Метод publish () из модели в CMS Joomla 2.5 |
Ранее был рассмотрен метод // опубликовать элементы if (!$model->publish($cid, $value)) { JError::raiseWarning(500, $model->getError()) ; } Именно здесь из модели вызывается метод publish (). Если он завершается успешно, то возвращается логическое значение true. В противном случае возвращается логическое значение false и предоставляются сведения о возникшей ошибке, которые могут быть извлечены методом getError (). А теперь рассмотрим аналогичный метод publish () из модели, а по существу, из класса JModelAdmin. Он вызывается с двумя аргументами. Напомним, что первым его Обратите внимание на то, что первый аргумент данного метода обозначается префиксом &. Это означает, что данный аргумент передается по ссылке. Так, если изменить значение переменной &$pks в теле вызываемого метода, внесенные изменения окажутся доступными в вызывающем методе из переменной $cid, использовавшейся в качестве аргумента при вызове метода publish (). Причины такого проектного решения будут пояснены несколько позже. В следующих двух строках кода инициализируются объекты диспетчера и пользователя. Как пояснялось ранее, диспетчер используется для инициирования событий, обрабатываемых в подключаемых модулях. Далее создается табличный объект, для чего вызывается метод В этом коде объект класса WeblinksModelWeblink получается из папки tables. В этом классе предоставляются методы, используемые для чтения и записи информации в созданную таким образом таблицу базы данных. В следующей строке кода переменная $pks преобразуется в массив. В данном случае она уже является массивом, и поэтому в этой строке кода никаких особых изменений не происходит. Но это дает возможность вызывать метод publish () как с одним целочисленным элементом, так и с целым массивом. Так, если вызвать его с одним идентификатором, последний будет преобразован в массив. Далее следуют комментарий и последняя строка из первой части метода // включить подключаемые модули содержимого, чтобы изменить событие состояния JPluginHelper::importPlugin('content'); В этой строке кода импортируются подключаемые модули содержимого, которые выполняются при инициировании соответствующих событий. В частности, при изменении состояния "опубликовано" конкретного элемента наступает событие onContent ChangeState. В этом фрагменте кода организуется циклическое обращение к каждому элементу по его идентификатору и проверяются полномочия пользователя на изменение состояния "опубликовано" каждого такого элемента. Сначала исходные по умолчанию значения устанавливаются в столбцах таблицы с помощью метода reset (), а затем по идентификатору каждого элемента вызывается метод Таким образом, если пользователь наделен соответствующими полномочиями, следующий далее кодовый блок условного оператора if пропускается и выполнение рассматриваемого здесь метода продолжается дальше. А если у пользователя нет таких полномочий, то выполняются следующие действия. Во-первых, элемент удаляется по своему идентификатору из массива $pks с помощью команды unset языка РНР. Во-вторых, выводится сообщение, предупреждающее пользователя о том, что у него нет надлежащих полномочий. И в-третьих, происходит возврат из рассматриваемого здесь метода по команде return false. Следует заметить, что где бы команда return ни использовалась в теле вызываемого метода, его выполнение немедленно завершается и происходит возврат в вызывающий метод. Напомним, что при передаче в качестве первого аргумента методу publish () переменная $pks была обозначена префиксом &, т.е. она передавалась по ссылке. Следовательно, при удалении элемента из массива, хранящегося в этой переменной, по команде unset изменения в массиве окажутся доступными в вызывающем методе. Иными словами, изменение переменной $pks в теле метода publish () отразится на состоянии переменной $cid в том контроллере, где этот метод вызывался. Напомним также, что метод publish () вызывался из модели в теле метода publish {) из класса JControllerAdmin следующим образом: if (!$model->publish($cid, $value)) { а затем количество опубликованных веб-ссылок было включено в сообщение так, как показано ниже. $this->setMessage(JText::plural($ntext, count($cid))); Если пользователь попытается удалить в корзину три веб-ссылки, но одна из них относится к той категории, где у него нет полномочий выполнять действие core. edit. state, то в конечном итоге в корзину попадут лишь две веб-ссылки. Но поскольку необработанный элемент все равно удаляется по команде unset из массива $pks, передаваемого данному методу по ссылке &, то изменения в массиве $pks отразятся на состоянии переменной $cid в вызывающем методе publish () текущего контроллера. Таким образом, переменная $cid в данном примере будет содержать лишь два элемента, а в сообщении будет правильно извещено об удалении в корзину двух, а не трех веб-ссылок. Рассмотрим далее метод canEditState () из класса WeblinksModelWeblink. Ниже приведен его исходный код. protected function canEditState($record) { $user = JFactory::getUser() ; if (!empty($record->catid)) { return $user->authorise('core.edit.state', *b 'com_weblinks.category.'. (int) $record->catid); } else { return parent::canEditState($record); } } Обратите внимание на то, что этот метод объявляется с модификатором доступа protected, а следовательно, он может использоваться только в текущем классе или расширяющем его классе. Это означает, что данный метод предназначен для поддержки метода публикации, но не может быть использован за пределами своего класса. В систему безопасности ACL (списков контроля доступа), внедренную в версии Joomla 1.6, введены специальные полномочия на изменение состояния "опубликовано" конкретного элемента. Для компонента Weblinks эти полномочия могут быть установлены как на уровне самого компонента, так и на уровне его категории. Поэтому в методе canEditState () проверяется, имеется ли категория у текущей записи. (Впрочем, у компонента Weblinks всегда должна быть какая-то категория, а следовательно, подобная проверка оказывается ненужной.) И если такая категория имеется, то вызывается метод authorise () из класса JUser для проверки полномочий текущего пользователя на изменение состояния "опубликовано" веб-ссылки в данной категории. (Обратите внимание на британский вариант написания метода authorise (), поскольку британский английский принят в качестве официального языка для Joomla.) В качестве аргументов метода authorise () указываются выполняемое действие и наименование ресурса. Для категорий наименование ресурса составляется по следующему образцу: <имя компонента> + .category. + идентификатор категории> Если у текущей записи отсутствует категория, из родительского класса JModelAdmin вызывается метод canEditState (), который содержит следующую строку кода: return $user->authorise('core.edit.state', $this->option); В этой строке кода проверяются полномочия на уровне компонента. Поле $this-> option содержит имя компонента (в данном случае com_weblinks). Ранее в этой главе упоминался файл access .xml, который содержит действия ACL, выполняемые на уровне компонента и на уровне категории данного компонента. Кроме того, в этом файле определяются элементы разметки action с атрибутом name="core.edit.state" для обозначения компонентов и категорий по частям. Файл access.xml позволяет отредактировать установленные полномочия для компонентов и категорий. А в коде рассматриваемого здесь метода эти полномочия проверяются. Если пользователю разрешено выполнить указанное действие, из метода authorise () возвращается логическое значение true, в противном случае — логическое значение false. Полученное в итоге значение возвращается далее из метода canEditState (). Ниже приведен следующий фрагмент кода из метода publish () класса JModel Admin. // попытаться изменить состояние записей (!$table->publish($pks, $value, $user->get('id'))) { $this->setError($table->getError()); false; } В этом фрагменте кода, по существу, изменяется значение в базе данных. Для этого вызывается метод В следующем фрагменте кода из метода publish (), определяемого в классе JModelAdmin, вызываются подключаемые модули для обработки события onContentChangeState, как показано ниже. Сначала в этом фрагменте кода задается контекст, чтобы подключаемые модули могли проверить его по мере надобности. Затем созданный ранее объект $dispatcher используется для инициирования упомянутого выше события. В поле $this->event_change_ state конструктором класса JModelAdmin было установлено исходное по умолчанию значение onContentChangeState. Метод Метод И в последней строке кода из рассматриваемого здесь метода возвращается логическое значение true, обозначающее его успешное завершение. Если выполнение данного метода дошло до этой стадии, значит, можно с уверенностью утверждать, что никаких серьезных ошибок не произошло.
Понравился материал? Пригодилась информация? Плюсани в социалки!
Теги:
|
Похожие новости | |
|