Последние темы


Записки велосипедиста №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 рад помочь 😃

 

Последние комментарии

  • Что нового в Shopkeeper 4.0.3:

    Исправлено некорректное определение языка по умолчанию В настройках в админке скрываются пароли. Добавлена возможность загружать картинки для категорий. shopkeeper.js - добавлена функция updateProductsPrice() для поддержки текстовых полей для цены. Twig-функции contentList() и includeContent() вынесены в отдельный класс. Добавлено событие "order.before_create". Сортировка всех полей типа контента перетаскиванием. Автоматическое сохранение сортировки полей при сохранении типа контента (не нужно нажимать на отдельную кнопку). В интерфейсе админа добавлено поле поиска для списка Composer-пакетов.

    Скачать можно на главной странице https://modx-shopkeeper.ru/

    Читать далее
  • Вот этот плагин:
    0_1550334109280_screenshot_022.png

    Вроде по умолчанию он выключен. Надо включить. Но плагин работает только на редактирование товаров, при удалении он делалать ничего не будет. Только что проверил кнопку, всё работает корректно, фильтры удаляются и добавляются, когда нужно. Но нужно очищать корзину после удаления товаров (возможно баг).

    Читать далее
  • J

    @Andchir Если нажимаю кнопочку "Обновить значения", то в фильтрах появляются как раз те самые удаленные значения фильтра.. Потом приходится Ручками выбирать эти удаленные значения.
    вот так выглядит Управление фильтрами когда удаляешь ручками: https://yadi.sk/i/_zw64CGkZ_sAYg
    А вот так выглядит когда просто нажимаешь "Обновить значения": https://yadi.sk/i/7WFbXC6xV5sQAw (красным выделено, то что приходится постоянно удалять

    Читать далее
  • J

    Участник @Jokerit написал в TagManager2 отображает в фильтре удаленные значения TV-полей:

    tmRefresh

    Так и не смог найти как включить

    Читать далее