Создайте наблюдатель для controller_action_layout_generate_blocks_after, метод должен выглядеть примерно так:
Примечание: это основная идея, сложная часть заключается в разборе правила, возможно, его гораздо проще добавить в описание правилачто-то вроде: productSku: 123;productSku: 345 и проанализировать описание правила, чтобы увидеть, соответствует ли один из продуктов корзины правилу или нет.
public function addPromotionBlock($observer)
{
$action = $observer->getEvent()->getAction();
$layout = $observer->getEvent()->getLayout();
if($action->getRequest()->getControllerName() == 'cart' && $action->getRequest()->getActionName() == 'index') {
$addPromotion = false;
$quote = Mage::getSingleton('checkout/cart')->getQuote();
$items = Mage::getSingleton('checkout/cart')->getQuote()->getAllItems();
$rules = Mage::getResourceModel('salesrule/rule_collection')
->setValidationFilter(
Mage::app()->getStore($quote->getStoreId())->getWebsiteId(),
$quote->getCustomerGroupId(),
$quote->getCouponCode())
->load();
// see Mage_SalesRule_Model_Validator
foreach ($items as $item) {
//check if the rules applies
foreach ($rules as $rule) {
var_dump($rule->toArray());
}
//let's say we found a valid rule
$addPromotion = true;
}
if ($addPromotion) {
$crosssell = $layout->getBlock('checkout.cart.crosssell');
if ($crosssell) {
//set your template here
$crosssell->setTemplate('checkout/promotion.phtml');
}
}
}
}