Автор Тема: Как прописать адрес доставки Боксберри в шаблон письма клиенту при покупке товар  (Прочитано 1327 раз)

29 Март 2016, 23:01:47
  • Новичок
  • *
  • Сообщений: 27
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Добрый день.
Преста 1.5.6.2.
Установили модуль Боксберри.
Все нормально, только после оформления заказа клиенту на почту приходит письмо БЕЗ адреса доставки(пункт Боксберри).
Подскажите, что куда прописать, что бы в письме был пункт Боксберри?

По спецификации модуля в письмо приходит только название способа доставки.
30 Март 2016, 10:39:25
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 3419
  • Репутация: +79/-6
  • Сообщество PrestaShop
    • Просмотр профиля
В шаблоне письма проверерь. Там должна быть переменная адрес доставки.
31 Март 2016, 13:57:15
Ответ #2
  • Новичок
  • *
  • Сообщений: 27
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
адрес доставки есть, но туда не попадает адрес отделения Боксберри
31 Март 2016, 15:53:45
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 3419
  • Репутация: +79/-6
  • Сообщество PrestaShop
    • Просмотр профиля
Так проверяй переменную, которая этот адрес выводит. В базе данных сохраняется этот адрес?
06 Апрель 2016, 00:06:10
Ответ #4
  • Новичок
  • *
  • Сообщений: 27
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Так проверяй переменную, которая этот адрес выводит. В базе данных сохраняется этот адрес?

да, в БД этот адрес сохраняется.
Подскажите в каком классе/контроллере в шаблон письма передается переменная delivery_address2(ну или все переменные).
Там я попробую сделать проверку, если для ORDER_ID существует адрес Боксберри, то буду подставлять этот адрес.
Но я не могу найти, где это сделать

