Вывод содержимого корзины конкретного пользователя

Материал из Umicms
Версия от 10:05, 5 июня 2013; Mad grant (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

Актуально для версии 2.9

Поставим себе задачу: Вывести содержимое корзины конкретного пользователя. Эта функция весьма полезна и позволит проводить мониторинг того, что люди в данный момент собираются купить. Для реализации такого функционала доработаем макрос %emarket order()%. Скопируем код оригинального макроса в файл ~/classes/modules/emarket/__custom.php после строки //TODO: Write here your own macroses и внесём необходимые изменения. Наш код будет выглядеть примерно так:

<?php
public function getBasketOrderByUserId($customerId,$template = 'default'){
    //----------наш код--------------------------------------------------
    $cmsController = cmsController::getInstance();
    $domain = $cmsController->getCurrentDomain();
    $domainId = $domain->getId();
    $sel = new selector('objects');
    $sel->types('object-type')->name('emarket', 'order');
    $sel->where('customer_id')->equals($customerId);
    $sel->where('domain_id')->equals($domainId);
    //$sel->where('status_id')->isnull(true);
    $sel->order('id')->desc();
    $result = $sel->result();
    $order=$result[0];
    $orderId=$order->id;            
    //-------------------------------------------------------------------
    if(!$template) $template = 'default';
        $permissions = permissionsCollection::getInstance();
    
    $orderId = (int) ($orderId ? $orderId : getRequest('param0'));
    if(!$orderId) {
        throw new publicException("You should specify order id");
    }
    
    $order = order::get($orderId);
    if($order instanceof order == false) {
        throw new publicException("Order #{$orderId} doesn't exists");
    }
    
    if(!$permissions->isSv() && ($order->getName() !== 'dummy') &&
    (customer::get()->getId() != $order->customer_id) &&
    !$permissions->isAllowedMethod($permissions->getUserId(), "emarket", "control")) {
        throw new publicException(getLabel('error-require-more-permissions'));
    }
    
    list($tpl_block, $tpl_block_empty) = def_module::loadTemplates("emarket/".$template,
    'order_block', 'order_block_empty');
    
    $discount = $order->getDiscount();
    $totalAmount = $order->getTotalAmount();
    $originalPrice = $order->getOriginalPrice();
    $actualPrice = $order->getActualPrice();
    $deliveryPrice = $order->getDeliveryPrice();
    
    if($originalPrice == $actualPrice) {
        $originalPrice = null;
    }
    
    $discountAmount = ($originalPrice) ? $originalPrice + $deliveryPrice - $actualPrice : 0;
    $result = array(
    'attribute:id'	=> ($orderId),
    'xlink:href'	=> ('uobject://' . $orderId),
    'customer'		=> ($order->getName()  == 'dummy') ? null : $this->renderOrderCustomer($order, $template),
    'subnodes:items'=> ($order->getName()  == 'dummy') ? null : $this->renderOrderItems($order, $template),
    'summary'		=> array(
    'amount'		=> $totalAmount,
    'price'			=> $this->formatCurrencyPrice(array(
    'original'		=> $originalPrice,
    'delivery'		=> $deliveryPrice,
    'actual'		=> $actualPrice,
    'discount'		=> $discountAmount
    ))
    )
    );
    
    if ($order->number) {
        $result['number'] = $order->number;
        $result['status'] = selector::get('object')->id($order->status_id);
    }
    
    if(sizeof($result['subnodes:items']) == 0) {
        $tpl_block = $tpl_block_empty;
    }
    
    $result['void:total-price'] = $this->parsePriceTpl($template, $result['summary']['price']);
    $result['void:delivery-price'] = $this->parsePriceTpl($template, $this->formatCurrencyPrice(array('actual' => $deliveryPrice)));
    $result['void:total-amount'] = $totalAmount;
    
    $result['void:discount_id'] = false;
    if($discount instanceof discount) {
        $result['discount'] = array(
        'attribute:id'		=> $discount->id,
        'attribute:name'	=> $discount->getName(),
        'description'		=> $discount->getValue('description')
        );
        $result['void:discount_id'] = $discount->id;
    }
    return def_module::parseTemplate($tpl_block, $result, false, $order->id);
}
?>

В нём добавлены строки, которые получают id заказа, который является текущей корзиной пользователя, id которого указали в качестве первого параметра. Шаблонами он оперирует теми же что и макрос %emarket order()%, в качестве первого параметра нужно передать id пользователя, корзину которого нужно вывести. Не забудьте также, что метод нужно прописать в permissions.custom.php, чтобы можно было работать с ним не только супервайзеру.