Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Samouchitel_po_razrabotke_rasshireny_dlya_Jooml....docx
Скачиваний:
3
Добавлен:
10.11.2018
Размер:
2.53 Mб
Скачать

Обработка данных

После того как форма будет заполнена и администратор нажимает кнопку 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 будет выглядеть примерно так:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]