12. Сохранение данных настройки. Часть 2.¶
Мы нашли раздел контроллера app/controllers/backend/products.php, который отвечает за сохранение данных на странице редактирования товара в панели администратора.
Изучение данного раздела приводит к функции fn_update_product
:
1 | $product_id = fn_update_product($_REQUEST['product_data'], $_REQUEST['product_id'], DESCR_SL);
|
Данная функция принимает следующие аргументы:
$_REQUEST['product_data']
— массив с данными из полей формы$_REQUEST['product_id']
— ID товара который обновляетсяDESCR_SL
— константа с кодом выбранного языка.
$_REQUEST
— глобальная переменная которая содержит данные POST и GET запросов. Не используйте $_POST
и $_GET
напрямую, так данные из них проходят обработку и попадают в $_REQUEST
.
Респечатаем
$_REQUEST
перед функциейfn_update_product
1 2
fn_print_die($_REQUEST); $product_id = fn_update_product($_REQUEST['product_data'], $_REQUEST['product_id'], DESCR_SL);
На экране отобразятся данные которые передаются на сохранение.
Найдите в массиве данные из вашей настройки (поля видео кода).
Когда мы создавали поле для видео в шаблоне, мы указали текстовому полю параметр:
name="product_data[video]"
Это значит код видео должен быть в ячейке
video
массиваproduct_data
переменной$_REQUEST
.Распечатайте ячейку отдельно.
1 2
fn_print_die($_REQUEST['product_data']['video']); $product_id = fn_update_product($_REQUEST['product_data'], $_REQUEST['product_id'], DESCR_SL);
Перезагрузите страницу.
Всё отлично, код из поля передаётся в функцию.
Убирайте все
fn_print_r
иfn_print_die
.Изучим функцию
fn_update_product
.Данная функция находится в файле c функциями для работы с товарами:
app/functions/fn.catalog.php
Результатом работы
fn_update_product
будет сохранение данных из формы в базе данных MySQL:- Основные данные о товаре, которые не зависят от языка, сохраняются в таблицу
cscart_products
- Различные описания товара, сохраняются в таблицу
cscart_product_descriptions
, для выбранного языка.
- Основные данные о товаре, которые не зависят от языка, сохраняются в таблицу
Откройте файл app/functions/fn.catalog.php и найдите
fn_update_product
Все запросы к базе данных в CS-Cart должны выполнятся с помощью специальных функций плейсхолдеров (placeholder). Это сильно повышает безопасность и исключает SQL инъекции.
Запросы выглядят так:
Создание нового товара: 1
$product_id = db_query("INSERT INTO ?:products ?e", $_data);
Обновление существующего товара 1
$arow = db_query("UPDATE ?:products SET ?u WHERE product_id = ?i", $_data, $product_id);
Нас интересует запрос на обновление.
?:products
— Название таблицы базы данных, где?:
автоматически заменится на префиксcscart_
.?u
и?i
— Будут автоматически заменены на аргументы (переменные) передаваемые в функцию с учётом порядка:?u
— заменится на$_data
,?i
— заменится на$product_id
Распечатаем
$_data
перед запросом.1 2
fn_print_die($_data); $arow = db_query("UPDATE ?:products SET ?u WHERE product_id = ?i", $_data, $product_id);
Видим массив с данными которые передаются на обновление.
Ключи массива соответствуют колонкам таблицы
cscart_products
. Если в таблице есть колонка с соответствующим названием, то она будет обновлена.Откройте таблицу
cscart_products
в phpmyadmin.Все колонки данные для которых есть в массиве будут обновлены для обновляемого продукта. Как вы можете догадаться id продукта мы передаём в
$product_id
.Наша новая настройка передаётся в ячейке с ключом
video
. В таблице базы данных нет колонки с названием video, поэтому и данные не сохраняются. Нужно просто создать колонку и данные из нового поля будут сохранены.
Убирайте все fn_print_r
и fn_print_die
.
Создадим новую колонку в базе данных MySQL с помощью модуля в следующем уроке.