protected function _requireVisitorWithTwoProducts() { $visitor = new Mage_Log_Model_Visitor(); $visitor->setSessionId(md5(time()) . md5(microtime()))->setLastVisitAt(now())->save(); $item = new Mage_Catalog_Model_Product_Compare_Item(); $item->setVisitorId($visitor->getId())->setProductId(1)->save(); $item = new Mage_Catalog_Model_Product_Compare_Item(); $item->setVisitorId($visitor->getId())->setProductId(2)->save(); Mage::getSingleton('Mage_Log_Model_Visitor')->load($visitor->getId()); $this->_assertCompareListEquals(array(1, 2)); }
/** * Load object by product * * @param Mage_Core_Model_Abstract $object * @param mixed $product * @return bool */ public function loadByProduct(Mage_Catalog_Model_Product_Compare_Item $object, $product) { $read = $this->_getReadAdapter(); if ($product instanceof Mage_Catalog_Model_Product) { $productId = $product->getId(); } else { $productId = (int) $product; } $select = $read->select()->from($this->getMainTable())->where('product_id=?', $productId)->where('visitor_id=?', $object->getVisitorId()); if ($object->getCustomerId()) { $select->where('customer_id=?', $object->getCustomerId()); } $data = $read->fetchRow($select); if (!$data) { return false; } $object->setData($data); $this->_afterLoad($object); return true; }
/** * Update (Merge) customer data from visitor * * After Login process * * @param Mage_Catalog_Model_Product_Compare_Item $object * @return Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Compare_Item */ public function updateCustomerFromVisitor($object) { if (!$object->getCustomerId()) { return $this; } // collect visitor compared items $select = $this->_getWriteAdapter()->select()->from($this->getMainTable())->where('visitor_id=?', $object->getVisitorId()); $visitor = $this->_getWriteAdapter()->fetchAll($select); // collect customer compared items $select = $this->_getWriteAdapter()->select()->from($this->getMainTable())->where('customer_id=?', $object->getCustomerId())->where('visitor_id<>?', $object->getVisitorId()); $customer = $this->_getWriteAdapter()->fetchAll($select); $products = array(); $delete = array(); $update = array(); foreach ($visitor as $row) { $products[$row['product_id']] = array('store_id' => $row['store_id'], 'customer_id' => $object->getCustomerId(), 'visitor_id' => $object->getVisitorId(), 'product_id' => $row['product_id']); $update[$row[$this->getIdFieldName()]] = $row['product_id']; } foreach ($customer as $row) { if (isset($products[$row['product_id']])) { $delete[] = $row[$this->getIdFieldName()]; } else { $products[$row['product_id']] = array('store_id' => $row['store_id'], 'customer_id' => $object->getCustomerId(), 'visitor_id' => $object->getVisitorId(), 'product_id' => $row['product_id']); } } if ($delete) { $this->_getWriteAdapter()->delete($this->getMainTable(), $this->_getWriteAdapter()->quoteInto($this->getIdFieldName() . ' IN(?)', $delete)); } if ($update) { foreach ($update as $itemId => $productId) { $bind = $products[$productId]; $this->_getWriteAdapter()->update($this->getMainTable(), $bind, $this->_getWriteAdapter()->quoteInto($this->getIdFieldName() . '=?', $itemId)); } } return $this; }
/** * Add visitor and customer data to compare item * * @param Mage_Catalog_Model_Product_Compare_Item $item * @return Mage_Catalog_Model_Product_Compare_List */ protected function _addVisitorToItem($item) { $item->addVisitorId(Mage::getSingleton('log/visitor')->getId()); if (Mage::getSingleton('customer/session')->isLoggedIn()) { $item->addCustomerData(Mage::getSingleton('customer/session')->getCustomer()); } return $this; }
/** * Add visitor and customer data to compare item * * @param Mage_Catalog_Model_Product_Compare_Item $item * @return Mage_Catalog_Model_Product_Compare_List */ protected function _addVisitorToItem($item) { $item->addVisitorId(Mage::getSingleton('Mage_Log_Model_Visitor')->getId()); if (Mage::getSingleton('Mage_Customer_Model_Session')->isLoggedIn()) { $item->addCustomerData(Mage::getSingleton('Mage_Customer_Model_Session')->getCustomer()); } return $this; }