Записки велосипедиста №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 , спасибо большое за совет! Я пока только учусь, поэтому могу писать жуть =)



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