3 янв. 2019 г., 10:23

Вопрос по ShopKeeper3

В блоге Песочница

Всем привет, такой вопрос, отправляю на почту заказ, после оформления с сайта из корзины, но вместо параметров товара приходит Array, хотя в админке сайта в Управление заказами shopkeeper, выводит нормально всё ["L","Classic Ball 3-5 мм","красный"] , я понимаю, что это массив, но почему он не приходит на почту мне, может кто сталкивался с такой проблемой?
Та надо в шаблоне письма этот массив разобрать на отдельные составляющие.
А чтобы проверить, что они в шаблон приходят, можно передать его через print_r()
а в каком системном файле сделать передачу через print_r()?
Вообще, лучше эти вопросы на сайте шопкипера и спрашивать, я здесь не замечал особых специалистов по нему.

А так, вроде вот здесь формируется информация о заказе. Можете попробовать на 161-ой строке вставить
$modx->log(1, print_r($orderOutputData, 1));
и после оформления заказа в логах MODX смотреть выводится там что или нет.

И вы бы привели код вашего чанка, где формируется письмо и полностью полученное сообщение. Дело в том, что у него используется функция implode(), которая вполне будет работать для одноуровневого массива со строчными значениями, но если многоуровневый, то некоторые элементы будут залетать как array.
Вот файл orderDataOuter:
<p><b>Состав заказаb>p> [[+purchases]] Способ оплаты: <b>[[+payment]]b><br> Вид доставки: <b>[[+delivery]]b><br> Цена за доставку: <b>[[+delivery_price:num_format]]b><br> <b>Итого: [[+price:num_format]]b> [[+currency]]<br> <p><b>Контактные данныеb>p> <table> <colgroup> <col width="50%" span="2"> colgroup> <tbody> [[+contacts]] tbody> table>
А вот файл orderDataRow:
Наименование товара: <b>[[+name]]b><br> Параметры товара: <b>[[+addit_data:default=``]]b><br> Количество: <b>[[+count]]b> шт.<br> Цена: <b>[[+price]]b> [[+currency]]<br>
А вот само письмо, которое приходит мне на почту: https://cuu.su/Eq4MGT4/
А вот логи:

[2019-01-04 09:32:50] (ERROR @ /index.php) <p><b>Состав заказаb>p> Наименование товара: <b>Кресло-мешок Классикb><br> Параметры товара: <b>Arrayb><br> Количество: <b>1b> шт.<br> Цена: <b>79b> руб.<br> Способ оплаты: <b>Оплата картойb><br> Вид доставки: <b>courierb><br> Цена за доставку: <b>5b><br> <b>Итого: 84b> руб.<br> <p><b>Контактные данныеb>p> <table> <colgroup> <col width="50%" span="2"> colgroup> <tbody> <tr> <td>Имя:td> <td>Денис Александрович Шафоростовtd> tr><tr> <td>Адрес эл. почты:td> <td>d_s2001@tut.bytd> tr><tr> <td>Телефон:td> <td>+375297506592td> tr><tr> <td>Комментарий:td> <td>td> tr> tbody> table>

А вот файл shopOrderReport:

