Всегда отображайте ярлык Правил цены корзины покупок над корзиной (не только при первом применении правила)
Я только что начал использовать расширение промо-товаров Amasty для добавления бесплатных товаров в корзину при покупке определенных товаров.
Надпись, которую я написал, сообщающая покупателю, почему был добавлен бесплатный товар, появляется над списком покупок при первом применении правила (у меня есть просмотры магазинов на 2 языках, и это отлично работает для обоих).
Однако, если пользователь продолжит делать покупки и добавит больше товаров, в следующий раз, когда он увидит свою корзину, ярлык не будет отображаться. Если они пропустили это в первый раз, они иногда путаются в том, почему в их тележке появляются вещи, которые они туда не положили.
Я спросил об этом Amasty, и они сказали мне, что это поведение Magento по умолчанию для правил цены корзины покупок (только для отображения метки при первом применении правила).
Есть ли способ переопределить это поведение и чтобы надпись всегда отображалась над корзиной?
2 answers
Я только недавно столкнулся с этим с клиентом. Я закончил писать модуль, который создает новый атрибут элемента предложения, устанавливает его из наблюдателя и отображает его под деталями продукта в корзине, на странице оформления заказа, в электронном письме нового заказа и в представлении заказа/счета администратора.
Чтобы отобразить пользовательский элемент цитаты там, где я хотел его показать, я вызываю вспомогательный метод из любого шаблона, который мне нужно изменить. Я мог бы когда-нибудь превратить это в настоящий универсальный модуль, и когда я это сделаю, я придумаю лучший способ отображения этого атрибута, а не взломаю кучу шаблонов. Из-за нехватки времени мне пришлось использовать "быстрый и грязный" метод.
Ниже приведен код, который я использовал для создания, установки и получения атрибута, а также список шаблонов, которые я изменил:
Config.xml
<config>
<modules>
<Company_PromoName>
<version>0.2.0</version>
</Company_PromoName>
</modules>
<global>
<models>
<company_promoname>
<class>Company_PromoName_Model</class>
</company_promoname>
</models>
<helpers>
<company_promoname>
<class>Company_PromoName_Helper</class>
</company_promoname>
</helpers>
<resources>
<company_promoname_setup>
<setup>
<module>Company_PromoName</module>
<class>Company_PromoName_Model_Resource_Setup</class>
</setup>
</company_promoname_setup>
</resources>
<events>
<sales_quote_add_item>
<observers>
<company_promoname>
<class>company_promoname/observer</class>
<method>salesQuoteAddItem</method>
</company_promoname>
</observers>
</sales_quote_add_item>
</events>
<fieldsets>
<sales_convert_quote_item>
<promo_name>
<to_order_item>*</to_order_item>
</promo_name>
</sales_convert_quote_item>
<sales_convert_order_item>
<promo_name>
<to_quote_item>*</to_quote_item>
<to_invoice_item>*</to_invoice_item>
</promo_name>
</sales_convert_order_item>
</fieldsets>
</global>
</config>
Model/Resource/Setup.php
class Company_PromoName_Model_Resource_Setup extends Mage_Sales_Model_Resource_Setup
{
}
Data-install-1.0.0.php
$installer = $this;
$entities = array(
'quote_item',
'order_item',
'invoice_item',
);
$options = array(
'type' => Varien_Db_Ddl_Table::TYPE_VARCHAR,
'visible' => true,
'required' => false
);
$installer->startSetup();
foreach ($entities as $entity) {
$installer->addAttribute($entity, 'promo_name', $options);
}
$installer->endSetup();
Observer.php
class Company_PromoName_Model_Observer
{
/**
* Adds the promo name to the quote item if it is a promo item when the item
* is added to the quote
*
* @param Varien_Event_Observer $observer Object containing data passed
* from the event
* @see Mage_Sales_Model_Quote::addItem()
* @return void
*/
public function salesQuoteAddItem(Varien_Event_Observer $observer)
{
$quoteItem = $observer->getEvent()->getQuoteItem();
$amPromoRule = $quoteItem->getOptionByCode('ampromo_rule');
if ($amPromoRule && $amPromoRule->getValue()) {
$rule = Mage::getModel('salesrule/rule')->load($amPromoRule->getValue());
if ($rule) {
$quoteItem->setPromoName($rule->getName());
}
}
}
}
Helper/Data.php
class Company_PromoName_Helper_Data extends Mage_Core_Helper_Abstract
{
/**
* Gets the name of the promotion from a custom item attribute
*
* @param Mage_Core_Model_Abstract $item The promo item
* @return string
*/
public function getPromoName(Mage_Core_Model_Abstract $item)
{
$promoName = '';
if ($item->getPromoName()) {
$promoName = $item->getPromoName();
}
return $promoName;
}
}
Изменено шаблоны:
frontend:
checkout/cart/item/default.phtml
checkout/onepage/review/item.phtml
adminhtml:
sales/items/column/name.phtml
Скриншот рекламного товара в корзине:
Примечание: Имя расширения и снимок экрана были изменены для защиты конфиденциальности клиента.
Я надеюсь, что код, который я предоставил, поможет вам в вашем пути. Наслаждайтесь!
Я пишу ответ, потому что пока не могу добавить комментарий.
Используя предложение Джозефа, вы можете добавить скрытый атрибут, в котором вы можете сохранить "почему я здесь, в корзине" для рекламных товаров.
Позже вы можете повторить элемент в предложении, и если этот скрытый атрибут будет найден, вы можете снова добавить промо-сообщение. Я сделаю это в файле cart.phtml или лучше в контроллере корзины, если вам нужно использовать функцию "addmessage"., Окончательный выбор зависит от того, как амасты расширение управляет сообщениями.