- •Что в этой книге
- •Настройки против Расширений
- •Как расширить Joomla!
- •Компоненты (Components)
- •Модули (Modules)
- •Плагины (Plug-Ins)
- •Обзор тем
- •Создание пи (Toolbars) и Списков
- •Поддержание стиля и исключение повторений кода используя html функции
- •Доступ к бд и управление записями
- •Безопасность и предпочтительный способ получения переменных запроса
- •Меню управления
- •Управления логикой работы внутри Компонента
- •Конфигурация посредством xml-параметров
- •Упаковка и распространение
- •Наш Проект для примера
- •Приступая к разработке Компонента
- •Структура Компонента Joomla!
- •Запуск Компонента
- •Разделение на иа и ип в Joomla
- •Регистрация Компонента в бд
- •Создание пи
- •Доступные кнопки пи
- •Создание таблицы бд
- •Создание класса Table
- •Создание формы Обзора
- •Обработка данных
- •Создание Списка
- •Редактирование записей
- •Удаление записей
- •Разработка ип
- •Листинг Обзоров
- •Отображение Обзора
- •Генерация дружественных для поисковиков ссылок
- •Создание url сегментов
- •Парсинг url сегментов
- •Добавление комментариев
- •Отображение комментариев
- •Разработка Модуля
- •Регистрация Модуля в бд
- •Создание и настройка базового Модуля
- •Воспользуемся некоторыми помощниками (class Helper)
- •Пробуем различные стили
- •Попробуем смешать
- •Расширяем проект
- •Модель, Вид, Контроллер: Почему?
- •Построение Модели данных
- •Модель Все Обзоры
- •Модель одиночного Обзора
- •Миграция на Виды
- •Переключения посредством Контроллеров (Controllers)
- •Обновление связей и маршрутов
- •Реорганизация кода иа
- •Управление публикацией Обзоров
- •Добавление постраничной навигации
- •Управление Коментариями
- •Дополнительные пи
- •За кулисами: Плагины (Plug-Ins)
- •Запросы к бд
- •Плагин ссылка
- •Плагин справочной информации
- •Поиск Обзоров
- •Параметры
- •Добавление параметров к расширениям
- •Параметры для Модулей
- •Параметры для Плагинов
- •Параметры для Компонентов
- •Упаковываем все вместе
- •Список всех файлов
- •Упаковка Модуля
- •Упаковка Плагина
- •Упаковка Компонента
- •Включение sql-запросов
- •Создание пунктов меню иа
- •Дополнительные сценарии установки
- •Распространение
- •Содержание
Парсинг url сегментов
При попытке нажать на один из Обзоров прямо сейчас, вы получите сообщение типа "Фатальная ошибка: Вызов неопределенной функции reviewsParseRoute() ("Fatal error: Call to undefined function reviewsParseRoute()"). В дополнение к функции генерации SEF URL для Обзоров, мы должны иметь функцию способную декодировать эти URL. Вернемся в components/com_reviews/router.php и добавим ее:
function ReviewsParseRoute($segments)
{
$vars = array();
$vars['task'] = $segments[0];
$vars['id'] = $segments[1];
return $vars;
}
Как только Joomla! определит, что запрос страницы предназначен для Компонента Обзоров, она будет вызывать BuildParseRoute() и передст в массив соответствующие сегменты URL. Эти сегменты уже отсортированы, и мы передаем их в ReviewsBuildRoute(). Инициализируем массив $vars для хранения возвращаемых переменных. Мы помещали task и ID в массив $segments как первый и второй элементы соответственно. Наконец, мы возвращаем массив, Joomla! в свою очередь, устанавливает переменные запроса. Таким образом, весь процесс маршрутизации является прозрачным для остального кода: все переменные, которые обычно мы ожидаем увидеть при обычных вызовах скрипта будут на месте.
Сохраните router.php и попробуйте нажать на некоторые ссылки и обратите внимание на адресную строку в браузере. Теперь вы должны видеть URL, как
http://www.oursite.com/reviews/view/1 или
http://www.oursite.com/index.php/reviews/view/1.
Если URL выглядит как
http://www.oursite.com/component/reviews/view/1, это просто означает, что вы перешли без SEF URL. Все восстановится, как только Вы пройдете круг.
Добавление комментариев
Большинство посетителей поверят нам на слово, когда мы будем говорить, что ресторан большой (или, что это не так). Однако, могут быть и несогласные. Почему бы не дать им возможность оставлять комментарии? Нам нужно место для их хранения, поэтому введите следующую SQL команду в вашу базу данных из консоли
CREATE TABLE 'jos_reviews_comments' (
'id' int(11) NOT NULL auto_increment,
'review_id' int(11) NOT NULL,
'user_id' int(11) NOT NULL,
'full_name' varchar(50) NOT NULL,
'comment_date' datetime NOT NULL,
'comment_text' text NOT NULL,
PRIMARY KEY ('id')
)
или в PhpMyAdmin создайте таблицу jos_reviews_comments с 6 полями:
Заполните как показано на рисунке:
Обратите внимание, что id установлен как auto_increment и primary key:
Добавим еще один класс БД для работы с основными функциями. Поскольку у нас уже есть класс для Обзоров administrator/components/com_reviews/tables, добавим второй здесь же. Создайте comment.php файл и добавьте класс TableComment, убедившись, что каждый столбец в таблице представлен в виде переменной:
<?php
defined('_JEXEC') or die('Restricted access');
class TableComment extends JTable
{
var $id = null;
var $review_id = null;
var $user_id = null;
var $full_name = null;
var $comment_date = null;
var $comment_text = null;
function __construct(&$db)
{
parent::__construct( '#__reviews_comments',
'id', $db );
}
}
?>
Теперь, добавим форму, чтобы люди могли вводить свои комментарии. Откройте reviews.html.php файл и добавьте следующую функцию в HTML_reviews
function showCommentForm($option, $review_id, $name)
{
?>
<br /><br />
<form action="index.php" method="post">
<table>
<tr>
<td>
<strong>Name:</strong>
</td>
<td>
<input class="text_area" type="text" name="full_name"
id="full_name" value="<?php echo $name; ?>" />
</td>
</tr>
<tr>
<td>
<strong>Comment:</strong>
</td>
<td>
<textarea class="text_area" cols="20" rows="4"
name="comment_text" id="comment_text"
style="width:500px"></textarea>
</td>
</tr>
</table>
<input type="hidden" name="review_id"
value="<?php echo $review_id; ?>" />
<input type="hidden" name="task"
value="comment" />
<input type="hidden" name="option"
value="<?php echo $option; ?>" />
<input type="submit" class="button" id="button"
value="Submit" />
</form>
<?php
}
Функция ShowCommentForm() принимает имя текущего Компонента, id отображаемого Обзора и имя в качестве параметров. Имя (Name) уже заполнено в форме, так что зарегистрированные пользователи не должны его вводить. Ссылка вернуться к Обзорам (return to the reviews) вернет нас назад в Компонент. Переменная task имеет значение comment, так что Компонент записывает комментарии. Чтобы быть уверенным, что комментарий соответствует Обзору, review_id установлен как текущий. Чтобы форма отображалась только под Обзором, добавьте следующий выделенный код viewReview () в файл reviews.php:
if(!$row->published)
{
JError::raiseError( 404, JText::_( 'Invalid ID provided' ) );
}
HTML_reviews::showReview($row, $option);
$user =& JFactory::getUser();
if($user->name)
{
$name = $user->name;
}
else
{
$name = '';
}
HTML_reviews::showCommentForm($option, $id, $name);
Перед вызовом функции HTML-отображения, нам необходимо получить имя вошедшего в систему пользователя (если имеется). Код $user =& Jfactory::getUser(); устанавливает ссылку на объект $user для вошедшего в систему пользователя. Если полное имя пользователя находится в переменной name, мы фиксируем это значение в $name, в противном случае $name имеет значение пустой строки.
Сохраните все ваши файлы и перезагрузите Обзор. Если вы вошли как пользователь, ваш экран должен выглядеть как на скриншоте ниже. Если вы не авторизованы на форуме, будет отображаться форма, но поле Name не будет заполнено
Прежде чем мы попытаемся заполнить и отправить форму, мы должны добавить код, который будет обрабатывать входные и записывать их в базу данных. Добавьте следующий выделенный код для switch() в reviews.php файл:
switch($task)
{
case 'view':
viewReview($option);
break;
case 'comment':
addComment($option);
break;
default:
showPublishedReviews($option);
break;
}
Далее в этот же файл добавьте функцию addComment():
function addComment($option)
{
global $mainframe;
$row =& JTable::getInstance('comment', 'Table');
if (!$row->bind(JRequest::get('post')))
{
echo "<script> alert('".$row->getError()."');
window.history.go(-1); </script>\n";
exit();
}
$row->comment_date = date( 'Y-m-d H:i:s' );
$user =& JFactory::getUser();
if($user->id)
{
$row->user_id = $user->id;
}
if (!$row->store())
{
echo "<script> alert('".$row->getError()."');
window.history.go(-1); </script>\n";
exit();
}
$mainframe->redirect('index.php?option=' .
$option . '&id=' . $row->review_id .
'&task=view', 'Comment Added.');
}
Большая часть этого кода уже должна быть понятна. Мы получаем ссылку на текущий объект пользователя, чтобы получить ID пользователя и установить его в нашей БД. На данный момент, мы, позволяем оставлять комментарии как зарегистрированным пользователям, так и анонимные комментарии. В дальнейшем будет возможно отслеживать зарегистрированных пользователей. Если посетитель не вошел в систему, $user будет пустой и, следовательно, столбец user_id, по умолчанию будет равен 0. Перед сохранением, присвоим текущую дату и время comment_date. Остальные функции связывания, сохранения, и перенаправления аналогичны ИА