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

Плагин справочной информации

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

Например, детали для "Каждодневное Блюдо" могут быть включены в введя {review Каждодневное Блюдо}. [Далее по непонятным причинам вместо review будет использовано reviewinfo. прим.переводчика]

Почему фигурные скобки?

Многие основные Плагины используют фигурные скобки как способ создания "Плагин тегов" в содержании элементов, чтобы они не путать с HTML- или XML- тегами. Часто можно увидеть что они используются отдельно, как в {runmyplugin}, с параметрами, как делаем мы в Обзорах или содержащих текст {plugin}как здесь{/plugin}. PHP/Perl функции регулярных выражений очень удобны для обнаружения этих шаблонов (pattern). Более подробную информацию об этих функциях можно найти на веб-сайте PHP: http://www.php.net/manual/en/ref.pcre.php

Перед тем, как мы начнем писать код перейдите в ИА и отмените публикацию нашего первого Плагина, а затем опубликуйте новый. В Extensions/Plugin Manager отмените публикацию Content – Reviews и опубликуйте Content– Review Information. Затем создайте файл reviewinfo.php в /plugins/content и добавьте этот код:

<?php

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

$mainframe->registerEvent( 'onPrepareContent',

'pluginReviewInfo' );

Как и для первого Плагина, мы регистрируем функцию pluginReviewInfo() для события onPrepareContent.

function pluginReviewInfo ( &$row, &$params )

{

preg_match_all('/\{reviewinfo (.*)\}/U',

$row->text, $matches);

foreach( $matches[1] as $name )

{

$review = contentReviewInfo_getReviewByName($name);

$html = contentReviewInfo_createHTML($review);

$row->text = str_replace("{reviewinfo $name}",

$html, $row->text);

}

return true;

}

В pluginReviewInfo() при возникновении события автоматически проходим по строкам содержание и параметрам статьи. Мы используем PHP-функцию preg_match_all() чтобы получить все {reviewinfo...} теги в статье, собирая их в $matches. Массива в $matches[1] содержит все имена, которые были найдены между пробелом после reviewinfo и до конца тега. Проходим циклом по массиву и передаем имена в contentReviewInfo_getReviewByName() для получения информации для каждого Обзора. Далее, мы получаем в HTML-формате фрагмент информации в $html, передавая объект $review в contentReviewInfo_createHTML(). Наконец, мы используем в PHP-функцию str_replace(), чтобы заменить все вхождения тегов reviewinfo для этого Обзора с HTML-фрагментами

function contentReviewInfo_getReviewByName ($name)

{

$db =& JFactory::getDBO();

$name = addslashes($name);

$query = "SELECT * FROM #__reviews WHERE name = '$name'";

$db->setQuery($query);

$review = $db->loadObject();

return $review;

}

Без id Обзоров, мы используем contentReviewInfo_getReviewByName() для получения информации для Обзора используя только $name. Сначала, мы получаем ссылку на текущий объект БД. Далее, берем переменную $name и пропускаем через PHP-функцию addslashes(). Таким образом Обзоры с апострофами не вызывают ошибку запроса. Выполняем запрос используя функцию loadObject() для загрузки только первой строки в результатах поиска. Мы предупреждали наших критиков, что Плагин не может работать правильно, если два человека написали отдельные Обзоры на один и тот же ресторан. Но они гарантировали нам, что другие критики слишком нарцистичны чтобы писать о месте, которое уже кто-то рассмотрел

function contentReviewInfo_createHTML (&$review)

{

$html = '<table class="moduletable">';

$html .= '<tr><th colspan="2">Info</th></tr>';

$html .= '<tr><td>Address:</td><td>' .

$review->address . '</td></tr>';

$html .= '<tr><td>Price Range:</td><td>$' .

$review->avg_dinner_price . '</td></tr>';

$html .= '<tr><td>Reservations:</td><td>' .

$review->reservations . '</td></tr>';

if ( $review->smoking == 0 )

{

$smoking = 'No';

}

else

{

$smoking = 'Yes';

}

$html .= '<tr><td>Smoking:</td><td>' .

$smoking . '</td></tr>';

$html .= '</table>';

return $html;

}

?>

Наконец, contentReviewInfo_createHTML() принимает строку объект Обзора в качестве параметра и форматирует его в HTML-таблицу. Этой таблице присваивается CSS-класс moduletable, который является стандартным для Joomla! шаблонов. Столбцы address, price range и reservations - все включается в HTML как есть. Столбец $smoking проверяется на Да или Нет. Затем мы используем $smoking в последней строке таблицы. Теперь посмотрим как статьи наших критиков выглядят до применения Плагина:

После публикации Плагина все выглядит несколько по другому:

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