- •Что в этой книге
- •Настройки против Расширений
- •Как расширить Joomla!
- •Компоненты (Components)
- •Модули (Modules)
- •Плагины (Plug-Ins)
- •Обзор тем
- •Создание пи (Toolbars) и Списков
- •Поддержание стиля и исключение повторений кода используя html функции
- •Доступ к бд и управление записями
- •Безопасность и предпочтительный способ получения переменных запроса
- •Меню управления
- •Управления логикой работы внутри Компонента
- •Конфигурация посредством xml-параметров
- •Упаковка и распространение
- •Наш Проект для примера
- •Приступая к разработке Компонента
- •Структура Компонента Joomla!
- •Запуск Компонента
- •Разделение на иа и ип в Joomla
- •Регистрация Компонента в бд
- •Создание пи
- •Доступные кнопки пи
- •Создание таблицы бд
- •Создание класса Table
- •Создание формы Обзора
- •Обработка данных
- •Создание Списка
- •Редактирование записей
- •Удаление записей
- •Разработка ип
- •Листинг Обзоров
- •Отображение Обзора
- •Генерация дружественных для поисковиков ссылок
- •Создание url сегментов
- •Парсинг url сегментов
- •Добавление комментариев
- •Отображение комментариев
- •Разработка Модуля
- •Регистрация Модуля в бд
- •Создание и настройка базового Модуля
- •Воспользуемся некоторыми помощниками (class Helper)
- •Пробуем различные стили
- •Попробуем смешать
- •Расширяем проект
- •Модель, Вид, Контроллер: Почему?
- •Построение Модели данных
- •Модель Все Обзоры
- •Модель одиночного Обзора
- •Миграция на Виды
- •Переключения посредством Контроллеров (Controllers)
- •Обновление связей и маршрутов
- •Реорганизация кода иа
- •Управление публикацией Обзоров
- •Добавление постраничной навигации
- •Управление Коментариями
- •Дополнительные пи
- •За кулисами: Плагины (Plug-Ins)
- •Запросы к бд
- •Плагин ссылка
- •Плагин справочной информации
- •Поиск Обзоров
- •Параметры
- •Добавление параметров к расширениям
- •Параметры для Модулей
- •Параметры для Плагинов
- •Параметры для Компонентов
- •Упаковываем все вместе
- •Список всех файлов
- •Упаковка Модуля
- •Упаковка Плагина
- •Упаковка Компонента
- •Включение sql-запросов
- •Создание пунктов меню иа
- •Дополнительные сценарии установки
- •Распространение
- •Содержание
Параметры для Компонентов
В рамках усилий по интернационализации нашего Компонента, мы хотим дать администраторам возможность изменения валюты символ которой отображается рядом с полем средняя цена обеда (average dinner price). Наш Компонент имел несколько Видов, и мы можем настроить каждый из них в отдельности. Вместо того чтобы писать XML-файл в ИА, мы сделаем по одному для каждого Вида в ИП. Для начала, создайте файл metadata.xml в папке /components/com_reviews/views/all и добавьте следующую информацию:
<?xml version="1.0" encoding="utf8"?>
<metadata>
<view title="All">
<message>
<![CDATA[Shows all reviews.]]>
</message>
</view>
<params>
<param name="currency_symbol" type="text" size="3"
default="$" label="Currency Symbol"
description="Enter the currency symbol
to be used for average dinner prices." />
</params>
</metadata>
XML-файл конфигурации для просмотра гораздо меньше того, что используется для всего расширения. Во-первых, мы располагаем все наши данные в теге <metadata>. Далее, в теге <view> с названием параметра, которое мы увидим в ИА. Тег <message> помещается внутрь и содержит описание которое отображается при наведении мышки. В ИА и выберите Menus / Main Menu, затем выберите команду New. После выбора Restaurant Reviews как тип меню, вы увидите такой экран:
Клик по Default Layout внутри All выведет экран конфигурации с Menu Item Parameters, как показано на следующем рисунке:
Определение символа валюты в конфигурации в ИП потребует некоторых изменений в классе display(), что управляет отдельными Обзорами. Откройте /components/com_reviews/views/review/view.html.php и сделайте следующие модификации (выделено):
class ReviewViewReview extends JView
{
function display($tpl = null)
{
global $option, $mainframe;
$model = &$this->getModel();
$user =& JFactory::getUser();
$review = $model->getReview();
$comments = $model->getComments();
$pathway =& $mainframe->getPathWay();
$backlink = JRoute::_('index.php?option=' . $option);
$menu =& JMenu::getInstance();
$item = $menu->getActive();
$params =& $menu->getParams($item->id);
$currency = $params->get('currency_symbol', '$');
$review->review_date = JHTML::Date($review->review_date);
if($review->smoking == 1)
{
$review->smoking = "Yes";
}
else
{
$review->smoking = "No";
}
for($i = 0; $i < count($comments); $i++)
{
$row =& $comments[$i];
$row->comment_date = JHTML::Date($row->comment_date);
}
$pathway->addItem($review->name, '');
$this->assignRef('review', $review);
$this->assignRef('comments', $comments);
$this->assignRef('backlink', $backlink);
$this->assignRef('Itemid', $Itemid);
$this->assignRef('option', $option);
$this->assignRef('name', $user->_table->name);
$this->assignRef('currency', $currency);
parent::display($tpl);
}
}
Чтобы включить символ валюты, установленный в настройках, нам необходимо загрузить параметры. Поскольку параметры сохраняются в пункте меню, указывающем на Компонент, мы использованием JMenu функцию GetInstance(), чтобы получить ссылку на объект $menu. Затем мы вызываем $menu функцию getActive(), чтобы получить ссылку на текущий пункт меню. Наконец, мы получаем ссылку на параметры объекта вызывая $menu функцию getParams() и передем $item переменную id. Как и в других параметрах, мы используем функцию get(), чтобы получить $currency с символом currency_symbol, по умолчанию $, если он не указан. Эта переменная затем присваивается ссылке на объект ReviewViewReview. Сам шаблон также нуждается в корректировке. Откройте /components/com_reviews/views/review/tmpl/default.php и замените строку с символом $ на выделенные строки:
<p class="contentheading">
<?php echo $this->review->name; ?>
</p>
<p class="createdate">
<?php echo $this->review->review_date; ?>
</p>
<p>
<?php echo $this->review->quicktake; ?>
</p>
<p><strong>Address:</strong> <?php echo $this->review->address; ?>
</p>
<p><strong>Cuisine:</strong> <?php echo $this->review->cuisine; ?>
</p>
<p><strong>Average dinner price:</strong>
<?php echo $this->currency,
$this->review->avg_dinner_price; ?>
</p>
<p><strong>Credit cards:</strong>
<?php echo $this->review->credit_cards; ?>
</p>
<p><strong>Reservations:</strong>
<?php echo $this->review->reservations; ?>
</p>
<p><strong>Smoking:</strong>
<?php echo $this->review->smoking ?>
</p>
<p>
<?php echo $this->review->review; ?>
</p>
<p><em>Notes:</em>
<?php echo $this->review->notes; ?>
</p>
<a href="<?php echo $this->backlink; ?>">< return to the
reviews</a>
<?php if(count($this->comments)) : ?>
<br /><br />
<?php foreach($this->comments as $comment): ?>
<p><strong><?php echo $comment->full_name; ?></strong> <em><?php
echo $comment->comment_date; ?></em></p>
<p><?php echo $comment->comment_text; ?></p>
<?php endforeach; ?>
<?php endif; ?>
<br /><br />
<?php echo $this->loadTemplate('form'); ?>
Вместе с ранее добавленными мы выводим переменную currency объекта view.
Сразу сделаем это же со средней ценой обеда в ресторане.
В дополнение ко всем Обзорам, мы хотим иметь возможность добавить ссылку на отдельные Обзоры. При ссылке на отдельные Обзоры, мы хотим также управлять денежной единицы. Для этого нам нужно создать metadata.xml в /components/com_reviews/views/review с таким кодом:
<?xml version="1.0" encoding="utf8"?>
<metadata>
<view title="Single Review">
<message>
<![CDATA[Shows individual reviews.]]>
</message>
</view>
<params>
<param name="id" type="text" size="3" default=""
label="Review ID" description="Enter the ID
of the review to be displayed." />
<param name="currency_symbol" type="text" size="3"
default="$" label="Currency Symbol"
description="Enter the currency symbol to
be used for average dinner prices." />
</params>
</metadata>
Эта конфигурация XML похожа на ту, что мы использовали для всех Обзоров. Но, главное отличие в дополнительном параметре, где администратор может добавить ID конкретного Обзора, что будет отображаться. При создании новой ссылки меню, используйте Single Review внутри Restaurant Reviews. Вы должны получить окно параметров, которое выглядит как на рисунке. Получите Review ID для Обзора, на который вы хотите перейти по ссылке и введите его в это поле.
Хотя мы и не будем делать какие-либо изменения в классе display, все же нужно изменить конструктор для обнаружения установки ID в параметрах пункта меню. Откройте /components/com_reviews/models/review.php и замените функцию __construct() на такой код:
function __construct()
{
parent::__construct();
$params =& JSiteHelper::getMenuParams();
$id = $params->get('id', 0);
if(!$id)
{
$id = JRequest::getVar('id', '');
}
$this->_id = $id;
}
Как и в предыдущей версии __construct(), мы вызываем конструктор родителя JModel чтобы добавить некоторые шаги в процесс инициализации класса, а не для замены его. Затем мы получаем ссылку на параметры текущего пункта меню, используя JSiteHelper функцию getMenuParams(). Мы захватываем значение ID параметр в $id, по умолчанию 0. Значение $id проверяется: если 0, мы попытаемся получить id из переменных запроса, по умолчанию null, если он не существует. Наконец, присваиваем переменной объекта _id значение $id. После сохранения модели в ИП перейдите по созданной ссылке для отдельного Обзора. Ваш экран должен выглядеть так:
Резюме
Благодаря XML-файлам конфигурации мы смогли добавить несколько опций, не создавая отдельные таблицы для их хранения. Параметры были добавлены в Модули, Плагины, Компоненты и Виды с минимальным обновлением кода. Администраторы сайта теперь могут использовать знакомые элементы управления, позволяющие управлять этими параметрами