Комментарии

  • Гид в Париже
  • Система поиска и заказа туров. Видов операций в области недвижимости.
  • paris-vip.ru
Применение модели в Joomla 2.5
( 0 Голосов )

А теперь рассмотрим метод publish () из класса JControllerAdmin. Ниже приведена первая часть исходного кода этого метода.

function publish()
{
// проверить наличие поддельных запросов
JRequest:: checkToken () or die (JText::_('JINVALID_TOKEN')) ;

В этом фрагменте кода проверяется, произошел ли переход к данной стадии обработки из формы Joomla. Благодаря этому предотвращаются попытки злоумышленника получить доступ к рассматриваемому здесь методу непосредственно из браузера без предварительной регистрации на веб-сайте Joomla. Далее в этом методе следуют приведенные ниже строки кода.

// получить  из  запроса  элементы для публикации
$cid =  JRequest:rgetVar('cid', array(), '', 'array');
$data = array('publish'   =>  1,  'unpublish'  =>  0, 'archive'=>  2,
$trash  =>  -2,  ('report'->-3) ;
$task =  $this->getTask();

В этом фрагменте кода из запроса получается список идентификаторов. В данном примере эти идентификаторы необходимо изменить таким образом, чтобы они обозначали состояние удаления. Затем нужно построить ассоциативный массив, в котором целые значения из столбца state таблицы сопоставляются с задачами. Например, для выполнения задачи publish значение изменяется на 1, а для выполнения задачи trash — на -2. Далее задача получается с помощью метода getTask (). Значение, присваиваемое задаче, сохраняется при ее выполнении в приведенном ниже коде метода execute () из класса JController.

function execute($task) {
$this->task =  $task;

Напомним, что задача была изменена в запросе методом get Instance (), в результате чего на момент вызова метода execute () осталась лишь вторая ее часть. Так, в начале данного примера задача называлась weblinks. trash, а теперь от ее названия осталась лишь вторая часть —trash. В приведенном выше фрагменте кода видоизмененная задача (trash) сохраняется в поле $task объекта класса JController, и поэтому она становится доступной с помощью метода getTask (), когда в ней возникнет потребность.

В следующей строке кода из метода publish () значение нового состояния получается из созданного ранее ассоциативного массива:

$value =  JArrayHelper:rgetValue($data, $task, 0, 'int');

Теперь известна задача, которую следует выполнить, а также новое значение, которое необходимо установить в столбце state таблицы. В приведенном ниже следующем фрагменте кода из метода publish () выдается ошибка, если отсутствуют элементы для обработки, а иначе известная задача обрабатывается.

(empty($cid))    {
JError::raiseWarning(500, JText::_($this-> 'text_prefix.'_NO_ITEM_SELECTED')); } else {
// получить модель
$model = $this->getModel();

Для обработки задачи необходимо вызвать метод getModel (), как выделено полужирным в последней строке приведенного выше фрагмента кода. Проанализируем эту строку подробнее, поскольку это очень важно для понимания кода. Прежде всего необходимо выяснить, о каком, собственно, классе идет речь. Несмотря на то что данный код выполняется из класса JControllerAdmin, текущим на самом деле является класс WeblinksControllerWeblinks, поскольку метод publish () отсутствует в классе JControllerAdmin, а следовательно, он наследуется из родительского класса. Таким образом, оператор $this в выражении $this->getModel () обозначает ссылку на класс WeblinksControllerWeblinks.

Существенно, что в шаблоне проектирования MVC контроллеру известно^ как получить модель для выполняемой задачи. Именно это и делает метод getModel (). В действительности, если проанализировать класс WeblinksControllerWeblinks, то в нем можно обнаружить единственный метод — getModel ()! Ниже для справки приведен весь код этого класса.

class WeblinksControllerWeblinks extends JControllerAdmin
{
/**
Замещает получение модели.
@since 1.6 */
public function getModel($name = 'Weblink', $prefix = 'WeblinksModel', ->$config = array('ignore_request' => true)) {
$model = parent::getModel($name, $prefix, $config); return $model; } }

Этот метод (и класс) лишь предоставляет информацию, необходимую для поиска модели, подходящей для данного контроллера. В данном случае класс модели называется WeblinksModelWeblink, где слово Weblink второй раз указывается в единственном числе. Это характерный пример того, как ООП вообще и шаблон MVC в частности позволяет использовать код повторно. Единственным отличием данного конкретного контроллера является имя модели, которое ему требуется. Но только это и обеспечивает код из класса WeblinksControllerWeblinks, а все остальные используемые в нем методы наследуются из его родительских классов. То же самое справедливо и для большинства других контроллеров из административной части веб-сайта на Joomla. Например, в версии Joomla 2.5 имеется 17 классов, расширяющих класс JControllerAdmin, но только 7 из них содержат единственный метод getModel (), а все остальные — совсем немного дополнительного кода, используя главным образом код из своих родительских классов.

Вернемся, однако, к методу publish () из класса контроллера JControllerAdmin. Вслед за получением модели в этом методе следуют приведенные ниже строки кода.

// убедиться в том, что идентификаторы являются целочисленными JArrayHelper::tolnteger($cid);
// опубликовать элементы
if (!$model->publish($cid, $value)) {
JError::raiseWarning(500, $model->getError()); }

В первой строке приведенного выше фрагмента кода вызывается метод из класса JArrayHelper, чтобы проверить, все ли значения, хранящиеся в массиве, являются целочисленными. Напомним, что эти значения взяты из запроса, и поэтому, следуя принципам безопасного программирования, необходимо принять меры защиты против злоумышленников. Если заранее известно, что значение, поступающее из запроса, должно быть целочисленным, то его рекомендуется приводить к целочисленному типу явным образом. Этим обеспечивается надежная защита, поскольку целые значения не могут содержать специальные символы, используемые для внесения злонамеренного кода. Именно поэтому в практике разработки принято использовать целые значения в качестве идентификационных номеров или признаков состояния "опубликовано" в столбцах таблиц.

Далее следует кодовый блок условного оператора if, в котором из модели вызывается метод publish (), возвращающий логическое значение true при успешном его выполнении. А если он возвратит логическое значение false, значит, в модели произошла какая-то ошибка.

Более подробно модели будут рассматриваться далее в этой главе, а вместе с ними и метод publish (). А до тех пор следует иметь в виду, что весь описываемый здесь процесс заключается только во взаимодействии контроллера с моделью для выполнения конкретной задачи. Сначала с помощью метода getModel () получается подходящая модель, а затем из нее вызывается нужный метод. Контроллеру известно лишь имя модели и метода, вызываемого для выполнения каждой задачи. И если у модели правильное имя и подходящие методы, ее можно видоизменить, не затрагивая ничего в самом контроллере. Зачастую имена методов в модели воспроизводят имена методов в контроллере. И хотя следовать этому правилу совсем не обязательно, оно тем не менее упрощает сопровождение кода.

Далее в методе publish (), вызываемом из контроллера, следуют приведенные ниже строки кода.

else {
if ($value ==1) {
$ntext = $this->text_prefix.'_N_ITEMS_PUBLISHED'; } else if ($value == 0) {
$ntext = $this->text_prefix.'_N_ITEMS_UNPUBLISHED'; } else if ($value == 2) {
$ntext = $this->text_prefix.'_N_ITEMS_ARCHIVED'; } else {
$ntext = $this->text_prefix.'_N_ITEMS_TRASHED'; }
$this->setMessage(JText:rplural($ntext, count($cid)));

Этот кодовый блок выполняется в том случае, если метод publish(), вызываемый из модели, завершается успешно. В этом кодовом блоке формируется сообщение о каждой задаче. Обратите внимание на последнюю строку кода, где вызывается метод JText:: plural (), внедренный в версии Joomla 1.6. Этот метод упрощает вывод сообщений, в которых элементы правильно перечисляются во множественном числе на каждом языке.

И в завершающей части метода publish (), вызываемого из контроллера, следуют приведенные ниже строки кода.

$extension = JRequest::getCmd('extension');
$extensionURL = ($extension) ? '&extension=' . => JRequest::getCmd('extension')    :   '';
$this->setRedirect(JRoute::_('index.php?option='. =>$this->option.'&view='.$this->view_list.$extensionURL, false)); }

В этом фрагменте кода устанавливается переадресация. В данном примере расширение в запросе отсутствует, и поэтому переадресация берется из пункта меню (значение com_weblinks переменной option) и представления (значение weblinks переменной view_list). В итоге происходит возврат к экрану Weblinks Manager, где появляется сформированное ранее сообщение об успешном выполнении задачи.


Понравился материал? Пригодилась информация? Плюсани в социалки!


 
Похожие новости
Добавить комментарий


Защитный код