Magento: добавьте продукт в корзину с пользовательской ценой, используя наблюдатель

у меня есть ввод на странице продукта, который позволяет покупателям изменять цену: введите описание изображения здесь

я следовал этому руководству: http://magentotutorial.org/programmatically-add-product-cart-price-change-magento/

и это мой код: config.xml:

<events>
            <core_block_abstract_to_html_after>
                <observers>
                    <customprice>
                        <type>singleton</type>
                        <class>WebDirect_CustomPrice_Model_Observer</class>
                        <method>convertPricespanToInput</method>
                    </customprice>
                </observers>
            </core_block_abstract_to_html_after>

            <checkout_cart_product_add_after>
                <observers>
                    <customprice>
                        <type>singleton</type>
                        <class>WebDirect_CustomPrice_Model_Observer</class>
                        <method>applyCustomPrice</method>
                    </customprice>
                </observers>
            </checkout_cart_product_add_after>

        </events>

класс наблюдателя:

<?php
class WebDirect_CustomPrice_Model_Observer
{
    const MODULE_NAME = 'WebDirect_CustomPrice';
    public function convertPricespanToInput($observer = NULL) {
        if (!$observer) {
            return;
        }
        if ('product.info.simple' == $observer->getEvent()->getBlock()->getNameInLayout()) {
            if (!Mage::getStoreConfig('advanced/modules_disable_output/'.self::MODULE_NAME)) {
                $transport = $observer->getEvent()->getTransport();
                $block = new WebDirect_CustomPrice_Block_priceSpanToInput();
                $block->setPassingTransport($transport['html']);
                $block->toHtml();
            }
        }
        return $this;
    }

    /**
     * @param Varien_Event_Observer $observer
     */
    public function applyCustomPrice(Varien_Event_Observer $observer) {
        /* @var $item Mage_Sales_Model_Quote_Item */
        $item = $observer->getQuoteItem();
        if ($item->getParentItem()) {
            $item = $item->getParentItem();
        }

        // Discounted 50% off
        $percentDiscount = 0.50;

        // This makes sure the discount isn't applied over and over when refreshing
        $specialPrice = $item->getOriginalPrice() - ($item->getOriginalPrice() * $percentDiscount);

        // Make sure we don't have a negative
        if ($specialPrice > 0) {
            $item->setCustomPrice($specialPrice);
            $item->setOriginalCustomPrice($specialPrice);
            $item->getProduct()->setIsSuperMode(true);
        }
    }
}

эта функция только для теста, когда я нажимаю добавить в корзину, ничего не меняется! есть ли в этом ошибка?


person Souf    schedule 25.03.2014    source источник
comment
Вы сначала проверили, что ваш метод наблюдателя действительно выполняется? Просто поставьте die('here') в начале метода и убедитесь, что он вызывается, когда вы добавляете товар в корзину. Если это так, переместите кубик на проверку специальной цены и измените его на die($specialPrice);, чтобы убедиться, что он входит в оператор if. Сообщите нам, действительно ли метод вызывается, если нет, попробуйте очистить кеш и проверить, включен ли модуль в админке.   -  person Ashley Swatton    schedule 25.03.2014
comment
@AshleySwatton да, это пустая страница с 0, так что делать дальше?   -  person Souf    schedule 25.03.2014
comment
Я не думаю, что он должен умирать с 0, если рассчитана специальная цена и предполагается, что она больше 0 :-). Закомментируйте свои расчеты и сделайте что-нибудь простое, например $item->setOriginalCustomPrice(100.00);. Если это сработает, вам нужно будет отладить свои расчеты и выяснить, где что-то идет не так. Я думаю, ты почти у цели :-)   -  person Ashley Swatton    schedule 25.03.2014
comment
@AshleySwatton, это сработало !!! теперь я хочу получить значение ввода во внешнем интерфейсе, как вы можете видеть на изображении вверху вопроса, имя и идентификатор этого ввода - это customprice. Знаете ли вы, как это сделать?   -  person Souf    schedule 26.03.2014
comment
@AshleySwatton, кажется, у вас есть опыт разработки magento, не могли бы вы проверить этот вопрос stackoverflow.com/questions/22657041/   -  person Souf    schedule 26.03.2014
comment
Глупый вопрос, и, пожалуйста, простите меня за то, что я новичок в этом, но есть ли способ сделать это без создания наблюдателя?   -  person Vinnie Saletto    schedule 21.04.2014
comment
@VinnieSaletto нет, потому что при нажатии кнопки «Добавить в корзину» это событие, а когда мы говорим о событиях, должен быть наблюдатель.   -  person Souf    schedule 22.04.2014
comment
Пробовали ли вы вместо этого наблюдать за sales_quote_add_item? Это срабатывает после добавления/обновления элемента корзины.   -  person Jongosi    schedule 30.04.2014