Почитать другие заметки или статьи

Каждый разработчик знает, что три кита, на которых строится современный компонент для Joomla — это: контроллер, модель и представление. Достаточно часто возникает необходимость в своём расширении использовать модель стороннего компонента. Например, с помощью модели стандартного «com_content» получить данные статьи.

Шпаргалка сегодняшнего дня о том, как подключить модель стороннего компонента в своём расширении и подключать эту самую модель мы будем, как под Joomla 3, так и под Joomla 4 и Joomla 5.

Как подключить модель в Joomla 3

Начнём с Joomla 3.

Несмотря на то, что по планете широкими шагами шагает Joomla 5, немалое число владельцев сайтов хранит верность третьей версии системы.

Кстати, не так давно житель одной европейской страны рассказал мне, что нет ничего лучше, чем Joomla 2,5.

Итак, код под Joomla 3:

$app = JFactory::getApplication();

JModelLegacy::addIncludePath(JPATH_SITE.'/components/com_content/models');
$model = JModelLegacy::getInstance('Article', 'ContentModel', array('ignore_request' => true));
$params = $app->getParams();
$model->setState('params', $params);

$id = 1; // ID статьи

$article = $model->getItem($id);

Обратите внимание на строчку:

JmodelLegacy::addIncludePath(JPATH_SITE.'/components/com_content/models');

Она указывает каталог, где располагаются модели нужного нам компонента.

В данном случае мы подключили модель фронтальной или лицевой части компонента «com_content» и получили объект статьи.

Поскольку методу «getItem» данной модели для корректной работы требуются параметры компонента, мы их также передали.

Как подключить модель в Joomla 4 и Joomla 5

Joomla 4 и Joomla 5 — это, как сестры близнецы. Отличия есть, но чтобы их найти, нужно хорошенько приглядеться.

Подключение модели для Joomla 4 и Joomla 5 будет происходить одинаково.

Для начала сделаем то, что мы делали для Joomla 3 и получим модель фронтальной части сайта стандартного «com_content».

Выглядеть это будет так:

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;

$app = Factory::getApplication();
$model = $app->bootComponent('com_content')->getMVCFactory()->createModel('Article', 'Site', ['ignore_request' => true]);
$id = 1; // ID статьи
$params = ComponentHelper::getParams('com_content');
$model->setState('params', $params);
$article = $model->getItem($id);

Параметры компонента мы получили несколько по другому.

Это сделано, чтобы избежать ошибки, если модель будет вызываться из административной части сайта.

В отличие от Joomla 3 мы не указываем путь к каталогу с моделями, однако, задаем область сайта, где:

Site — Фронтальная часть сайта

Administrator — Административная часть сайта

Приведу ещё один фрагмент кода, где показано подключение модели моего собственного компонента «J SMS Registration».

Как видим из представленного ниже кода, на этот раз речь идёт об административной части компонента:

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;

$app = Factory::getApplication();
$model = $app->bootComponent('com_j_sms_registration')->getMVCFactory()->createModel('Agregator', 'Administrator', ['ignore_request' => true]);
$id = 1;
$agregator = $model->getItem($id);

Зачем нужен параметр ignore_request?

Вероятно, вы обратили внимание, что при каждом случае подключения модели, мы передавали массив, где был элемент с ключом «ignore_request» и значением «true».

Возникает законный вопрос: что это такое и зачем нужен данный параметр?

Нюанс заключается в том, что при вызове модели есть метод «populateState()», который автоматически вызывается при её подключении.

Метод этот используется для обработки всевозможных параметров, в том числе передаваемых параметров из форм.

Например, если мы, на странице списка статей, в административной панели укажем, что нужно отображать не по 20, а по 40 материалов, то непосредственное участие в этом примет метод «populateState()», который получит новое значение и запомнит его.

Всё это хорошо, однако, при подключении модели из другого компонента, это совершенно не нужно и бесполезно.

Поэтому, мы передаем параметр «ignore_request» в значении «true, в результате чего метод «populateState()» запускаться не будет.

Заключение

Безусловно, описанное выше будет работать, если компонент, к которому вы обращаетесь, написан согласно всем канонам и правилам Joomla.

Если же компонент написан изобретателями велосипедов, а таких немало, то гарантировать подключение модели встроенными средствами Joomla никто не сможет.

На этом хочу откланяться и как всегда оставить ссылку на свою группу VK:

https://vk.com/sitogon

С уважением, Владимир Егоров