You should use following way to get product's categories in observer.
Declare event observers in config.xml
<events>
<checkout_cart_product_add_after>
<observers>
<custommodule>
<class>custommodule/observer</class>
<method>cartProductAddAfter</method>
</custommodule>
</observers>
</checkout_cart_product_add_after>
<checkout_cart_product_update_after>
<observers>
<custommodule>
<class>custommodule/observer</class>
<method>cartProductUpdateAfter</method>
</custommodule>
</observers>
</checkout_cart_product_update_after>
</events>
Develop the Observers handlers
class Vendor_Custommodule_Model_Observer
{
/* If you'd like to do the same while updating the shopping cart*/
public function cartProductUpdateAfter($observer)
{
$this->cartProductAddAfter($observer);
}
public function cartProductAddAfter($observer)
{
$product_id = $observer->getEvent()->getProduct()->getId();
//Get the category ids
$product = Mage::getModel('catalog/product')->load($product_id);
$cats = $product->getCategoryIds();
//One product can associate with more then one categories.
foreach ($cats as $category_id) {
$_cat = Mage::getModel('catalog/category')->setStoreId(Mage::app()->getStore()->getId())->load($category_id);
echo $_cat->getName();
}
}
}
Another way
public function cartProductAddAfter($observer)
{
$_product = $observer->getEvent()->getProduct();
$catIds = $_product->getCategoryIds();
$catCollection = Mage::getResourceModel('catalog/category_collection')
->addAttributeToSelect('*')
->addAttributeToFilter('entity_id', $catIds)
->addIsActiveFilter();
foreach($catCollection as $cat){
print_r($cat->getData());
//echo $cat->getName();
//echo $cat->getUrl();
}
}
Mage::registry('current_category')
is only available oncatalog_category_view