onContentAfterSave и JLanguageAssociations::getAssociations

  • 11 Ответов
  • 300 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

Cristoff

Разрабатываю плагин для articles тип "content".

Есть задача вытянуть актуальные языковые связи article с выбранными статьями/материалами.
Суть следующая
Код
 public function onContentAfterSave($context, $article, $isNew)
    {

        if ($context !== 'com_content.article')
            return true;
        if (empty($this->_db)) {
            $this->_db = JFactory::getDBO();
        }
        $associations = JLanguageAssociations::getAssociations('com_content', '#__content', 'com_content.item', $article->id);
}
Проблема в том что $associations имеет неактуальную информацию. Оно вринципе логично, судя по коду JModelAdmin Dispatcher срабатывает до сохранения ассоциаций.

Как можно обойти эту проблему без двойного сохранения?



*

Aleks.Denezh

Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #1 : 16.09.2016, 11:54:48 »
А вам религия не позволяет два раза сохранять?)
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

Cristoff

Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #2 : 16.09.2016, 13:27:17 »
А вам религия не позволяет два раза сохранять?)
Типа того, но сохраняет пользователь. Заставлять его сохранять два раза - выглядит как костыль.

*

Aleks.Denezh

Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #3 : 16.09.2016, 13:38:45 »
Типа того, но сохраняет пользователь. Заставлять его сохранять два раза - выглядит как костыль.
ну тогда не совсем понятно что где и когда должен делать плагин ваш и на каком этапе должен получать языковые связи и для чего!
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

SmokerMan

Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #4 : 16.09.2016, 13:55:08 »
как вариант можно переопределить системным плагином модель и в ней уже делать что душе угодно)

*

Cristoff

Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #5 : 16.09.2016, 13:56:11 »
ну тогда не совсем понятно что где и когда должен делать плагин ваш и на каком этапе должен получать языковые связи и для чего!

1. Есть статьи, которые создает юзер. Указывает раздел, язык и тд
2. Плагин цепляется на событие onContentAfterSave - то есть после сохранения статьи или создание новой.
3. Юзер использует встроенную возможность Joomla мультиязычность и создает еще статьи но с другим языком
4. В статье указывает связанные статьи и вот тут начинается проблема
5. Плагин в событии onContentAfterSave пытается получить эти связанные статьи, но их там нет потому что сохранение самих связей происходит после вызова события.

вот кусок кода /libraries/legacy/model/admin.php
Код
$dispatcher->trigger($this->event_after_save, array($context, $table, $isNew));
}
catch (Exception $e)
{
$this->setError($e->getMessage());

return false;
}

if (isset($table->$key))
{
$this->setState($this->getName(). '.id', $table->$key);
}

$this->setState($this->getName(). '.new', $isNew);

if ($this->associationsContext && JLanguageAssociations::isEnabled() && !empty($data['associations']))
{
$associations = $data['associations'];

// Unset any invalid associations
$associations = Joomla\Utilities\ArrayHelper::toInteger($associations);


тут происходит вызов триггера и только потом обработка связей.

То есть и получается: чтобы мне получить актуальную инфу по связям нужно юзера заставить два раза жмакнуть кнопку сохранить.
Либо сделать это за него, но как понять когда перестать сохранять, чтобы не зациклиться.
 

*

Cristoff

Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #6 : 16.09.2016, 13:56:32 »
как вариант можно переопределить системным плагином модель и в ней уже делать что душе угодно)

Можно поподробней.

*

SmokerMan

Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #7 : 16.09.2016, 14:10:20 »
Можно поподробней.
будет подключаться модель из плагина

*

Cristoff

Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #8 : 16.09.2016, 14:22:28 »
будет подключаться модель из плагина
Спасибо. Интересный подход. Это распространенная практика в среде Joomla?

*

Aleks.Denezh

Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #9 : 16.09.2016, 14:25:47 »
Спасибо. Интересный подход. Это распространенная практика в среде Joomla?
Это больше костыль чем практика )
можно попробовать в плагине самому сохранить связи (скопировав код administrator/components/com_content/models/article.php) со строки 545 начинается..
но я не знаю что больше костыль это или то (

Но я так и не понял зачем вам получать эти связи в момент сохранения, чего вы пытаетесь с ними потом сделать?
« Последнее редактирование: 16.09.2016, 14:31:55 от Istaan »
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

SmokerMan

Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #10 : 16.09.2016, 14:33:54 »
Это больше костыль чем практика )
ну костыль не костыль не знаю, иногда другого выхода просто нет
бывают ситуации что не только модель ну допустим макеты надо переопределять, допустим в таблицу надо добавить вывод столбца или еще чего-то
по другому это не сделать

*

Cristoff

Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #11 : 16.09.2016, 14:45:29 »
Это больше костыль чем практика )
можно попробовать в плагине самому сохранить связи (скопировав код administrator/components/com_content/models/article.php) со строки 545 начинается..
но я не знаю что больше костыль это или то (

Но я так и не понял зачем вам получать эти связи в момент сохранения, чего вы пытаетесь с ними потом сделать?

вся эта затея для автоматического создания меню по этим статьям. При включенном SEF режиме ссылки на новости выдают 404 если не сделать для него меню.
А меню так же имеет языковые связи.

чтобы сохранить эти связи мне их нужно получить, а в плагин они не попадают(