Мне удалось успешно использовать несколько моделей из одного и того же представления, выполняя вызовы непосредственно в двух файлах 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
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.2016JModelLegacy
была правильной функцией, а не вашим предложеннымJModel
. Кроме того, вместо предложенного вами$items= $model->getItems()
я использовал$this->ItemsOtherModel = $this->get('Items','model-b');
. Ваше предложение не сработало бы, потому что в нем не указывалась фактическая модель, которая будет использоваться, что является необходимым шагом при использовании моделей, выходящих за рамки по умолчанию. В обоих случаях ваше предложение не решило проблему. - person John W. Benac   schedule 14.05.2016