Комментарии

Функции контроллера в компоненте Weblinks (Часть 2)
( 0 Голосов )

В самом URL указывается решаемая задача: weblink.edit, т.е. редактирование веб-ссылки. Этим методу getlnstance () из класса JController предписывается найти контроллер с именем WeblinksControllerWeblink. Его имя составляется по следующему образцу:

<имя компонента> + Controller + <первая часть названия задачи>

Пример 2. Пользователь щелкает на названии веб-ссылки, чтобы отредактировать ее

Ниже приведены исходные данные для первой части данного примера.

  • URL: administrator/index.php?option=com_weblinks&task=weblink.edit&id=7.
  • Задача: weblink. edit.
  • Контроллер: класса WeblinksControllerWeblink из файла controllers/web-link, php.
  • Выполняемый метод контроллера: JControllerForm->edit ().
  • Переадресация контроллера: index.php?option=com_weblinks&view=weblin k&layout=edit&id=7.

Метод getlnstance () из класса JController, находящегося в файле libraries/ joomla/application/component/controller.php, содержит следующий код для обработки указанной задачи:

// проверить команду контроллер.задача if (strpos($command, '.') !== false) {
// расчленить команду контроллер.задача
list($type, $task) = explode('.', $command);
// определить имя файла контроллера и путь к нему $file = self::createFileName('controller', array('name' => $type, V format' => $ format) ) ; $path = $basePath.'/controllers/'.$file;
// восстановить задачу без контекста контроллера JRequest::setVar('task', $task);

В приведенном выше фрагменте кода название задачи расчленяется на части, разделяемые точкой. В данном примере задача weblink.edit превращается в массив, где weblink — тип задачи, a edit — ее название. Тип задачи становится третьей частью имени класса контроллера (в данном случае — Weblink в WeblinksControllerWeblink). Затем переменная запроса на обработку задачи изменяется таким образом, чтобы в нее была включена лишь вторая часть названия задачи. В данном примере в переменную $_ REQUEST ['task'] включается лишь часть edit из названия задачи weblink. edit.

Когда черед доходит до строки кода $controller->execute (), выполнение задачи редактирования веб-ссылки поручается классу WeblinksControllerWeblink. У этого класса отсутствует собственный метод edit (), и поэтому он вызывает метод из своего родительского класса JControllerForm, находящегося в файле libraries/joomla/application/component/controllerform.php. В этом методе проверяется, разрешено ли текущему пользователю редактировать данный элемент и снят ли он с регистрации для другого пользователя. Если все нормально, то идентификатор данного элемента сохраняется в переменной сеанса работы пользователя. Он используется на следующей стадии обработки, когда происходит переадресация и фактическая загрузка элемента для редактирования.

И на последней стадии устанавливается и происходит переадресация по новому URL, используемому в Joomla для загрузки редактируемого элемента. В данном случае переадресация происходит по следующему URL:

index.php?option=com_weblinks&view=weblink&layout=edit&id=7

Слово administrator добавляется в начале URL при обработке методом redirect (), поскольку действие происходит в административной части веб-сайта. 

Обработкой URL для переадресации начинается второй цикл запроса. Ниже приведены исходные данные для этой обработки.

  • URL: administrator/index.php?option=com_weblinks&view=weblink&lay out=edit&id=7
  • Задача: не указана (по умолчанию решается задача отображения информации).
  • Контроллер: класса WeblinksController из файла controller.php.
  • Выполняемый метод контроллера: WeblinksController->edit ().
  • Переадресация контроллера: отсутствует.

Указанный выше URL не содержит задачу, и поэтому снова используется базовый класс контроллера WeblinksController и выполняется метод display (). Этот метод содержит следующий код:

$view = JRequest::getCmd('view', 'weblinks'); $layout = JRequest::getCmd('layout', 'default'); $id = JRequest::getInt('id');

//  проверить наличие формы редактирования ($view == 'weblink'   &&  $layout == 'edit' && !$this->checkEditId('com_weblinks.edit.weblink', $id))   {
//не разрешать  несанкционированный доступ  к форме $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_UNHELD_ID', $id)); $this->setMessage($this->getError(), 'error'); $this->setRedirect(JRoute::_('index.php?option=com_weblinks&view=weblinks', false)); false; }

Напомним, что в предыдущем цикле запроса идентификатор редактируемого элемента был сохранен в переменной сеанса работы пользователя. Поэтому в методе checkEditld () текущий идентификатор проверяется на совпадение с сохраненным ранее. А для чего это нужно делать?

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

Если все нормально, то выполнение метода display () из класса WeblinksController продолжается далее. На этот раз указаны представление и компоновка, и поэтому форма редактирования отображается вместо экранной формы диспетчера. Эта форма отображается еще и потому, что переадресация отсутствует. Таким образом, выполняется один цикл запроса для проверки полномочий пользователя на редактирование данного элемента. При этом формируется URL для переадресации к форме редактирования с целью ее последующего отображения.


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


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


Защитный код