PS
Вроде нашел в классе PaymentModule в function validateOrder.
Там есть
$data = array(
'{firstname}' => $this->context->customer->firstname,
                          .....
'{delivery_address1}' => $address, //$delivery->address1,   - вставляю тот адрес что получился с моей выборки
'{delivery_address2}' => $delivery->address2,

перед этим делаю проверку
$res_boxber_deliv = Db::getInstance()->executeS('
SELECT `details`
FROM `'._DB_PREFIX_.'boxberry_details`
WHERE `id_order`='.$order->id.'');

if ($res_boxber_deliv[0]['details']) $address1 = $res_boxber_deliv[0]['details'];

но даже после очищения кэша, на почту не приходит адрес боксберри.
Что я делаю не так?
06 Апрель 2016, 11:32:11
Ответ #5
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
В PaymentModule переменную адрес Боксберри должен передать ваш модуль.
В модуле в контроллере валидации заказа нужно инициализировать эиту переменную, при вызове метода отправки писем передать ее в дополнительных  парамметрах.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
06 Апрель 2016, 14:46:30
Ответ #6
  • Новичок
  • *
  • Сообщений: 27
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В PaymentModule переменную адрес Боксберри должен передать ваш модуль.
В модуле в контроллере валидации заказа нужно инициализировать эиту переменную, при вызове метода отправки писем передать ее в дополнительных  парамметрах.

Хорошо, тогда подскажите правильно ли я все понял?:
1. в методе  public function hookOrderConfirmation класса class BoxberryDelivery я прописываю
$this->smarty->assign('delivery_boxberry', $boxberry_details->details);чем передаю в глобал переменную значение  $boxberry_details->details(нужный мне адрес).

2. в файле \modules\cashondeliveryplus\cashondeliveryplus.php в методе validateOrder пытаюсь вставить
                    // Send an e-mail to customer (one order = one email)
                    if ($id_order_state != Configuration::get('PS_OS_ERROR') && $id_order_state != Configuration::get('PS_OS_CANCELED') && $this->context->customer->id)
                    {
                        $invoice = new Address($order->id_address_invoice);
                       ...
                '{delivery_address2}' => $delivery->address2,
'{delivery_boxberry}' => BoxberryDelivery::getBoxberryDelivery($order->id),

но далее error 500.

я как понимаю, не там и не так инициализирую свою delivery_boxberry ...
Подскажите, что и где мне прописать?
06 Апрель 2016, 14:49:08
Ответ #7
  • Ветеран
  • *****
  • Сообщений: 3419
  • Репутация: +79/-6
  • Сообщество PrestaShop
    • Просмотр профиля
Модуль платный, чего мучаться, напиши программисту пусть исправит сам.
06 Апрель 2016, 15:11:32
Ответ #8
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Не правильно. Модули доставки и оплаты работают отдельно.Для обмена данными их нужно сохранять в таблицах бд. Вам не нужно что-то менять в платежном модуле. В модуле BoxberryDelivery должен быть определен метод CreateOrder и шаблоны email.
06 Апрель 2016, 15:25:57
Ответ #9
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Если модуль доставки должен выслать письмо клиенту, то нужно чтобы он был установлен в хук actionValidateOrder и в определении этого хука в модуле была отправка email.
Mail::Send(/* определение переменных шаблона email+данных клиента*/)
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
06 Апрель 2016, 15:52:23
Ответ #10
  • Новичок
  • *
  • Сообщений: 27
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Если модуль доставки должен выслать письмо клиенту, то нужно чтобы он был установлен в хук actionValidateOrder и в определении этого хука в модуле была отправка email.
Mail::Send(/* определение переменных шаблона email+данных клиента*/)

Сам модуль не должен отправлять письмо клиенту, это делает стандартный класс Престашопа.
Мне просто нужно добавить переменную в шаблон письма, точнее я ее добавил, только она не инициализирована.
А вот где ее именно нужно инициализировать я пока не могу разобраться.
я в модуле передаю в глобал переменную значение  $boxberry_details->details нужный мне адрес.
Вот а что далее с этим делать, разобраться не могу.
06 Апрель 2016, 16:17:56
Ответ #11
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Цитировать
Сам модуль не должен отправлять письмо клиенту, это делает стандартный класс Престашопа.
Я вам про это написал, класс стандарный Mail, метод в нем определен Send.
Mail::Send(/* определение переменных шаблона email+данных клиента*/)Модуль же добавляет свой метод в хук, который сработает при событии создания заказа, так нет нужды изменять контроллеры платежных модулей, при обновлении ничего не пропадет. 

Цитировать
Мне просто нужно добавить переменную в шаблон письма, точнее я ее добавил, только она не инициализирована.
А вот где ее именно нужно инициализировать я пока не могу разобраться.
Если делать по вашему, то нужно в каждом платежном модуле добавить инициализацию этой переменной.
Тогда этот код
$this->smarty->assign('delivery_boxberry', $boxberry_details->details);должен быть в контроллере каждого платежного модуля, которые установлены на сайте.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
07 Апрель 2016, 23:51:17
Ответ #12
  • Новичок
  • *
  • Сообщений: 27
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
обновил модуль и добавил отправку письма в boxberrydelivery.php. так же создал папку mails и в ней ru и там шаблон письма
public function hookOrderConfirmation($params)
{
$order = $params['objOrder'];
$orders = Order::getByReference($order->reference)->getResults();
foreach ($orders as $order)
{
if (($order->id_carrier == Configuration::get(self::PREFIX.'boxberry')) && $order->id)
{
$boxberry_details = BoxberryDetails::loadByOrderId($order->id);

if (!$boxberry_details->id)
{
$boxberry_details->id_order = (int)$order->id;
$boxberry_details->details = pSQL($this->context->cookie->boxberry_details);

if ($boxberry_details->add())
unset($this->context->cookie->boxberry_details);
}
}
}
// отправка письма
// if($order->id){
    $invoice = new Address($order->id_address_invoice);
            $delivery = new Address($order->id_address_delivery);

            $data = array(
'{delivery_firstname}' => $delivery->firstname,
'{delivery_lastname}' => $delivery->lastname,
                '{email}' => $this->context->customer->email,
                '{delivery_address}' => $boxberry_details->details);

                Mail::Send(
                    (int)$order->id_lang,
                    'delivery_boxberry',
                    Mail::l('delivery_boxberry', (int)$order->id_lang),
                    $data,
                    $this->context->customer->email,
                    null,
                    null,
null,
null,
                    null, 
dirname(__FILE__).'/mails/ru/');
// }

}

Приходит стандартное посьмо, а указанное выше письмо не приходит(((.
все переменные со значениями.
Подскажите, пожалуйста, что не так?
12 Апрель 2016, 00:25:03
Ответ #13
  • Новичок
  • *
  • Сообщений: 27
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Решил данный вопрос отправкой второго письма(сделал новый шаблон для письма) с модуля Боксберри, если кому поможет:
$delivery = new Address($order->id_address_delivery);
     $data = array(
      '{order_id}' => $order->id,
                        '{firstname}' => $delivery->firstname,
                        '{lastname}' => $delivery->lastname,
      '{delivery_address}' => $boxberry_details->details,
      '{date}' => Tools::displayDate(date('Y-m-d H:i:s'), (int)$order->id_lang, 1)     
      );
     
     if (Validate::isEmail($this->context->customer->email)){
                        Mail::Send(
                                (int)$order->id_lang,
                                'boxberry',
                                Mail::l('boxberry', (int)$order->id_lang),
                                $data,
                                $this->context->customer->email,
                                $this->context->customer->firstname.' '.$this->context->customer->lastname,
                                null,
                                null,
                                null,
                                null,
        PS_MAIL_DIR,
        false,
        (int)$order->id_shop
                            );
     }

Только вот спустя пару часов частично перестали приходить письма: одним приходят, другим нет. Подскажите что может быть?
12 Апрель 2016, 10:03:45
Ответ #14
  • Ветеран
  • *****
  • Сообщений: 1807
  • Репутация: +49/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Может быть у вас ограничение на отсылаемое количество писем на хостинге. Спросите тех. подержку хостинга.