- •Что в этой книге
- •Настройки против Расширений
- •Как расширить Joomla!
- •Компоненты (Components)
- •Модули (Modules)
- •Плагины (Plug-Ins)
- •Обзор тем
- •Создание пи (Toolbars) и Списков
- •Поддержание стиля и исключение повторений кода используя html функции
- •Доступ к бд и управление записями
- •Безопасность и предпочтительный способ получения переменных запроса
- •Меню управления
- •Управления логикой работы внутри Компонента
- •Конфигурация посредством xml-параметров
- •Упаковка и распространение
- •Наш Проект для примера
- •Приступая к разработке Компонента
- •Структура Компонента Joomla!
- •Запуск Компонента
- •Разделение на иа и ип в Joomla
- •Регистрация Компонента в бд
- •Создание пи
- •Доступные кнопки пи
- •Создание таблицы бд
- •Создание класса Table
- •Создание формы Обзора
- •Обработка данных
- •Создание Списка
- •Редактирование записей
- •Удаление записей
- •Разработка ип
- •Листинг Обзоров
- •Отображение Обзора
- •Генерация дружественных для поисковиков ссылок
- •Создание url сегментов
- •Парсинг url сегментов
- •Добавление комментариев
- •Отображение комментариев
- •Разработка Модуля
- •Регистрация Модуля в бд
- •Создание и настройка базового Модуля
- •Воспользуемся некоторыми помощниками (class Helper)
- •Пробуем различные стили
- •Попробуем смешать
- •Расширяем проект
- •Модель, Вид, Контроллер: Почему?
- •Построение Модели данных
- •Модель Все Обзоры
- •Модель одиночного Обзора
- •Миграция на Виды
- •Переключения посредством Контроллеров (Controllers)
- •Обновление связей и маршрутов
- •Реорганизация кода иа
- •Управление публикацией Обзоров
- •Добавление постраничной навигации
- •Управление Коментариями
- •Дополнительные пи
- •За кулисами: Плагины (Plug-Ins)
- •Запросы к бд
- •Плагин ссылка
- •Плагин справочной информации
- •Поиск Обзоров
- •Параметры
- •Добавление параметров к расширениям
- •Параметры для Модулей
- •Параметры для Плагинов
- •Параметры для Компонентов
- •Упаковываем все вместе
- •Список всех файлов
- •Упаковка Модуля
- •Упаковка Плагина
- •Упаковка Компонента
- •Включение sql-запросов
- •Создание пунктов меню иа
- •Дополнительные сценарии установки
- •Распространение
- •Содержание
Запросы к бд
Перед созданием кода, выполним некоторые запросы для регистрации Плагинов в БД. Мы создадим три Плагина: два будут форматировать содержание, еще один - взаимодействовать с основным Компонентом поиска Joomla!. Запросы добавят записи, указывающие на папки с плагинами. В командной строке введите эти три запроса:
INSERT INTO jos_plugins (name, element, folder, published) VALUES
('Content - Reviews', 'reviews', 'content', 1);
INSERT INTO jos_plugins (name, element, folder, published) VALUES
('Content - Review Information', 'reviewinfo', 'content', 0);
INSERT INTO jos_plugins (name, element, folder, published)
VALUES ('Search - Reviews', 'reviews', 'search', 1);
Если вы используете PhpMyAdmin, вызовите экран для ввода строки в jos_plugins и заполните поля как на следующем скриншоте для Плагина Content–Reviews:
В jos_plugins заполните поля как на следующем скриншоте для Плагина Content – Review Information:
В jos_plugins заполните поля как на следующем скриншоте для Плагина Search – Reviews:
Плагин ссылка
Один из наших критиков предложил, чтобы мы сделали что-то, что позволит им получать ссылку на Обзор, просто введя название ресторана. Например, при написании статьи об обеде, критик не хочет, выискивать ссылки на Обзор о Crosstown Deli. Он хочет просто набрать Crosstown Deli и превратить это в ссылку, если статья опубликована. Мы могли бы просто изменить код в com_content, но неизвестно насколько это понравится другим критикам. Кроме того, если com_content будет пропатчен, мы должны будем менять код еще раз. Поэтому мы создадим Плагин для поиска названий и автоматически преобразовывать их в ссылки. Для этого создадим файл в reviews.php в plugins/content в Joomla! и добавим следующий код:
<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
$mainframe->registerEvent( 'onPrepareContent',
'pluginReviews' );
Мы используем функцию registerEvent() объекта $mainframe чтобы назначить pluginReviews() для события onPrepareContent. Когда Joomla! загрузит содержание элемента из БД, она будет вызывать все функции, назначенные событию onPrepareContent.
Функции PluginReviews() передается строка для загруженной статьи вместе с объектом параметров для нее. Мы используем contentReviews_getlist() для получения массива названий ресторанов, где роль ключей выполняют id. Далее, мы строим два массива: один с шаблонами для поиска и другой с строк замены. В массиве $pattern, мы используем preg_quote() для всех названий ресторанов, чтобы исключить какие-либо символы, которые обычно являются частью регулярного выражения. Для $replace мы вызываем contentReviews_makeLink() и передаем имя Обзора, а также массив имен. Это позволит contentReviews_makeLink() извлечь id и отформатировать ссылку. После того как наши шаблоны и замены созданы, используем preg_replace() для замены имен на ссылки. Присвоим $row->text результат preg_replace() и он будет доступен по ссылке на объект.
function contentReviews_makeLink ($title, &$reviews)
{
$id = array_search($title, $reviews);
$link = JRoute::_('index.php?option=com_reviews&view=review&id=' .
$id );
$link = '<a href="' . $link . '">' . $title . '</a>';
return $link;
}
Учитывая название Обзора и массив названий с id в качестве ключей, contentReviews_makeLink() использует PHP-функцию array_search(), чтобы получить id соответствующий названию. Переменная $link устанавливается с относительным URL на статью, полученную через JRoute::_(). Затем переменная $link оборачивается HTML тегом <a>, используя название статьи как текст ссылки возвращается как результат функции.
function contentReviews_getlist()
{
$reviews = array();
$db =& JFactory::getDBO();
$query = "SELECT id, name FROM #__reviews";
$db->setQuery($query);
$rows = $db->loadObjectList('id');
foreach($rows as $id => $row)
{
$reviews[$id] = $row->name;
}
return $reviews;
}
?>
В contentReviews_getlist() вставляем столбец id в loadObjectList() так что результаты возвращаются индексированными ключом id, так что нам остается только присвоить имя для каждой строки.
Обратите внимание, что название главной функции [она описана далее. прим. переводчика] в формате plugin, а затем имя файла. Аналогичным образом, другие две функции начинается с типа Плагина (content), затем имя файла, нижнее подчеркивание и имя. Хотя такое соглашение не обязательно, это поможет нам избежать конфликтов имен с другими Плагинами.
Какие события регистрируются?
Плагины в Joomla! может реагировать на любое число событий во время запроса. Несколько Плагинов могут реагировать на любое событие в своей группе. Упорядочение Плагинов в Joomla! в ИА определяет порядок в котором зарегистрированные функции вызываются. Например, если оба Плагин А и Плагина В реагируют на onBeforeDisplayContent, функции Плагина А зарегистрированного с onBeforeDisplayContent будут вызваны в первую очередь. Листинг о том, когда эти события происходят, сгруппированные по типу Плагина выглядит следующим образом:
Система:
onAfterInitialise |
после загрузки фреймворка но до маршрутизации и вывода |
onAfterRoute |
после маршрутизации но до вывода |
onAfterDispatch |
после старта Joomla! |
onAfterRender |
после обработки всех выводов |
onGetWebServices |
когда XML RPC функции запрашивает список допустимых вызовов функций |
onLoginFailure |
при неудачной попытке входа |
Поиск:
onSearch |
во время выполнения поиска |
onSearchAreas |
когда Компонент поиска запрашивает список допустимых областей поиска |
Аутентификация:
onAuthenticate |
когда пользователь сначала пытается выполнить проверку подлинности, обеспечивает метод для проверки подлинности |
Пользователь:
onLoginUser |
После проверки подлинности пользователя изначально, но до полного входа в систему: все функции должны возвращать true для окончания проверки подлинности |
onLogoutUser |
когда пользователь пытается выйти: все функции должны возвращать true для выхода |
onBeforeStoreUser |
перед сохранением пользователя в БД |
onAfterStoreUser |
после сохранения пользователя в БД |
onBeforeDeleteUser |
до удаления пользователя из системы |
onAfterDeleteUser |
после удаления пользователя из системы |
Расширенный редактор:
onCustomEditorButton |
когда пользовательские кнопки загружены в редактор. Позволяет добавлять кнопки |
Редактор:
onInit |
когда редактор инициализирован |
onDisplay |
когда редактор готов быть отображен |
onGetContent |
когда запрошено содержимое редактора |
onSetContent |
когда содержимое редактора populated |
onSave |
когда содержимое редактора сохранено |
onGetInsertMethod |
непосредственно перед выходом из редактора |
Содержание:
onPrepareContent |
происходит до любого вывода |
onAfterDisplayTitle |
сразу же после отображения названия статьи |
onBeforeDisplayContent |
как раз перед выводом содержание, возвращается содержание которое будет отображаться |
onAfterDisplayContent |
сразу после вывода содержания, возвращается содержание которое будет отображаться |
function pluginReviews( &$row, &$params )
{
$reviews = contentReviews_getlist();
$pattern = array();
$replace = array();
foreach($reviews as $review)
{
$pattern[] = '/' . preg_quote($review) . '/';
$replace[] = contentReviews_makeLink($review,
$reviews);
}
$row->text = preg_replace($pattern, $replace, $row->text);
return true;
}
До добавления Плагина одна из наших статей могла бы выглядеть так:
После применения Плагина, наша статья будет изменять названия ресторанов в ссылки как на скриншоте: