Наумов Алексей

Наумов Алексей

С нами с 31 марта 2013; Место в рейтинге пользователей: #13
Наумов Алексей
10 апреля 2015, 13:44
+3
Спасибо за дельный комментарий!

Мысль сделать это была, просто пока не добрался! Но теперь точно придется сделать)))
Наумов Алексей
10 апреля 2015, 09:06
0
Подумаю, может в следующем релизе.

Вы можете мне навскидку предложить сценарии, в которых потребуются дополнительные поля?
Наумов Алексей
09 апреля 2015, 14:29
0
Отвлекаете меня прям)
но раз взялся помочь, залез и дальше.

Алгоритм следующий:

1. Делаем копию сниппета msGetOrder, что бы при обновлении все не затерлось
2. В этом сниппете есть цикл
foreach ($rows as $row) {
в котором мы «пробегаемся» по покупкам.

Так давайте посчитаем в цикле стоимость покупок:
$rowsCost += $row['cost'];
3. И еще у нас есть $outer['cart_cost'], она где то в вверху сниппета фигурирует — это стоимость корзины.

Так вот, если была скидка или наценка, то стоимость покупок и стоимость корзины не совпадают)) Значит можно и посчитать скидку или наценку простым вычитанием. При этом вызывать $miniShop2->cart->getCartMargin(); не нужно из этого снипеета!
Наумов Алексей
09 апреля 2015, 13:54
0
Я брал сниппет msOrder, который получает заказ, делал его копию, в нем получал эту скидку и в чанках во всех выводил ее… точнее сейчас сказать уже не смогу
Наумов Алексей
09 апреля 2015, 09:50
1
+1
Даю полный код своей расширенной корзины:

<?php
class myCartHandler extends msCartHandler{

    private $marginPercent = 5.0;
    private $discountPercent = 2.0;

    public function getMarginPercent(){
        return $this->marginPercent;
    }
    public function getDiscountPercent(){
        return $this->discountPercent;
    }

    /* @inheritdoc} */
    public function status($data = array()) {
        $status = parent::status($data);

        // margin && discount
        $status['margin'] = $this->getCartMargin();
        $status['discount'] = $this->getCartDiscount();
        //$status['total_cost_ex'] = $this->calcTotalCostEx($status['total_cost'], $status['margin'], $status['discount']);
        $status['total_cost'] = $this->calcTotalCostEx($status['total_cost'], $status['margin'], $status['discount']);

        return $status;
    }

    public function calcTotalCostEx($total_cost, $margin, $discount){
        $result = $total_cost;
        if(!empty($margin)){
            //$result = $this->roundCost($total_cost + $margin);
            $result = $total_cost + $margin;
        }
        if(!empty($discount)){
            //$result = $this->roundCost($total_cost - $discount);
            $result = $total_cost - $discount;
        }
        return $result;
    }

    public function getCartMargin(){
        $count = 0;
        $totalCount = 0;
        $totalCost = 0;
        $tmpPrice = 0;
        foreach ($this->cart as $item) {
            if (empty($item['ctx']) || $item['ctx'] == $this->modx->context->key){
                $count++;
                $totalCount += $item['count'];
                $tmpPrice = $item['price'];
                $totalCost += $item['price'] * $item['count'];
            }
        }

        // наценка, если в корзине 1 товарная позиция, с кол-вом 2 шт и ценой менее 4000 рублей
        if($count == 1 && $totalCount <= 2 && $tmpPrice < 4000){
            return $this->roundCost($totalCost * ($this->marginPercent / 100.0));
        }
        return 0;
    }

    public function getCartDiscount(){
        $countSet = 0;
        $totalCost = 0;
        foreach ($this->cart as $item) {
            if (empty($item['ctx']) || $item['ctx'] == $this->modx->context->key){
                if($item['count'] >= 4){
                    $countSet ++;
                }
                $totalCost += $item['price'] * $item['count'];
            }
        }

        // скидка, если в корзине 2 комплекта
        if($countSet >= 2){
            return $this->roundCost($totalCost * ($this->discountPercent / 100.0));
        }
        return 0;
    }

