Вопрос по ShopKeeper3

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

Comments

Та надо в шаблоне письма этот массив разобрать на отдельные составляющие. А чтобы проверить, что они в шаблон приходят, можно передать его через 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=`&mdash;`]]</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]], оставил, чтобы вы посмотрели что и как. Удалите что не нужно будет.