- •Что в этой книге
- •Настройки против Расширений
- •Как расширить Joomla!
- •Компоненты (Components)
- •Модули (Modules)
- •Плагины (Plug-Ins)
- •Обзор тем
- •Создание пи (Toolbars) и Списков
- •Поддержание стиля и исключение повторений кода используя html функции
- •Доступ к бд и управление записями
- •Безопасность и предпочтительный способ получения переменных запроса
- •Меню управления
- •Управления логикой работы внутри Компонента
- •Конфигурация посредством xml-параметров
- •Упаковка и распространение
- •Наш Проект для примера
- •Приступая к разработке Компонента
- •Структура Компонента Joomla!
- •Запуск Компонента
- •Разделение на иа и ип в Joomla
- •Регистрация Компонента в бд
- •Создание пи
- •Доступные кнопки пи
- •Создание таблицы бд
- •Создание класса Table
- •Создание формы Обзора
- •Обработка данных
- •Создание Списка
- •Редактирование записей
- •Удаление записей
- •Разработка ип
- •Листинг Обзоров
- •Отображение Обзора
- •Генерация дружественных для поисковиков ссылок
- •Создание url сегментов
- •Парсинг url сегментов
- •Добавление комментариев
- •Отображение комментариев
- •Разработка Модуля
- •Регистрация Модуля в бд
- •Создание и настройка базового Модуля
- •Воспользуемся некоторыми помощниками (class Helper)
- •Пробуем различные стили
- •Попробуем смешать
- •Расширяем проект
- •Модель, Вид, Контроллер: Почему?
- •Построение Модели данных
- •Модель Все Обзоры
- •Модель одиночного Обзора
- •Миграция на Виды
- •Переключения посредством Контроллеров (Controllers)
- •Обновление связей и маршрутов
- •Реорганизация кода иа
- •Управление публикацией Обзоров
- •Добавление постраничной навигации
- •Управление Коментариями
- •Дополнительные пи
- •За кулисами: Плагины (Plug-Ins)
- •Запросы к бд
- •Плагин ссылка
- •Плагин справочной информации
- •Поиск Обзоров
- •Параметры
- •Добавление параметров к расширениям
- •Параметры для Модулей
- •Параметры для Плагинов
- •Параметры для Компонентов
- •Упаковываем все вместе
- •Список всех файлов
- •Упаковка Модуля
- •Упаковка Плагина
- •Упаковка Компонента
- •Включение sql-запросов
- •Создание пунктов меню иа
- •Дополнительные сценарии установки
- •Распространение
- •Содержание
Обработка данных
После того как форма будет заполнена и администратор нажимает кнопку Save, мы должны сохранить информацию в базе данных. Для начала, создадим saveReview() в admin.reviews.php:
function saveReview( $option )
{
global $mainframe;
$row =& JTable::getInstance('review', 'Table');
if (!$row->bind(JRequest::get('post')))
{
echo "<script> alert('".$row->getError()."');
window.history.go(-1); </script>\n";
exit();
}
$row->quicktake = JRequest::getVar( 'quicktake', '', 'post',
'string', JREQUEST_ALLOWRAW );
$row->review = JRequest::getVar( 'review', '', 'post',
'string', JREQUEST_ALLOWRAW );
if(!$row->review_date)
$row->review_date = date( 'Y-m-d H:i:s' );
if (!$row->store())
{
echo "<script> alert('".$row->getError()."');
window.history.go(-1); </script>\n";
exit();
}
$mainframe->redirect('index.php?option=' .
$option, 'Review Saved');
}
Во-первых, мы подключаем глобальный $mainframe и текущее соединение с БД. Объект $mainframe имеет множество функций в своем составе, которые можно использовать для контроля переменных и заголовков сессии. Мы также объявляем $row как экземпляр нашего класса TableReview;.
Имя класса собирается из параметров, где второй выступает в качестве префикса первого. Далее, мы вызываем $row функцию Bind() для загрузки всех переменных из формы.
Bind() принимает ассоциативный массив в качестве параметра и пытается сопоставить все элементы переменным - членам объекта. Чтобы уменьшить риск атак SQL-инъекций, мы называем JRequest::get() для дезинфекции значений из $_POST. Этот процесс убирает символы, которые могут быть использованы для управления SQL-запросами. Если bind() возвращает false по определенным причинам, мы показываем это в виде JavaScript-оповещения и возвращаем пользователя назад к предыдущему экрану.
После привязки, мы можем манипулировать переменными – членами объекта $row непосредственно.
Поля quicktake и review принимают HTML содержание и нуждаются в особой обработке, так как функция Bind() автоматически удаляет HTML теги. Чтобы обойти эту проблему, мы используем JRequest функцию getVar() с параметрами: имя переменной, значение по умолчанию, массив, ожидаемый формат и флаг JREQUEST_ALLOWRAW.
В дополнение к HTML данным, мы также можем добавить данные по умолчанию или другие автоматически сгенерированные данные после привязки. Здесь мы вставляем текущую дату в случае, если она не указана. Наконец, мы вызываем функцию store(), которая берет все переменные и превращает их в UPDATE или INSERT запрос, в зависимости от значения ID. Поскольку мы создаем эту запись в первый раз, ID не будет иметь значения и запрос будет построен как INSERT. Если есть ошибки SQL, мы возвращаем переменные пользователю, а самого пользователя к предыдущему экрану. Часто, SQL ошибки на этом уровне могут быть вызваны из-за появления посторонних переменных, которые не описаны в таблице классов $row. Если в запросе ошибка, сначала проверьте, соответствует ли написание ваших переменных класса написанию названий столбцов таблицы.
Если SQL-запрос прошел успешно, мы используем функцию redirect() из $mainframe чтобы отправить пользователя в главное меню Компонента с подтверждающим сообщением. На данный момент, switch() в admin.reviews.php обрабатывает только задачу add. Теперь у нас есть все необходимое, и мы можем добавить очередной case для сохранения данных. Добавьте выделенный код в switch():
switch($task)
{
case 'add':
editReview( $option );
break;
case 'save':
saveReview( $option );
break;
}
Сохраните все ваши файлы и наберите http://localhost/joomla/administrator
/index.php?option=com_reviews&task=add в вашем браузере. Заполняйте форму и нажмите кнопку Save. Вы должны увидеть подобный экран:
Почему не нажимается кнопка "New"?
Кнопки на панели инструментов предназначены для работы с формой по имени adminForm. Так как наш код еще не имеет формы, нажатие на любую из кнопок приведет к ошибке JavaScript. После добавления adminForm со скрытой переменной task, кнопки будут функционировать как и ожидалось
Вы можете проверить результаты в таблице БД jos_reviews. Если все работает правильно таблиц в PhpMyAdmin будет выглядеть примерно так: