Автор Тема: Где происходит обновление $cart->gift_message (через order-opc.js)  (Прочитано 250 раз)

21 Апреля 2015, 16:29:20
  • Новичок
  • *
  • Сообщений: 41
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Доброго дня, уважаемые форумчане!

Второй день бьюсь, и, понимаю, что нужна помощь ввиду нехватки знаний.

Вопрос: Как в таблицу PS_CART проходит UPDATE поля GIFT_MESSAGE?

При оформлении заказа на одной странице, ставим чек-бокс на подарочной упаковке, открывается GIFT_DIV. Там поле textarea, при введении в него значения и уходе с поля - значение пишется в БД.
В order-opc.js есть функция updateCarrierSelectionAndGift(). Там в $.ajax (POST) берётся значение для этого поля в переменной giftMessage.
Далее, насколько я понимаю, смотря на метод (method=updateCarrierAndGetPayments) - подключается контроллер OrderOpcController. А что дальше?
Я нигде не могу найти ни прямого UPDATE для базы, ни $cart->gift_message = ***.
Подозреваю, что отвечает за это класс CART.php, но как-то очень хитро он это делает.

Подскажите, пожалуйста, хотя бы, что за функция, место и т.д.?! Голову сломал...
Версия PS 1.6
21 Апреля 2015, 16:37:28
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 86177
  • Репутация: +25412/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В бд сообщение сохраняется с заказом
/*
* /classes/order/Order.php
*/

class OrderCore extends ObjectModel
{
/** @var string Gift message if specified */
        public $gift_message;

Достать из бд можно так
$order->gift_message
21 Апреля 2015, 16:49:27
Ответ #2
  • Новичок
  • *
  • Сообщений: 41
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В бд сообщение сохраняется с заказом
/*
* /classes/order/Order.php
*/

class OrderCore extends ObjectModel
{
/** @var string Gift message if specified */
        public $gift_message;

Достать из бд можно так
$order->gift_message

В сам заказ сообщение берётся из PS_CART, это в контроллере OrderOpcController прописано.
А вот в корзину (PS_CART) сохраняется сразу же при вводе в поле и уходе с него (срабатывает .change в js).
Проверял, внёс сообщение, ушёл, увидел свои понаставленные alert'ы (сработавшие в order-opc.js), зашёл в MySQL - увидел, что запись появилась.
При этом никуда со страницы заказа не переходил, просто добавил, к примеру, в поле "444". Эти "444" появились в таблице PS_CART.

В чём дело - добавляю новое поле при оформлении заказа. Делаю аналогию с gift_message, добавляю с Order.php, Cart.php.
Добавляю в OrderOpcController.php -> public function init()
case 'updateCarrierAndGetPayments': if (*** && Tools::isSubmit('***')В CartController добавляю пустое значение на функцию processDeleteProductInCart()

В общем, везде, где увидел.

В order-opc.js получаю значение этого поля (вывожу alert, вижу значение), также добавляю сюда:
data: 'ajax=true&method=updateCarrierAndGetPayments' + delivery_option_params + 'recyclable=' + recyclablePackage  [b]+ '&***=' + ***[/b] + '&gift=' + gift + '&gift_message=' + giftMessage + '&token=' + static_token,
Но в таблицу PS_CART значение не пишется. Облазил контроллеры, уже все классы перелопатил, не могу понять...

А в Order.php я первым делом завёл переменную, ну, раз добавил в таблицу. то и в класс засунуть нужно )))
21 Апреля 2015, 16:55:59
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 86177
  • Репутация: +25412/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Если нужно что-то делать с полем gift_message после совершения заказа, то его нужно брать из табл. заказов.
Например, отсылать админу при покупке
/modules/mailalerts/mailalerts.php,
'{gift_message}' => $order->gift_message,добавить в шаблон email  /mails/ru/new_order.html (txt)
{gift_message}
21 Апреля 2015, 17:00:01
Ответ #4
  • Новичок
  • *
  • Сообщений: 41
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Если нужно что-то делать с полем gift_message после соверщения заказа, то его нужно брать из табл. заказов.
Например, отсылать админу при покупке
/modules/mailalerts/mailalerts.php,
'{gift_message}' => $order->gift_message,добавить в шаблон email  /mails/ru/new_order.html (txt)
{gift_message}

Нет, делать с ним ничего не нужно, взять его НЕ проблема. С переменными работать умею.
Суть в том, как оно сохраняется в PS_CART на лету (т.е. через order-opc.JS -> OrderOpcController.php -> Cart.php или ???).

До добавления строки в Orders - мы не доходим! Формирование заказа тут ни при чём. Мы работаем с корзиной, пытаемся вводить комментарий в поле gift_message.
Точно также я пытаюсь ввести сообщение в другое поле, и оба они из JS уходят, но до БД добирается только одно...
21 Апреля 2015, 17:14:25
Ответ #5
  • Ветеран
  • *****
  • Сообщений: 86177
  • Репутация: +25412/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Если хотите добавить еше одно поле, то нужно добавить его:
1. в таблицу ps_cart
2. в класс Cart.php
3. в order-opc.js
4. в OrderOpcController.php
21 Апреля 2015, 17:34:08
Ответ #6
  • Новичок
  • *
  • Сообщений: 41
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Постараюсь на пальцах объяснить:

