Правка shopFrontendCartAdd.controller.php

Подскажите, нужно добавить переменные в таблицу БД shop_cart_items при добавлении товара в корзину, к примеру переменная test, поле таблицы в БД тоже test. Есть исходный код файла shopFrontendCartAdd.controller.php:

if (!$item_id) {
                $data = array(
                    'create_datetime' => date('Y-m-d H:i:s'),
                    'product_id' => $product['id'],
                    'sku_id' => $sku['id'],
                    'quantity' => $quantity,
                    'type' => 'product'
                );
                if ($services) {
                    $data_services = array();
                    foreach ($services as $service_id => $variant_id) {
                        $data_services[] = array(
                            'service_id' => $service_id,
                            'service_variant_id' => $variant_id,
                        );
                    }
                
                } else {
                    $data_services = array();
                }
                             
                $item_id = $this->cart->addItem($data, $data_services);

Если я правильно понимаю, то за запись переменных в базу отвечает последняя строчка, правлю код на такой:


 if (!$item_id) {
                $data = array(
                    'create_datetime' => date('Y-m-d H:i:s'),
                    'product_id' => $product['id'],
                    'sku_id' => $sku['id'],
                    'quantity' => $quantity,
                    'type' => 'product'
                );
                if ($services) {
                    $data_services = array();
                    foreach ($services as $service_id => $variant_id) {
                        $data_services[] = array(
                            'service_id' => $service_id,
                            'service_variant_id' => $variant_id,
                        );
                    }
                
                } else {
                    $data_services = array();
                }
                
                 $test = array(
                    'test' => '123'
                     ); 
                
                $item_id = $this->cart->addItem($data, $data_services, $test);

но в поле test в БД ничего не записывается, подскажите что делаю не так, если можно для чайника

24 ответа

  • 2
    Алексей Webasyst 13 ноября 2016 19:34 #

    public function addItem($item, $services = array()) ничего не знает про ваши новые параметры поэтому ничего не добавит

    • +1
      Wanderer Wanderer 13 ноября 2016 19:38 #

      Спасибо за быстрый ответ, но если можно для чайника чуть подробнее

      • +1
        Алексей Алексей Webasyst 13 ноября 2016 19:43 #

        Записывает в базу метод addItem из shopCart.class.php, поэтому вместо 3-го параметра вам видимо необходимо расширить массив $data.

        • +1
          Wanderer Wanderer 13 ноября 2016 19:45 #

          Пробовал делать вот так


          if (!$item_id) {
                          $data = array(
                              'create_datetime' => date('Y-m-d H:i:s'),
                              'product_id' => $product['id'],
                              'sku_id' => $sku['id'],
                              'quantity' => $quantity,
                              'type' => 'product',
                               'test'  =>  '123'
                          );
                          if ($services) {
                              $data_services = array();
                              foreach ($services as $service_id => $variant_id) {
                                  $data_services[] = array(
                                      'service_id' => $service_id,
                                      'service_variant_id' => $variant_id,
                                  );
                              }
                          
                          } else {
                              $data_services = array();
                          }
                           
                          
                          $item_id = $this->cart->addItem($data, $data_services);

          все равно не помогает

        • +1
          Wanderer Wanderer 13 ноября 2016 20:51 #

          ну подскажите где покапаться?

          • +2
            Алексей Алексей Webasyst 13 ноября 2016 21:10 #

            посмотрите метод waLog::log() и расставьте нужное логирование для проверки данных.

            • +1
              Wanderer Wanderer 13 ноября 2016 21:17 #

              подскажите подробнее пожалуйста, я с методом waLog::log() совсем не знаком

              • +1
                Алексей Алексей Webasyst 13 ноября 2016 22:17 #

                Например
                waLog::log(var_export($data, true));
                запишет содержимое переменной $data в wa-log/error.log

                можете расставить примерные конструкции по файлу и узнать где и когда что передаётся.
                Хотя вы наверно что-то странное пытаетесь реализовать и стоит использовать https://developers.webasyst.ru/hooks/shop/cart_add...

                • +1
                  Wanderer Wanderer 13 ноября 2016 22:26 #

                  Хотел обойтись без плагина

                  лог файл

                  array (
                    'create_datetime' => '2016-11-13 21:23:23',
                    'product_id' => '30',
                    'sku_id' => '31156',
                    'quantity' => '1',
                    'type' => 'product',
                    'test' => '123',
                  )

                  значение передается, но в БД не попадает

                • +1
                  Wanderer Wanderer 13 ноября 2016 22:35 #

                  дело в том, что переменная test везде присутствует и передается правильно, она просто не хочет записываться в базу данных, если вместо test подставить уже существующее в БД поле, например quantity, то это поле запишется и обновится и т.п.. А вот любое новое поле не записывается никак. Пробовал по разному,

                  $this->model->updateByField(array('code' => $this->code), array('quantity' => '123')); - работает
                  $this->model->updateByField(array('code' => $this->code), array('test' => '123')); - не работает

                  делал это в файле shopCart.class.php

                  • +1
                    Алексей Алексей Webasyst 13 ноября 2016 23:19 #

                    попробовал этот код добавить после $this->clearSessionData();
                    Всё работает и добавляется, Можете через инсталлер кэш очистить

                    Проверьте всё же вывод команды show CREATE TABLE `shop_cart_items` в pma. должно быть что-то типа:

                    shop_cart_items
                    CREATE TABLE `shop_cart_items` (
                     `id` int(11) NOT NULL AUTO_INCREMENT,
                     `code` varchar(32) DEFAULT NULL,
                     `contact_id` int(11) DEFAULT NULL,
                     `product_id` int(11) NOT NULL,
                     `sku_id` int(11) NOT NULL,
                     `create_datetime` datetime NOT NULL,
                     `quantity` int(11) NOT NULL DEFAULT '1',
                     `type` enum('product','service') NOT NULL DEFAULT 'product',
                     `service_id` int(11) DEFAULT NULL,
                     `service_variant_id` int(11) DEFAULT NULL,
                     `parent_id` int(11) DEFAULT NULL,
                     `test` varchar(10) DEFAULT NULL,
                     PRIMARY KEY (`id`),
                     KEY `code` (`code`)
                    ) ENGINE=MyISAM AUTO_INCREMENT=125 DEFAULT CHARSET=utf8
                    


                    • +1
                      Wanderer Wanderer 14 ноября 2016 11:20 #

                      Очистка кеша не помогает, а вывод команды в pma выдает это:

                      CREATE TABLE `shop_cart_items` (
                       `id` int(11) NO...

                      Также написано, что данная таблица не содержит уникального столбца. Это что может значить?

                    • +1
                      Wanderer Wanderer 14 ноября 2016 11:24 #

                      Полный код

                      CREATE TABLE `shop_cart_items` (
                       `id` int(11) NOT NULL AUTO_INCREMENT,
                       `code` varchar(32) DEFAULT NULL,
                       `contact_id` int(11) DEFAULT NULL,
                       `product_id` int(11) NOT NULL,
                       `test` varchar(32) NOT NULL,
                       `sku_id` int(11) NOT NULL,
                       `create_datetime` datetime NOT NULL,
                       `quantity` int(11) NOT NULL DEFAULT '1',
                       `type` enum('product','service') NOT NULL DEFAULT 'product',
                       `service_id` int(11) DEFAULT NULL,
                       `service_variant_id` int(11) DEFAULT NULL,
                       `parent_id` int(11) DEFAULT NULL,
                       PRIMARY KEY (`id`),
                       KEY `code` (`code`)
                      ) ENGINE=MyISAM AUTO_INCREMENT=76 DEFAULT CHARSET=utf8
                    • +1
                      Wanderer Wanderer 14 ноября 2016 11:25 #

                      И вот такое сообщение:

                      Данная таблица не содержит уникального столбца. Изменение сетки, выставление галочки, редактирование, копирование и удаление не доступно.

                      Возможно что-то в базе мешает записывать значения?

                    • +1
                      Wanderer Wanderer 14 ноября 2016 13:06 #

                      Попробовал обычным php обновить, все получается, а средствами шоп скрипт не получается

                       $idr='81';
                           $test = '123';
                           $result = mysql_query("UPDATE shop_cart_items SET
                      
                      	id='$idr', test='$test'
                      
                      	WHERE
                      	id='$idr' ");
                    • +1
                      Wanderer Wanderer 14 ноября 2016 13:28 #

                      Получилось вот таким образом:

                      $idr = $item['id'];
                         $this->model->query("UPDATE shop_cart_items SET test = '123' WHERE id = '$idr'");

                      Наверно не совсем корректно, но зато работает

                • +2
                  BNP (Дмитрий) BNP (Дмитрий) 14 ноября 2016 00:29 #

                  Немного не в тему, но почему waLog::log(var_export($data, true)); а не просто waLog::dump($data); ?

                  Насколько я помню, при первом варианте в логах очень неудобочитаемо получается =)

                  • +1
                    Wanderer Wanderer 14 ноября 2016 11:15 #

                    ну вполне норм получается:

                    2016-11-13 21:29:52:
                    array (
                      'create_datetime' => '2016-11-13 21:29:52',
                      'product_id' => '30',
                      'sku_id' => '31156',
                      'quantity' => '1',
                      'type' => 'product',
                      'test' => 'a429b9e8a1a5071743e679011e000adc',
                      'code' => 'a429b9e8a1a5071743e679011e000adc',
                      'contact_id' => '1',
                      'id' => 72,
                    )
  • 1
    Wanderer 13 ноября 2016 22:16 #

    неужели у шоп скрип это такая большая проблема - записать данные в БД?

  • 1
    Алексей Webasyst 13 ноября 2016 22:53 #

    А такой своевременный вопрос. В таблице shop_cart_items вы создали столбец `test` ?

    • +1
      Wanderer Wanderer 13 ноября 2016 22:55 #

      ну конечно, а где бы я проверял его содержимое)))

    • +1
      Wanderer Wanderer 13 ноября 2016 23:00 #

      а есть возможность через ЛОГ файл посмотреть какие данные отправляются в БД, и какой ответ возвращает БД. Как это правильно записать через waLog::log?

  • 1
    Николай Иванов 14 ноября 2016 16:26 #

    Скопируйте метод insert из wa-system/database/waModel.class.php в wa-apps/shop/lib/model/shopCartItems.model.php
    В новом методе воткните логирование получившегося sql запроса и потом попробуйте его напрямую в мускуле исполнить. Смотрите результат.
    Можно конечно и системный класс логирование воткнуть временно.
    А вообще освойте xdebug - спасает кучу времени на дебаге.

  • 1
    Wanderer 14 ноября 2016 22:43 #

    Благодарю за помощь и советы!

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите