Magento: Не удается установить опубликованное значение в наблюдателе


Я пытаюсь изменить цену товара, когда пользователь нажимает кнопку "Добавить в корзину" на странице просмотра товара. Для этого я сделал несколько jQuery и скрытых полей. Как только пользователь нажимает кнопку "Добавить в корзину", я получаю данные скрытого поля в observer и изменяю цену, и она работает нормально.

ПРОБЛЕМА

Теперь на странице продукта я создал некоторые параметры продукта с использованием html и jQuery (не настраиваемый параметр по умолчанию) и передал их значения в скрытое заполнилось. Теперь я должен показать выбранную опцию на странице корзины, как работает пользовательский параметр magento по умолчанию. И для этого я создал наблюдателя для создания опции "на лету", когда пользователь нажимает кнопку "Добавить в корзину". Это работает нормально, если я передаю статическое значение в наблюдателе для опции, но я хочу получить те скрытые значения в наблюдателе, которые передаются со страницы просмотра продукта, как я делал ранее, чтобы изменить цену раньше. Пожалуйста, мой код ниже :

Config.xml

<events>
    <checkout_cart_product_add_after>
        <observers>
            <san_change_price>
                <class>webroot/observer</class>
                <method>modifyPrice</method>
            </san_change_price>
        </observers>
    </checkout_cart_product_add_after>
    <sales_quote_collect_totals_before>
        <observers>
            <san_after_addtocart>
                <type>singleton</type>
                    <class>webroot/observer</class>
                <method>salesQuoteAddressCollectTotalsBefore</method>
            </san_after_addtocart>
        </observers>
    </sales_quote_collect_totals_before>
    <sales_convert_quote_item_to_order_item>
        <observers>
            <san_show_in_admin>
            <type>singleton</type>
            <class>webroot/observer</class>
            <method>salesConvertQuoteItemToOrderItem</method>
            </san_show_in_admin>
        </observers>
    </sales_convert_quote_item_to_order_item>
</events> 

Observer.php

public function modifyPrice(Varien_Event_Observer $obs)
{

    $item   = $obs->getQuoteItem();

    $item   = ( $item->getParentItem() ? $item->getParentItem() : $item );
    $price  = $this->_getPriceByItem($item);
    $data   = Mage::app()->getRequest()->getParams();
    // Update Price
    $price = $data['pay-amount'];
    $item->setCustomPrice($price);
    $item->setOriginalCustomPrice($price);

    $item->getProduct()->setIsSuperMode(true);
}

protected function _getPriceByItem(Mage_Sales_Model_Quote_Item $item)
{
    $price;
    return $price;
}

public function salesQuoteAddressCollectTotalsBefore($observer)
{
    $quote = $observer->getQuote();
    $quote_items = $quote->getItemsCollection();
    $data   = Mage::app()->getRequest()->getParams();
    $print_type =  $data['printing-type'];
    //echo $print_type;exit;
    //echo '<pre>';print_r($quote_items);exit;
    foreach ($quote_items as $item) {

        $additionalOptions = array(
            array(
                'code'  => '666',
                'label' => 'Printing Type',
                'value' => 'abc'            // Have to pass $print_type
            )

        );
        $item->addOption(
            array(
                 'code'  => 'additional_options',
                 'value' => serialize($additionalOptions),
            )
        );
    }
    // echo '<pre>';
    // print_r(serialize($additionalOptions));exit;
}
public function salesConvertQuoteItemToOrderItem(Varien_Event_Observer $observer)
{
    $quoteItem = $observer->getItem();
    if ($additionalOptions = $quoteItem->getOptionByCode('additional_options')) {
        $orderItem = $observer->getOrderItem();
        $options = $orderItem->getProductOptions();
        $options['additional_options'] = unserialize($additionalOptions->getValue());
        $orderItem->setProductOptions($options);
    }
}

В приведенном выше методе salesQuoteAddressCollectTotalsBefore() я должен установить значение $print_type = $data['printing-type']; для $additionalOptions массив. но когда я устанавливаю value как $print_type, он отображается пустым на странице корзины, однако, если я передаю какое-либо статическое значение, например abc, то оно работает нормально.

Пожалуйста, помогите мне установить эти скрытые значения для параметра ($additionaloptions), и эти значения должны быть видны в панели администратора в соответствующем порядке Информация раздел как работает пользовательский параметр по умолчанию

Спасибо.

Author: Sanchit Gupta, 2016-12-06

3 answers

Проблема в том, что событие sales_quote_collect_totals_before отправляется в большем количестве мест, чем вы думаете.
Не уверен в этом, но я думаю, что он отправляется, когда вы добавляете товар в корзину и когда страница корзины перезагружается. Вы можете легко проверить это, добавив регистратор в свой наблюдатель и посмотрев, сколько раз он выполняется.
Добавьте это в свой наблюдатель:

Mage::log('running my observer', null, 'sales.txt', true);

Затем добавьте товар в корзину и посмотрите, сколько журналов в файле var/log/sales.txt.
Я предполагаю, что в первый раз, когда наблюдатель запускается, ваше значение добавляется к элементу предложения, но во второй раз (при загрузке страницы корзины) это значение сбрасывается до нуля, поскольку в запросе отсутствует тип печати.
это объясняет, почему он работает с жестко запрограммированным значением, потому что во второй раз, когда наблюдатель срабатывает, вы все равно получаете то же значение, прикрепленное к элементу предложения.

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

$data   = Mage::app()->getRequest()->getParams();
$print_type = isset($data['printing-type']) ? $data['printing-type'] : null;
if (!is_null($print_type))  {
    //your foreach loop here
}
 2
Author: Marius, 2016-12-15 05:59:16

Первое, что нужно для значения поста

Mage::app()->getRequest()->getParams() не будет работать, вы должны использовать

Mage::app()->getRequest()->getPost()

 1
Author: Murtuza Zabuawala, 2016-12-06 09:59:31
public function modifyPrice(Varien_Event_Observer $obs)
{
    $data   = Mage::app()->getRequest()->getParams();
    if (isset($data['pay-amount']) && $data['pay-amount'] != '') {
            //do your changes here...
    }
}

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

$additionalOptions = array(
            array(
                'label' => 'Printing Type',
                'value' => $print_type            // Have to pass $print_type
            )

        );
        $item->addOption(
            array(
                 'code'  => 'additional_options',
                 'value' => serialize($additionalOptions),
            )
        );

Проверьте приведенный выше код.

 1
Author: Rakesh Jesadiya, 2016-12-12 13:36:33