Комментарии

Задача подписки в Joomla 2.5
( 0 Голосов )

 

Если пользователь щелкнет на кнопке предъявления формы, в рассматриваемом здесь контроллере будет выполнен метод 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.

 


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


 
Похожие новости