Всем привет, такой вопрос, отправляю на почту заказ, после оформления с сайта из корзины, но вместо параметров товара приходит 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>Array</b><br>
Количество: <b>1</b> шт.<br>
Цена: <b>79</b> руб.<br>
Способ оплаты: <b>Оплата картой</b><br>
Вид доставки: <b>courier</b><br>
Цена за доставку: <b>5</b><br>
<b>Итого: 84</b> руб.<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.by</td>
</tr><tr>
<td>Телефон:</td>
<td>+375297506592</td>
</tr><tr>
<td>Комментарий:</td>
<td></td>
</tr>
</tbody>
</table>
А вот файл shopOrderReport:
<!DOCTYPE html>
<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 вот с таким содержимым:
<?php
// $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". Чтобы проще понять было, попробуйте выполнить вот такой код (например в консоли):
<?php
print "<pre>";
$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
<?php
// $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]], оставил, чтобы вы посмотрели что и как. Удалите что не нужно будет.
спасибо за попытку помочь, буду дальше копаться
Не за что