Записки велосипедиста №2. Список заказов пользователя.

Очередная порция велосипедов подъехала. Сегодня вывод списка заказов пользователя. Работает, сверяя заказы по почте пользователя. Поэтому вообще не важно, Login у вас, Офис или прочие непотребства.

Есть у Андрея платный плагин, но мне, если честно, его функционал избыточен. Ибо не совсем понимаю, зачем юзверю редактировать свои заказы. Это ведь может путаницу создать, когда заказ принят, а его вдруг поменяли.

Приступаем.

  1. Создаём страницу "Список заказов" и туда выводим
[[!user_order_info]]
  1. Создаём, соответственно, сниппет user_order_info
  2. Вставляем в сниппет код:
<?php
//получаем почту активного юзверя и подставляем её в переменную
$profile = $modx->user->getOne('Profile');
$email = $profile ? $profile->get('email') : '';

//просим у БД выдадать нам ID, стоимость заказа и другие данные заказов, относящихся к пользователю с определённой почтой
$sql   = "SELECT `price`, `id`,`delivery`,`delivery_price`,`payment`,`date`  FROM `modx_shopkeeper3_orders` WHERE `email` = '$email'";
$query = new xPDOCriteria($modx, $sql, array(
    ':id' => '10'
));
if ($query->prepare() && $query->stmt->execute()) {
    $res = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
 
//оформляем шапку таблицы    
echo '
<table class="table">
   <thead>
      <tr>
         <th>ID</th>
         <th>Цена</th>
         <th>Доставка</th>
         <th>Цена доставки</th>
         <th>Способ оплаты</th>
         <th>Дата</th>
      </tr>
   </thead>
   <tbody>';
//выводим содержимое - данные о заказе
    foreach ($res as $row) {
        echo "<tr>" 
        . "<td>" . $row['id'] . "</td>" 
        . "<td>" . $row['price'] . "</td>" 
        . "<td>" . $row['delivery'] . "</td>" 
        . "<td>" . $row['delivery_price'] . "</td>" 
        . "<td>" . $row['payment'] . "</td>"
        . "<td>" . $row['date'] . "</td>"
        ."</tr>";
    }
//закрываем таблицу
    echo '
   </tbody>
</table>';

}

//если чего-то вдруг не работает
else
    echo "Запрос не выполнен";

ВАЖНО!!! В этом куске кода

FROM `modx_shopkeeper3_orders`

modx нужно заменить на ваш префикс таблиц. Ибо я тот ещё велосипедист, и так и не понял, как вытащить эти данные из системы.

UPD #1

Нашёл время - доработал сниппет немного. Теперь научил его выводить дополнительные данные + доработал код, теперь он чище и немного правильнее =)

  • Появилось содержимое заказа (товары со ссылками) + количество товара в заказе

  • Появились поля: адрес доставки, телефон, комментарий.

  • Поправил код, чтобы вам не приходилось вписывать свой префикс таблиц руками

Список действий, чтобы получить такую табличку в личном кабинете пользователя:
alt text

  • Создаём страничку Список заказов и выводим [[!user_order_info]]

  • Создаём сниппет user_order_info

<?php
$prefix = $modx->getOption('table_prefix'); // получаем префикс таблицы
$profile = $modx->user->getOne('Profile'); // получем профиль пользователя
$email = $profile ? $profile->get('email') : ''; // получем почту пользователя
$table = $prefix.'shopkeeper3_orders'; // перфикс + название таблицы


