PDA

Просмотр полной версии : Как переопределить одну из метод в t3lib_befunc ?


Boris
18.04.2006, 18:14
Надо переписать одн из методов в классе t3lib_befunc, но не могу понять как :confused:

Думал , при помощи 'XCLASS', но для данного класса не подходит

Зарание благодарен за помощь

Дылгеров Ц.В.
20.04.2006, 10:51
а что за метода? создавать extended t3lib_befunc наверняка невозможно. может просто переписать все методы по цепочке?

Boris
22.04.2006, 00:56
Надо было изменить в t3lib_befunc::getProcessedValue значение $theColConf['MM'].
Так как использую ext:bidirectional, например для того что-бы в категориях можно было присваивать новости.
Но тогда в WEB->Listview вместо категорий выводится N/A.

Проапдейтил вчера на 4.0 и увидел, что в етой методе добавлен НООК


if (is_array ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_befunc.php']['preProcessValue'])) {
foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_befunc.php']['preProcessValue'] as $_funcRef) {
t3lib_div::callUserFunction($_funcRef,$theColConf, $this);

}
}


В описании callUserFunction написано, что $theColConf передаётся как референц.

В своей функции меняю значение $theColConf['MM']


class tx_t3lib_befunc {
function preProcessValue(&$theColConf,&$ref) {
$MM_Table =$theColConf['MM'];
if(strstr($MM_Table,"|")){
$parts = t3lib_div::trimExplode("|",$MM_Table,1);
$theColConf['MM'] = $parts[0];
}
//return $theColConf;

}
}


Но когда вывожу в t3lib_befunc::getProcessedValue значение $theColConf после HOOK, то вижу что ничего не изменилось(хотя етот array передовался как референц)
Может обьясните почему?

Пришлось возвращать в моей функции $theColConf ( return $theColConf )

А в t3lib_befunc править на:

$theColConf =& t3lib_div::callUserFunction($_funcRef,$theColConf, $this);
Тогда заработало.

Но мне не нравится, что я сделал изменения прямо в ядре
Может кто-нибудь подскажет, где была ошибка.

Дылгеров Ц.В.
25.04.2006, 06:19
Очень интересная тема

$theColConf=&t3lib_div::callUserFunction($_funcRef,$theColConf, $this);

Скорее всего так нельзя делать - ведь хук будет использоваться другими экстеншинами. Другое дело что этот хук "молодой" - и его еще никто не успел использовать.

Можно разобраться с передачей в ваш хук theColConf['MM'] - а это код двух функций - самой callUserFunction и с похожим названием, вызываемой из нее.

А что в bidirectional не работает? у меня вроде работает.

А куда вы вносите изменения - в сам bidirectional или создаете расширение только из-за хука?

(:)
25.04.2006, 18:12
В описании callUserFunction написано, что $theColConf передаётся как референц.

В своей функции меняю значение $theColConf['MM']


class tx_t3lib_befunc {
function preProcessValue(&$theColConf,&$ref) {
$MM_Table =$theColConf['MM'];
if(strstr($MM_Table,"|")){
$parts = t3lib_div::trimExplode("|",$MM_Table,1);
$theColConf['MM'] = $parts[0];
}
//return $theColConf;

}
}


Но когда вывожу в t3lib_befunc::getProcessedValue значение $theColConf после HOOK, то вижу что ничего не изменилось(хотя етот array передовался как референц)
Может обьясните почему?



в вашей функции есть условие. вы не проверяли оно выполняется во время теста?

Boris
27.04.2006, 02:25
Скорее всего так нельзя делать - ведь хук будет использоваться другими экстеншинами. Другое дело что этот хук "молодой" - и его еще никто не успел использовать.

Полностю с вами согласен.

Сам bidirectional работает без проблем. только в WEB->Listview выводится N/A(в поле 'связанных данных').

Values from bidirectional fields may not display correctly in the List module's “extended mode”.
http://typo3.org/documentation/document-library/extension-manuals/bidirectional/1.1.0/view/1/4/

Потому-что для bidirectional прописывается в TCA:

'MM' => 'tx_myext_table1_table2_mm | foreign'


'| foreign' мешает для правильного отбражения в Listview
В $theColConf['MM'] ожидается только название таблици связей.

Вносил я изменения в сам bidirectional (в принципе разницы нет)

В ext_localconf.php добавил:

$GLOBALS ['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_befunc.php']['preProcessValue'][] = 'tx_t3lib_befunc->preProcessValue';


В ext_tables.php :
require_once(t3lib_extMgm::extPath('bidirectional' ).'class.user_t3lib_befunc.php');

Хотя можно и без етого, только в ext_localconf.php:

$GLOBALS ['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_befunc.php']['preProcessValue'][] = 'EXT:bidirectional/class.ux_t3lib_befunc.php:tx_t3lib_befunc->preProcessValue';


И соответственно добавил файл class.ux_t3lib_befunc.php с :
class tx_t3lib_befunc {
function preProcessValue(&$theColConf,&$ref) {
$MM_Table =$theColConf['MM'];
if(strstr($MM_Table,"|")){
$parts = t3lib_div::trimExplode("|",$MM_Table,1);
$theColConf['MM'] = $parts[0];
}
//debug($theColConf);
//return $theColConf;

}
}

Смысл всего хоока обрубить всё лишнее, оставить только tx_myext_table1_table2_mm

Внутри моей методы проверяю(Debug), что содержимое $theColConf меняетя так как мне надо, а с 'наружи' нет.

Проблема с референц! Почему правильно не отрабатывается не пойму.
Хотя в доке написано:


function callUserFunction($funcName,&$params,&$ref,$checkPrefix='user_',$silent=0)
Such a function/method should look like this: "function proc(&$params, &$ref) {...}"

&$params - Parameters to be pass along (typically an array) (REFERENCE!)