- •Что в этой книге
- •Настройки против Расширений
- •Как расширить Joomla!
- •Компоненты (Components)
- •Модули (Modules)
- •Плагины (Plug-Ins)
- •Обзор тем
- •Создание пи (Toolbars) и Списков
- •Поддержание стиля и исключение повторений кода используя html функции
- •Доступ к бд и управление записями
- •Безопасность и предпочтительный способ получения переменных запроса
- •Меню управления
- •Управления логикой работы внутри Компонента
- •Конфигурация посредством xml-параметров
- •Упаковка и распространение
- •Наш Проект для примера
- •Приступая к разработке Компонента
- •Структура Компонента Joomla!
- •Запуск Компонента
- •Разделение на иа и ип в Joomla
- •Регистрация Компонента в бд
- •Создание пи
- •Доступные кнопки пи
- •Создание таблицы бд
- •Создание класса Table
- •Создание формы Обзора
- •Обработка данных
- •Создание Списка
- •Редактирование записей
- •Удаление записей
- •Разработка ип
- •Листинг Обзоров
- •Отображение Обзора
- •Генерация дружественных для поисковиков ссылок
- •Создание url сегментов
- •Парсинг url сегментов
- •Добавление комментариев
- •Отображение комментариев
- •Разработка Модуля
- •Регистрация Модуля в бд
- •Создание и настройка базового Модуля
- •Воспользуемся некоторыми помощниками (class Helper)
- •Пробуем различные стили
- •Попробуем смешать
- •Расширяем проект
- •Модель, Вид, Контроллер: Почему?
- •Построение Модели данных
- •Модель Все Обзоры
- •Модель одиночного Обзора
- •Миграция на Виды
- •Переключения посредством Контроллеров (Controllers)
- •Обновление связей и маршрутов
- •Реорганизация кода иа
- •Управление публикацией Обзоров
- •Добавление постраничной навигации
- •Управление Коментариями
- •Дополнительные пи
- •За кулисами: Плагины (Plug-Ins)
- •Запросы к бд
- •Плагин ссылка
- •Плагин справочной информации
- •Поиск Обзоров
- •Параметры
- •Добавление параметров к расширениям
- •Параметры для Модулей
- •Параметры для Плагинов
- •Параметры для Компонентов
- •Упаковываем все вместе
- •Список всех файлов
- •Упаковка Модуля
- •Упаковка Плагина
- •Упаковка Компонента
- •Включение sql-запросов
- •Создание пунктов меню иа
- •Дополнительные сценарии установки
- •Распространение
- •Содержание
Плагин справочной информации
Другой критик был более заинтересован в получении окна, которое будет отображать "важные детали" для ресторана по своему выбору. Чтобы использовать эту опцию, мы научим критика вставлять имя Обзора в фигурные скобки так, чтобы ему предшествовало слово 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 в последней строке таблицы. Теперь посмотрим как статьи наших критиков выглядят до применения Плагина:
После публикации Плагина все выглядит несколько по другому: