Если пользователь щелкнет на кнопке предъявления формы, в рассматриваемом здесь контроллере будет выполнен метод subscribe () , определяемый в классе JoomproSubsControllerSubscription из файла controllers/subscription.php. Ниже приведена первая часть исходного кода этого метода.
/**
* Подписывает на конкретную подписку.
* @param string $key Имя первичного ключа в переменной URL.
* @param string $urlVar Имя переменной URL, отличающееся от имени первичного ключа.
* @return string Возвращаемый URL.
*/
public function subscribe ($key = null, $urlVar = 'sub_id')
{
// проверить полномочия пользователя
$user = JFactory::getUser() ;
if (!$user->authorise('core.edit', 'com_joomprosubs.category.' . >$this->category->id)) {
JError::raiseError(403, JText::_('JERROR_ALERTNOAUTHOR')) ; return false;
// проверить достоверность данных в форме if(!$this->validate()) {
return false; }
// ввести пользователя в группу, если он еще не является ее членом
$model = $this->getModel();
$id = JRequest:rgetlnt('sub_idf);
$subscription = $model- >getltem($id);
// установить переадресацию без идентификатора на случай ошибки $this->setRedirect(JRoute::_('index.php?option=com_joomprosubs&view=form&layout=thankyou', false));
И в этом случае сначала проверяются полномочия пользователя. Ведь злоумышленник может просто изменить форму, чтобы добраться до нужной задачи и идентификатора, и поэтому необходимо убедиться в том, что данный пользователь является законным. После этого вызывается метод validate (), чтобы проверить достоверность данных в форме. Более подробно этот метод будет рассматриваться ниже. Затем происходит обращение к модели с целью получить элемент подписки. И наконец, устанавливается ссылка для переадресации без идентификационного номера. Как будет показано далее, эта ссылка указывает на компоновку экрана с сообщением о неудачном завершении операции.
Обратите внимание на то, что метод JRoute: :_() вызывается с логическим значением false в качестве второго аргумента. По умолчанию в качестве второго аргумента этого метода указывается логическое значение true, что приводит к вызову функции html special chars () для экранирования специальных символов в URL. Напомним, что в этой функции символ 6 заменяется на &ахпр;. Когда метод JRoute: :_ () используется для построения URL, то, как правило, второй его аргумент опускается, а следовательно, он принимает выбираемое по умолчанию значение. Но если метод JRoute::_ () используется для построения URL в целях переадресации, то в качестве второго его аргумента следует указать логическое значение false, чтобы не экранировать специальные символы в URL. В противном случае при обработке переадресации переменные запроса будут указаны в URL неверно (например, вместо ключа Itemid в массиве $_REQUEST окажется & Itemid).
Ниже приведена остальная часть исходного кода метода subscribe ().
if (!in_array($subscription->group_id, $user->groups)) {
if (!JUserHelper:raddUserToGroup($user->id, $subscription->group_id)) { $this->setMessage($model->getError(), 'error'); return false; } }
// добавить или обновить строку в таблице соответствий if (!$result = $model->updateSubscriptionMapping($subscription, >$user)) {
$this->setMessage($model->getError(), 'error');
return false;}
//до сих пор все складывалось удачно, инициировать событие
onAfterSubscribe JDispatcher::getlnstance()->trigger('onAfterSubscribe', array(&$subscription));
// включить идентификатор в переадресацию для сообщения об удачном завершении операции
$this->setRedirect(JRoute::_('index.php?option=com_joomprosubs&view=form&layout=thankyou'>&sub_id=' . $id, false) ) ;
return true; }
В этом фрагменте кода в базу данных вносятся изменения, отражающие тот факт, что пользователь совершил подписку. Напомним, что для совершения подписки требуется выполнить два действия. Во-первых, ввести пользователя в группу, сформированную в системе списков контроля доступа (ACL) для данной подписки. И во-вторых, добавить строку в таблицу соответствий, чтобы записать в ней подробные сведения о подписке.
Для этого сначала проверяется, не является ли пользователь уже членом данной группы. Если он им не является, то для ввода пользователя в группу вызывается метод JUserHelper: raddUserToGroup (). И если эта операция завершится неудачно, то составляется сообщение об ошибке и возвращается логическое значение false.
B cлeдyющeй cтpoкe кoдa из мoдeли вызывaeтcя мeтoд updateSubscription () , и если он возвращает логическое значение false, то устанавливается состояние ошибки. Подробнее об этом речь пойдет несколько позже. А далее для рассматриваемого здесь компонента инициируется событие onAfterSubscribe, чтобы найти любые подключаемые модули с таким же именем метода и вызвать их. Для нормальной работы данного компонента это событие не существенно. Его можно инициировать по желанию. И наконец, для переадресации устанавливается полное значение маршрута, включая идентификатор. Это значение будет использовано в компоновке, чтобы проверить, насколько успешно была выполнена поставленная задача. Обратите внимание на то, что и в данном случае в качестве второго аргумента при вызове метода JRoute::_ () указывается логическое значение false.
Понравился материал? Пригодилась информация? Плюсани в социалки!
|