<html> <head> <style type="text/css"> body{background-color:#fff;} table {width:650px; margin:10px 0; border:1px solid #BCBCBC; border-collapse:collapse;} table td {padding:5px; border:1px solid #BCBCBC;} style> head> <body> <div class="inner-page clearfix"> <p>В интернет-магазине <b>[[++site_name]]b>(<a href="[[++site_url]]" target="_blank">[[++site_url]]a>) сделан заказ.p> <div style="padding:15px 0; margin:15px 0; border-top:3px solid #BCBCBC; border-bottom:3px solid #BCBCBC;"> <p>Номер заказа: [[+orderID]]p> <p>Дата: [[+orderDate]].p> [[+orderOutputData]] div> div> body> html>
В файле, на который я ссылался, нет переменной addit_data, то есть это или ваша какая-то собственная переменная, или просто что-то где-то не сходится. В любом случае, здесь скорее всего нет смысла очень глубоко копать, а просто можно решить проблему локально. Смотрите, на уровне чанков просто так нельзя работать с массивами, но можно переменную передать в сниппет-обработчик. Создайте, к примеру, сниппет arrayToStr вот с таким содержимым:
// $modx->log только для отладки, потому можно удалить эту строку $modx->log(1, print_r($input, 1), "FILE"); return $input && is_array($input) ? implode(",", $input) : $input;
и замените
[[+addit_data:default=``]]
на
[[+addit_data:arrayToStr]]
Это не гарантированно заработает, но может. Суть его в том, что значение плейсхолдера будет передано в сниппет-модификатор, в котором мы и выполняем обработку массива. После выполнения проверьте логи MODX-а, если все ОК, там будет запись с содержимым этой переменной.

Если это не поможет, можно попробовать другой вариант:
[[+addit_data:default=``]]
заменить на
[[!arrayToStr?input=[[+addit_data]]`]]
Просто в первом варианте в сниппет может не дойти переменная в чистом виде, а так больше шанс. Но если первый вариант пройдет, он предпочтительней.
все равно в логе пишется просто [2019-01-04 11:29:52] (ERROR @ /index.php) ArrayПробовал два варианта делать, но почему-то не прокатывает.
Раз пишет Array, значит в сниппет уже залетает значение Array (строковое). То есть это не объект типа Array, а просто строковая переменная "Array". Чтобы проще понять было, попробуйте выполнить вот такой код (например в консоли):
print "
";
$var = array(1,2,3);
var_dump($var);
var_dump((string)$var);
Результат будет такой:
array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } string(5) "Array"
Вот и получается, что на момент вывода переменной вам передается не исходный массив, а простое строчное значение Array. Из этого вы уже ничего не получите.

В исходниках шопкипера виду два места (раз и два), где формируется такая такая переменная. Попробуйте их отдебажить что там за данные на выходе.

А вообще это лютый квест...
Просто прикол в том, что если бы в саму вкладку "Управление заказами ShopKeeper" тоже летело Array, тогда да, косяк где-то лютый, но просто там все нормально отображается.
В этом ничего удивительного нет, потому что разные механизмы работают. В админке выводится через процессоры и JS+ExtJS, а на фронте проходит через чанки-сниппеты.
Собственно, это больше всего и раздражает.
Ага, понял, спасибо, буду пробовать.
Смотри, я передаю в корзину маленькую с помощью [[+addit_data:default=`—`]] [[!arrayToStr?input=[[+addit_data]]]] [[+addit_data:arrayToStr]] всеми выдает Array, как можно передать параметры не через этот метод?
Я же говорю, в данной ситуации это не имеет смысла. В плейсхолдер [[+addit_data]] уже прилетает строковый параметр Array. Сделай себе бекап сайта и пришли мне доступ в админку на почту n.lanets@modxclub.ru, я посмотрю что там у тебя происходит.
Как я и говорил, проблема в том, что у вас передается многоуровневый массив.
( [0] => Array ( [0] => L [1] => Classic Ball 3-5 мм [2] => молочный ) )
Но как эту проблему решить с шопкипером, я не знаю, так как перелопачивать его нет никакого желания. Посмотрите, я дописал у вас сниппет arrayToStr
// $modx->log только для отладки, потому можно удалить эту строку $input = $modx->getPlaceholder("addit_data"); $modx->log(1, "addit_data test", "FILE"); $modx->log(1, print_r($input, 1), "FILE"); $modx->log(1, print_r($modx->getPlaceholder("shkDataArray"), 1), "FILE"); $modx->log(1, "addit_data test end", "FILE"); // return $input && is_array($input) ? implode(",", $input) : $input; return "dsfg";
Плейсхолдер shkDataArray я устанавливаю в файле core/components/shopkeeper3/model/shopkeeper.class.php на строке 1297. Посмотрите там код.
Вот свою переменную я в сниппете смог получить как есть, а вот плейсхолдер data_arr там же в сниппете я получаю Array, то есть где-то он преобразовывается.

Сорри, ничем больше не помогу.

P.S. в чанке orderDataRow я тоже дописал [[!arrayToStr]], оставил, чтобы вы посмотрели что и как. Удалите что не нужно будет.
спасибо за попытку помочь, буду дальше копаться

Добавить комментарий