If you are unable to save the products into a "special" category as @Julien suggested, you could set a different attribute set specifically for the products, or, if you can do neither of those, I would suggest setting a product attribute. Any way you do it, you'll still have to query the DB for these products, then grab your Cart and see if any items are in it.
So, let's create a product attribute, and call it "featured". Make a new attribute, as a Yes/No and assign it to the appropriate attribute set. Flag those 4 products as such.
Next, you need something along the lines of:
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addFieldToFilter(array(array('attribute'=>'featured','eq'=>'1'));
$exemptProducts = array();
$exemptProductFound = false;
foreach ($collection as $product) {
$exemptProducts[] = $product->getId();
}
// now let's check if any are in the basket
$cart = new Mage_Checkout_Model_Cart();
$cart->init();
foreach ($cart->getItems() as $item) {
if(in_array($item->getProductId(), $exemptProducts)) {
// to make it simple, just set a flag
$exemptProductFound = true;
}
}
This could be in-line in your template, or in a function that you make available to your template (cleaner).
The closest events I could find that would work that are lower than the dispatch event are
catalog_product_type_prepare_full_options
catalog_product_type_prepare_lite_options
You can have an event listener on one of those events that does your logic check and throws an exception if it fails.
That being said, Magento itself actually uses the following event
checkout_cart_product_add_after
Then, in the listener is uses code like this
$quoteItem = $observer->getEvent()->getQuoteItem();
$product = $observer->getEvent()->getProduct();
// Your checks here, return if you want to leave things alone
$quoteItem->getQuote()->removeItem($quoteItem->getId());
Mage::throwException('This is the message to the customer');
Best Answer
You can use
checkout_cart_product_add_after
event to allow or disallow products being added ...Edit: allow multiple "pre-order" products in cart
If your are curious why using
checkout_cart_product_add_after
and remove item from cart later$quote->getQuote()->removeItem($quote->getId())
... it is just because there is nocheckout_cart_product_add_before
event dispatched inMage_Checkout_Model_Cart::addProduct()
:(