- •Что в этой книге
- •Настройки против Расширений
- •Как расширить Joomla!
- •Компоненты (Components)
- •Модули (Modules)
- •Плагины (Plug-Ins)
- •Обзор тем
- •Создание пи (Toolbars) и Списков
- •Поддержание стиля и исключение повторений кода используя html функции
- •Доступ к бд и управление записями
- •Безопасность и предпочтительный способ получения переменных запроса
- •Меню управления
- •Управления логикой работы внутри Компонента
- •Конфигурация посредством xml-параметров
- •Упаковка и распространение
- •Наш Проект для примера
- •Приступая к разработке Компонента
- •Структура Компонента Joomla!
- •Запуск Компонента
- •Разделение на иа и ип в Joomla
- •Регистрация Компонента в бд
- •Создание пи
- •Доступные кнопки пи
- •Создание таблицы бд
- •Создание класса Table
- •Создание формы Обзора
- •Обработка данных
- •Создание Списка
- •Редактирование записей
- •Удаление записей
- •Разработка ип
- •Листинг Обзоров
- •Отображение Обзора
- •Генерация дружественных для поисковиков ссылок
- •Создание url сегментов
- •Парсинг url сегментов
- •Добавление комментариев
- •Отображение комментариев
- •Разработка Модуля
- •Регистрация Модуля в бд
- •Создание и настройка базового Модуля
- •Воспользуемся некоторыми помощниками (class Helper)
- •Пробуем различные стили
- •Попробуем смешать
- •Расширяем проект
- •Модель, Вид, Контроллер: Почему?
- •Построение Модели данных
- •Модель Все Обзоры
- •Модель одиночного Обзора
- •Миграция на Виды
- •Переключения посредством Контроллеров (Controllers)
- •Обновление связей и маршрутов
- •Реорганизация кода иа
- •Управление публикацией Обзоров
- •Добавление постраничной навигации
- •Управление Коментариями
- •Дополнительные пи
- •За кулисами: Плагины (Plug-Ins)
- •Запросы к бд
- •Плагин ссылка
- •Плагин справочной информации
- •Поиск Обзоров
- •Параметры
- •Добавление параметров к расширениям
- •Параметры для Модулей
- •Параметры для Плагинов
- •Параметры для Компонентов
- •Упаковываем все вместе
- •Список всех файлов
- •Упаковка Модуля
- •Упаковка Плагина
- •Упаковка Компонента
- •Включение sql-запросов
- •Создание пунктов меню иа
- •Дополнительные сценарии установки
- •Распространение
- •Содержание
Создание формы Обзора
После создания таблицы БД, нам необходим дружественный интерфейс для добавления Обзоров в нее. Для начала, давайте создадим форму для ввода данных Обзора. Также как и с ПИ, мы отделяем логику от отображения. PHP-код для настройки формы будет в admin.reviews.php, а admin.reviews.html.php будет содержать инструкции HTML. Откройте admin.reviews.php и замените содержимое на следующий код:
<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
require_once( JApplicationHelper::getPath( 'admin_html' ) );
JTable::addIncludePath(JPATH_COMPONENT.DS.'tables');
switch($task)
{
case 'add':
editReview( $option );
break;
}
function editReview( $option )
{
$row =& JTable::getInstance('Review', 'Table');
$lists = array();
$reservations = array(
'0' => array('value' => 'None Taken',
'text' => 'None Taken'),
'1' => array('value' => 'Accepted',
'text' => 'Accepted'),
'2' => array('value' => 'Suggested',
'text' => 'Suggested'),
'3' => array('value' => 'Required',
'text' => 'Required'),
);
$lists['reservations'] = JHTML::_('select.genericList',
$reservations, 'reservations', 'class="inputbox" '. '', 'value',
'text', $row->reservations );
$lists['smoking'] = JHTML::_('select.booleanlist', 'smoking',
'class="inputbox"', $row->smoking);
$lists['published'] = JHTML::_('select.booleanlist', 'published',
'class="inputbox"', $row->published);
HTML_reviews::editReview($row, $lists, $option);
}
?>
После проверки, что мы находимся в Joomla, используем require_once(JApplicationHelper::getPath('admin_html')) для подключения admin.reviews.html.php. Функция GetPath() принимает определенные строки (такие, как admin_html, front_html, и класс) и возвращает абсолютный путь к соответствующим файлам Компонента. Хотя мы не указали имя Компонента в этой строке кода, будет подключен соответствующий (правильный) файл, даже если мы изменим название Компонента и HTML-файла. Использование require_once() гарантирует подключение файла только один раз.
Хотя мы сразу же и не будем работать с базой данных подключаем наш table-класс таблицы с помощью JTable функции addIncludePath(). Эта функция автоматически включает все классы которые мы определили в файлах в каталоге tables. Имя файла и путь созданы для кросс-платформенной совместимости. В JPATH_COMPONENT содержится абсолютный путь к ИА. Константа DS разделитель каталогов, конретный для операционной системы. Оператор switch() проверяет переменную $task и выбирает соответствующую функцию для запуска в зависимости от значения. Наконец, функция editReview() готовит несколько элементов HTML до передачи их вместе с нашей функцией отображения HTML_reviews::editReview().
Теперь создайте admin.reviews.html.php файл и добавьте в него следующий код:
<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
class HTML_reviews
{
function editReview( $row, $lists, $option )
{
$editor =& JFactory::getEditor();
JHTML::_('behavior.calendar');
?>
<form action="index.php" method="post"
name="adminForm" id="adminForm">
<fieldset class="adminform">
<legend>Details</legend>
<table class="admintable">
<tr>
<td width="100" align="right" class="key">
Name:
</td>
<td>
<input class="text_area" type="text" name="name"
id="name" size="50" maxlength="250"
value="<?php echo $row->name;?>" />
</td>
</tr>
<tr>
<td width="100" align="right" class="key">
Address:
</td>
<td>
<input class="text_area" type="text" name="address"
id="address" size="50" maxlength="250"
value="<?php echo $row->address;?>" />
</td>
</tr>
<tr>
<td width="100" align="right" class="key">
Reservations:
</td>
<td>
<?php
echo $lists['reservations'];
?>
</td>
</tr>
<tr>
<td width="100" align="right" class="key">
Quicktake:
</td>
<td>
<?php
echo $editor->display( 'quicktake', $row->quicktake ,
'100%', '150', '40', '5' ) ;
?>
</td>
</tr>
<tr>
<td width="100" align="right" class="key">
Review:
</td>
<td>
<?php
echo $editor->display( 'review', $row->review ,
'100%', '250', '40', '10' ) ;
?>
</td>
</tr>
<tr>
<td width="100" align="right" class="key">
Notes:
</td>
<td>
<textarea class="text_area" cols="20" rows="4"
name="notes" id="notes" style="width:500px"><?php echo
$row->notes; ?></textarea>
</td>
</tr>
<tr>
<td width="100" align="right" class="key">
Smoking:
</td>
<td>
<?php
echo $lists['smoking'];
?>
</td>
</tr>
<tr>
<td width="100" align="right" class="key">
Credit Cards:
</td>
<td>
<input class="text_area" type="text" name="credit_cards"
id="credit_cards" size="50" maxlength="250"
value="<?php echo $row->credit_cards;?>" />
</td>
</tr>
<tr>
<td width="100" align="right" class="key">
Cuisine:
</td>
<td>
<input class="text_area" type="text" name="cuisine"
id="cuisine" size="31" maxlength="31"
value="<?php echo $row->cuisine;?>" />
</td>
</tr>
<tr>
<td width="100" align="right" class="key">
Average Dinner Price:
</td>
<td>
$<input class="text_area" type="text"
name="avg_dinner_price"
id="avg_dinner_price" size="5" maxlength="3"
value="<?php echo $row->avg_dinner_price;?>" />
</td>
</tr>
<tr>
<td width="100" align="right" class="key">
Review Date:
</td>
<td>
<input class="inputbox" type="text" name="review_date"
id="review_date" size="25" maxlength="19"
value="<?php echo $row->review_date; ?>" />
<input type="reset" class="button" value="..."
onclick="return showCalendar('review_date',
'y-mm-dd');" />
</td>
</tr>
<tr>
<td width="100" align="right" class="key">
Published:
</td>
<td>
<?php
echo $lists['published'];
?>
</td>
</tr>
</table>
</fieldset>
<input type="hidden" name="id"
value="<?php echo $row->id; ?>" />
<input type="hidden" name="option"
value="<?php echo $option;?>" />
<input type="hidden" name="task"
value="" />
</form>
<?php
}
}
?>
Введите в браузере http://localhost/joomla/administrator/index.php?option=com_reviews&task=add и вы должны увидеть такой экран
Наши функция editReview() принимает в строке таблицы объектов базы данных, массив фрагментов HTML и имя Компонента для создания этого экрана. Таким образом, editReview() почти целиком посвящен отображению. В функцию включено несколько частей вспомогательного кода для некоторых элементов пользовательского интерфейса.
Что делает JTML::_()? Joomla! включает в себя многие поколения HTML функций, которые могут быть использованы для автоматизации создания элементов, таких как раскрывающиеся списки и чекбоксы. Для скорости исполнения, эти функции загружаются в память только по мере их необходимости. Это достигается с помощью функции _ (), которая принимает имя функции в качестве первого параметра и передает остальные параметры (если таковые имеются) в нужную функцию. Функции сгруппированы по типу, о чем свидетельствует первая часть названия (перед точкой) переходящая в первый параметр функции _ ().
Сначала мы вставляем в объект HTML редактор администратора с помощью функции JFactory::getEditor();. Далее мы также используем JHTML::_('behavior.calendar "), чтобы добавить JavaScript и CSS в header. Они необходимы для всплывающего календаря в поле Review Date:
class HTML_reviews
{
function editReview( $row, $lists, $option )
{
$editor =& JFactory::getEditor();
JHTML::_('behavior.calendar');
Функция объекта редактора display() возвращает HTML для выбранного текстового редактора. Если текстовый редактор не требуется, это будет возвращено поле <textarea>.
<td>
<?php
echo $editor->display( 'quicktake', $row->quicktake ,
'100%', '150', '40', '5' ) ;
?>
</td>
Функция display() принимает следующие элементы: form variable, name, value, width, height, columns и rows. Последние два - размеры для <textarea>, в случае если администратор решил не использовать редактор HTML