Комментарии

Модель ввода и редактирования подписок
( 0 Голосов )

В рассматриваемом здесь представлении из модели вызываются методы getForm (), getltem() и getStateO, поэтому рассмотрим далее класс модели JoomproSubsModelSubscription, объявляемый в файле models/subscription.php. Напомним, что методы getForm() и getltem() наследуются в этом классе модели из классов JModelAdmin и JModel соответственно. Кроме того, в нем определяются еще шесть методов.

В первой части файла models/subscription.php определяется сам класс модели, а также метод canDelete (), как показано ниже.

Метод canDelete () вызывается при выполнении задачи. В нем просто проверяется, разрешено ли пользователю удалить элемент. Однако эта проверка полномочий производится лишь на уровне категории. В Joomla система списков контроля доступа (ACL) имеет иерархический характер, и поэтому полномочия достаточно проверить лишь на уровне категории. Так, если на уровне категории не установлены полномочия на выполнение данного действия, автоматически будут унаследованы полномочия, заданные на уровне компонента. Это избавляет от необходимости проверять полномочия на обоих уровнях иерархии доступа.

Далее в рассматриваемом здесь классе модели определяется метод canEditState (), как показано ниже.

/**
* Метод для проверки возможного изменения состояния записи.
* @param  object Объект записи.
* @return boolean Истинно, если разрешается изменить состояние записи. По умолчанию соответствует полномочиям, установленным на уровне компонента.
*/

protected function canEditState($record) { $user = JFactory::getUser(); if (!empty($record->catid)) { return $user->authorise('core.edit.state', ^>'com_joomprosubs.category.'.(int) $record->catid); } else { return parent::canEditState($record); } }

Этот метод вызывается всякий раз, когда изменяется состояние "опубликовано" редактируемого элемента. И в этом методе только проверяется, разрешено ли пользователю изменить состояние данного элемента.

Ниже приведен исходный код следующего далее метода getTable ().

/**
* Возвращает ссылку на объект типа Table и всегда создает его.
* @param type Тип таблицы для получения экземпляра ее объекта.
* @param string Необязательный префикс для имени табличного класса.
* @param array Необязательный массив конфигурации модели.
* @return JTable Объект базы данных.
*/

public function getTable($type = 'subscription', prefix = 'JoomproSubsTable', $config = array ()) { return JTable::getlnstance($type, $prefix, $config); }

Этот метод вызывается всякий раз, когда предполагается запись данных в таблицу. Он всего лишь предоставляет нужное имя таблицы и получает экземпляр ее объекта из класса JTable.

Далее следует приведенный ниже метод get Form ().

/**
* Метод для получения формы записи.
* @param array $data Необязательный массив данных для опроса в форме.
* @param boolean loadData Истинно, если в форму должны быть загружены ее собственные данные (по умолчанию),   иначе — ложно.
* @return JForm Объект типа JForm, возвращаемый при успешном завершении операции, иначе — логическое значение false.
*/

public function getForm($data = arrayO, $loadData = true) {
// инициализировать переменные $app = JFactory::getApplication ();
// получить форму  $form = $this->loadForm('com_joomprosubs.subscription', 'subscription', array('control' => 'jform', 'load_data' => $loadData)); if (empty($form)) { return false;
// определить правильность проверяемых полномочий
if ($this->getState('subscription.id')) {
// Существующая запись. Может быть отредактирована только в выбранных категориях. $form->setFieldAttribute('catid', 'action', 'core.edit'); } else {
// Новая запись. Может быть создана только в выбранных категориях $form->setFieldAttribute('catid', 'action', 'core.create');
// видоизменить форму на основании контроля прав доступа if (!$this->canEditState((object) $data)) {
// запретить отображение полей $form->setFieldAttribute('published', 'disabled', 'true'); $form->setFieldAttribute('publish_up', 'disabled', 'true'); $form->setFieldAttribute('publish_down', 'disabled', 'true');
// сделать поля недоступными на время сохранения. //В контроллере уже проверено, что эту запись можно редактировать. $form->setFieldAttribute('published', 'filter', 'unset'); $form->setFieldAttribute('publish_up', 'filter', 'unset'); $form->setFieldAttribute('publish down', 'filter', 'unset'); return $form; }

Этот метод вызывается в двух местах цикла.

  • При открытии формы для редактирования.
  • При сохранении данных формы.

В этом методе сначала получаются данные для формы и проверяются полномочия пользователя на редактирование или создание элемента. Затем в нем проверяется, разрешено ли пользователю редактировать состояние подписки. Если у него нет таких полномочий, то выполняются следующие действия.

Поля формы делаются недоступными и не отображаются в форме, для чего в атрибуте disabled устанавливается логическое значение true.

Любые изменения, которые могут быть внесены в этих полях, отфильтровываются, для чего в атрибуте filter устанавливается значение unset.

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

Класс JForm позволяет очень просто организовать такую проверку. Установкой значения "unset" в атрибуте filter классу JForm предписывается удалить любые данные, которые могли быть введены пользователем. В этом случае можно выяснить, что эти данные могли быть введены в браузере кем-то, видоизменившим форму после того, как поля формы были сделаны недоступными для ввода в обычном режиме. Эта надежная мера защиты от подобного рода злонамеренных попыток реализуется в коде данного класса, не требуя дополнительной проверки. Она служит характерным примером применения класса JForm для динамического изменения состояния и защиты от взлома.

Далее следует приведенный ниже метод getFormData ().

/**
* Метод для получения данных, которые должны быть внесены в форму.
* @return mixed  Данные для формы.
*/

protected function loadFormData() {
// проверить наличие введенных ранее данных в текущем сеансе работы $data = JFactory::getApplication()->getUserState -> ('com_joomprosubs.edit.subscription.data', array()); (empty($data))    { $data = $this->getltem();
// заполнить  форму рядом выбираемых по умолчанию значений if ($this->getState('subscription.id') == 0) { $app = JFactory:rgetApplication(); $data->set('catid',   JRequest::getlnt('catid', Q>$app->getUserState('com_joomprosubs.submanager.filter.category_id')));}} $data; }

Сначала в этом методе получаются любые данные, которые могли быть сохранены в текущем сеансе работы. Напомним, что это делается для того, чтобы пользователю не пришлось еще раз заполнять форму полностью, если данные в каком-нибудь из ее полей окажутся недействительными. Если же в текущем сеансе работы не окажется введенных данных, они получаются с помощью метода get Item (). А если вводится новый элемент содержимого, то проверяется потребность его фильтрации по категории, и в таком случае идентификатор категории выбирается для формы по умолчанию.

И в последней части рассматриваемого здесь класса определяется метод prepare Table (), как показано ниже.

/**
* Подготавливает и подвергает таблицу дополнительной обработке перед сохранением.
*/

function prepareTable(&$table) { $table->alias = JApplication::stringURLSafe($table->alias); (empty($table->alias)) { $table->alias = JApplication:-.stringURLSafe ($table->title) ; }   // конец класса

В этом методе проверяется, насколько безопасным для URL может оказаться столбец alias, содержащий псевдоним в подготавливаемой таблице. Ведь псевдоним используется в URL, если установлена кнопка-переключатель Yes параметра Search Engine Friendly URLs на вкладке SEO диалогового окна Global Configuration. Кроме того, URL автоматически устанавливается по названию подписки, если псевдоним не задан. В этом случае пользователь может пропустить поле ввода псевдонима, если желает употреблять название в качестве псевдонима.


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


Теги:
 
Похожие новости