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.

  1. Респечатаем $_REQUEST перед функцией fn_update_product

    1
    2
        fn_print_die($_REQUEST);
        $product_id = fn_update_product($_REQUEST['product_data'], $_REQUEST['product_id'], DESCR_SL);
    

    На экране отобразятся данные которые передаются на сохранение.

  2. Найдите в массиве данные из вашей настройки (поля видео кода).

    Когда мы создавали поле для видео в шаблоне, мы указали текстовому полю параметр:

    name="product_data[video]"

    Это значит код видео должен быть в ячейке video массива product_data переменной $_REQUEST.

  3. Распечатайте ячейку отдельно.

    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.

  4. Изучим функцию fn_update_product.

    Данная функция находится в файле c функциями для работы с товарами:

    app/functions/fn.catalog.php

    Результатом работы fn_update_product будет сохранение данных из формы в базе данных MySQL:

    • Основные данные о товаре, которые не зависят от языка, сохраняются в таблицу cscart_products
    • Различные описания товара, сохраняются в таблицу cscart_product_descriptions, для выбранного языка.
  5. Откройте файл 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
  6. Распечатаем $_data перед запросом.

    1
    2
        fn_print_die($_data);
        $arow = db_query("UPDATE ?:products SET ?u WHERE product_id = ?i", $_data, $product_id);
    

    Видим массив с данными которые передаются на обновление.

    Ключи массива соответствуют колонкам таблицы cscart_products . Если в таблице есть колонка с соответствующим названием, то она будет обновлена.

  7. Откройте таблицу cscart_products в phpmyadmin.

    Все колонки данные для которых есть в массиве будут обновлены для обновляемого продукта. Как вы можете догадаться id продукта мы передаём в $product_id.

  8. Наша новая настройка передаётся в ячейке с ключом video . В таблице базы данных нет колонки с названием video, поэтому и данные не сохраняются. Нужно просто создать колонку и данные из нового поля будут сохранены.

Убирайте все fn_print_r и fn_print_die.

Создадим новую колонку в базе данных MySQL с помощью модуля в следующем уроке.