    public function roundCost($cost){
        return round($cost / 50) * 50;
    }
}
Она делает скидку 2%, если в корзине есть как минимум 2 разных товара по 4 штуки (это магазин шин и дисков, т.е. имеется ввиду что в корзине минимум 2 набора по 4 колеса или диска). Так е есть наценка 5% если в корзине всего 1 товарная позиция с кол-вом меньшим или раным 2 штук (например 1 или 2 покрышки) и общей суммой заказа меньше 4 тысяч рублей…

+ тут еще есть округление скидки или наценки до 50 рублей функцией roundCost
Наумов Алексей
09 апреля 2015, 09:16
0
А, ок =)

Спасибо! Ну, почему бы и нет конечно )
Наумов Алексей
09 апреля 2015, 09:02
0
Дело в том, что я пока вижу следующие сценарии использования дополнения: отзывы, вопрос-ответ, комментарии. Для этих сценариев стандартных полей хватает. Если вы назовете другие сценарии использования — я подумаю над ними, но пока даже сам не представляю.
Наумов Алексей
09 апреля 2015, 08:52
0
Ну в принципе в комментарии все написано. Переопределите класс и выведите в нем $this->cart, посмотрите, что там внтури, 3 товара найдете и в зависимости от этого условие делайте свое.
Наумов Алексей
09 апреля 2015, 08:50
0
Ну во первых это не ресурсы MODx, поэтому о каких TV полях речь вообще?

А если имеются ввиду просто дополнительные поля, например, как в minishop2 — то нет. Но возможно, что пока нет.

Каких полей вам не хватает?
Наумов Алексей
08 апреля 2015, 09:43
0
Ага, спасибо, что все идет!

Ждем результатов!
Наумов Алексей
06 апреля 2015, 07:29
+4
Во первых ОЧЕНЬ внимательно прочитайте документацию: docs.modx.pro/components/pdotools/general-settings#Способы-вызова-чанков

там написан важный нюанс.

Во вторых для вставки кода на этом сайте используйте кнопку Code.

Ваш пример:
[[pdoResources? 
&tpl=`myTpl` 
&parents=`[[#[[*parent]].parent]]` 
&resources=`-[[*id]]`
]]
myTpl:
<img src="[[+tv.image_src:phpthumboff=`w=100&h=100&zc=1`]]" />
...остальной код...
Наумов Алексей
06 апреля 2015, 07:23
+2
Если у вас просто список, как на скриншоте — можно использовать pdoMenu с параметром countChildren.
Наумов Алексей
05 апреля 2015, 17:15
0
Читайте про параметры phpthumb.sourceforge.net/demo/docs/phpthumb.readme.txt

самый важные w,h,zc,far, например w=100&h=100&zc=1
Наумов Алексей
05 апреля 2015, 10:30
0
Картинка — ужасна! =)

Создаете TV поле с именем myImage, тип ввода картинка. В pdoResources добавляете параметр &includeTVs=`myImage`, в чанке шаблоне пишете
<img src="[[+tv.myImage]]" />
Если нужно автоматически уменьшать картинку, используете phpthumboff, phpthumbon или иные phpthumb…
Наумов Алексей
03 апреля 2015, 19:04
0
Все верно, Илья. В этом ключе и собирался продолжать. Пока только первая версия, надеюсь дальше функционал будет улучшаться.
Наумов Алексей
03 апреля 2015, 19:03
0
Да исходники есть, я просто ссылку не публиковал)) но кто захочет, найти сможет. =)
Наумов Алексей
03 апреля 2015, 18:02
0
Я написал в статье про тикетс… Это несколько не то. Авторизация, древоводные комментарии, весьма сложная настройка (если нужно поменять стандартный функционал), неудобство работы из админки… Все это скорее мешает, чем помогает в тех задачах, которые призван решать мой компонент. Тикетс отлично подходит для блогов, а мой компонент наоборот)
Наумов Алексей
03 апреля 2015, 17:58
0
В тикетс с тояки срения архитектуры это есть, но фронтенд js скрипт это не поддерживает