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



  • 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 было разорвано, подождите, пока мы пытаемся восстановить соединение.