//просим у БД выдадать нам ID, стоимость заказа и другие данные заказов, относящихся к пользователю
$sql   = " SELECT `price`, `id`,`delivery`,`delivery_price`,`payment`,`date`,`contacts`  FROM `$table` WHERE `email` = '$email' ";
$query = new xPDOCriteria($modx, $sql);
if ($query->prepare() && $query->stmt->execute()) 
{
    $res = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
 
//оформляем шапку таблицы    
echo '
<table class="table table-bordered table-hover">
   <thead>
      <tr>
         <th>ID</th>
         <th>Цена</th>
         <th>Способ доставки</th>
         <th>Цена доставки</th>
         <th>Способ оплаты</th>
         <th>Дата</th>
         <th>Состав заказа</th>
         <th>Кол-во</th>
         <th>Адрес доставки</th>
         <th>Телефон</th>
         <th>Комментарий к заказу</th>
      </tr>
   </thead>
   <tbody>';
//выводим содержимое - данные о заказе
    foreach ($res as $row) {
        $json = $row['contacts'];
        $array = json_decode($json);
        
        
        echo 
        '<tr>'
        
        . '<td>' . $row['id'] .             '</td>' // ID заказа (номер)
        . '<td>' . $row['price'] .          '</td>' // Стоимость заказа
        . '<td>' . $row['delivery'] .       '</td>' // Способ доставки
        . '<td>' . $row['delivery_price'] . '</td>' // Цена доставки
        . '<td>' . $row['payment'] .        '</td>' // Способ оплаты
        . '<td>' . $row['date'] .           '</td> '// Дата заказа
        
        . "[[!user_order_list? &order_id = `" . $row['id']  ."`]]" // Сниппет, выводящий одержимое заказа (товары и количество); в параметр order_id  передаёт номер заказа, для которого нужно узнать товары
        
        . '<td>' . $array[1]->value .       '</td>' // Адрес доставки
        . '<td>' . $array[3]->value .       '</td>' // Телефон, на который был оформлен заказ
        . '<td>' . $array[4]->value .       '</td>' //Комментарий к заказу
        
        // Если нужно получить почту, указанную при заказе - удалите //
        // . '<td>' . $array[2]->value . "</td>" 
        
        // Если нужно получить ФИО заказчика - удалите //
        // . '<td>' . $array[0]->value ."</td>"
        
        ."</tr>";
    }
//закрываем таблицу
    echo '
   </tbody>
</table>';
}

//если чего-то вдруг не работает
else
    echo "Запрос не выполнен";
  • Создаём сниппет user_order_list
<?php
$prefix = $modx->getOption('table_prefix'); // получаем префикс
$table = $prefix.'shopkeeper3_purchases'; // перфикс + название таблицы


//просим у БД выдадать нам информацию о товарах, находящихся в заказе с ID из user_order_info
$sql   = "SELECT `name`, `p_id` , `count`  FROM `$table` WHERE `order_id` = '$order_id'";
$query = new xPDOCriteria($modx, $sql);
if ($query->prepare() && $query->stmt->execute()) {
    $res = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
    
//оформляем таблицу  
echo "<td>";

//выводим содержимое - товары в заказе

    foreach ($res as $row) {
        echo  '<a href="[[~' . $row['p_id'] . ']]">' . $row['name'] . '</a> <br>';
    }

//оформляем таблицу       
echo "</td>";

echo '<td align="center">';
//выводим содержимое - количество товара в заказе
    foreach ($res as $row) {
        echo  $row['count'] . "<br>";
    }

//оформляем таблицу  
echo "</td>";
}

//если чего-то вдруг не работает
else
    echo "Запрос не выполнен";

Всё. Наслаждаемся табличкой заказов для клиента.

Единственное гипотетическое "НО", возможно у вас будет другая структура полей в заказе. Тогда нужно просто поменять
$array[4]->value в user_order_info на, например, $array[3]->value

@pooding выглядит это чудо такalt text

Andchir, если есть возможность, пожалуйста, замените главное сообщение темы на это.

UPD #1

Нашёл время - доработал сниппет немного. Теперь научил его выводить дополнительные данные + доработал код, теперь он чище и немного правильнее =)

  • Появилось содержимое заказа (товары со ссылками) + количество товара в заказе

  • Появились поля: адрес доставки, телефон, комментарий.

  • Поправил код, чтобы вам не приходилось вписывать свой префикс таблиц руками

Список действий, чтобы получить такую табличку в личном кабинете пользователя:
alt text

  • Создаём страничку Список заказов и выводим [[!user_order_info]]

  • Создаём сниппет user_order_info

<?php
$prefix = $modx->getOption('table_prefix'); // получаем префикс таблицы
$profile = $modx->user->getOne('Profile'); // получем профиль пользователя
$email = $profile ? $profile->get('email') : ''; // получем почту пользователя
$table = $prefix.'shopkeeper3_orders'; // перфикс + название таблицы


