Как включить несколько моделей в одном представлении для компонента Joomla 3.x, созданного с помощью Component Creator

Компоненты Joomla используют модель MVC. Component Creator - широко используемый инструмент, платный уровень которого поддерживает создание многотабличных представлений с импортом SQL. Также разработчики создают компоненты с нуля в соответствии с документацией Joomla.

Я хочу создать расширенный компонент, который функционирует как "панель мониторинга", отображающая данные из нескольких таблиц базы данных со всеми возможностями Joomla для администратора и пользователя для внешнего интерфейса CRUD (CREATE, READ, UPDATE, DELETE). Это означает, что мне нужно, чтобы несколько моделей (из философии MVC) рисовали из нескольких таблиц базы данных, показанных на экране одновременно.

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

$view = $this->getView( 'model-a', 'html' );
$view->setModel( $this->getModel( 'model-a' ), true );
$view->setModel( $this->getModel( 'model-b' ) );
$view->display();

а затем вызовите эти модели с методом отображения в представлениях:

$item1 = $this->get( 'data1' );
$item2 = $this->get( 'data2', 'model-b' );

Тем не менее, эти инструкции, приведенные в документации Joomla, недостаточны или несовместимы с компонентом, созданным при соблюдении предоставленного учебного пособия по Joomla Hello World, или компонентов, созданных из широко используемого и популярного инструмента Component Creator. Либо компонент не сможет загрузить страницу при вызове, либо не передаст данные в представление с простым копированием и вставкой в ​​любой из нескольких контроллеров, созданных создателем компонента, или Joomla hello world tutorial.

Как я могу вызвать несколько моделей в одном представлении для компонента Joomla 3.X?

1 ответ

Решение

Мне удалось успешно использовать несколько моделей из одного представления, совершая вызовы непосредственно в двух файлах представления для правильно сформированных моделей. Я не следовал документации Joomla, потому что я не модифицировал ни один из возможных контроллеров (один из которых является контроллером для всего компонента, а другой - для конкретного вида). Я также не использовал функции, представленные в документации Joomla, так как они вызывали ошибки.

Согласно надлежащему соглашению Joomla MVC, представление создается двумя файлами в соответствующей директории представления и подпапке:

  • / site / views / multiviewname /view.html.php (который передает модель в представление)
  • / site / views / multiviewname /tmpl/default.php (который имеет шаблон HTML)

Оба они должны быть изменены, чтобы просматривать данные более чем из одной модели одновременно. Это работает при условии, что все ваши другие виды, контроллеры и модели построены правильно, как это делается автоматически при использовании инструмента "Создатель компонентов". В моем компоненте были сотни файлов, в том числе css, администрирование бэкэнда, установка, язык и т. Д. Все они были собраны в одно мгновение с помощью инструмента создания компонентов.

Сокращенный, но все еще полностью функциональный код выглядит следующим образом:

/ site / views / multiviewname /view.html.php

<?php

jimport('joomla.application.component.view');

class ComponentnameViewMultiviewname extends JViewLegacy
{
//  $items is for the default model
    protected $items;
//  $ItemsOtherModel is for second model. Notice the '$' used here but not elsewhere   
    protected $ItemsOtherModel;

    public function display($tpl = null)
    {
        $app = JFactory::getApplication();
        $this->state = $this->get('State');
        $this->items = $this->get('Items');
        $this->pagination = $this->get('Pagination');
        $this->params     = $app->getParams('com_componentname');

//  sets default model
        $this->setModel( $this->getModel( 'model-a' ), true );
//  sets second model & uses 'JModelLegacy,' contrary to documentation
        $this->setModel(JModelLegacy::getInstance('model-b', 'componentnameModel'));
//  assigns array from the second model to 'ItemsOtherModel.' there is no '$' sign used.
        $this->ItemsOtherModel = $this->get('Items','model-b');

        parent::display($tpl);
    }

}

/ site / views / multiviewname /tmpl/default.php

<?php

echo "<h3>Items from default model</h3> ";
echo var_dump($this->items);

echo "<h3>items from secondary model</h3> ";
//  notice that the '$' is absent from 'ItemsOtherModel'
echo var_dump($this->ItemsOtherModel);

Этот прорыв был возможен только после нескольких дней исследований. Платный инструмент Component Creator был неоценим, чтобы начать меня с правильно сформированного кода, который соответствует стандартам компонентов Joomla MVC. Поработав со всеми файлами в течение нескольких дней, я нашел нужную подсказку в этой ветке групп Google, обратив мое внимание на JModelLegacy класс, найденный при поиске в Google терминов из сообщения об ошибке PHP PHP Notice: Undefined index: оставил на моем сервере при попытке использовать официально документированные методы.

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

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

Другие вопросы по тегам