Разное

Создание плагина для компонента Ksenmart

Joomla

Часто возникает потребность в расширении возможностей того или иного компонента, при этом сохранении возможности обновить его до более актуальной версии без потери изменений. Именно для этого и предназначены плагины в Joomla. В данном небольшом цикле статей рассмотрим создание плагина для такого компонента как Ksenmart. Статьи рассчитаны на людей, которые уже имеют минимальные базовые навыки по созданию плагинов, сли же вы не обладаете такими навыками, то у нас есть соответствующие статьи.

Знакомство с плагинами для Ksenmart начнём со списка доступных событий. Благо компонент имеет огромное количество событий для гибкого изменения компонента.

События в модели компонента

Каждая функция в модели компонента имеет по два события: до выполнения кода функции и после. Название события до выполнения кода образуется по следующему принципу:

onBeforeExecute + сокращенное название расширения в верхнем регистре + название модели + название функции. Т.е. в таком случае событие в функции getProduct для получения информации о товаре в модели product будет иметь следующий вид - onBeforeExecuteKSMproductgetProduct, где:

  • onBeforeExecute - указывает на событие в начале функции модели.
  • KSM - сокращенное название компонента Ksenmart (сделано это потому что компонент использует плагин ksencore, который является ядром для нескольких компонентов Ksenmart, Ksengallery и т.д.)
  • product - название модели
  • getProduct - название функции

Событие для выполнения после кода функции имеет ту же самую схему, но начинается на onAfterExecute, т.е. будет выглядеть как onAfterExecuteKSMproductgetProduct

События в представлении компонента

Так же есть возможность для подключения кода в представлении (View) компонента. Для функции display это выглядит следующим образом:

  • onAfterView+ сокращенное название расширения в верхнем регистре + название представления, например: onAfterViewKSMproduct

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

  • onBeforeDisplay + сокращенное название расширения в верхнем регистре + название представления + название субшаблона

Для примера возьмем стандартный шаблон Ksenmart, отображение товара, где следующей строкой подключается субшаблон с ценами:

<?php echo $this->loadTemplate('prices');?>

Есть так же два события - до и после. Событие "до" для вывода этого субшаблона выглядит так - onBeforeDisplayKSMproductproduct_prices, где:

  • onBeforeDisplay - указывает на событие при подключении субшаблона
  • KSM - сокращенное название компонента Ksenmart (сделано это потому что компонент использует плагин ksencore, который является ядром для нескольких компонентов Ksenmart, Ksengallery и т.д.)
  • product - название представления
  • product_prices - название субшаблона (обратите внимание, что субшаблон начинается с названия основного шаблона - product)

Событие "после" имеет аналогичную схему и использует префикс - onAfterDisplay.

Собственные события

А теперь несколько слов о самом интересном: в Ksenmart есть возможность создавать собственные события и напрямую обращаться к ним при помощи Ajax. Это возможно благодаря функции pluginAction, находящейся в контроллере ядра ksencore.

Название события строится по схеме:

onAjax + название плагина + название функции. Например: onAjaxPlg_TestSendAsk, где Plg_Test - название плагина.

В таком случае, обращение к плагину при помощи Ajax будет задаваться по следующему url:

index.php?option=com_ksenmart&task=pluginAction&plugin=plg_obrus&action=sendAsk&format=json&tmpl=ksenmart

  • где task - указывает функцию в контроллере для обращения к плагину
  • plugin - передает название плагина к которому необходимо обратиться
  • action - необходимая функция плагина
  • format - формат возвращаемых данных

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

Создаем простой плагин для Ksenmart

Для того, чтобы был понятнее принцип создания плагина, рассмотрим самый простой пример. Сделаем плагин, который будет в карточке товара рядом с названием производителя отображать количество товаров, принадлежащих этому производителю. Назовём плагин manufacturercount.

Создание xml файла опустим, упомяну лишь, что группу для плагина указываем "kmplugins". Посмотрим на основной файл manufacturercount.php, его содержание:


defined('_JEXEC') or die('Restricted access');
 
if (!class_exists('KMPlugin')) 
{
    require JPATH_ROOT . '/administrator/components/com_ksenmart/classes/kmplugin.php';
}
 
class plgKmpluginsManufacturercount extends KMPlugin 
{
    public function onAfterExecuteKSMproductgetProduct($model, $product)
    {
        if(isset($product) && !empty($product->manufacturer->id))
        {
            $db = JFactory::getDbo();
            $query = $db->getQuery(true);
 
            $query
                ->select('count(*)')
                ->from('#__ksenmart_products')
                ->where('manufacturer=' . $db->quote($product->manufacturer->id));
 
            $db->setQuery($query);
            $count = $db->loadResult();
 
            $product->manufacturer->title .= '(' . $count . ')';
 
            return true;
        }
    }
}

Сначала идёт проверка подключен ли класс KMPlugin, в данном плагине нам он необязателен, но в более сложных плагинах может пригодиться. После расширяем этот класс нашим плагином.

Вешаем код на событие onAfterExecuteKSMproductgetProduct, т.е. будет обрабатываться после получения данных о товаре в модели. В нашу функцию приходят 2 переменные - экземпляр объекта модели и экземпляр объекта товара. Нас интересует только второй. Используя данные из второго объекта, производим необходимую выборку из базы данных. Далее у нас два варианта: либо добавить значение к названию, либо добавить объекту новую переменную, которая будет содержать число товаров производителя. У каждого способа есть свои полюсы и минусы.

Первый способ (который на примере) хорош тем, что он не требует внесения изменений в шаблон, при включении плагина в карточке товара сразу же отобразится число товаров. Но плох тем, что если переменная с названием производителя используется ещё где-то в карточке товара, то она тоже получит доп. значение.

Второй способ позволяет нам вывести переменную с числом товаров только там, где нам необходимо, но потребует внести изменения в сам шаблон.

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

Есть ещё третий способ: внесение изменения в шаблон при помощи loadTemplate(), но о нем поговорим позже, когда подойдём к более сложным примерам плагинов.