//просим у БД выдадать нам ID, стоимость заказа и другие данные заказов, относящихся к пользователю
$sql   = " SELECT `price`, `id`,`delivery`,`delivery_price`,`payment`,`date`,`contacts`  FROM `$table` WHERE `email` = '$email' ";
$query = new xPDOCriteria($modx, $sql);
if ($query->prepare() && $query->stmt->execute()) 
{
    $res = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
 
//оформляем шапку таблицы    
echo '
<table class="table table-bordered table-hover">
   <thead>
      <tr>
         <th>ID</th>
         <th>Цена</th>
         <th>Способ доставки</th>
         <th>Цена доставки</th>
         <th>Способ оплаты</th>
         <th>Дата</th>
         <th>Состав заказа</th>
         <th>Кол-во</th>
         <th>Адрес доставки</th>
         <th>Телефон</th>
         <th>Комментарий к заказу</th>
      </tr>
   </thead>
   <tbody>';
//выводим содержимое - данные о заказе
    foreach ($res as $row) {
        $json = $row['contacts'];
        $array = json_decode($json);
        
        
        echo 
        '<tr>'
        
        . '<td>' . $row['id'] .             '</td>' // ID заказа (номер)
        . '<td>' . $row['price'] .          '</td>' // Стоимость заказа
        . '<td>' . $row['delivery'] .       '</td>' // Способ доставки
        . '<td>' . $row['delivery_price'] . '</td>' // Цена доставки
        . '<td>' . $row['payment'] .        '</td>' // Способ оплаты
        . '<td>' . $row['date'] .           '</td> '// Дата заказа
        
        . "[[!user_order_list? &order_id = `" . $row['id']  ."`]]" // Сниппет, выводящий одержимое заказа (товары и количество); в параметр order_id  передаёт номер заказа, для которого нужно узнать товары
        
        . '<td>' . $array[1]->value .       '</td>' // Адрес доставки
        . '<td>' . $array[3]->value .       '</td>' // Телефон, на который был оформлен заказ
        . '<td>' . $array[4]->value .       '</td>' //Комментарий к заказу
        
        // Если нужно получить почту, указанную при заказе - удалите //
        // . '<td>' . $array[2]->value . "</td>" 
        
        // Если нужно получить ФИО заказчика - удалите //
        // . '<td>' . $array[0]->value ."</td>"
        
        ."</tr>";
    }
//закрываем таблицу
    echo '
   </tbody>
</table>';
}

//если чего-то вдруг не работает
else
    echo "Запрос не выполнен";
  • Создаём сниппет user_order_list
<?php
$prefix = $modx->getOption('table_prefix'); // получаем префикс
$table = $prefix.'shopkeeper3_purchases'; // перфикс + название таблицы


//просим у БД выдадать нам информацию о товарах, находящихся в заказе с ID из user_order_info
$sql   = "SELECT `name`, `p_id` , `count`  FROM `$table` WHERE `order_id` = '$order_id'";
$query = new xPDOCriteria($modx, $sql);
if ($query->prepare() && $query->stmt->execute()) {
    $res = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
    
//оформляем таблицу  
echo "<td>";

//выводим содержимое - товары в заказе

    foreach ($res as $row) {
        echo  '<a href="[[~' . $row['p_id'] . ']]">' . $row['name'] . '</a> <br>';
    }

//оформляем таблицу       
echo "</td>";

echo '<td align="center">';
//выводим содержимое - количество товара в заказе
    foreach ($res as $row) {
        echo  $row['count'] . "<br>";
    }

//оформляем таблицу  
echo "</td>";
}

//если чего-то вдруг не работает
else
    echo "Запрос не выполнен";

Всё. Наслаждаемся табличкой заказов для клиента.

Единственное гипотетическое "НО", возможно у вас будет другая структура полей в заказе. Тогда нужно просто поменять
$array[4]->value в user_order_info на, например, $array[3]->value

Маленький совет

. "[[!user_order_list? &order_id = `" . $row['id']  ."`]]"

это лучше заменить на

