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

Запросы к бд

Перед созданием кода, выполним некоторые запросы для регистрации Плагинов в БД. Мы создадим три Плагина: два будут форматировать содержание, еще один - взаимодействовать с основным Компонентом поиска 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;

}

До добавления Плагина одна из наших статей могла бы выглядеть так:

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

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