Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Samouchitel_po_razrabotke_rasshireny_dlya_Jooml....docx
Скачиваний:
3
Добавлен:
10.11.2018
Размер:
2.53 Mб
Скачать

Поиск Обзоров

Некоторые из наших посетителей жаловались, что они не могут найти Обзоры ресторанов через окно поиска в верхней части экрана. Мы можем исправить это написав Плагин поиска для сканирования Обзоров вместе с содержанием. Создайте файл /plugins/search/reviews.php и добавить следующий код:

<?php

defined( '_JEXEC' ) or die( 'Restricted access' );

$mainframe->registerEvent( 'onSearch', 'botSearchReviews' );

$mainframe->registerEvent( 'onSearchAreas', 'botSearchReviewAreas' );

Для Плагина поиска, мы зарегистрировали функции для двух событий: onSearch и onSearchAreas. Событие OnSearch срабатывает, когда Компонент поиска ищет результаты для данной фразы. Событие onSearchAreas – при построении поисковой формы, чтобы посетитель мог управлять возвращающимися записями

function &botSearchReviewAreas() {

static $areas = array(

'reviews' => 'Restaurant Reviews'

);

return $areas;

}

Функция BotSearchReviewAreas() используется для возврата массива действительных областей поиска. Хотя есть возможность иметь более одной области поиска (например, поиск в тексте Обзора или поиск в комментариях), мы оставим ее простой и будем искать Обзоры в целом. По умолчанию Компонент поиска будет возвращать результаты из всех опубликованных поисковых Плагинов. Когда посетитель выбирает одну или несколько областей поиска, он ограничивает поиск, выводя записи только из этих областей. Амперсанд предшествующий botSearchReviewAreas() говорит о том, что возвращается ссылка на массив $areas - не будем создавать избыточные копии статического массива в памяти

function botSearchReviews ( $text, $phrase='',

$ordering='', $areas=null )

{

Во время поиска, botSearchReviews() получает до четырех параметров. Ключевые слова передаются в $text. Мы можем определять особые условия, используя $phrase, которая может быть установлена как any (любое из этих слов), all (все слова) или exact (точная фраза). Сортировка записей определяется $ordering, которая может быть установлена как newest, oldest, popular, alpha или category. Наконец, в массиве $areas - области поиска выбранные посетителем

if (!$text) {

return array();

}

if (is_array( $areas )) {

if (!array_intersect( $areas,

array_keys( botSearchReviewAreas() ) )) {

return array();

}

}

Есть несколько ситуаций, при которых нам необходимо немедленно выйти из обработки. Во-первых, при отсутствии ключевых слов в $text мы уверены в отсутствии результатов, так что мы возвращаем пустой массив. Далее, мы убеждаемся, что $areas является массивом. Если это так, мы сопоставляем этот массив с действительными области поиска для нашего Плагина. Если нет - мы также возвращаем пустой массив. Когда $areas установлен в null, предполагается что включены все поисковые районы

$db =& JFactory::getDBO();

if ($phrase == 'exact')

{

$where = "(LOWER(name) LIKE '%$text%')

OR (LOWER(quicktake) LIKE '%$text%')" .

" OR (LOWER(review) LIKE '%$text%')

OR (LOWER(notes) LIKE '%$text%')";

}

else

{

$words = explode( ' ', $text );

$wheres = array();

foreach ($words as $word) {

$wheres[] = "(LOWER(name) LIKE '%$word%')

OR (LOWER(quicktake) LIKE '%$word%')" .

" OR (LOWER(review) LIKE '%$word%')

OR (LOWER(notes) LIKE '%$word%')";

}

if($phrase == 'all')

{

$separator = "AND";

}

else

{

$separator = "OR";

}

$where = '(' . implode( ") $separator (" , $wheres ) . ')';

}

$where .= ' AND published = 1';

После получения текущего экземпляра объекта базы данных из JFactory::getDBO(), мы строим предложение WHERE для запроса. Проверяем переменную $phrase для определения условий поиска. В случае точной фразы (exact), мы просто ищем совпадение в полях name, quicktake, review и notes в jos_reviews. Для "все" (all) и "любое" (any) поисков, мы выделим каждое слово и создадим массив WHERE, который подключается в соответствии с типом запроса. Наконец, мы добавляем проверку на вывод только опубликованных Обзоров

switch ($ordering) {

case 'oldest':

$order = 'review_date ASC';

break;

case 'alpha':

$order = 'title ASC';

break;

case 'newest':

default:

$order = 'review_date DESC';

break;

}

Нам необходимо вывести найденные Обзоры правильном порядке. Из пяти возможных, только три действительно имеют смысл для нашего Плагина: старейшие, новейшие и алфавитный [newest, oldest, alpha. прим.переводчика]. По умолчанию - сортировка по дате в обратном порядке.

$query = "SELECT name AS title, quicktake AS text,

review_date AS created, " .

"\n 'Restaurant Reviews' AS section," .

"\n CONCAT('index.php?option=com_reviews&view=review&id=', id) AS

href," .

"\n '2' AS browsernav" .

"\n FROM #__reviews" .

"\n WHERE $where" .

"\n ORDER BY $order";

$db->setQuery( $query );

$rows = $db->loadObjectList();

return $rows;

}

?>

Наконец, мы заканчиваем создание нашего запроса. Ссылки на Обзоры строятся непосредственно в запросе, используя функцию CONCAT(). Им присваивается псевдоним href. Псевдониму browsernav присваиваем значение 2. Кроме того, полю name присвоен псевдоним title, полю quicktaketext, а полю review_date - created. Такие имена столбцов ожидает Компонент поиска так, что теперь он знает ссылки на выходе и как их форматировать. Если browsernav = 1, ссылки будут открываться в новом окне, а если 2 - в текущем. Результаты запроса выводим как массив объектов в $rows и возвращаем $rows так, что он может быть использован наряду с другими результатами поиска. Перед добавлением Плагина, поиск возвращал примерно такой результирующий набор:

После добавления Плагина, "Ежедневно Блюдо" (The Daily Dish) должно появиться в результатах:

Ограничение поиска только по Обзорам должно возвращать только "Ежедневные блюда":

Резюме

С нашими Плагинами критики теперь могут добавлять ссылки к оригинальным Обзорам, даже не копируя URL. Кроме того, мы дали им возможность показывать окна деталей с возможностью выбора шаблона вывода. Наконец, Обзоры теперь можно найти в результатах поиска вместе с нашими статьями. Посетители могут ограничивать поиск только в Обзорах и по ключевым словам. К примеру, пользователь помнит, что в каком-то Обзоре было слово "гренки" – он найдет этот Обзор

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]