Комментарии

Класс новой модели в Joomla 2.5
( 0 Голосов )

Для новой модели придется создать отдельный класс JoomproSubsModelCSVReport, объявляемый в файле models/csvreport.php. Ниже приведена первая часть исходного кода этого класса.

*/

definedC_JEXEC) or die; jimport('joomla.application.component.modellist'); JLoader::register('JoomproSubsModelSubManager', JPATH_COMPONENT.'/models/submanager.php'); /* * Методы, поддерживающие список записей подписок. */
class JoomproSubsModelCSVReport extends JoomproSubsModelSubManager {
/* * Методы для установки состояния на основании значений, выбираемых из представления подчиненного диспетчера. */
public function setModelState () { $this->context = 'com_joomprosubs.submanager'; parent::populateState (); }

Как видите, этот класс расширяет класс JoomproSubsModelSubManager, в котором определяется модель для экрана диспетчера подписок. Это дает возможность использовать конструктор и метод populateState (), уже написанные для данного класса. Напомним, что в конструкторе данного класса составляется список действительных столбцов для сортировки данных. И сделано это для защиты от взлома.

Первым в рассматриваемом здесь классе объявляется метод setModelState (). Напомним, что отчет, составляемый в формате CSV, необходимо отфильтровать и упорядочить, используя значения, установленные на экране диспетчера подписок. Для этого необходимо вызвать метод populateState () со значением контекста из экрана диспетчера подписок. Но здесь имеется одно небольшое препятствие. Ведь метод populateState () является защищенным, а следовательно, его нельзя вызывать непосредственно из класса контроллера или переопределить (т.е. создать другой метод с таким же именем), изменив его модификатор доступа на public и тем самым сделав этот метод открытым. Ведь когда метод из родительского класса переопределяется в производном подклассе, у него должен быть точно такой же модификатор доступа.

Но в то же время метод populateState () можно вызвать из текущей модели, поскольку она определена в подклассе, производном от класса JoomproSubsModelSubManager. Следовательно, в качестве выхода из данного положения в классе новой модели можно создать (а не переопределять) новый открытый метод, чтобы вызвать в нем защищенный метод из родительского класса. Именно для того в классе JoomproSubsModelCSVReport и создается открытый метод setModelState (), чтобы воспользоваться им для вызова защищенного метода populateState () из родительского класса. Это даст также возможность вызывать открытый метод setModelState () из контроллера.

Следующим в новой модели является метод getListQuery (), который переопределяет аналогичный метод в родительском классе. А для этого у него должен быть такой же самый модификатор доступа (в данном случае protected). Ниже приведена первая часть исходного кода этого метода.

/**
* Формирует запрос SQL на загрузку данных списком.
* @return JDatabaseQuery
*/

protected function getListQuery() {
// создать новый объект запроса $db = $this->getDbo(); $query = $db->getQuery(true);
// выбрать требующиеся поля из таблицы
$query->select('a.id AS subsciption_id, a.title AS subscription_title, g.title AS group_title, c.title AS category_title, a.alias AS subscription_alias, a.description AS subscription_description, a.duration, a.published AS subscriptionjpublished, a.access AS subscription_access, uc.name AS subscriber_name');
$query->from($db->quoteName('# joompro_subscriptions').' AS a');

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

Ниже приведена следующая часть исходного кода метода getListQuery ().

// осуществить соединение по всей таблице соответствий, чтобы получить подписчиков
$query->select('m.user_id as subscriber_id, m.start_date, m.end_date');
$query->j oin('LEFT', $db->quoteName('# joompro_sub_mapping') .' AS m>ON m.subscription_id = a.id');

// осуществить соединение по всем пользователям, чтобы // получить имя подписчика $query->join('LEFT', $db->quoteName(*# users').' ASuc>0N uc.id = m.user_id');
// осуществить соединение по всем группам пользователей, // чтобы получить имя группы $query->join('LEFT', $db->quoteName('# usergroups').' AS g>0N a. group_id = g. id') ;
// осуществить соединение по всем категориям $query->join('LEFT', $db->quoteName('# categories').' AS с ON с id = a.catid');

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

Следующая часть кода рассматриваемого здесь метода приведена ниже.

// отфильтровать по уровню доступа
if ($access = $this->getState('filter.access')) {
$query->where(*a.access = '.(int) $access); }
 
// отфильтровать по состоянию "опубликовано" 
$published = $this->getState('filter.state'); if (is_numeric($published)) { $query->where('a.published = '.(int) $published); } else if ($published === ") { $query->where('(a.published IN (0, 1))'); }
// отфильтровать по категории $categoryId = $this->getState('filter.category_id'); if (is_numeric($categoryId)) { $query->where('a.catid = '.(int) $categoryId); }
// отфильтровать по критерию поиска в названии
$search = $this->getState('filter.search');
if (!empty($search)) { if (stripos($search, 'id:') ===== 0) { $query->where('a.id = '.(int) substr($search, 3)); } else { $search = $db->Quote('%'.$db->getEscaped($search, true).'%');
$query->where('(a.title LIKE '.$search.' 4>OR a.alias LIKE '.$search.')'); } }

В этом фрагменте кода используются поля фильтров, выбираемые из поля состояния на экране диспетчера подписок, чтобы просеять результаты составления отчета. Для фильтрации по уровню доступа, состоянию "опубликовано", идентификатору категории и текстовому критерию поиска в запрос вводятся операторы WHERE. Обратите внимание на несколько усложненный характер обработки при фильтрации по текстовому критерию поиска. Если три первых символа в тексте равны " id: ", то поиск осуществляется по целочисленному идентификатору. Так, если ввести критерий "id: б" в текстовом поле поиска, то в таблице будут обнаружены только те строки, где идентификатор подписки равен б. В противном случае осуществляется поиск на совпадение метасимвола SQL с символами в столбце названия подписки.

И последняя часть исходного кода рассматриваемого здесь метода приведена ниже.

$orderCol = $this->state->get('list.ordering', 'a.title'); 
$orderDirn = $this->state->get('list.direction', 'ASC');
$query->order($db->getEscaped($orderCol.' '.$orderDirn)); return $query; } }  
//  конец класса

В этом фрагменте кода поля упорядочиваются в запросе. По умолчанию такое упорядочение происходит по названию подписки.


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


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