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

effrit

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

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

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

*

buyanov

  • Захожу иногда
  • 188
  • 29 / 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

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

effrit

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

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

buyanov

  • Захожу иногда
  • 188
  • 29 / 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

  • Захожу иногда
  • 188
  • 29 / 1
  • Сайты 74
Цитировать
обработать шорткоды

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

effrit

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

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

effrit

  • Легенда
  • 10132
  • 1118 / 13
  • effrit.com
ладно, болванка есть, документация тоже есть.
чего-нить уже можно сотворить )).
зы

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

buyanov

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

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

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

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

Arkadiy

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

  • Легенда
  • 10132
  • 1118 / 13
  • effrit.com
спасибо, товарищи, кажется прояснение наступило )
буду пробовать

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

buyanov

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

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

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

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

robert

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

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

fsv

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

robert

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

buyanov

  • Захожу иногда
  • 188
  • 29 / 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

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

Arkadiy

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

Проблема вебвизором в Яндекс метрике при использовании плагина jch optimize

Автор polezniy

Ответов: 32
Просмотров: 2662
Последний ответ 01.03.2024, 10:26:31
от Vastriet
Пропало главное меню, и контент на главной (после обновления)

Автор GTHack

Ответов: 15
Просмотров: 519
Последний ответ 07.01.2024, 16:00:15
от ProtectYourSite
Не могу обновить контент на странице

Автор Aleksey G

Ответов: 10
Просмотров: 489
Последний ответ 02.01.2024, 22:11:43
от Aleksey G
Получить текущий номер страницы плагина "Разрыв страницы" (pagebreak)

Автор sertlan

Ответов: 1
Просмотров: 439
Последний ответ 12.06.2023, 18:14:09
от sertlan
Доступ в админку без права редактировать контент

Автор NIKOLY

Ответов: 1
Просмотров: 444
Последний ответ 01.06.2023, 14:12:06
от stepan39