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), и эти значения должны быть видны в панели администратора в соответствующем порядке Информация раздел как работает пользовательский параметр по умолчанию
Спасибо.
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
}
Первое, что нужно для значения поста
Mage::app()->getRequest()->getParams()
не будет работать, вы должны использовать
Mage::app()->getRequest()->getPost()
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),
)
);
Проверьте приведенный выше код.