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

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

Я хочу создать расширенный компонент, который будет функционировать как «панель мониторинга», отображающая данные из нескольких таблиц базы данных со всеми функциями интерфейса CRUD (CREATE, READ, UPDATE, DELETE) администратора Joomla. Это означает, что мне нужно несколько моделей (из философии 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 Tutorial или компонентами, созданными из широко используемого и популярного инструмента Component Creator. Либо компонент не сможет загрузить страницу при вызове, либо не будет передавать данные в представление с помощью простой копии и вставить в любой из нескольких контроллеров, созданных создателем компонента или Joomla hello world tutorial.

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

Я смог успешно использовать несколько моделей с одного и того же представления, совершив вызовы непосредственно в двух файлах просмотра в правильно сформированные модели. Я не следил за документацией 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); 

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

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

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