Для формы редактирования в методе getForm () получается объект типа JForm. Ниже в статье представлены методы, вызываемые в ходе этого процесса.
Блок-схема выполнения данного метода выглядит немного запутанной, поскольку некоторые методы вызываются из родительских классов. Класс WeblinksModelWeblink расширяет класс JModelAdmin, который, в свою очередь, расширяет класс JModelForm, а тот — класс JModel. В данном примере методы loadForm () и preprocessForm () вызываются из класса JModelForm, тогда как метод bind () — из класса JForm.
Ниже приведена первая часть исходного кода из метода getForm ().
public function getForm($data = array (), $loadData = true)
// инициализировать переменные $app = JFactory::getApplication();
// получить форму $form = $this->loadForm('com_weblinks.weblink', 'weblink' array('control' => 'jform', 'load^data' => $loadData));
(empty($form)) { return false;
В строке кода, выделенной выше полужирным, вызывается метод loadForm () из родительского класса JModelForm. В качестве первого аргумента при вызове этого метода указывается переменная $name со значением "com_weblinks. weblink", в качестве второго аргумента — переменная $ source со значением "weblink", в качестве третьего аргумента — ассоциативный массив, инициируемый непосредственно в данной строке кода. В методе loadForm () проверяется, была ли форма уже кеширована. Если она не кеширована, то выполняется приведенный ниже код из блока try/catch.
{
$form = JForm::getinstance($name, $source, $options, false, $xpath);
if (isset($options['load_data']) && $options['load_data']) {
// получить данные для формы
$data = $this->loadFormData(); j
} else {
$data = array(); }
// разрешить дополнительное видоизменение формы, а также инициируемых событий
// Данные передаются потому, что они могут потребоваться в подключаемых модулях.
$this->preprocessForm($form, $data); j
// загрузить данные в форму после предварительной (
// обработки в подключаемых модулях
>
$form->bind($data); } catch (Exception $е) {
$this->setError($e->getMessage());
return false; }
Если вы незнакомы с блоками try/catch, обращайтесь за справкой к приведенной далее врезке "Исключения и блоки try/catch". Метод getlnstance () выполняется в блоке try, поскольку этот метод может сгенерировать исключения, для обработки которых служит блок catch. В теле метода getlnstance () проверяется, не является ли переменная $data пустой. Эта переменная может содержать имя XML-файла или символьную строку с кодом XML для формы. Далее в методе getlnstance () проверяется первый символ из переменной $data. Если это символ <, то предполагается, что в данной переменной содержится символьная строка с кодом XML, а далее предпринимается попытка создать форму с помощью метода load () из класса JForm. В данном примере переменная $data содержит имя XML-файла weblink, и поэтому вместо метода load() из класса JForm для загрузки формы используется этот файл, а именно models/forms/weblink.xml. В обоих методах форма создается из элементов f ieldset и field разметки в коде XML. В файле weblink. xml определяются два элемента fieldset, содержащие ряд элементов разметки field. Более подробно применение элементов разметки полей для воспроизведения формы будет показано далее в этой главе, когда будут рассматриваться файлы компоновки экранной формы редактирования.
Все возникающие ошибки полностью обрабатываются в методе getlnstance () . Нужно лишь сгенерировать исключение соответствующего типа для каждого условия возникновения ошибки. А исключения обрабатываются в блоке catch вызывающего метода, как показано в приведенном выше коде. В данном случае характер ошибки устанавливается, исходя из сообщения, получаемого от объекта исключения, а затем возвращается логическое значение false.
Понравился материал? Пригодилась информация? Плюсани в социалки!
|