. $modx->runSnippet('user_order_list', array('order_id' => $row['id']))

Код не увеличился, зато меньше работы парсеру.

https://docs.modx.com/revolution/2.x/developing-in-modx/other-development-resources/class-reference/modx/modx.runsnippet

@Andchir , спасибо большое за совет! Я пока только учусь, поэтому могу писать жуть =)

Спасибо работает, очень помогло . У меня правда после первой реализации потом вываливалось с ошибкой связанной с pdotools. Никак не могу для себя определиться стоит оставлять на борту по дэфолту MinifyX с pdotools. Стоит ли юзатьт эти турбины )))

@shk3fan какие ошибки? Не замечал ничего подобного.

@pooding я просто с кодингом на профессиональном уровне не разбираюсь , так что что то адекватное написать за errors которые сыпятся в /core/cache/logs написать не могу. Мне помогает если что то edit-ишь и увлёкся всё падает, я просто всю папку cache сношу всё что внутри . Result = помогает :)

Буду очень признателен за пример , как сделать ссылку с личного кабинета прямо на товар в шопе . Я за 4 часа так и не понял как это сделать . Зашёл в PMA посмотрел что в двух таблицах shopkeeper3_orders, shopkeeper3_purchases нет resource_id и на этом остановил попытки . Буду признателен за пример линка.

@shk3fan надеюсь, что правильно вас понял.
modx_shopkeeper3_purchases хранит в себе состав заказа. Там название товара (name), id его ресурса (p_id) и количество (count).
Вот кусок кода, который выводит именно ссылку на товары из заказа. Здесь WHERE order_id = '1' - номер заказа, с которого нужно получить список товаров.

$sql   = "SELECT `name`, `p_id` , `count`  FROM `modx_shopkeeper3_purchases` WHERE `order_id` = '1";
$query = new xPDOCriteria($modx, $sql);
if ($query->prepare() && $query->stmt->execute()) {
    $res = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
    


//выводим содержимое - товары в заказе

    foreach ($res as $row) {
        echo  '<a href="[[~' . $row['p_id'] . ']]">' . $row['name'] . '</a> <br>';
    }

//выводим содержимое - количество товара в заказе
    foreach ($res as $row) {
        echo  $row['count'] . "<br>";
    }
}

//если чего-то вдруг не работает
else
    echo "Запрос не выполнен";

Весь код ужасный, это вообще первые попытки работать с php. Но, тем не менее, работает.

Если объяснить чуть подробнее, чего хотите, то я помогу, мне не трудно =)

Спасибо огромнейшее !!! Я потом со временем свои наработки по шопу выложу как разберусь . Пока на данный момент могу только поделиться своей custom-ной dev panel :) Если интересно могу выложить свою dev panel из /manager/templates/default/header.tpl Спасибо ещё раз !

alt text
Подскажите пожайлуста как можно обработать вывод опций товара???
На скриншоте выводится вот так.

@akradeus через json_decode.
С контактами аналогично здесь делал, попробуйте по примеру.
$json = $row['contacts'];
$array = json_decode($json);

Участник @pooding написал в Записки велосипедиста №2. Список заказов пользователя.:

$json = $row['contacts'];

Что то так не прокатывает (((

@akradeus
в чанке user_order_list добавить options в SQL Select

$sql   = "SELECT `name`, `p_id` , `count`, `options`   FROM `$table` WHERE `order_id` = '$order_id'";

Далее в нужном месте:

 foreach ($res as $row) {
            $json = $row['options']; 
            $options = json_decode( $json, true ); // декодим массив
            
            foreach ($options as $option) { 
                echo $option[0]; //выводим массив
            }   
    }

Выводится он в формате "Название TV Название выбранной опции".
Проверял, работает.

Участник @pooding написал в Записки велосипедиста №2. Список заказов пользователя.:

$json = $row['options'];
$options = json_decode( $json, true ); // декодим массив

        foreach ($options as $option) { 
            echo $option[0]; //выводим массив
        }  

Оооо спс работает! +100500 к карме :)

@akradeus рад помочь =)

Похоже, подключение к Форум | MODX Shopkeeper было разорвано, подождите, пока мы пытаемся восстановить соединение.