Как я могу включить несколько моделей в одно представление для компонента 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.

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


person John W. Benac    schedule 14.05.2016    source источник
comment
Вы можете вызвать любую модель изнутри, используя эту $ model = JModel :: getInstance ('MODEL_NAME', 'COMPONENT_NAME'); $ items = $ model- ›getItems (); Использование синтаксиса - ›get ('items') допустимо только в представлении (поскольку get () является методом класса представления)   -  person Amit Ray    schedule 14.05.2016
comment
@Amit Ray JModel не работает, но JModelLegacy работает с Joomla 3.5.1. Когда я использую JModel, я получаю следующую ошибку в журналах моего сервера: PHP Fatal error: Call to undefined method JModel::getInstance() in /var/www/html/components/com_componentname/views/multiviewname/view.html.php. JModelLegacy не выдает ошибку, и страница загружается нормально.   -  person John W. Benac    schedule 14.05.2016
comment
Извините за ошибку, я забыл устаревшую часть. Но решило ли это проблему?   -  person Amit Ray    schedule 14.05.2016
comment
@Amit Ray, JModelLegacy была правильной функцией, а не вашим предложенным JModel. Кроме того, вместо предложенного вами $items= $model->getItems() я использовал $this->ItemsOtherModel = $this->get('Items','model-b');. Ваше предложение не сработало бы, потому что в нем не указывалась фактическая модель, которая будет использоваться, что является необходимым шагом при использовании моделей, выходящих за рамки по умолчанию. В обоих случаях ваше предложение не решило проблему.   -  person John W. Benac    schedule 14.05.2016
comment
Моя работа заключалась в том, чтобы показать вам направление. То, что я смутно вспомнил, я предложил. А Google сделает все остальное.   -  person Amit Ray    schedule 14.05.2016


Ответы (1)


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

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

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

Оба эти параметра необходимо изменить для одновременного просмотра данных более чем одной модели. Это работает при условии, что все другие ваши представления, контроллеры и модели построены правильно, как это делается автоматически при использовании инструмента Component Creator. В моем компоненте были сотни файлов, в том числе 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 для добавления нескольких моделей в одно представление настроена для нескольких отдельных элементов, а не для массивов элементов, показанных здесь.

person John W. Benac    schedule 14.05.2016