Автор Тема: Модуль BlockWishList не отправляет сообщения на e-mail  (Прочитано 3861 раз)

02 Октябрь 2014, 10:27:40
Ответ #15
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
public static function mimeEncode($string, $charset = 'UTF-8', $newline = "\r\n")
{
if (!self::isMultibyte($string) && strlen($string) < 75)
{
return $string;
}

$charset = strtoupper($charset);
$start   = '=?' . $charset . '?B?';
$end     = '?=';
$sep     = $end . $newline . ' ' . $start;
$length  = 75 - strlen($start) - strlen($end);
$length  = $length - ($length % 4);
if ($charset === 'UTF-8')
{
$parts = array();
$maxchars = floor(($length * 3) / 4);
$stringLength = strlen($string);
while ($stringLength > $maxchars)
{
$i = (int)$maxchars;
$result = ord($string[$i]);
while ($result >= 128 && $result <= 191)
{
$i--;
$result = ord($string[$i]);
}
$parts[] = base64_encode(substr($string, 0, $i));
$string = substr($string, $i);
$stringLength = strlen($string);
}
$parts[] = base64_encode($string);
$string = implode($sep, $parts);
}
else
{
$string = chunk_split(base64_encode($string), $length, $sep);
$string = preg_replace('/' . preg_quote($sep) . '$/', '', $string);
}
return $start . $string . $end;
}
02 Октябрь 2014, 10:32:06
Ответ #16
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
А точнее, что такое громадное генерит этот SELF::, что сообщения не отправляются?
По простому, $this->fn - для нестатического, self::$fn - для статического.
02 Октябрь 2014, 10:36:24
Ответ #17
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Тем по проблемам почты много, нужно бы их собрать в одни раздел. Много зависит от хостинга.
Вот похожая тема - http://prestashop-forum.ru/index.php/topic,1852.msg12732.html#msg12732 
02 Октябрь 2014, 12:28:49
Ответ #18
  • Новичок
  • *
  • Сообщений: 41
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Да, согласен, но вся сложность в том, чтобы определить сперва, с чем имеешь дело - с ошибкой модуля или общей ошибкой/особенностью класса/контроллера.
За ссылки спасибо, буду изучать. Я пока плохо понимаю отличие статического от нестатического, но, точно это наводка на один из моих вопросов, в чём отличие:
1. $переменная = ***   2. $this -> переменная = ***   3. $this->smarty->assign (переменная = ***), с/без использования параметра global $smarty
Часто приходится добавлять переменные, и всегда используются разные методы её определения и подтягивания в шаблон. Точнее для моих знаний они разные, для Ваших - конкретные...))


Следующий момент, думаю, что многим будет интересно. Если ошибусь, можете мне об этом сказать, тему закроем, я сам разберусь:
Модуль BlockWishList можно превратить в ПРЕДЗАКАЗ. Он очень хорошо собирает "хотелки" клиентов, т.е. любой клиент независимо от наличия товара в магазине и запрета на заказ при нулевом остатке может - набросать артикулы в ЛИТС, присвоить им кол-во, сформировав, таким образом, ПРЕДЗАКАЗ. Получая такие списки от многих, можно осуществлять закупку под клиента.

Мой текущий итог:
Я убрал все поля с EMAIL кроме 1-го, ему присвоил value="e-mail магазина".
Первую кнопку "Отправить список" (это ссылка <a>, открывала форму с полями под ввод email) заменил кн.Отправить (<input>, вторая кнопка), которую нажимали после ввода электронных адресов.
В ajax-wishlist.js в функции отправки также оставил одну переменную под email.

Теперь можно просто раскрыть ЛИСТ Желаний, отредактировать список артикулов и нажать ОДНУ кнопку, на почту магазина прилетит письмо от клиента.

Вопрос:
1. Прилетает ссылка на лист. Она не нужна... Как лучше всего в шаблон листа добавить список артикулов?
Предполагаю завести в sendwithlist новую переменную '{product_list}'.
Есть ли способ проще, чем создавать новую функцию public static function getProducts($customer, $id_lang) по образу и подобию MailAlert, но менять в ней таблицу в базе, откуда будет тянутся товар?
2. После нажатия на кнопку "Отправить" больше ничего не сворачивается, как было раньше - сворачивать всё содержимое, оставляя только табличку с самим листом (название, кол-во, ***, и кн.Удалить). Полагаю, что нужно отредактировать это: WishlistVisibility(id, 'hideSendWishlist');  Только вопрос, как правильно переписать? =)

За "нуб" фразы, слова и вопросы - сразу прошу прощения! Я только учусь...))
02 Октябрь 2014, 12:41:31
Ответ #19
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
Лучше сделать отдельный модуль, а не менять стандарный. Клиенту нужно оставить возможность отослать сохранней список.
02 Октябрь 2014, 12:45:09
Ответ #20
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
Ориентироваться можно на готовые модули
Prestashop Модуль Предзаказ и список ожиданий
Там есть демо админки. Останеться только в код перевести.
02 Октябрь 2014, 12:52:20
Ответ #21
  • Новичок
  • *
  • Сообщений: 41
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Сказать друзьям и знакомым, к примеру, "Что я хочу на ДР" - это буржуйская тем, Россия - душа, нужно об этом помнить. Спонтанность и неожиданность, вот признак интеллектуального подарка)))

Я делаю прототип. После можно всё лишнее почистить и скомпоновать, как новый модуль "Pre-sale".
И, конечно, нужна функция, которая будет при нажатии на эту кнопку создавать корзину клиента со статусом "ПРЕДЗАКАЗ". Товар пришёл, из админки оформили клиенту заказ, он получил сообщение и дальше, либо подтверждает, либо мы заказ аннулируем.

Да, есть модуль за 50Евро, но они его могли разрабатывать примерно также, вести диалоги, спрашивать, а потом запихали всё в коробочку и за 50 Евро! Коммерсантики такие, молодцы...))


Вопрос, у меня модуль blockwishlist использует шаблон TXT, как это изменить?
Настройка в магазине стоит на HTML...
02 Октябрь 2014, 12:58:56
Ответ #22
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
Кнопку предзаказ можно добавить в шаблон product.tpl. Была такая тему, ссыдку не помню. Что-то подобное
{if $product->quantity > 0}
        <span>{l s='Add to cart'}</span>
{else}
        <span>{l s='Pre Order'}</span>
{/if}
и разрешить заказ товаров с нулевым остатком.
02 Октябрь 2014, 13:18:24
Ответ #23
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Выбор формата шаблона уставливается в админке, если у вас установлен HTML и шаблон email.html существует, то письмо должно приходить в HTML.

