Хуки и расширение функции.

pilot911

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

не придется каждый раз в коде отслеживать цепочку наследований ?
 

AmdY

Пью пиво
Команда форума
Если хочешь построить цепочку, используй паттерн filter chain, можно попытаться через decorator. всё зависит от того как выглядит остальная архитектура
 

HraKK

Мудак
Команда форума
Если хочешь построить цепочку, используй паттерн filter chain, можно попытаться через decorator. всё зависит от того как выглядит остальная архитектура
не, не из этой оперы.

pilot911
Давай на практике, какой модуль и какие 2 екстейшена и напиши примерчик как я.
 

pilot911

Новичок
Автор оригинала: HraKK
не, не из этой оперы.

pilot911
Давай на практике, какой модуль и какие 2 екстейшена и напиши примерчик как я.
например, класс ядра для админки, который отвечает за вывод и сохранение информации о пользователе

PHP:
class	user_manage {

	function	main()	{

		$this->showField('username');
		$this->showField('firstname');
		$this->showField('lastname');
	}

}

появляется экстеншен, который добавляет в таблицу `user` поле: "money" и экстеншен хочет, чтобы поле было показано среди других

ПС.

я знаю один вариант решения - как в CMS TYPO3 - через добавление поля в конфигурационный массив типа


PHP:
$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"
			)
		),
-~{}~ 12.11.08 02:39:

получается, что функция `main` обрабатывает этот массив и на его основе строит форму

экстеншен просто добавляет ключ в массив и конфиг поля "money"

хорошее решение, но не очень удобное, поскольку в серьезных проектах значение поле "money" может быть результатом сложного запроса
 

HraKK

Мудак
Команда форума
Где ваше решение?! Я вижу только решение в TYPO3, вы мне еще с битрикса привидите. Или там скажите сколько у вас глюкоы в крови.
Я что просил?
 

pilot911

Новичок
так и говори. решение давай :) мы же люди простые, из народа, нам чем проще, тем лучше
 

HraKK

Мудак
Команда форума
Я накатал свое решение. Ты сказал
мне кажется, вопрос чуток сложнее - есть два или более эктеншена, которые ничего друг о дружке не знают, но расширяют один и тот же модуль или функцию

не придется каждый раз в коде отслеживать цепочку наследований ?
Вот покажи на практике какие 2 екстеншена какой модуль, как твой метод справляется с этим. А я в ответ набросаю свое.

В общем ответь на вопрос:
pilot911
Давай на практике, какой модуль и какие 2 екстейшена и напиши примерчик как я.
 

pilot911

Новичок
добавляем класс и фунукцию, которые будут показывать поле "money"

loadconfigs::extendFunction('user_manage', 'user_manage_ext_1', 'main');




PHP:
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 login password;
И функциями добавить пользователя и получить пользователя по id.
В добавлении сделать шифрование password md5().

А потом сделай мне дополнительные поля sex, age которые лежат в другой таблице idUser, sex, age
где проверяй sex на равенство women тогда в базу 1 или men тогда в базу 0. И age >18 если women и age > 16 если men.
 

pilot911

Новичок
Автор оригинала: HraKK
Давай так. Есть класс User
с полями id login password;
И функциями добавить пользователя и получить пользователя по id.
В добавлении сделать шифрование password md5().

А потом сделай мне дополнительные поля sex, age
где проверяй sex на равенство women тогда в базу 1 или men тогда в базу 0. И age >18 если women и age > 16 если men.
сохранение происходит по той же схеме

PHP:
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'];
    }

}
 

pilot911

Новичок
Автор оригинала: HraKK
где проверяй sex на равенство women тогда в базу 1 или men тогда в базу 0. И age >18 если women и age > 16 если men.
ну я сделал абстрактное сравнение, смысл понятен


Автор оригинала: HraKK
которые лежат в другой таблице idUser, sex, age
можно обратиться из user_manage_ext::save к другим моделям и таблицам


ПС. судя по всему Amdy прав относительно filter chain - единственный вопрос, как это скажется на производительности
 

HraKK

Мудак
Команда форума
Нет, давай без абстракции. Напиши более подробнее где проверка как вставляется когда. Не до корочки, но я твой код не понял.

Chain filter тут не причем кстати.
 

pilot911

Новичок
Автор оригинала: HraKK
Нет, давай без абстракции. Напиши более подробнее где проверка как вставляется когда. Не до корочки, но я твой код не понял.
все проверки в этой функции по новому полю user_manage_ext::save - проверки у каждого по-своему в зависимости от моделей и тп


Автор оригинала: HraKK
Chain filter тут не причем кстати.
почему нет ? там же можно создавать цепочку вызовов
 

HraKK

Мудак
Команда форума
pilot911
Напиши. Ты или пишешь или сливаешся.

почему нет ? там же можно создавать цепочку вызовов
Гланды через анус тоже лечить можно. А Chain filter преднозначенный как транзакционный фильтр. А не как расширенение функционала.
 

pilot911

Новичок
Автор оригинала: HraKK
pilot911
Напиши. Ты или пишешь или сливаешся.


Гланды через анус тоже лечить можно. А Chain filter преднозначенный как транзакционный фильтр. А не как расширенение функционала.
я уже 2 раза написал, лучше задай наводящий вопрос, чтобы мог что-то сказать конкретнее

-~{}~ 12.11.08 13:26:

HRAKK, вот решение - перед и после model_user::save($array_data); в user_manage::save() добавляем хуки



PHP:
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, а не передвать действия возложенные на него чёрт знает кому.
 

pilot911

Новичок
Автор оригинала: AmdY
так нужно расширить сам метод model_user::save, а не передвать действия возложенные на него чёрт знает кому.
согласен, но как расширить, когда подобная операция требуется сразу нескольким плугинам ?
 

HraKK

Мудак
Команда форума
Отлично, добился наконец с 5 раз такого функционала.
Это у нас 1 модуль 1 плагин.
А теперь еще один плагин который добавляет статистику в лог файл где указывается строчку время регистрации пользователя и вся информация о нем.

И весь код вместе напиши.

----
А хотя не надо я уже представляю что это будет. В твоем конфиге придется еще и отслеживать сортировку последовательностей. И в КАЖДУЮ функцию ты будешь добавлять 2 строчки проверки pre и post которые нунеразу не будут тормозить систему. И код такой уже сразу читабельный
PHP:
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);  
    }
}
И файл в итоге будет конфигураций тоже будет очень маленкий и интуитивно понятный.

Все это ради мифического расширения, которое возможно когда-то понадобится.

А в конце читаем про Observer.
 

pilot911

Новичок
не в каждую функцию, а только в две функции: формирования полей формы и сохранения данных из формы

в общем, решения кроме обозначенного выше, нет ?
 
Сверху