1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
26:
27:
28: 29: 30: 31: 32:
33: class Mage_CatalogIndex_Model_Observer extends Mage_Core_Model_Abstract
34: {
35: protected $_parentProductIds = array();
36: protected $_productIdsMassupdate = array();
37:
38: protected function _construct() {}
39:
40: 41: 42: 43: 44:
45: protected function _getIndexer()
46: {
47: return Mage::getSingleton('catalogindex/indexer');
48: }
49:
50: 51: 52: 53: 54:
55: protected function _getAggregator()
56: {
57: return Mage::getSingleton('catalogindex/aggregation');
58: }
59:
60: 61: 62: 63: 64:
65: public function reindexAll()
66: {
67: $this->_getIndexer()->plainReindex();
68: $this->_getAggregator()->clearCacheData();
69: return $this;
70: }
71:
72: 73: 74: 75: 76:
77: public function reindexDaily()
78: {
79: $this->_getIndexer()->plainReindex(
80: null,
81: Mage_CatalogIndex_Model_Indexer::REINDEX_TYPE_PRICE
82: );
83: $this->clearPriceAggregation();
84: return $this;
85: }
86:
87: 88: 89: 90: 91: 92:
93: public function processAfterSaveEvent(Varien_Event_Observer $observer)
94: {
95: $productIds = array();
96: $eventProduct = $observer->getEvent()->getProduct();
97: $productIds[] = $eventProduct->getId();
98:
99: if (!$eventProduct->getIsMassupdate()) {
100: $this->_getIndexer()->plainReindex($eventProduct);
101: } else {
102: $this->_productIdsMassupdate[] = $eventProduct->getId();
103: }
104:
105: $eventProduct->loadParentProductIds();
106: $parentProductIds = $eventProduct->getParentProductIds();
107: if ($parentProductIds && !$eventProduct->getIsMassupdate()) {
108: $this->_getIndexer()->plainReindex($parentProductIds);
109: } elseif ($parentProductIds) {
110: $this->_productIdsMassupdate = array_merge($this->_productIdsMassupdate, $parentProductIds);
111: $productIds = array_merge($productIds, $parentProductIds);
112: }
113: $this->_getAggregator()->clearProductData($productIds);
114: return $this;
115: }
116:
117: 118: 119: 120: 121: 122:
123: public function processPriceScopeChange(Varien_Event_Observer $observer)
124: {
125: $configOption = $observer->getEvent()->getOption();
126: if ($configOption->isValueChanged()) {
127: $this->_getIndexer()->plainReindex(
128: null,
129: Mage_CatalogIndex_Model_Indexer::REINDEX_TYPE_PRICE
130: );
131: $this->clearPriceAggregation();
132: }
133: return $this;
134: }
135:
136: 137: 138: 139: 140: 141:
142: public function processPriceRuleApplication(Varien_Event_Observer $observer)
143: {
144: $eventProduct = $observer->getEvent()->getProduct();
145: $productCondition = $observer->getEvent()->getProductCondition();
146: if ($productCondition) {
147: $eventProduct = $productCondition;
148: }
149: $this->_getIndexer()->plainReindex(
150: $eventProduct,
151: Mage_CatalogIndex_Model_Indexer::REINDEX_TYPE_PRICE
152: );
153:
154: $this->clearPriceAggregation();
155: return $this;
156: }
157:
158: 159: 160: 161: 162: 163:
164: public function processAfterDeleteEvent(Varien_Event_Observer $observer)
165: {
166: $eventProduct = $observer->getEvent()->getProduct();
167: $eventProduct->setNeedStoreForReindex(true);
168: $this->_getIndexer()->cleanup($eventProduct);
169: $parentProductIds = $eventProduct->getParentProductIds();
170:
171: if ($parentProductIds) {
172: $this->_getIndexer()->plainReindex($parentProductIds);
173: }
174: return $this;
175: }
176:
177: 178: 179: 180: 181: 182:
183: public function processAttributeChangeEvent(Varien_Event_Observer $observer)
184: {
185: 186: 187:
188: $attribute = $observer->getEvent()->getAttribute();
189: $tags = array(
190: Mage_Eav_Model_Entity_Attribute::CACHE_TAG.':'.$attribute->getId()
191: );
192:
193: if ($attribute->getOrigData('is_filterable') != $attribute->getIsFilterable()) {
194: if ($attribute->getIsFilterable() != 0) {
195: $this->_getIndexer()->plainReindex(null, $attribute);
196: } else {
197: $this->_getAggregator()->clearCacheData($tags);
198: }
199: } elseif ($attribute->getIsFilterable()) {
200: $this->_getAggregator()->clearCacheData($tags);
201: }
202:
203: return $this;
204: }
205:
206: 207: 208: 209: 210: 211:
212: public function processStoreAdd(Varien_Event_Observer $observer)
213: {
214: $store = $observer->getEvent()->getStore();
215: $this->_getIndexer()->plainReindex(null, null, $store);
216: return $this;
217: }
218:
219: 220: 221: 222: 223: 224:
225: public function catalogProductImportAfter(Varien_Event_Observer $observer)
226: {
227: $this->_getIndexer()->plainReindex();
228: $this->_getAggregator()->clearCacheData();
229: return $this;
230: }
231:
232: 233: 234: 235: 236:
237: public function runQueuedIndexing()
238: {
239: $flag = Mage::getModel('catalogindex/catalog_index_flag')->loadSelf();
240: if ($flag->getState() == Mage_CatalogIndex_Model_Catalog_Index_Flag::STATE_QUEUED) {
241: $this->_getIndexer()->plainReindex();
242: $this->_getAggregator()->clearCacheData();
243: }
244: return $this;
245: }
246:
247: 248: 249: 250: 251: 252:
253: public function cleanCache(Varien_Event_Observer $observer)
254: {
255: $tagsArray = $observer->getEvent()->getTags();
256: $tagName = Mage_CatalogIndex_Model_Aggregation::CACHE_FLAG_NAME;
257:
258: if (empty($tagsArray) || in_array($tagName, $tagsArray)) {
259: $this->_getAggregator()->clearCacheData();
260: }
261: return $this;
262: }
263:
264: 265: 266: 267: 268: 269:
270: public function catalogCategorySaveAfter(Varien_Event_Observer $observer)
271: {
272: $category = $observer->getEvent()->getCategory();
273: if ($category->getInitialSetupFlag()) {
274: return $this;
275: }
276: $tags = array(
277: Mage_Catalog_Model_Category::CACHE_TAG.':'.$category->getPath()
278: );
279: $this->_getAggregator()->clearCacheData($tags);
280: return $this;
281: }
282:
283: 284: 285: 286: 287:
288: public function clearPriceAggregation()
289: {
290: $this->_getAggregator()->clearCacheData(array(
291: Mage_Catalog_Model_Product_Type_Price::CACHE_TAG
292: ));
293: return $this;
294: }
295:
296: 297: 298: 299: 300:
301: public function clearSearchLayerCache()
302: {
303: $this->_getAggregator()->clearCacheData(array(
304: Mage_CatalogSearch_Model_Query::CACHE_TAG
305: ));
306: return $this;
307: }
308:
309: 310: 311: 312: 313: 314:
315: public function registerParentIds(Varien_Event_Observer $observer)
316: {
317: $product = $observer->getEvent()->getProduct();
318: $product->loadParentProductIds();
319: $productIds = array($product->getId());
320: $productIds = array_merge($productIds, $product->getParentProductIds());
321: $this->_getAggregator()->clearProductData($productIds);
322: return $this;
323: }
324:
325: 326: 327: 328: 329: 330:
331: public function processProductsWebsitesChange(Varien_Event_Observer $observer)
332: {
333: $productIds = $observer->getEvent()->getProducts();
334: $this->_getIndexer()->plainReindex($productIds);
335: $this->_getAggregator()->clearProductData($productIds);
336: return $this;
337: }
338:
339: 340: 341: 342: 343: 344:
345: public function catalogProductFlatPrepareColumns(Varien_Event_Observer $observer)
346: {
347: $columns = $observer->getEvent()->getColumns();
348:
349: $this->_getIndexer()->prepareCatalogProductFlatColumns($columns);
350:
351: return $this;
352: }
353:
354: 355: 356: 357: 358: 359:
360: public function catalogProductFlatPrepareIndexes(Varien_Event_Observer $observer)
361: {
362: $indexes = $observer->getEvent()->getIndexes();
363:
364: $this->_getIndexer()->prepareCatalogProductFlatIndexes($indexes);
365:
366: return $this;
367: }
368:
369: 370: 371: 372: 373: 374:
375: public function catalogProductFlatRebuild(Varien_Event_Observer $observer)
376: {
377: $storeId = $observer->getEvent()->getStoreId();
378: $tableName = $observer->getEvent()->getTable();
379:
380: $this->_getIndexer()->updateCatalogProductFlat($storeId, null, $tableName);
381:
382: return $this;
383: }
384:
385: 386: 387: 388: 389: 390:
391: public function catalogProductFlatUpdateProduct(Varien_Event_Observer $observer)
392: {
393: $storeId = $observer->getEvent()->getStoreId();
394: $tableName = $observer->getEvent()->getTable();
395: $productIds = $observer->getEvent()->getProductIds();
396:
397: $this->_getIndexer()->updateCatalogProductFlat($storeId, $productIds, $tableName);
398:
399: return $this;
400: }
401: }
402: