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


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

 

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

  • Z

    Спасибо, действительно проще создать отдельно.

    Читать далее
  • Но проблема в том, что эта старая цена "дублируется" в плесхолдер "Дополнительных услуг" - [[+addit_data]].

    Можно не использовать [[+addit_data]], а выводить параметры по-отдельности.

    Цитата из документации:

    [[+shk_любой доп.параметр]] - любой доп. параметр, выбранный при добавлении товара в корзину (из [[+addit_data]]), например [[+shk_param1]].
    Если параметры сделаны в виде чекбоксов, то чтобы вывести отдельно каждый из них, нужно добавлять индекс (номер от нуля) для параметров следующих за первым.
    Пример: [[+shk_param1]], [[+shk_param1_1]], [[+shk_param1_2]] ...
    [[+shk_любой доп.параметр_price]] - цена доп.параметра. Пример: [[+shk_param1_price]].

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

    Доброго времени суток. Не могу разобраться, как передать данные migx-поля в корзину в плейсхолдер без "дублирования" в [[+addit_data]]
    Суть в чем: У меня есть 2 цены у товара (со скидкой и без скидки) Форма для отправки в корзину:

    <form action="[[~[[*resource_id]]? &scheme=`abs`]][[*alias]].html" method="post"> <input type="hidden" name="shk-id" value="[[*id]]" /> <input type="hidden" name="shk-name" value="[[*pagetitle]]" /> <input type="hidden" name="price_old__[[*id]]__add" value="[[*price_old]]" /> <input type="hidden" name="shk-count" value="1" /> <div class="product-price"> Цена: <span class="shk-price">[[!*price:shk_curr_rate:num_format]]</span> Старая цена - <span class="shk-price-old">[[+price_old]]</span> [[!+shk_currency]] </div> <div class="padding-lr-30"> <h5>Дополнительные услуги</h5> [[*param1]] </div> <div class="product-price"> <button class="btn btn-lg btn-primary" type="submit" class="shk-but">В корзину</button> </div> </form>

    Данные со "старой ценой" в корзину попадают нормально и выводится в нужном месте в плейсхолдере:
    [[+shk_price_old]]
    Но проблема в том, что эта старая цена "дублируется" в плесхолдер "Дополнительных услуг" - [[+addit_data]]. Как сделать чтобы старая цена не выводилась в [[+addit_data]]? Или может я как то не правильно передаю MIGX-параметр в корзину ? Заранее спасибо.

    Читать далее
  • Фотографии, как я понял, это второй вопрос. Я по нему пока ничего не отвечал и не просил информации. Это не отменяет того, что в вашем конфиге есть ошибка, о которой я писал выше. Не нужно задавать разные вопросы в одной теме, чтобы не было путаницы.
    http://forum.modx-shopkeeper.ru/topic/15/рекомендации-по-оформлению-темы-с-вопросом

    Читать далее