Комментарии

Вспомогательный файл модуля PHP (часть 2)
( 0 Голосов )

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

Поэтому, прежде чем приступать к составлению списка статей, необходимо убедиться в том, что мы находимся в представлении для единственной статьи, что, собственно, и делается в рассматриваемой здесь строке кода. Представление для единственной статьи определяется значением "com_content" элемента разметки option и значением "article" элемента разметки view. Эти значения появятся в URL каждой страницы с единственной статьей, если установить кнопку-переключатель No параметра Search Engine Friendly URLs (Удобные для поиска URL) на вкладке SEO (Оптимизация поискового механизма) диалогового окна Global Configuration (Глобальная настройка). Но в любом случае эти значения устанавливаются в переменной $_REQUEST.

А теперь, когда известно, что тип пункта меню выбран правильно, можно приступать к составлению списка статей. В листинге 6.9 приведена вторая часть вспомогательного РНР-файла.

Исходный код из файла helper.php (часть 2)

// получить объект базы данных
$db = JFactory::getDbo();
$арр = JFactory:rgetApplication();
$user =  JFactory::getUser (); $id = JRequest:rgetlnt ('id' );
//  получить  уровни доступа в виде разделенной
//  запятыми  символьной строки
$levels  =  implode(',',   $user->getAuthorisedViewLevels());
//  установить  в  полях текущую и пустую даты $date =  JFactory::getDate(); $now =  $date->toSql(); $nullDate  =  $db->getNullDate() ;
// инициализировать  объект  запроса $query = $db->getQuery(true);
// запросить  базу данных  с целью получить  сведения
//  об  авторе  текущей  статьи
$query->select('id,   created_by,   created_by_alias');
$query->from('# content');
$query->where('id = '. (int) $id); $db->setQuery($query); $currentArticle  =  $db->loadObject() ;

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

В трех первых строках кода объекты типа JDatabase, JApplication и JUser получаются с помощью методов из класса JFactory. Затем идентификатор из запроса получается с помощью метода get Int (). Этот метод обеспечивает получение целочисленного значения, отфильтровывая любое злоумышленное или непредвиденное содержимое в запросе.

В следующей строке кода получается список уровней доступа, разрешенных текущему пользователю для просмотра информации на веб-сайте. Для этого вызывается метод getAuthorisedViewLevels (), возвращающий массив уровней доступа для всех групп, которым принадлежит данный пользователя. С помощью функции implode () языка РНР этот массив преобразуется в разделенный запятыми список.

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

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

В первой из рассматриваемых здесь строк кода средствами класса JFactory получается объект текущих даты и времени из среды Joomla. Затем переменная $now создается в том формате, который требуется для базы данных. Для этого вызывается метод toSql () из класса JDate. И наконец, создается переменная $ null Date, для чего вызывается метод getNullDate () из класса JDatabase. Следует, однако, иметь в виду, что значение, присваиваемое этой переменной, на самом деле не является пустым. Например, в базе данных MySQL метод getNullDate () возвращает поле даты и времени со всеми нулями (0000-00-00 00:00:00). Но самое главное, что здесь используется то же самое значение даты и времени, что и при создании статьи.

Далее составляется первый запрос для получения сведений об авторе, необходимых для текущей статьи. И здесь нам придется принять еще одно проектное решение. В Joomla с каждой статьей связан столбец created_by, в котором находится идентификатор пользователя (id), являющегося автором статьи, а также столбец created_by_alias с дополнительным текстом, который может быть введен при создании или редактировании статьи. Какой же столбец следует выбрать, чтобы проверить, принадлежит ли очередная статья тому же самому автору?

Из этого положения можно выйти несколькими путями. В частности, можно выбрать дополнительный столбец created_by_alias, если таковой имеется в таблице базы данных, а иначе — столбец created_by. Еще проще произвести поиск на совпадение в любом из двух столбцов. А кроме того, можно предоставить пользователю возможность самому выбирать, как поступить дальше, с помощью отдельного параметра. В данном примере мы выберем второй, самый простой способ: составить список всех статей, совпадающих с любым из двух столбцов. Для этого нам нужно получить оба этих столбца для текущей статьи, чтобы воспользоваться ими во втором запросе.

Первый запрос составляется очень просто. Сначала создается новый объект запроса с помощью метода getQuery (). Логическое значение true, передаваемое этому методу в качестве аргумента, означает, что в ответ будет получен новый пустой запрос. Затем в запрос вводятся три столбца с помощью метода select О. К упомянутым выше двум столбцам добавлен еще и столбец id, хотя формально делать это совсем не обязательно. Но его добавление не требует никаких дополнительных затрат, а лишь упрощает отладку и проверку того, что по данному запросу возвращается ожидаемый результат.

В методе from () указывается таблица #content. Напомним, что в запросах базы данных всегда используется префикс #. Он заменяется конкретным префиксом таблицы перед тем, как передавать запрос базе данных. Далее в запрос вводится оператор WHERE с помощью метода where (), как показано ниже.

$query->where('id = ' . (int) $id);

В данном случае приведение типа переменной $id к целочисленному типу не требуется. Ведь для установки ее значения ранее был вызван метод JRequest:rgetlnt (), а следовательно, ее значение и так является целочисленным. Тем не менее переменные, указываемые в операторе WHERE запросов SLQ, рекомендуется подвергать дополнительной обработке. Так, текст можно дополнительно обработать методом quote () из класса JDatabase, заключающим текст в кавычки и экранирующим специальные символы, в том числе и сами кавычки, чтобы злоумышленник не смог подделать запрос. А целые значения переменных можно дополнительно обработать с помощью оператора приведения типов, как в данном примере. Подробнее о защите от умышленного внесения запросов SQL речь пойдет в других статьях нашего сайта.


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


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


Защитный код