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


Делаем личный кабинет для shopkeeper

  • Создаем сниппет billing и вставляем туда

    <?php
    if (file_exists(MODX_BASE_PATH.$file)){
       $o = billing MODX_BASE_PATH.$file;
    }else{ $o = 'File not found at: '.$file; }
    return $o;
    

    Создаём файл core/components/user_orders.php и вставляем туда следующее содержимое

    <?php
     
    /*
     
    Выводит заказы пользователя
     
    */
     
    @date_default_timezone_set('Europe/Moscow');
    @setlocale (LC_ALL, 'ru_RU.UTF-8');
     
    $output = '';
     
    $usergroup = $modx->getOption('usergroup',$scriptProperties,'Покупатели');
    $limit = 0;
    $start = 0;
     
    $user = $modx->user;
    $user_id = $modx->user->get('id');
    $profile = $user->getOne('Profile');
    if(!$profile || !$user->isMember($usergroup)) return $output;
     
    require_once MODX_CORE_PATH.'components/shopkeeper/model/shopkeeper.class.php';
    require_once MODX_CORE_PATH."components/shopkeeper/model/shk_mgr.class.php";
    $SHKmanager = new SHKmanager($modx);
    $SHKmanager->getModConfig();
    $SHKmanager->config['orderDataTpl'] = $modx->getOption('orderDataTpl',$scriptProperties,'@FILE orderData.tpl');
    $SHKmanager->config['additDataTpl'] = $modx->getOption('additDataTpl',$scriptProperties,'@FILE additData.tpl');
     
    $c = $modx->newQuery('SHKorder');
    $c->where(array('userid:=' => $user_id));
    $count = $modx->getCount('SHKorder',$c);
    $c->sortby('date','DESC');
    if ($limit) $c->limit($limit,$start);
    $orders = $modx->getCollection('SHKorder', $c);
     
    //Повтор заказа
    if(isset($_GET['action']) && $_GET['action']=='repeat'){
         
        $order_id = isset($_GET['id']) ? trim($_GET['id']) : 0;
        if($order_id){
             
            $order = $modx->getObject('SHKorder',array('id'=>$order_id, 'userid' => $user_id));
            if($order){
                 
                $new_order = $modx->newObject('SHKorder');
                $new_order->fromArray($order->toArray());
                $new_order->set('status',0);
                $new_order->set('date',strftime('%Y-%m-%d %H:%M:%S'));
                $new_order->save();
                 
            }
            $modx->sendRedirect($modx->makeUrl($modx->resource->get('id')));
            exit;
             
        }
     
    }
     
    //Вывод заказов
    if($count>0){
         
        $index = 0;
        foreach($orders as $order){
             
            $purchases = unserialize($order->get('content'));
            $addit_params = unserialize($order->get('addit'));
            $date = $order->get('date');
            $allowed = $order->get('allowed');
             
            $orderData = $SHKmanager->getOrderData($purchases,$addit_params);
             
            $chunkArr = array(
                'index' => $index,
                'orderID' => $order->get('id'),
                'date' => $date,
                'status_id' => $order->get('status'),
                'status' => isset($SHKmanager->config['statuses'][$order->get('status')]) ? $SHKmanager->config['statuses'][$order->get('status')][0] : ''
            );
             
            $chunk_data = $SHKmanager->getChunk('@INLINE '.$orderData);
            $output .= $SHKmanager->parseTpl($chunk_data, $chunkArr);
            $index++;
             
        }
     
    }
     
    return $output;
    

    В нужном месте вызываем сниппет billing со следующими настройками:

    [[!billing?
    &file=`core/components/user_orders.php`
    &usergroup=`Покупатели`
    &orderDataTpl=`user_orderDataTpl`
    ]]
    

    Создаём чанк user_orderDataTpl (пример core/components/shopkeeper/elements/chunks/ru/orderData.tpl), в который копируем этот код:

    <p>Дата заказа: [[+date]]</p>
    
    <table>
    
    [[+loop]]
        [[+name:is=`Доставка`:then=`
        <tr>
            <td>
                [[+s]]<b>[[+name]]</b> [[+shk_delivery]][[+/s]]
            </td>
            <td></td>
            <td>[[+price_total]] [[+currency]]</td>
        </tr>
        `:else=`
        <tr>
            <td>
                [[+s]]
                <b><a href="[[+link]]">[[+name]]</a></b>
                [[+addit_data]]
                [[+/s]]
            </td>
            <td>
                [[+s]][[+count]] шт.[[+/s]]
            </td>
            <td>
                [[+s]][[+price]] [[+currency]][[+/s]]
            </td>
        </tr>
        `]]
    [[+end_loop]]
        
        <tr>
            <td align="right" colspan="2"><b>Итого:</b></td>
            <td><b>[[+price_total]] [[+currency]]</b></td>
        </tr>
        
    </table>
    
    <br/>
    

    Формировать структуру можно как угодно, не только в таблицах, а например в <div> + bootstrap Просто используете плейсхолдоры из кода и подставляйте их в нужные блоки.

    Кнопка повторить заказ

    <a href="[[~[[*id]]]]?action=repeat&id=[[+orderID]]">Повторить заказ</a>
    
  • @Роман это замена userOrders? В чем преимущества?

  • Хорошо бы указывать источник
    http://promo-creative.com/lichnyij-kabinet-polzovatelya-v-internet-magazine-modx-revolution-shopkeeper.html

    А первоисточник, по-моему, мой блог, который сейчас не работает.

  • @Роман А на Shopkeeper 3 такого же нету??

  • @akradeus Изначально этого нет, вы сами создаете сниппет и выводите его в нужном вам месте шаблона

  • Зачем изобретать велосипед? Прекрасно работает связка login+shopkeeper+userOrders опробовал на 3 сайтах. Очень много крутых фич из пакета.

  • @Pavel сказал Делаем личный кабинет для shopkeeper:

    userOrders

    А где его скачать то теперь ??

  • @Pavel Не могу найти организованной документации либо видея для "чайников" про сборку login + shopkeeper +userOrders. Есть ли у кого нибудь ссылки?

  • а ничего что сниппет billing сразу же показывает синтаксическую ошибку в строке $o = billing MODX_BASE_PATH.$file; ?

 

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

  • M

    @Andchir , спасибо. Проблема и правда была в одном из плагинов, который на другом сайте нормально работает

    Читать далее
  • Что нового в 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 (красным выделено, то что приходится постоянно удалять

    Читать далее