- •Что в этой книге
- •Настройки против Расширений
- •Как расширить Joomla!
- •Компоненты (Components)
- •Модули (Modules)
- •Плагины (Plug-Ins)
- •Обзор тем
- •Создание пи (Toolbars) и Списков
- •Поддержание стиля и исключение повторений кода используя html функции
- •Доступ к бд и управление записями
- •Безопасность и предпочтительный способ получения переменных запроса
- •Меню управления
- •Управления логикой работы внутри Компонента
- •Конфигурация посредством xml-параметров
- •Упаковка и распространение
- •Наш Проект для примера
- •Приступая к разработке Компонента
- •Структура Компонента Joomla!
- •Запуск Компонента
- •Разделение на иа и ип в Joomla
- •Регистрация Компонента в бд
- •Создание пи
- •Доступные кнопки пи
- •Создание таблицы бд
- •Создание класса Table
- •Создание формы Обзора
- •Обработка данных
- •Создание Списка
- •Редактирование записей
- •Удаление записей
- •Разработка ип
- •Листинг Обзоров
- •Отображение Обзора
- •Генерация дружественных для поисковиков ссылок
- •Создание url сегментов
- •Парсинг url сегментов
- •Добавление комментариев
- •Отображение комментариев
- •Разработка Модуля
- •Регистрация Модуля в бд
- •Создание и настройка базового Модуля
- •Воспользуемся некоторыми помощниками (class Helper)
- •Пробуем различные стили
- •Попробуем смешать
- •Расширяем проект
- •Модель, Вид, Контроллер: Почему?
- •Построение Модели данных
- •Модель Все Обзоры
- •Модель одиночного Обзора
- •Миграция на Виды
- •Переключения посредством Контроллеров (Controllers)
- •Обновление связей и маршрутов
- •Реорганизация кода иа
- •Управление публикацией Обзоров
- •Добавление постраничной навигации
- •Управление Коментариями
- •Дополнительные пи
- •За кулисами: Плагины (Plug-Ins)
- •Запросы к бд
- •Плагин ссылка
- •Плагин справочной информации
- •Поиск Обзоров
- •Параметры
- •Добавление параметров к расширениям
- •Параметры для Модулей
- •Параметры для Плагинов
- •Параметры для Компонентов
- •Упаковываем все вместе
- •Список всех файлов
- •Упаковка Модуля
- •Упаковка Плагина
- •Упаковка Компонента
- •Включение sql-запросов
- •Создание пунктов меню иа
- •Дополнительные сценарии установки
- •Распространение
- •Содержание
Параметры для Плагинов
Для Плагина-ссылки, мы хотели бы дать администраторам определенный контроль над форматированием ссылок. Они должны иметь возможность добавлять текст к ссылке и некоторые атрибуты тегу <a>. Процесс добавления параметров для нашего Плагина похож на то, как мы делали это для Модулей.
Откройте /plugins/content/reviews.xml и добавьте такой код:
<?xml version="1.0" encoding="utf-8"?>
<install version="1.5" type="plugin" group="content">
<name>Content - Restaurant Review Links</name>
<author>Sumptuous Software</author>
<creationDate>January 2007</creationDate>
<copyright>(C) 2007</copyright>
<license>Commercial</license>
<authorEmail>support@packtpub.com</authorEmail>
<authorUrl>www.packtpub.com</authorUrl>
<version>1.0</version>
<description>Searches for titles of restaurants in
articles and turns them into review links.</description>
<params>
<param name="linkcode" type="textarea" default=""
rows="5" cols="40" label="Custom Link Code"
description="By using {link} and {title},
you can generate custom HTML output that
includes the URL and review title respectively." />
</params>
</install>
Поскольку наши администраторы будут вставлять небольшой код - будет полезно дать им больше места, чем то, что предлагает типичный input. Для этого, мы создаем параметр linkcode типа textarea. В ИА перейдите в Extensions / Plugin Manager, затем выберите из списка Content – Reviews. Там должно быть поле Custom Link Code для ввода кода для ссылки. Наши критики решили обозначить свое мнение в Обзоре. Они хотят, чтобы текст (our take (наше видение)) был в названии каждого Обзора. А так как они обычно склонны менять свое мнение, определяемый параметр должен давать возможность такого изменения. Мы определим теги {link} и {title} как относительный путь и название Обзора соответственно. При отображении содержимого эти теги будут динамически заменены соответствующими значениями. В поле Custom Link Code введите <a href="{link}">{title} (our take)</a>. Все должно выглядеть примерно так:
Сохраните Плагин. Чтобы наше форматирование заработало, нам нужно изменить код Плагина. Откройте /plugins/content/reviews.php и сделать изменения (изменения выделны):
function pluginReviews( &$row, &$params )
{
$plugin =& JPluginHelper::getPlugin('content', 'reviews');
$pluginParams = new JParameter( $plugin->params );
$reviews = contentReviews_getlist();
$pattern = array();
$replace = array();
foreach($reviews as $review)
{
$pattern[] = '/' . preg_quote($review) . '/';
$replace[] = contentReviews_makeLink(
$review, $reviews, $pluginParams);
}
$row->text = preg_replace($pattern, $replace, $row->text);
return true;
}
function contentReviews_makeLink ($title, &$reviews,
&$pluginParams)
{
$linkcode = $pluginParams->get('linkcode', '');
$id = array_search($title, $reviews);
$link = JRoute::_('index.php?option=com_reviews&view=review&id=' .
$id);
if($linkcode == '')
{
$linkcode = '<a href="' . $link . '">' . $title . '</a>';
}
else
{
$linkcode = str_replace('{link}', $link, $linkcode);
$linkcode = str_replace('{title}', $title, $linkcode);
}
return $linkcode;
}
В pluginReviews(), мы получаем Плагин объект с помощью JPluginHelper функции getPlugin(), передав content и reviews. Params передается в конструктор JParameter, чтобы получить параметры обратно в виде объекта. Мы передаем этот объект в contentReviews_makeLink(), где извлекается значение параметра для linkcode. Если linkcode не имеет значения, мы возвращаем ссылку как обычно. В противном случае, мы ищем теги {link} и {title} и заменяем их на соответствующие элементы.
После сохранения Плагина, ссылки на Обзоры должны быть с таким заголовком:
Добавление конфигурации для Плагина Review Information аналогично. На этот раз, у нас есть четыре возможных элемента данных для каждого информационного окна. Это может быть слишком много, поэтому мы будем позволять администратору выключать некоторые поля.
Откройте /plugins/content/reviewinfo.xml и добавьте следующий код:
<?xml version="1.0" encoding="utf-8"?>
<install version="1.5" type="plugin" group="content">
<name>Content - Review Information</name>
<author>Sumptuous Software</author>
<creationDate>January 2007</creationDate>
<copyright>(C) 2007</copyright>
<license>Commercial</license>
<authorEmail>support@packtpub.com</authorEmail>
<authorUrl>www.packtpub.com</authorUrl>
<version>1.0</version>
<description>Turns {reviewinfo Name of your restaurant}
into a table with the review's essential
details.</description>
<params>
<param name="address" type="radio" default="1"
label="Display Address?" description="Toggles
the display of the address in summaries.">
<option value="1">Yes</option>
<option value="0">No</option>
</param>
<param name="price_range" type="radio" default="1"
label="Display Price Range?" description="Toggles
the display of the price range in summaries.">
<option value="1">Yes</option>
<option value="0">No</option>
</param>
<param name="reservations" type="radio" default="1"
label="Display Reservations?" description="Toggles
the display of reservation policy in summaries.">
<option value="1">Yes</option>
<option value="0">No</option>
</param>
<param name="smoking" type="radio" default="1"
label="Display Smoking?" description="Toggles
the display of smoking policy in summaries.">
<option value="1">Yes</option>
<option value="0">No</option>
</param>
</params>
</install>
Раздел <params> определяет четыре радио-кнопки, все со значением Да по умолчанию. Они будут использоваться в свою очередь для разрешения вывода информации об адресе (address), диапазоне цен (price range), бронировании (reservations) и курении (smoking) в резюме Обзора. После сохранения файла, перейдите на Extensions / Plugin Management и выберите " Content – Review Information. После выбора No для Display Address, параметры окна должны выглядеть так:
Как и для Плагина-ссылки, мы заглянем в параметры и передадим их другой функции.
Сделайте следующие изменения и дополнения в /plugins/content/reviewinfo.php:
function pluginReviewInfo ( &$row, &$params )
{
$plugin =& JPluginHelper::getPlugin('content',
'reviewinfo');
$pluginParams = new JParameter( $plugin->params );
preg_match_all('/\{reviewinfo (.*)\}/U', $row->text, $matches);
foreach( $matches[1] as $name )
{
$review = contentReviewInfo_getReviewByName($name);
$html = contentReviewInfo_createHTML($review,
$pluginParams);
$row->text = str_replace("{reviewinfo $name}", $html,
$row->text);
}
return true;
}
function contentReviewInfo_createHTML (&$review,
&$pluginParams)
{
$html = '<table class="moduletable">';
$html .= '<tr><th colspan="2">Info</th></tr>';
if($pluginParams->get('address', 1))
{
$html .= '<tr><td>Address:</td><td>' .
$review->address . '</td></tr>';
}
if($pluginParams->get('price_range', 1))
{
$html .= '<tr><td>Price Range:</td><td>$' .
$review->avg_dinner_price . '</td></tr>';
}
if($pluginParams->get('reservations', 1))
{
$html .= '<tr><td>Reservations:</td><td>' .
$review->reservations . '</td></tr>';
}
if ( $review->smoking == 0 )
{
$smoking = 'No';
}
else
{
$smoking = 'Yes';
}
if($pluginParams->get('smoking', 1))
{
$html .= '<tr><td>Smoking:</td><td>' .
$smoking . '</td></tr>';
}
$html .= '</table>';
return $html;
}
А как насчет $params в pluginReviewInfo()?
В определении функции pluginReviewInfo() передается переменная с именем $params. Это не параметр Плагина, это параметры для позиции (item) содержания. Кроме того, объект $row это строка в БД в #__content соответствующая текущему элементу содержания.
После получения параметров Плагина в pluginReviewInfo() передаем их в contentReviewInfo_createHTML(), где мы проверяем каждое поле для соответствующего значения конфигурации. Если все поля имеют значение Да, в информационном блоке содержание должно выглядеть примерно так:
А если мы выключим Addresses - так:
Наконец, у нас есть Плагин поиска. Откройте /plugins/search/reviews.xml и добавьте такой XML:
<?xml version="1.0" encoding="utf-8"?>
<install version="1.5" type="plugin" group="search">
<name>Search - Restaurant Reviews</name>
<author>Sumptuous Software</author>
<creationDate>January 2007</creationDate>
<copyright>(C) 2007</copyright>
<license>Commercial</license>
<authorEmail>support@packtpub.com</authorEmail>
<authorUrl>www.packtpub.com</authorUrl>
<version>1.0</version>
<description>Allows Searching of Restaurant Reviews</description>
<params>
<param name="search_limit" type="text" size="5" default="50"
label="Search Limit" description="Number of Search items
to return"/>
</params>
</install>
По умолчанию мы устанавливаем количество возвращаемых элементов в поиске до 50 (возможно это больше, чем общее количество элементов на экране в результатах поиска). С помощью этого параметра конфигурации, мы можем ограничить число возвращаемых Обзоров вплоть до 1
Чтобы сделать нашу конфигурацию рабочей, откройте /plugins/search/reviews.php и сделайте следующие корректировки:
function botSearchReviews ( $text, $phrase='',
$ordering='', $areas=null )
{
$db =& JFactory::getDBO();
if (is_array( $areas ))
{
if (!array_intersect( $areas,
array_keys( botSearchReviewAreas() ) ))
{
return array();
}
}
$plugin =& JPluginHelper::getPlugin('search', 'reviews');
$pluginParams = new JParameter( $plugin->params );
$limit = $pluginParams->get( 'search_limit', 50 );
$db->setQuery( $query, 0, $limit );
$rows = $db->loadObjectList();
return $rows;
}
Как и в других Плагинах, мы сначала получаем параметры для поиска Обзоров, а затем используем JParameter для создания объекта из них. Вызывая setQuery(), мы используем два дополнительных параметра, которые будут автоматически строить наши предложения LIMIT в SQL запросе: 0, чтобы начинать с первой строки и $limit – устанавливаемое нами количество. Перед добавлением лимита результаты поиска Обзоров ресторанов выглядели так:
После добавления лимита, результаты будут больше похожи на это:
В обоих результатах число элементов контента возвращается без изменений, а число Обзоров изменилось.