В модуле blockwishlist за отправку письма отвечает файл /modules/blockwishlist/sendwishlist.php
if (Validate::isLoadedObject($customer))
Mail::Send(
$context->language->id,
'wishlist',  // вот это название шаблона писем
В классе Mail (файл /classes/Mail.php) метод
Send($id_lang, $template, $subject, $template_vars, $to, $to_name = null, $from = null, $from_name = null, $file_attachment = null, $mode_smtp = null, $template_path = _PS_MAIL_DIR_, $die = false, $id_shop = null, $bcc = null)отвечает за отправку email и определение переменных.
Формат email определяется из пременной конфигурации
$configuration['PS_MAIL_TYPE']
Если установлено HTML, а приходят в txt, то проверить нужно наличие шаблона email в HTML, права доступа к этому файлу, настройки почтового сервера.
02 Октябрь 2014, 13:24:15
Ответ #24
  • Новичок
  • *
  • Сообщений: 41
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Кнопку предзаказ можно добавить в шаблон product.tpl. Была такая тему, ссыдку не помню. Что-то подобное
{if $product->quantity > 0}
        <span>{l s='Add to cart'}</span>
{else}
        <span>{l s='Pre Order'}</span>
{/if}
и разрешить заказ товаров с нулевым остатком.
Как вариант, согласен. И, конечно, такие темы есть, тоже видел. Спасибо за информацию!

Тут иной момент, мы делаем возможным заказ с нулевым остатком, а клиент в корзине правит кол-во товара с 5, к примеру, на 8. А на складе только 6.
Мне нужно будет разбираться, что 6 я ему доставлю сейчас, а потом по завозу ещё 2, о которых мне нужно помнить. Да и согласится ли он на это?!

Функционал однозначно должен отделять суп от мух...)) А для этого я полезу в формы и классы, и буду ВСЁ равно переделывать функционал, ставить проверку на корзину, впихивать лишние сообщения, вписывать кучу IF ELSEIF ELSE и т.д. Не хочу. Стандарт пусть работает по заявленному, а доп.модуль (не важно, свой, чужой, переделанный, отдельный или стандартный) - выполняет функцию ПРЕДЗАКАЗА. Тем более, в общем, я знаю, что нужно сделать, даже в реализации укладывания этих "хотелок" в корзину в админке (заполнять базу INSET'ом). Мне бы немножко помочь с деталями...)

Я, в отличие от Вас, , к сожалению, не профессионал, не разработчик. Стану, позже, мне нравится это направление...) Но пока обращаюсь за помощью. А вопросы мои выше...  ;)
02 Октябрь 2014, 13:30:48
Ответ #25
  • Новичок
  • *
  • Сообщений: 41
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Да, спасибо большое, разобрался. Установка стояла на TXT, забыл, что вчера при тестировании работы отправки писем изменил. Теперь всё хорошо.
Про MAIL::Send уже знаю, проверял наличие всех переменных для sendwishlist...)

Открытым остаётся один вопрос, как проще в письмо взять перечень товара с количеством и статусом, как это есть в ЛИСТе?
02 Октябрь 2014, 13:41:49
Ответ #26
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В модуле есть класс WishList
$wishlist = WishList:: getByIdCustomer($id_customer)список определенного пользоваля.
02 Октябрь 2014, 16:06:46
Ответ #27
  • Новичок
  • *
  • Сообщений: 41
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Идею понял. Может следующую функцию класса взять (getProductByIdCustomer), которая выводит $products?!
Посмотрите, пожалуйста, правильно ли делаю (учу матчасть):
1. В sendwishlist я добавляю: $w = WishList::getByIdCustomer($context->customer->id); - как я понимаю, это массив.
2. Я должен циклом его вывести... что-то вроде (взял из MailAlert.php):
foreach ($w as $key => $product)
{
$items_table .=
'<tr>
<td style="padding:0.6em 0.4em;">'.$product['name'].'</td>
<td style="padding:0.6em 0.4em;">'.$product['quantity'].'</td>
                <td> И Т.Д.</td>
</tr>';
}
Грубо говоря, смотрю, что выдаёт SELECT и забираю оттуда то, что хочу вывести в шаблон.
3. В array() (переменные для шаблона) добавляю, '{items_table}' => $items_table    В шаблон в нужное место вставляю {items_table}

Так?
02 Октябрь 2014, 16:19:10
Ответ #28
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Не совсем правильно, но направление верное.
В getByIdCustomer вы получаете номер листа "id_wishlist" по номеру пользователя "id_customer".
Затем далаете выборку товаров из этого листа getProductByIdCustomer (вернет массив "products").
Потом определяете переменные шаблона ($products) и после этого, все как в MailAlert, выводите в цикле в шаблоне.
02 Октябрь 2014, 16:55:31
Ответ #29
  • Новичок
  • *
  • Сообщений: 41
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Понял, буду пробовать. Позже отпишусь о результатах.
И огромное спасибо за терпение и помощь! Где-то на подсознательном уровне 6-го чувства начинаю понимать всю эту "кухню"...))

Кстати, не поправил п.2, там на самом деле вот это:
$w = WishList::getProductByIdCustomer($id_wishlist, $context->customer->id, $context->language->id);

А $id_wishlist уже определён в SendWishList.php.