Come generare regola promozionali in modo dinamico utilizzando il metodo di osservatore / modello?
-
16-10-2019 - |
Domanda
Come faccio a generare regola coupon in modo dinamico utilizzando il metodo di osservatore?
Ho creato sotto la funzione, funziona se creiamo azione del controller ed eseguire. Ma non funziona con osservatore.
function createCoupon($customer_id, $discount,$days,$type)
{
$customer = Mage::getModel('customer/customer')->load($customer_id);
$customerGroupIds = Mage::getModel('customer/group')->getCollection()->getAllIds();
$websitesId = Mage::getModel('core/website')->getCollection()->getAllIds();
$customer_name = $customer->getName();
$couponCode = Mage::helper('core')->getRandomString(9);
$model = Mage::getModel('salesrule/rule');
$model->setName('Discount for ' . $customer_name);
$model->setDescription('Discount for ' . $customer_name);
$model->setFromDate(date('Y-m-d'));
$model->setToDate(date('Y-m-d', strtotime('+'.$days.' days')));
$model->setCouponType(2);
$model->setCouponCode($couponCode);
$model->setUsesPerCoupon(1);
$model->setUsesPerCustomer(1);
$model->setCustomerGroupIds($customerGroupIds);
$model->setIsActive(1);
$model->setConditionsSerialized('a:6:{s:4:\"type\";s:32:\"salesrule/rule_condition_combine\";s:9:\"attribute\";N;s:8:\"operator\";N;s:5:\"value\";s:1:\"1\";s:18:\"is_value_processed\";N;s:10:\"aggregator\";s:3:\"all\";}');
$model->setActionsSerialized('a:6:{s:4:\"type\";s:40:\"salesrule/rule_condition_product_combine\";s:9:\"attribute\";N;s:8:\"operator\";N;s:5:\"value\";s:1:\"1\";s:18:\"is_value_processed\";N;s:10:\"aggregator\";s:3:\"all\";}');
$model->setStopRulesProcessing(0);
$model->setIsAdvanced(1);
$model->setProductIds('');
$model->setSortOrder(1);
$model->setSimpleAction($type);//$model->setSimpleAction('by_fixed');
$model->setDiscountAmount($discount);
$model->setDiscountStep(0);
$model->setSimpleFreeShipping(0);
$model->setTimesUsed(0);
$model->setIsRss(0);
$model->setWebsiteIds($websitesId);
try {
$model->save();
} catch (Exception $e) {
Mage::log($e->getMessage());
}
}
Qualcuno può avere un'idea, perché questi succede?
Soluzione
Ho trovato la risposta di domanda di cui sopra.
evento Creato di sales_order_status_after
<events>
<sales_order_save_commit_after>
<observers>
<modulename>
<type>singleton</type>
<class>Mycompany_Offer_Model_Observer</class>
<method>sales_order_save_commit_after</method>
</modulename>
</observers>
</sales_order_save_commit_after>
</events>
Metodo Aggiunto sales_order_save_commit_after in osservatore:
<?php
class Mycompany_Offer_Model_Observer {
public function sales_order_save_commit_after(Varien_Event_Observer $observer)
{
$order = $observer->getOrder();
if($order->getState() == Mage_Sales_Model_Order::STATE_COMPLETE){
$orderTotal = $order->getBaseSubTotal();
$customerId = 0;
if($customerId = $order->getCustomerId())
{
$customer_id = $customer->getId();
}
$discountAmount = 10;
$duration = 30;
$discountIn = 'by_fixed';
Mage::getModel('offer/offer')->createCoupon($customer_id, $discountAmount, $duration, $discountIn);
}
}
}
Aggiunto sopra la funzione createCoupon nel file del modello:
class Mycompany_Offer_Model_Offer extends Mage_Core_Model_Abstract
/**
* Function to create coupon dynamically
*
* @param int $customer_id
* @param int $discount
* @param int $days
* @param text $type
* @return nothing
*/
public function createCoupon($customer_id, $discount,$days,$type)
{
$customer = Mage::getModel('customer/customer')->load($customer_id);
$customerGroupIds = Mage::getModel('customer/group')->getCollection()->getAllIds();
$websitesId = Mage::getModel('core/website')->getCollection()->getAllIds();
$customer_name = $customer->getName();
$couponCode = Mage::helper('core')->getRandomString(9);
$model = Mage::getModel('salesrule/rule');
$model->setName('Discount for ' . $customer_name);
$model->setDescription('Discount for ' . $customer_name);
$model->setFromDate(date('Y-m-d'));
$model->setToDate(date('Y-m-d', strtotime('+'.$days.' days')));
$model->setCouponType(2);
$model->setCouponCode($couponCode);
$model->setUsesPerCoupon(1);
$model->setUsesPerCustomer(1);
$model->setCustomerGroupIds($customerGroupIds);
$model->setIsActive(1);
$model->setConditionsSerialized('');
$model->setActionsSerialized('');
$model->setStopRulesProcessing(0);
$model->setIsAdvanced(1);
$model->setProductIds('');
$model->setSortOrder(1);
$model->setSimpleAction($type);//$model->setSimpleAction('by_fixed');
$model->setDiscountAmount($discount);
$model->setDiscountStep(0);
$model->setSimpleFreeShipping(0);
$model->setTimesUsed(0);
$model->setIsRss(0);
$model->setWebsiteIds($websitesId);
try {
$model->save();
return $model->getData();
} catch (Exception $e) {
print_r($e->getMessage());exit;
Mage::log($e->getMessage());
}
}
}
Mage::getModel('offer/offer')->createCoupon($customer_id, $discountAmount, $duration, $discountIn);
Come per sintassi di cui sopra, dobbiamo passare parametri come 'id del cliente', 'importo dello sconto', 'durata' (in giorni), e 'discountIn' (come 'by_percent' o 'by_fixed')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange