Создание системного плагина: как фильтровать контент по группам?

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

effrit

  • Группа развития
  • *****
  • 7443
  • 815
  • effrit.com
Всем прювет!
Воинствующий чайник решил создать самый_лучший_системный_плагин_в_мире, но сразу возникли вопросы  ;D

Хочется понять, можно ли отслеживать источники данных, которые плагин обрабатывает?
Конкретная задача:
обработать контент статьи одним алгоритмом, а контент в модулях - другим.
Можно так сделать на уровне API простым условием?
Или же придется работать с финальным HTML-ом всей страницы разом?

И на какое событие лучше всего вешать плагин? (обработка шорткодов).


*

buyanov

  • Осваиваюсь на форуме
  • ***
  • 178
  • 26
  • Сайты 74
Привет, диспетчер событий всегда отдает контекст вызова (это как раз то что ты имеешь ввиду)
Пример вот тут (этот мой плагинчик)
https://github.com/buyanov/KeywordLinks/blob/master/keywordlinks.php#L44

Правда для системного плагина контекста в явном виде не будет, но есть событие onModuleRender вроде бы

Код
public function onRenderModule(&$module, &$attribs)
{
//Отключение плагина для админки
        if ($this->app->isAdmin())
        {
            return true;
        }
// Параметры модуля
        $params = new \Joomla\Registry\Registry();
        $params->loadString($module->params);
       
// Тут логика

//Обязательно возвращаем True
        return true;
}

« Последнее редактирование: 09.11.2016, 22:05:57 от buyanov »
Создание сайтов, интернет-магазинов, оптимизация, продвижение, хостинг, безопасность, лечение от вирусов - мой сайт, телега, Хостинг

*

Arkadiy

  • Группа развития
  • *****
  • 5342
  • 440
  • Крепитесь, други.
https://docs.joomla.org/Plugin/Events Все события Joomla. Событие надо выбирать в зависимости от того, что хочешь получить и изменить. Возможно потребуется или будет удобнее использовать несколько событий.

*

effrit

  • Группа развития
  • *****
  • 7443
  • 815
  • effrit.com
ок, тогда так вопрос поставлю:
как в рамках одного плагина
а) обработать все пути (это системный плагин получается, тупая замена одной папки на другую)
б) обработать шорткоды, по типу, как товарищ buyanov прописал, желательно, чтобы там было видно момент получения данных из модулей?

можете мне набросать матрешку из 5-10 строк под это дело, чтобы понять, как оно работает?

*

buyanov

  • Осваиваюсь на форуме
  • ***
  • 178
  • 26
  • Сайты 74
Если я конечно правильно понял )))))

Код: php
defined('_JEXEC') or die('Restricted access');
jimport('joomla.plugin.plugin');
class plgSystemMysuperplugin extends JPlugin
{
   
    public function onAfterInitialise()
    {
        if ($this->app->isAdmin()){
            return true;
        }
        // событие после инициализации Joomla

echo 'onAfterInitialise';

        return true;
    }
    /**
     * @param $module
     * @param $attribs
     *
     * @return bool
     */
    public function onRenderModule(&$module, &$attribs)
    {
        if ($this->app->isAdmin()){
            return true;
        }
        // Переменная модуль будет содержать параметры модуля и все настройки и в том числе контент

echo 'onRenderModule';
        return true;
    }

    public function onBeforeRender()
    {
        if ($this->app->isAdmin()){
            return true;
        }
        // Это перед рендером HTML пока в буферах JDocument есть все по полочкам

echo 'onBeforeRender';
        return true;
    }

    public function onAfterRender()
    {
        if ($this->app->isAdmin()){
            return true;
        }
        // Тут Joomla уже все слепила и на данном этапе можно найти весь HTML кучей

echo 'onAfterRender';
        return true;
    }
}
Создание сайтов, интернет-магазинов, оптимизация, продвижение, хостинг, безопасность, лечение от вирусов - мой сайт, телега, Хостинг

*

buyanov

  • Осваиваюсь на форуме
  • ***
  • 178
  • 26
  • Сайты 74
Цитировать
обработать шорткоды

Это типа самостоятельно обработать <jdoc.../> ?
Создание сайтов, интернет-магазинов, оптимизация, продвижение, хостинг, безопасность, лечение от вирусов - мой сайт, телега, Хостинг

*

effrit

  • Группа развития
  • *****
  • 7443
  • 815
  • effrit.com
шорткоды - это обычный контентный плагин имеется в виду. я что-то такое делал уже. типа замены всяких {gal} и тд.
вопрос был про совмещение в рамках одного плагина обработки порций контента из статей/модулей с последующим глобальным прогоном по всему массиву на предмет замены путей.
у меня просто нет четкого понимания, где заканчивается функционал плагина контента.

он же не имеет доступа к финальной странице, включающей шаблон? или имеет?
если да - то мне тогда хватит контентного плагина


*

effrit

  • Группа развития
  • *****
  • 7443
  • 815
  • effrit.com
ладно, болванка есть, документация тоже есть.
чего-нить уже можно сотворить )).
зы

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

*

buyanov

  • Осваиваюсь на форуме
  • ***
  • 178
  • 26
  • Сайты 74
Если обычные замены в контенте, то можно обойтись и без системного плагина.

Сейчас сразу не вспомню, но чтобы получить именно кучу отрендеренного и обработанного HTML то тогда надо юзать системный и ставить его самым последним в списке плагинов (чтобы остальные отработали тоже)

Получить HTML страницы в событии onAfterRender() можно через $content = JFactory::getApplication()->getBody();
После обработки можно JFactory::getApplication()->setBody($content);

Проверить возможности нет ((( так что экспериментируй! )))) Если что пиши
Создание сайтов, интернет-магазинов, оптимизация, продвижение, хостинг, безопасность, лечение от вирусов - мой сайт, телега, Хостинг

*

Arkadiy

  • Группа развития
  • *****
  • 5342
  • 440
  • Крепитесь, други.
Если нужно все с шаблоном, посмотри в сторону onAfterRender.

Код: php
	function onAfterRender() {
$app = JFactory::getApplication();
if($app->isAdmin())
return;
        
                $JApplicationWeb = new JApplicationWeb;
$body = $JApplicationWeb->getBody();
$alternate_body = false;
if(empty($body)){
$app = JFactory::getApplication();
$body = $app->getBody();
$alternate_body = true;
}

//тут действия по замене ненужного на нужное

if($alternate_body)
$app->setBody($body);
else
                        $JApplicationWeb->setBody($body);
}

*

effrit

  • Группа развития
  • *****
  • 7443
  • 815
  • effrit.com
спасибо, товарищи, кажется прояснение наступило )
буду пробовать

зы
и все же - форум глючит?
Аркадий, у тебя в карме каммент к предпоследнему плюсу нормально читается?

*

buyanov

  • Осваиваюсь на форуме
  • ***
  • 178
  • 26
  • Сайты 74
Если нужно все с шаблоном, посмотри в сторону onAfterRender.

Код: php
$app = JFactory::getApplication();
if($app->isAdmin())
return;
 
                $JApplicationWeb = new JApplicationWeb;

new JApplicationWeb; использовать не стоит, Application использует паттерн Singleton если не ошибаюсь и плодить новые объекты такого типа нельзя

В первой строке правильно использована фабрика, какой смысл вкладывается в $JApplicationWeb = new JApplicationWeb; ?
Создание сайтов, интернет-магазинов, оптимизация, продвижение, хостинг, безопасность, лечение от вирусов - мой сайт, телега, Хостинг

*

robert

  • Профи
  • ********
  • 4006
  • 371
Спойлер
[свернуть]
new JApplicationWeb; использовать не стоит, Application использует паттерн Singleton если не ошибаюсь и плодить новые объекты такого типа нельзя

В первой строке правильно использована фабрика, какой смысл вкладывается в $JApplicationWeb = new JApplicationWeb; ?
Смысл в Joomla 4.
« Последнее редактирование: 10.11.2016, 00:59:51 от robert »
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

fsv

  • Практически профи
  • *******
  • 2506
  • 367
Кодер должен быть экономным:
Код: php
if (!$this->app->isAdmin()){
    echo 'onAfterInitialise';
}
Весь плагин оборачиваете в if + отступ. И таких проверок с отступами на 50-100 строк плагина штук 5...
И отслеживать каждый: что за он?
Читабельность очень ухудшается. Пару строк не жалко, выше был приведен стандартный способ выхода.
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

robert

  • Профи
  • ********
  • 4006
  • 371
таких проверок с отступами на 50-100 строк плагина штук 5...
В таком случае - да, вы правы.
« Последнее редактирование: 10.11.2016, 03:24:09 от robert »
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

buyanov

  • Осваиваюсь на форуме
  • ***
  • 178
  • 26
  • Сайты 74
$this->app

тогда надо объявить свойство, только тогда конструктор сделает ссылку на Application

кусок из конструктора класса JPlugin
Код

if (property_exists($this, 'app'))
{
$reflection = new ReflectionClass($this);
$appProperty = $reflection->getProperty('app');

if ($appProperty->isPrivate() === false && is_null($this->app))
{
$this->app = JFactory::getApplication();
}
}
Создание сайтов, интернет-магазинов, оптимизация, продвижение, хостинг, безопасность, лечение от вирусов - мой сайт, телега, Хостинг

*

fsv

  • Практически профи
  • *******
  • 2506
  • 367
$this->app
тогда надо...
Чего вы цитируете вырванный фрагмент из "цитаты цитаты"?  ;) Внимательнее выше почитайте.
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

Arkadiy

  • Группа развития
  • *****
  • 5342
  • 440
  • Крепитесь, други.
зы
и все же - форум глючит?
Аркадий, у тебя в карме каммент к предпоследнему плюсу нормально читается?
Последний нормально, предпоследний выводится html-сущностями.