![](/user_photo/2706_HbeT2.jpg)
- •Что в этой книге
- •Настройки против Расширений
- •Как расширить Joomla!
- •Компоненты (Components)
- •Модули (Modules)
- •Плагины (Plug-Ins)
- •Обзор тем
- •Создание пи (Toolbars) и Списков
- •Поддержание стиля и исключение повторений кода используя html функции
- •Доступ к бд и управление записями
- •Безопасность и предпочтительный способ получения переменных запроса
- •Меню управления
- •Управления логикой работы внутри Компонента
- •Конфигурация посредством xml-параметров
- •Упаковка и распространение
- •Наш Проект для примера
- •Приступая к разработке Компонента
- •Структура Компонента Joomla!
- •Запуск Компонента
- •Разделение на иа и ип в Joomla
- •Регистрация Компонента в бд
- •Создание пи
- •Доступные кнопки пи
- •Создание таблицы бд
- •Создание класса Table
- •Создание формы Обзора
- •Обработка данных
- •Создание Списка
- •Редактирование записей
- •Удаление записей
- •Разработка ип
- •Листинг Обзоров
- •Отображение Обзора
- •Генерация дружественных для поисковиков ссылок
- •Создание url сегментов
- •Парсинг url сегментов
- •Добавление комментариев
- •Отображение комментариев
- •Разработка Модуля
- •Регистрация Модуля в бд
- •Создание и настройка базового Модуля
- •Воспользуемся некоторыми помощниками (class Helper)
- •Пробуем различные стили
- •Попробуем смешать
- •Расширяем проект
- •Модель, Вид, Контроллер: Почему?
- •Построение Модели данных
- •Модель Все Обзоры
- •Модель одиночного Обзора
- •Миграция на Виды
- •Переключения посредством Контроллеров (Controllers)
- •Обновление связей и маршрутов
- •Реорганизация кода иа
- •Управление публикацией Обзоров
- •Добавление постраничной навигации
- •Управление Коментариями
- •Дополнительные пи
- •За кулисами: Плагины (Plug-Ins)
- •Запросы к бд
- •Плагин ссылка
- •Плагин справочной информации
- •Поиск Обзоров
- •Параметры
- •Добавление параметров к расширениям
- •Параметры для Модулей
- •Параметры для Плагинов
- •Параметры для Компонентов
- •Упаковываем все вместе
- •Список всех файлов
- •Упаковка Модуля
- •Упаковка Плагина
- •Упаковка Компонента
- •Включение sql-запросов
- •Создание пунктов меню иа
- •Дополнительные сценарии установки
- •Распространение
- •Содержание
Управление публикацией Обзоров
Когда мы построили элементы управления для Обзора Компонентов в ИА, был создан список экран, где администраторы могли выбирать существующий Обзор для редактирования. В дальней правой части экрана, есть колонка под названием Опубликовано (Published), которая показывает текущее состояние публикации каждого Обзора.
Иконки здесь на самом деле кнопки, которые предназначены для переключения между публикацией и ее отменой. Если нажать на одну из этих кнопок сейчас, значок не меняется, т.к. мы еще не добавили соответствующий код. Кнопки Публикация и Отмена (Publish и Unpublish) на ПИ, также не функционируют. Чтобы исправить это, мы добавим функцию publish() для Контроллера в ИА и зарегистрируем задачу unpublish с его помощью:
function __construct( $default = array() )
{
parent::__construct( $default );
$this->registerTask( 'add' , 'edit' );
$this->registerTask( 'apply', 'save' );
$this->registerTask( 'unpublish', 'publish' );
}
function publish()
{
global $option;
$cid
= JRequest::getVar( 'cid', array(), '', 'array' );
if( $this->_task == 'publish')
{
$publish = 1;
}
else
{
$publish = 0;
}
$reviewTable =& JTable::getInstance('review', 'Table');
$reviewTable->publish($cid, $publish);
$this->setRedirect( 'index.php?option=' . $option );
}
Как и функция edit(), функция publish() подключает текущий объект БД JFactory:: getDBO() и получает cid массив из нашей формы. Поскольку функция может обрабатывать задачи как публикации, так и отмену публикации, мы проверяем переменную _task Контроллера, чтобы определить, что в настоящее время делать. Исходя из этого, мы устанавливаем $publish в 1 или 0. Далее, reviewTable ссылаемся на экземпляр класса ReviewTable. Используя $reviewTable функцию publish(), получаем в массив ID Обзоров и устанавливаем значение для столбца Published, что хранится в БД. Наконец, Контроллер возвращает нас обратно в главное меню Компонента.
Теперь иконки переключения публикации любых Обзоров в списке должны работать
Добавление постраничной навигации
Как только наши обозреватели добавят слишком много Обзоров ресторанов, список станет весьма длинным. Было бы полезно разделить его на несколько экранов. Так, как это делают поисковые системы, которые обычно показывают десять или двадцать результатов за раз. Функциональность и интерфейс постраничной навигации встроен в Joomla! и его легко добавить. Для начала, мы добавим нумерацию страниц в менеджер Обзора в ИА. Списки Обзоров разделятся на несколько страниц и будут созданы ссылки для перемещения между ними. Откройте /administrator/components/com_reviews/controller.php и сделайте изменения в функции showReviews () (выделенный код):
function showReviews()
{
global $option, $mainframe;
$limit = JRequest::getVar('limit',
$mainframe->getCfg('list_limit'));
$limitstart = JRequest::getVar('limitstart', 0);
$db =& JFactory::getDBO();
$query = "SELECT count(*) FROM #__reviews";
$db->setQuery( $query );
$total = $db->loadResult();
$query = "SELECT * FROM #__reviews";
$db->setQuery( $query, $limitstart, $limit );
$rows = $db->loadObjectList();
if ($db->getErrorNum()) {
echo $db->stderr();
return false;
}
jimport('joomla.html.pagination');
$pageNav = new JPagination($total, $limitstart, $limit);
HTML_reviews::showReviews( $option, $rows, $pageNav );
}
Переменные $limit и $limitstart представляют количество выводимых записей для просмотра и номер начальной записи. Если $limit не определен в запросе, мы берем его из конфигурации Joomla!. Чтобы правильно рассчитать количество страниц, которые будут созданы, нам нужно общее число строк в наборе. Для этого назначаем переменную $total. В результат запроса мы хотим получить столько строк, сколько собираемся показывать. Для этого используются второй и третий параметры setQuery(). Соответствующий SQL запрос в БД создается автоматически.
Наконец, мы импортируем библиотеку, которая генерирует HTML-разбиение на страницы и получаем экземпляр класса JPagination чтобы установить диапазон и $total. Этот объект передается в HTML_reviews::showReviews(), который необходимо несколько изменить, чтобы сделать возможным его использование. Открываем admin.reviews.html.php и находим функцию showReviews(). Для отображения нумерации страниц необходимо сделать всего две небольшие модификации кода, как выделено ниже:
function showReviews( $option, &$rows, &$pageNav )
{
?>
<form action="index.php" method="post" name="adminForm">
<table class="adminlist">
<thead>
<tr>
<th width="20">
<input type="checkbox" name="toggle" value=""
onclick="checkAll(<?php echo count( $rows ); ?>);" />
</th>
<th class="title">Name</th>
<th width="15%">Address</th>
<th width="10%">Reservations</th>
<th width="10%">Cuisine</th>
<th width="10%">Credit Cards</th>
<th width="5%" nowrap="nowrap">Published</th>
</tr>
</thead>
<?php
jimport('joomla.filter.output');
$k = 0;
for ($i=0, $n=count( $rows ); $i < $n; $i++) {
$row = &$rows[$i];
$checked = JHTML::_('grid.id', $i, $row->id );
$published = JCommonHTML::PublishedProcessing( $row, $i );
$link = JOutputFilter::ampReplace( 'index.php?option=' .
$option . '&task=edit&cid[]='. $row->id );
?>
<tr class="<?php echo "row$k"; ?>">
<td><?php echo $checked; ?></td>
<td><a href="<?php echo $link; ?>">
<?php echo $row->name; ?></a></td>
<td><?php echo $row->address; ?></td>
<td><?php echo $row->reservations; ?></td>
<td><?php echo $row->cuisine; ?></td>
<td><?php echo $row->credit_cards; ?></td>
<td align="center"><?php echo $published;?></td>
</tr>
<?php
$k = 1 - $k;
}
?>
<tfoot>
<td colspan="7">
<?php echo $pageNav->getListFooter(); ?></td>
</tfoot>
</table>
<input type="hidden" name="option" value="<?php echo $option;?>" />
<input type="hidden" name="task" value="" />
<input type="hidden" name="boxchecked" value="0" />
</form>
<?php
}
Вызов $pageNav функции getListFooter() возвращает HTML ссылки на каждую из страниц списка Обзоров. Текущая страница выделена, но не имеет ссылки. Выводится выпадающий список для выбора отображаемого количества строк. Теперь ваш экран должен выглядеть примерно так. Желательно добавить Обзоры, чтобы у вас их было, по крайней мере, шесть
По умолчанию, вероятно у Вас установлено 20 строк для отображения. Выберите 5 из выпадающего списка, и вы увидите такой экран:
Нажатие на любой кнопку Next или End – должен появиться экран с оставшимися записями: