Форум русской поддержки Joomla!® CMS
09.12.2016, 15:38:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

[Решено] Запись в несколько таблиц при создании материала через плагин аналог onContentAfterSave

 (Прочитано 103 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Barabashka
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 64


Son of Sky


« : 26.10.2016, 14:47:54 »

Здравствуйте. Помогите разобраться пожалуйста.

Делаю компонент, допустим для примера: список компаний. Задача: во время создания компании необходимо заполнять табличку подразделений стандартным содержимым (добавить несколько строк в БД, типа: Отдел Маркетинга, Отдел IT и т.д.), но нюанс - каждое подразделение содержит в себе идентификатор компании.

Проблема/вопрос : как сделать так, чтобы создание происходило один раз только?

я создал простенький плагин, в котором в событие onContentAfterSave добавил вызов необходимой модели и запись через неё в БД. Запись в БД сработала отлично, но событие срабатывает и при открытии материала и при сохранении, короче как будто не имеет значения что это вообще за событие.

Я так же не до конца понимаю куда тригер и диспетчер в моем случае вставлять
например я добавил это ↓ в функцию display() файла view.html.php моей "компании". Но последствия описаны выше.

Код:
JPluginHelper::importPlugin('com_mycomp');
$dispatcher = JDispatcher::getInstance();
$dispatcher->trigger('onContentAfterSave',...);


была идея вызывать две модели в функции save() модели
и postSaveHook в контролере, но так и не придумал как получить там ID родителя, созданного в этот же момент

я уже не имею идей как и ГДЕ я могу корректно получить ID только что созданного (!) материала

функция плагина
Код:
public function onContentAfterSave($context, $company, $isNew){

$allowed_contexts = array('com_mycomp.company');
if(!in_array($context, $allowed_contexts)) {
return TRUE;
}

$default_data = array(....);

if ($isNew) {
echo "it's NEW";
exit();
$model = JModelLegacy::getInstance('Unit', 'MycompModel');
if (!empty($default_data)) {
foreach ($default_data as $default_row) {
$model->save($default_row);
}
}
}
else{
echo "NOT new";
}

}
« Последнее редактирование: 28.10.2016, 16:45:20 от Barabashka » Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7778



« Ответ #1 : 26.10.2016, 16:02:49 »

во-первых, onContentAfterSave - стандартное событие Joomla при сохранении материала. если у вас свой компонент, то для чего вам стандартное событие? назовите его как то по своему. или у вас компания это материал?
во-вторых, стандартно onContentAfterSave вызывается только при сохранении материала. и передается флаг $isNew который говорит о том, новый это материал, или уже был создан ранее.
в-третьих, событие у вас вызывается 100500 раз потому, что вы его вызываете 100500 раз.
например я добавил это ↓ в функцию display() файла view.html.php моей "компании"
почему вы тогда удивляетесь, что событие вызывается при открытии? вы его сами и вызвали. что не так?
Записан
Barabashka
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 64


Son of Sky


« Ответ #2 : 26.10.2016, 17:52:33 »

Спасибо за ответ.
Видимо что-то не так с пониманием основ или материалам по которым я обучался..=)

Цитировать
во-первых, onContentAfterSave - стандартное событие Joomla при сохранении материала
я не знал этого. Мне просто отлично подошли название и свойства. Создать собственное название - не вопрос.

но вопрос:  как и/или где запустить функцию плагина, чтобы она сработала один раз при создании записи собственного компонента и при этом ей в том месте можно было передать ID только что созданного материала

Цитировать
вы его сами и вызвали. что не так?
значит, если я правильно понял, то код

Код:
$dispatcher->trigger('onContentAfterSave',...)

вызывает материал? Проблема в том, что я думал, что он следит в этом месте и как бы ждет выполнения указанного условия (например, onContentAfterSave)
« Последнее редактирование: 28.10.2016, 16:46:16 от Barabashka » Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7778



« Ответ #3 : 26.10.2016, 18:04:44 »

Цитировать
как и/или где запустить функцию плагина, чтобы она сработала один раз при создании записи собственного компонента и при этом ей в том месте можно было передать ID только что созданного материала
очевидно, в модели сохранения вашего материала, непосредственно после сохранения Azn

Цитировать
значит, если я правильно понял, то код
$dispatcher->trigger('onContentAfterSave',...)
вызывает материал?
вызывает событие onContentAfterSave. которое слушают плагины, подписанные на это событие. их может быть 0/1/2/100500, они все выполнятся.
Записан
Barabashka
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 64


Son of Sky


« Ответ #4 : 26.10.2016, 20:41:45 »

Цитата: dmitry_stas
очевидно, в модели сохранения вашего материала, непосредственно после сохранения Azn
это я и не понимал.. Где же это таинственное место "непосредственно после сохранения",  но это натолкнуло меня на правильный ход мыслей  Smiley

в процессе тестирования я нашел в модели состояние company.new, это стало моим спасением.

после этого до меня дошло то каким же я был бараном Azn и что
Цитировать
непосредственно после сохранения
это например перед возвращением TRUE в функции save()

в результате я смог настроить вызов плагина сразу в двух местах (можно вибирать Wink ):
1) в модели:
Код:
        if (parent::save($data)) {

    $item = $this->getItem();
    $new_company_id = $item->get('id');

    $isNew= $this->getState('company.new');
   
    JPluginHelper::importPlugin('com_mycomp');
    $dispatcher = JDispatcher::getInstance();
    $dispatcher->trigger('onCompanyAfterSave', array('com_mycomp.company', $new_company_id, $isNew));

    return TRUE;
}
?>
2) и в контроллере:
Код:
class МycompControllerCompany extends JControllerForm{

protected function postSaveHook(JModelLegacy $model,$validData=array()){
    $item = $model->getItem();
    $new_company_id = $item->get('id');

    $isNew= $model->getState('company.new');
    JPluginHelper::importPlugin('com_mycomp');
    $dispatcher = JDispatcher::getInstance();
            $dispatcher->trigger('onCompanyAfterSave', array('com_mycomp.company', $new_company_id, $isNew));
}

}

спасибо вам еще раз за ответы, +
так же буду благодарен за замечания по приведенных отрывках кода, если что-то бросится в глаза
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7778



« Ответ #5 : 26.10.2016, 22:41:19 »

я правда не понимаю, что вы не могли понять Azn

Где же это таинственное место "непосредственно после сохранения"
очевидно там, где вы сохраняете компанию Azn
Код:
if (parent::save($data)) {
это же ваш компонент? или кто то в нем вместо вас сохраняет что то? Azn

ну в общем ладно, нашли и нашли Azn
Записан
Barabashka
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 64


Son of Sky


« Ответ #6 : 26.10.2016, 22:59:19 »

Цитировать
я правда не понимаю, что вы не могли понять

я думал, что функция save() модели не отдаст мне ID только что созданного материала, что  parent::save($data) возвращает только TRUE и на этом конец.
так же не знал как не вызывать свою функцию при редактировании, а только при сохранении.

Цитировать
это же ваш компонент?

да, именно Grin  Но хочется в первую очередь разобраться в правильном подходе программирования для Joomla.. правила, ограничения и т.д.
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7778



« Ответ #7 : 26.10.2016, 23:43:44 »

ясно теперь, т.е. вы не могли понять где вызвать потому что функция сохранения описана в родительском классе.. ну parent::save($data) на самом деле возвращает boolean и на этом все. но доступ то к модели вы после сохранения по прежнему имеете, и можете уже получать то, что вам нужно.

в общем, хорошо, что все хорошо Azn
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet