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

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

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

 (Прочитано 153 раз)
0 Пользователей и 1 Гость смотрят эту тему.
effrit
Группа развития
*****

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

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


effrit.com


« : 09.11.2016, 20:45:19 »

Всем прювет!
Воинствующий чайник решил создать самый_лучший_системный_плагин_в_мире, но сразу возникли вопросы  Grin

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

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

Записан
buyanov
Осваиваюсь на форуме
***

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

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


Сайты 74


« Ответ #1 : 09.11.2016, 20:56:30 »

Привет, диспетчер событий всегда отдает контекст вызова (это как раз то что ты имеешь ввиду)
Пример вот тут (этот мой плагинчик)
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, 21:05:57 от buyanov » Записан
Arkadiy
Группа развития
*****

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

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


Крепитесь, други.


« Ответ #2 : 09.11.2016, 21:04:57 »

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

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

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


effrit.com


« Ответ #3 : 09.11.2016, 21:11:08 »

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

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

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

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


Сайты 74


« Ответ #4 : 09.11.2016, 21:26:02 »

Если я конечно правильно понял )))))

Код
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
Осваиваюсь на форуме
***

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

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


Сайты 74


« Ответ #5 : 09.11.2016, 21:28:18 »

Цитировать
обработать шорткоды

Это типа самостоятельно обработать <jdoc.../> ?
Записан
effrit
Группа развития
*****

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

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


effrit.com


« Ответ #6 : 09.11.2016, 21:37:39 »

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

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

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

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


effrit.com


« Ответ #7 : 09.11.2016, 21:39:39 »

зы
как же ужасно быть чайником ))).
но вы терпите! может чего полезное выйдет )))
Записан
effrit
Группа развития
*****

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

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


effrit.com


« Ответ #8 : 09.11.2016, 21:45:46 »

ладно, болванка есть, документация тоже есть.
чего-нить уже можно сотворить )).
зы

это только у меня или у всех так испоганились комментарии к коду?
в примере выше камменты сконвертились
Записан
buyanov
Осваиваюсь на форуме
***

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

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


Сайты 74


« Ответ #9 : 09.11.2016, 21:51:40 »

Если обычные замены в контенте, то можно обойтись и без системного плагина.

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

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

Проверить возможности нет ((( так что экспериментируй! )))) Если что пиши
Записан
Arkadiy
Группа развития
*****

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

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


Крепитесь, други.


« Ответ #10 : 09.11.2016, 21:51:52 »

Если нужно все с шаблоном, посмотри в сторону onAfterRender.

Код
	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
Группа развития
*****

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

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


effrit.com


« Ответ #11 : 09.11.2016, 21:57:32 »

спасибо, товарищи, кажется прояснение наступило )
буду пробовать

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

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

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


Сайты 74


« Ответ #12 : 09.11.2016, 22:46:02 »

Если нужно все с шаблоном, посмотри в сторону onAfterRender.

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

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

В первой строке правильно использована фабрика, какой смысл вкладывается в $JApplicationWeb = new JApplicationWeb; ?
Записан
robert
Профи
********

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

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


« Ответ #13 : 09.11.2016, 23:44:33 »

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

В первой строке правильно использована фабрика, какой смысл вкладывается в $JApplicationWeb = new JApplicationWeb; ?
Смысл в Joomla 4.
« Последнее редактирование: 09.11.2016, 23:59:51 от robert » Записан
fsv
Практически профи
*******

Репутация: +330/-2
Online Online

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


« Ответ #14 : 10.11.2016, 01:13:43 »

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

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

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


« Ответ #15 : 10.11.2016, 02:14:19 »

таких проверок с отступами на 50-100 строк плагина штук 5...
В таком случае - да, вы правы.
« Последнее редактирование: 10.11.2016, 02:24:09 от robert » Записан
buyanov
Осваиваюсь на форуме
***

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

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


Сайты 74


« Ответ #16 : 10.11.2016, 02:21:11 »

$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
Практически профи
*******

Репутация: +330/-2
Online Online

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


« Ответ #17 : 10.11.2016, 02:51:04 »

$this->app
тогда надо...
Чего вы цитируете вырванный фрагмент из "цитаты цитаты"?  Wink Внимательнее выше почитайте.
Записан
Arkadiy
Группа развития
*****

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

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


Крепитесь, други.


« Ответ #18 : 10.11.2016, 05:25:55 »

зы
и все же - форум глючит?
Аркадий, у тебя в карме каммент к предпоследнему плюсу нормально читается?
Последний нормально, предпоследний выводится html-сущностями.
Записан
Страниц: [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