1. Новое поле в PS_CART есть, добавлено + добавлено в CART.php (public $metro; 'metro' => array('type' => self::TYPE_STRING, 'validate' => 'isMessage'))
2. order-opc.JS
function updateCarrierSelectionAndGift()
var metroMessage = '';
if ($('#metro').length)
metroMessage = encodeURIComponent($('#metro').val());
$.ajax({
***
data: 'ajax=true&method=updateCarrierAndGetPayments' + delivery_option_params + 'recyclable=' + recyclablePackage  + '&metro=' + metroMessage + '&gift=' + gift + '&gift_message=' + giftMessage + '&token=' + static_token,

Также в функцию bingInput добавлено:
$('#metro').change(function(){
updateCarrierSelectionAndGift();
});

3. OrderOpcController, public function init()
case 'updateCarrierAndGetPayments':
if ((Tools::isSubmit('delivery_option') || Tools::isSubmit('id_carrier')) && Tools::isSubmit('recyclable') && Tools::isSubmit('gift') && Tools::isSubmit('gift_message') && Tools::isSubmit('metro'))

А вот и вопрос, а куда ещё?  =)
21 Апреля 2015, 17:35:49
Ответ #7
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 33008
  • Репутация: +26760/-0
    • Просмотр профиля
21 Апреля 2015, 17:39:41
Ответ #8
  • Новичок
  • *
  • Сообщений: 41
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В шаблон.

 ;D ;D ;D

Это априори! )))

ORDER_CARRIER.tpl
<p class="textarea">
<label for="metro">{l s='If you wish, you can add a note to the gift:'}</label>
<textarea rows="5" cols="35" id="metro" name="metro">{$cart->metro|escape:'htmlall':'UTF-8'}</textarea>
</p>

Ой, даже настроение улучшилось, улыбнули меня, спасибо! =)
21 Апреля 2015, 17:44:37
Ответ #9
  • Ветеран
  • *****
  • Сообщений: 105581
  • Репутация: +39547/-0
    • Просмотр профиля
    • Webstudio UwK
Цитировать
Для 1.6 нужно - "Remove cache/class_index.php to clear the cache".
Cоздание интернет сайтов Webstudio UwK
21 Апреля 2015, 17:46:45
Ответ #10
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 33008
  • Репутация: +26760/-0
    • Просмотр профиля
Ой, даже настроение улучшилось, улыбнули меня, спасибо! =)
Всегда пожалуйста  :)

По описанию все добавлено, должно работать.
21 Апреля 2015, 17:50:53
Ответ #11
  • Новичок
  • *
  • Сообщений: 41
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Цитировать
Для 1.6 нужно - "Remove cache/class_index.php to clear the cache".

Нет, не то. Нет у меня этого файла, кэш отключил и почистил.

Тут даже не в js дело, там alert показывает, чему переменная metro равна, значит дальше уходит, в контроллер. Скорее всего в нём дело, либо в одной из функций, которые он использует из Cart.php
Но пока я это доказать/найти/подтвердить не могу...
21 Апреля 2015, 19:37:04
Ответ #12
  • Ветеран
  • *****
  • Сообщений: 105581
  • Репутация: +39547/-0
    • Просмотр профиля
    • Webstudio UwK
Если хотите добавить еше одно поле, то нужно добавить его:
1. в таблицу ps_cart
2. в класс Cart.php
3. в order-opc.js
4. в OrderOpcController.php

+ /controllers/front/ParentOrderController.php
Cоздание интернет сайтов Webstudio UwK
21 Апреля 2015, 20:07:44
Ответ #13
  • Новичок
  • *
  • Сообщений: 41
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
+ /controllers/front/ParentOrderController.php

Эврика!!!
Вот я тоже думал, что под parent::update проходит, всё думал, где этот класс?!
А это контроллер оказался...))

Спасибо огромное, всё пишется в базу (таблица ps_cart), УРА!


Ещё один вопрос, если знаете, касается ORDER-OPC.js
Ставлю SELECT, загоняю в него OPTIONS из массива, проще - перечень станций метро:
                        <select id="metro" name="metro">
                          <option value="">Выберите станцию метро</option>
{foreach from=$metro item=metros}
<option value="{$metros|escape:'htmlall':'UTF-8'}">{$metros|escape:'htmlall':'UTF-8'}</option>
{/foreach}
                          </select>

Добавил реакцию на .change:
//Metro option change
$('#metro').change(function(){
$('select#metro option:selected').attr('selected','selected');
updateCarrierSelectionAndGift();
});

Получаю в alert значение переменной, когда иду по функции updateCarrierSelectionAndGift().
Всё отлично до того момента, пока не попадаю в функцию:
function updateCarrierList(json)
{
var html = json.carrier_block;

$('#carrier_area').replaceWith(html);
bindInputs();
$('#HOOK_BEFORECARRIER').html(json.HOOK_BEFORECARRIER);
}

Этот .replaceWith(html) обновляет данные страницы и возвращает SELECT в первоначальное положение "Выберите станцию метро", удаляет :selected.

Я не знаю  точно, на что влияет данная функция, в чём её смысл (обновление данных на странице?!), поэтому закомментировал в неё переход.
Но может есть иной способ оставить значение в этом SELECT, которое выбрал пользователь?

PS: Я пока только постигаю все эти AJAX, JSON и т.д., поэтому прошу прощение за, вероятно, глупые вопросы))
22 Апреля 2015, 10:05:24
Ответ #14
  • Новичок
  • *
  • Сообщений: 41
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Всем спасибо, все проблемы и вопросы решил!

PS: По последнему решение было очевидным, раз значение есть в таблице, то его и нужно брать оттуда, и тогда всё работает:
<option {if isset($cart->metro) && $cart->metro != ''}value="{$cart->metro}" selected="selected"{else}value=""{/if}>{if isset($cart->metro) && $cart->metro != ''}{$cart->metro}{else}Выберите станцию метро{/if}</option>