Делаем личный кабинет для 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; ?



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