Изменение макета представления в Joomla 2.5

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

Я написал компонент в Joomla 2.5, и он работает до сих пор. У меня разные представления, и я могу загружать представления с помощью controller.php. В одном из представлений показана таблица из моей базы данных (данные о командах).

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

Это файловая структура:

views/
- team/
- - tmpl/
- - - default.php
- - -modify.php
- - view.html.php

Это из файла view.html.php:

...
// Overwriting JView display method
function display($tpl = null) {

    ...

    $this->setLayout('modify');
    echo $this->getLayout();
    // Display the view
    parent::display($tpl);
}

Я пробовал разные комбинации setLayout, $tpl = ..., default_modify.php и т. д., но всегда либо получаю макет по умолчанию, либо какую-то ошибку, например «не могу найти изменение макета».

Я загружаю сайт с помощью .../index.php?option=com_test&task=updateTeams

И controller.php выглядит так:

function updateTeams(){
    $model = $this->getModel('teams');
    $view = $this->getView('teams','html');
    $view->setModel($model);

    $view->display();
}

person jost21    schedule 15.09.2013    source источник


Ответы (3)


У меня была аналогичная проблема, я создал какое-то представление профиля пользователя и хотел, чтобы они могли редактировать поля без необходимости создавать для него новую модель (будут иметь аналогичные функции, ненавидеть избыточность...). Что сработало для меня, так это просто вызвать макет следующим образом:

index.php?option=com_mycomponent&view=myview&layout=edit ("изменить" в вашем случае будет "изменить")

Для этого я не трогал view.html.php (ну, сначала я это сделал, но мне не пришлось). И вам не нужно использовать контроллер. Если вы хотите загрузить представление изменения, просто добавьте кнопку в обычное представление со ссылкой на макет изменения. Больше ничего менять не нужно.

Я написал об этом статью в блоге, посмотрите ее, если хотите: http://violetfortytwo.blogspot.de/2012/11/joomla-25-multiple-views-one-model.html

Надеюсь это поможет.

person elk    schedule 17.09.2013
comment
Спасибо, я обязательно попробую это сегодня вечером и посмотрю, сработает ли это для меня. Я, вероятно, также попытаюсь сделать новый вид, так как я хочу узнать, как все это работает. Просто из интереса, не могли бы вы выяснить, как сделать то же самое, не используя другой URL-адрес (...&layout=edit), но используя метод setLayout() в view.html.php? Потому что, если я использую getLayout(), он говорит «изменить», но на самом деле показывает макет default.php. - person jost21; 17.09.2013
comment
Ну, я помню, что я тоже пробовал много разных вещей, но в итоге я использовал URL, потому что он работал :-). Но я только что взглянул на API viewhtml (здесь: api.joomla.org /Joomla-Platform/View/JViewHtml.html) и обнаружил, что существует метод setPath(), который устанавливает путь к макету. Вы пытались использовать это в дополнение к setLayout()? Еще одна вещь, которую я помню: у меня были некоторые проблемы с методом display(), который работал не так, как я хотел. Я просто поместил метод mydisplay() в view.html.php и позволил ему вызвать parent::display(). Попробуй положить туда свои вещи... - person elk; 18.09.2013
comment
У меня пока не работает. Но я создал новый компонент, который ничего не делает, кроме показа «‹a›по умолчанию‹/a›» и второго макета, который показывает «‹a›alternative‹/a›». Оба метода setLayout() и URL-адрес работают там довольно хорошо. Значит, что-то еще должно мешать другому компоненту?!? - person jost21; 18.09.2013
comment
Я понял. Я упростил код, который я разместил здесь, я пропустил, что имя моего макета на самом деле —modifyTeam.php, а заглавная буква «T» была проблемой. Я вспомнил, что действительно читал раньше, что в именах файлов следует избегать заглавных букв. Виноват - person jost21; 18.09.2013

Хорошо, это проблема ... вам не нужен другой макет, вам нужна новая триада MVC, основанная на формах, а не на рендеринге. Итак, если вы посмотрите на любой из основных компонентов контента, вы увидите, что в бэкэнде у них есть mvc, скажем, для ... контактов, и один для контакта, а контакт - это редактор. Если во внешнем интерфейсе вы заметите, что com_content и com_weblinks имеют mvc для статьи/веб-ссылки, а затем отдельные для редактирования.

Вам нужна действительно другая модель, макет и набор действий для редактирования, чем для простого рендеринга.

person Elin    schedule 15.09.2013
comment
Извините, я новичок в MVC и немного запутался. Итак, мне нужна новая модель, новое представление и новый метод в контроллере? Думал может понадобиться отдельный вид, но зачем лишняя модель. Разве многие методы не будут одинаковыми или, по крайней мере, очень похожими? - person jost21; 16.09.2013
comment
Ну, некоторые могут быть одинаковыми, но рендеринг и взаимодействие с формой довольно разные. - person Elin; 18.09.2013
comment
Могу ли я использовать общую модель для обоих представлений? Думаю, это сработает, но будет ли это противоречить соглашениям MVC? Я просто не могу смириться с тем, что у меня будут одинаковые функции в двух файлах - person jost21; 18.09.2013

Старая тема, но она все еще может помочь.
Кажется, что когда кто-то хочет изменить макет, $tpl не должен быть включен в the display() или должен быть null.

Таким образом, предыдущий код будет таким:

function display($tpl = null) {
    /* ... */
    $this->setLayout('modify');
    // Display the view without the $tpl (or be sure it is null)
    parent::display();
}
person Afonafon    schedule 18.10.2017