Заметка относится к вопросу разработки компонентов для CMS Joomla! и будет интересна всем, кто идет дальше рядового пользователя, создавая собственные дополнения к этой системе управления сайтами.
Рассмотрим взаимодействие Модели с формой на примере административной части нового компонента Joomla. Задача в том, чтобы на странице, предназначенной для работы с записями из базы данных, реализовать вывод формы. Ее поля будут использоваться для добавления или редактирования информации. Где описываются поля формы и как она вызывается в коде, читайте далее.
Как появляются формы в Joomla
За вывод формы на странице пользователя отвечает Вид компонента. Набор полей формы и другую необходимую информацию ему передает Модель. В свою очередь описание полей вводится при разработке компонента и находится в xml-файле.
Таким образом взаимодействие по схеме MVC выглядит следующим образом:
- По запросу пользователя Контроллер передает управление Виду.
- Вид запрашивает данные формы у Модели.
- На основании xml-файла Модель возвращает данные Виду.
- Через шаблон Вида форма выводится на странице пользователя.
Как выглядит взаимодействие Модели с xml-файлом в коде? Рассмотрим этот вопрос поэтапно.
Создаем класс Модели
Допустим, название компонента — com_spisok.
Данные в базе сгруппированы по категориям.
Тогда класс Модели будет описан следующим образом:
class SpisokModelCategory extends JModelAdmin { }
Класс является наследником класса JModelAdmin. Хотя в качестве родительского класса может использоваться JModelItem или JModelList, именно в JModelAdmin находятся свойства (методы), которые нужны нам в этом конкретном случае. Нас интересует возможность сохранения внесенных пользователем данных в базу. Метод, реализующий эту задачу, есть в JModelAdmin.
Описываем функцию, которая получит форму
public function getForm($data=array(), $loadData=true) {// передаем параметры $form = $this->LoadForm(// запрашиваем свойство класса $this->option.'category',// componentname+formname 'category', // xml-filename array('control'=>'jform','load_data'=>$loadData)// controlname, loaddata (true or false) ); if (empty($form)){// ======= если данных нет return FALSE; } return '$form'; }
Относительно параметров используемой функции.
- $this->LoadForm — обращаемся к методу в классе JModelAdmin, который получает объект формы, загружая ее параметры из xml-файла;
- $this->option — содержит имя нашего компонента (spisok). К нему добавляем имя нашей формы. Вот так: $this->option.’category’
- Далее указываем имя xml-файла без расширения — ‘category’
- Описываем массив параметров. К каждому тегу формы добавляем приставку jform: ‘control’=>’jform’. В результате html-код будет выглядеть так: <іnput type="text" name='jform[name]' />
- ‘load_data’=>$loadData — в зависимости от значения $loadData, которое может быть TRUE или FALSE в поля формы будет или не будет загружаться информация из базы данных. Если форма предназначена для редактирования, передается TRUE, если только для добавления новых данных — FALSE