не, не из этой оперы.Если хочешь построить цепочку, используй паттерн filter chain, можно попытаться через decorator. всё зависит от того как выглядит остальная архитектура
например, класс ядра для админки, который отвечает за вывод и сохранение информации о пользователеАвтор оригинала: HraKK
не, не из этой оперы.
pilot911
Давай на практике, какой модуль и какие 2 екстейшена и напиши примерчик как я.
class user_manage {
function main() {
$this->showField('username');
$this->showField('firstname');
$this->showField('lastname');
}
}
$TCA["user"] = array (
"interface" => array (
"showRecordFieldList" => "sys_language_uid,l18n_parent,l18n_diffsource,hidden,starttime,endtime,fe_group, username, firstname, lastname"
),
"columns" => array (
'l18n_parent' => array (
'displayCond' => 'FIELD:sys_language_uid:>:0',
'exclude' => 1,
'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.l18n_parent',
'config' => array (
'type' => 'select',
'items' => array (
array('', 0),
),
'foreign_table' => 'tx_golengine_obligations',
'foreign_table_where' => 'AND tx_golengine_obligations.pid=###CURRENT_PID### AND tx_golengine_obligations.sys_language_uid IN (-1,0)',
)
),
"hidden" => array (
"exclude" => 1,
"label" => "LLL:EXT:lang/locallang_general.xml:LGL.hidden",
"config" => array (
"type" => "check",
"default" => "0"
)
),
Вот покажи на практике какие 2 екстеншена какой модуль, как твой метод справляется с этим. А я в ответ набросаю свое.мне кажется, вопрос чуток сложнее - есть два или более эктеншена, которые ничего друг о дружке не знают, но расширяют один и тот же модуль или функцию
не придется каждый раз в коде отслеживать цепочку наследований ?
pilot911
Давай на практике, какой модуль и какие 2 екстейшена и напиши примерчик как я.
class user_manage extends base {
function main() {
$this->showField('username');
$this->showField('firstname');
$this->showField('lastname');
//добавляем вызов функции, которая смотрит
//специальный массив на предмет ключей для данного класса
$this->extendFunction('main');
}
}
class base {
function extendFunction($function, &$args=array()) {
$current_class = get_class($this);
if (isset($GLOBALS['FUNCTION_EXT'][$current_class][$function])) {
foreach($GLOBALS['FUNCTION_EXT'][$current_class][$function] as $k=>$class) {
if (method_exists($class, $function)) {
$args = call_user_func_array(array($class, $function), array(array('pObj'=>$this,'params'=>$args)));
}
}
}
}
}
// класс, добавляющий контент поля "money"
class user_manage_ext extends base {
function main($args) {
$args['pObj']->showField('money');
}
}
сохранение происходит по той же схемеАвтор оригинала: HraKK
Давай так. Есть класс User
с полями id login password;
И функциями добавить пользователя и получить пользователя по id.
В добавлении сделать шифрование password md5().
А потом сделай мне дополнительные поля sex, age
где проверяй sex на равенство women тогда в базу 1 или men тогда в базу 0. И age >18 если women и age > 16 если men.
class user_manage extends base {
function save() {
$array_data['username'] = _GP('username');
......
$this->extendFunction('save', $array_data);
// теперь $array_data с добавленными полями
model_user::save($array_data);
}
}
class user_manage_ext extends base {
function save($args) {
if (in_range(intval(_GP('sex')), 18,100)) {
$args['params']['sex'] = _GP('sex');
}
return $args['params'];
}
}
где проверяй sex на равенство women тогда в базу 1 или men тогда в базу 0. И age >18 если women и age > 16 если men.
которые лежат в другой таблице idUser, sex, age
ну я сделал абстрактное сравнение, смысл понятенАвтор оригинала: HraKK
где проверяй sex на равенство women тогда в базу 1 или men тогда в базу 0. И age >18 если women и age > 16 если men.
можно обратиться из user_manage_ext::save к другим моделям и таблицамАвтор оригинала: HraKK
которые лежат в другой таблице idUser, sex, age
все проверки в этой функции по новому полю user_manage_ext::save - проверки у каждого по-своему в зависимости от моделей и тпАвтор оригинала: HraKK
Нет, давай без абстракции. Напиши более подробнее где проверка как вставляется когда. Не до корочки, но я твой код не понял.
почему нет ? там же можно создавать цепочку вызововАвтор оригинала: HraKK
Chain filter тут не причем кстати.
Гланды через анус тоже лечить можно. А Chain filter преднозначенный как транзакционный фильтр. А не как расширенение функционала.почему нет ? там же можно создавать цепочку вызовов
я уже 2 раза написал, лучше задай наводящий вопрос, чтобы мог что-то сказать конкретнееАвтор оригинала: HraKK
pilot911
Напиши. Ты или пишешь или сливаешся.
Гланды через анус тоже лечить можно. А Chain filter преднозначенный как транзакционный фильтр. А не как расширенение функционала.
class user_manage extends base {
function save() {
$array_data['username'] = _GP('username');
......
$this->extendFunction('save_pre', $array_data);
// теперь $array_data с добавленными полями
$id = model_user::save($array_data);
$this->extendFunction('save_post', $array_data, $id);
}
}
class user_manage_ext extends base {
function save_pre($args) {
$args['param']['sex'] = _GP('sex')=='woman' ? 1 : 0 ;
return $args['params'];
}
function save_post($args) {
$args['param']['sex']==1 && $q = _GP('age')>18 ? model_newtable::save($args['id'], 1, $q);
$args['param']['sex']==0 && $q = _GP('age')>16 ? model_newtable::save($args['id'], 0, $q);
return $args['params'];
}
}
согласен, но как расширить, когда подобная операция требуется сразу нескольким плугинам ?Автор оригинала: AmdY
так нужно расширить сам метод model_user::save, а не передвать действия возложенные на него чёрт знает кому.
class a
{
function a()
{
$this->extendFunction('save_pre_a', $array_data);
....
$this->extendFunction('save_post_a', $array_data, $id);
}
function b()
{
$this->extendFunction('save_pre_b', $array_data);
....
$this->extendFunction('save_post_b', $array_data, $id);
}
function c()
{
$this->extendFunction('save_pre_c', $array_data);
....
$this->extendFunction('save_post_c', $array_data, $id);
}
function d()
{
$this->extendFunction('save_pre_d', $array_data);
....
$this->extendFunction('save_post_d', $array_data, $id);
}
}