Комментарии

Модель для формы в Joomla 2.5
( 0 Голосов )

 

Как пояснялось при обсуждении шаблона проектирования MVC, модель, как правило, отвечает за взаимодействие с базой данных. В данном случае из модели вызывается метод updateSubscriptionMapping () для обработки тех изменений в базе данных, которые требуется внести в таблицу соответствий.

Класс модели JoomproSubsModelForm объявляется в файле models/form.php. Ниже приведена первая часть исходного кода этого класса модели.

<?php 
/** * @copyright Copyright (С) 2013. All rights preserved. * @license  GNU General Public License version 2 or later; see LICENSE.txt
*/
// прямой доступ отсутствует defined('_JEXEC) or die;
JLoader::register('JoomproSubsModelSubscription', >JPATH_COMPONENT_ADMINISTRATOR.'/models/subscription.php');
/**
* Модель компонента Joomprosubs. * ©package Joomla.Site * @subpackage com_joomprosubs
*/ class  JoomproSubsModelForm extends  JoomproSubsModelSubscription {

Как видите, этот класс расширяет класс модели из административной части, что позволяет вызывать методы, необходимые для получения элементов подписки. Обратите также внимание на применение метода JLoader: : register (), которому отдается предпочтение над командой require_once.

В данном классе модели определяется единственный открытый метод update-SubscriptionMapping {). Ниже приведен исходный код этого метода.

/**
* Метод для ввода или обновления таблицы соответствий подписок.
* Если строка уже имеется в таблице, обновляет начальную и конечную
* даты подписки, в противном случае добавляет в таблицу новую строку.
* @param  Jobject    $subscription    Объект подписки.
* @param  JUser $user Объект пользователя.
* @return boolean Истинно, если операция завершается
* успешно, а иначе — ложно.
*/
public function updateSubscriptionMapping($subscription, $user) {
// проверить достоверность введенных данных if (((int) $subscription->id) && ((int) $subscription->duration) Q>&& ((int) $user->id) ) { $today = JFactory::getDate()->toSQL();
$endDate = JFactory::getDate('+ ' . (int) >$subscription->duration . ' days')->toSQL();
// проверить существование строки в таблице соответствий
$mapRow = $this->getMapRow($subscription->id, $user->id);
if ($mapRow === false) {
// ошибка в базе данных return false; } else if ($mapRow) {
//  строка уже имеется в таблице соответствий, поэтому обновить ее
if (!$this->updateMapRow($subscription->id,   $user->id,   $today, 4>$endDate)) { return  false; } } else {
// строка отсутствует в таблице соответствий, поэтому добавить  в нее новую строку if   (!$this->addMapRow($subscription->id, $user->id, $today, $endDate)) { return  false; }
//в данный момент база данных успешно обновлена return true;

Сначала в данном методе проверяется наличие действительных ненулевых целочисленных идентификаторов пользователя и подписки, а также срок ее действия, и затем рассчитывается конечная дата подписки с помощью метода getDate () из класса JFactory. Этот метод принимает в качестве своего аргумента промежуток времени относительно текущего момента времени, например "+ 10 minutes" (10 минут) или "+ 30 days" (30 дней). В данном случае в качестве аргумента ему передается промежуток времени " + хх days", где хх — срок действия подписки в днях.

Далее вызывается метод getMapRow (), чтобы выяснить, имеется ли искомая строка в таблице соответствий. Если такая строка имеется, то вызывается метод updateMapRow (), чтобы обновить поля в этой строке. В противном случае вызывается метод addMapRow (), чтобы добавить строку в таблицу.

Ниже приведен исходный код метода getMapRow (). protected function getMapRow($subID, $userID) {

$db = $this->getDbo();
$query = $db->getQuery(true);
$query->select('subscription_id,   user_id, start_date, end_date');
$query->from($db-  >nameQuote('#joompro_sub_mapping'));
$query->where('subscription_id = ' . (int) $subID);
$query->where('user_id = ' . (int) $userID);
$db->setQuery($query);
$data =  $db->loadObject();
if   ($db->getErrorNum())   {
$this->setError(JText::_('COM_JOOMPROSUBS_GET_MAP_ROW_FAIL')); return false;
} else {
return $data;

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

Ниже приведен исходный код метода updateMapRow ().

protected function updateMapRow($subID, $userID, $startDate, $endDate) {
$db =  $this->getDbo(); $query = $db->getQuery(true);
$query->update($db->nameQuote('#joompro_sub_mapping'));
$query->set('start_date = ' . $db->quote($startDate)); $query->set('end_date = ' . $db->quote($endDate)); 
$query->where('subscription_id = ' . (int) $subID);
$query->where('user_id = ' . (int) $userID);
$db->setQuery($query);
if ($db->query()) { return true; }   else   { $this->setError(JText::_('COM_JOOMPROSUBS_UPDATE_MAP_R0W_FAIL')); return  false; } }

В данном методе формируется запрос на обновление начальной и конечной дат в строке таблицы. И в этом случае указываются столбцы с идентификаторами подписки и пользователя, чтобы получить доступ к нужной строке таблицы.

Далее следует метод addMapRow (), исходный код которого приведен ниже.

protected function addMapRow <$subID, $userID, $startDate, $endDate) {
$db =  $this->getDbo(); 
$query =  $db->getQuery(true); $query->insert($db->nameQuote('# joompro_sub_mapping')); $query->set('subscription_id = * . (int) $subID);
$query->set ('user__id = * . (int) $userID) ;
$query->set('start_date = ' .$db->quote($startDate));
$query->set('end_date = ' . $db->quote($endDate)) ;

$db->setQuery($query);
if ($db->query()) { return  true; } else { $this->setError(JText::_('COM_JOOMPROSUBS_ADD_MAP_ROW_FAIL')); return  false;

В этом методе сначала формируется запрос на ввод строки в таблицу и задаются столбцы для идентификаторов подписки и пользователя, а также начальной и конечной дат. Затем составляется сообщение об ошибке, если обработка запроса завершится неудачно. Обратите внимание на то, что для обращения с датами используется метод quote () из класса JDatabase. В данном примере даты указываются в формате "гг-мм-дд<пробел>чч:мм:сс" (например, "2012-08-10 22:40:45"). Их приходится заключать в кавычки, поскольку они содержат символ пробела.

И пocлeдним в paccмaтpивaeмoм здecь клacce мoдeли являeтcя мeтoд populateState (). Этот метод вызывается в тот момент, когда в представлении вызывается метод get ('Item'). Ниже приведен исходный код метода populateState ().

protected function populateState () {
$app = JFactory::getApplication();

//  загрузить  состояние из запроса $pk = JRequest::getlnt('sub_id'); $this->setState (' joomprosub.sub__id', $pk) ;
// добавить  переменную совместимости с принятыми по умолчанию условными обозначениями $this->setState('form.id*, $pk); $return = JRequest::getVar('return', null, 'default', 'base64'); if (!JUri::islnternal(base64_decode($return))) { $return = null; } $this->setState('return_page',   base64_decode($return));

//  загрузить  параметры $params  =  $app->getParams(); $this->setState('params', $params); $this->setState('layout', JRequest::getCmd('layout')); }

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

 


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


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


Защитный код