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

effrit

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

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

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

*

buyanov

  • Захожу иногда
  • 178
  • 27 / 1
  • Сайты 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, 20:05:57 от buyanov »
Создание сайтов, интернет-магазинов, оптимизация, продвижение, хостинг, безопасность, лечение от вирусов - мой сайт, телега, Хостинг
*

Arkadiy

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

effrit

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

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

buyanov

  • Захожу иногда
  • 178
  • 27 / 1
  • Сайты 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
  • 27 / 1
  • Сайты 74
Цитировать
обработать шорткоды

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

effrit

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

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

effrit

  • Гуру
  • 7857
  • 877 / 7
  • effrit.com
ладно, болванка есть, документация тоже есть.
чего-нить уже можно сотворить )).
зы

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

buyanov

  • Захожу иногда
  • 178
  • 27 / 1
  • Сайты 74
Если обычные замены в контенте, то можно обойтись и без системного плагина.

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

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

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

Arkadiy

  • Гуру
  • 5136
  • 447 / 1
  • Крепитесь, други.
Если нужно все с шаблоном, посмотри в сторону 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

  • Гуру
  • 7857
  • 877 / 7
  • effrit.com
спасибо, товарищи, кажется прояснение наступило )
буду пробовать

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

buyanov

  • Захожу иногда
  • 178
  • 27 / 1
  • Сайты 74
Если нужно все с шаблоном, посмотри в сторону onAfterRender.

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

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

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

robert

  • Живу я здесь
  • 4256
  • 407 / 15
Спойлер
[свернуть]
new JApplicationWeb; использовать не стоит, Application использует паттерн Singleton если не ошибаюсь и плодить новые объекты такого типа нельзя

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

fsv

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

robert

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

buyanov

  • Захожу иногда
  • 178
  • 27 / 1
  • Сайты 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

  • Живу я здесь
  • 2530
  • 370 / 2
$this->app
тогда надо...
Чего вы цитируете вырванный фрагмент из "цитаты цитаты"?  ;) Внимательнее выше почитайте.
Веб-разработка: заказ.
*

Arkadiy

  • Гуру
  • 5136
  • 447 / 1
  • Крепитесь, други.
зы
и все же - форум глючит?
Аркадий, у тебя в карме каммент к предпоследнему плюсу нормально читается?
Последний нормально, предпоследний выводится html-сущностями.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Пожалуйста, подскажите насчет редактирования шаблонов и плагина с картами

Автор avi133

Ответов: 1
Просмотров: 129
Последний ответ 13.11.2017, 11:36:49
от newkrasno
создание материала

Автор Odin_S

Ответов: 0
Просмотров: 87
Последний ответ 11.11.2017, 01:37:30
от Odin_S
Сайт на Joomla 3.8.1 при проверке анализатором не выдаёт контент

Автор SKIEROCHEK

Ответов: 2
Просмотров: 94
Последний ответ 24.10.2017, 00:39:10
от dmitry_stas
Создание ИС на Joomla

Автор djmasterx

Ответов: 7
Просмотров: 148
Последний ответ 05.10.2017, 09:56:12
от step-di
Создание категорий для компонента

Автор ChervonStudio

Ответов: 6
Просмотров: 145
Последний ответ 29.08.2017, 11:56:50
от robert