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: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
48: class Mage_CatalogInventory_Model_Indexer_Stock extends Mage_Index_Model_Indexer_Abstract
49: {
50: 51: 52:
53: const EVENT_MATCH_RESULT_KEY = 'cataloginventory_stock_match_result';
54:
55: 56: 57:
58: protected $_matchedEntities = array(
59: Mage_CatalogInventory_Model_Stock_Item::ENTITY => array(
60: Mage_Index_Model_Event::TYPE_SAVE
61: ),
62: Mage_Catalog_Model_Product::ENTITY => array(
63: Mage_Index_Model_Event::TYPE_SAVE,
64: Mage_Index_Model_Event::TYPE_MASS_ACTION,
65: Mage_Index_Model_Event::TYPE_DELETE
66: ),
67: Mage_Core_Model_Store::ENTITY => array(
68: Mage_Index_Model_Event::TYPE_SAVE
69: ),
70: Mage_Core_Model_Store_Group::ENTITY => array(
71: Mage_Index_Model_Event::TYPE_SAVE
72: ),
73: Mage_Core_Model_Config_Data::ENTITY => array(
74: Mage_Index_Model_Event::TYPE_SAVE
75: ),
76: Mage_Catalog_Model_Convert_Adapter_Product::ENTITY => array(
77: Mage_Index_Model_Event::TYPE_SAVE
78: )
79: );
80:
81: 82: 83: 84: 85:
86: protected $_relatedConfigSettings = array(
87: Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK,
88: Mage_CatalogInventory_Helper_Data::XML_PATH_SHOW_OUT_OF_STOCK
89: );
90:
91: 92: 93: 94:
95: protected function _construct()
96: {
97: $this->_init('cataloginventory/indexer_stock');
98: }
99:
100: 101: 102: 103: 104:
105: protected function _getResource()
106: {
107: return parent::_getResource();
108: }
109:
110: 111: 112: 113: 114:
115: public function getName()
116: {
117: return Mage::helper('cataloginventory')->__('Stock Status');
118: }
119:
120: 121: 122: 123: 124:
125: public function getDescription()
126: {
127: return Mage::helper('cataloginventory')->__('Index Product Stock Status');
128: }
129:
130: 131: 132: 133: 134: 135: 136:
137: public function matchEvent(Mage_Index_Model_Event $event)
138: {
139: $data = $event->getNewData();
140: if (isset($data[self::EVENT_MATCH_RESULT_KEY])) {
141: return $data[self::EVENT_MATCH_RESULT_KEY];
142: }
143:
144: $entity = $event->getEntity();
145: if ($entity == Mage_Core_Model_Store::ENTITY) {
146:
147: $store = $event->getDataObject();
148: if ($store && $store->isObjectNew()) {
149: $result = true;
150: } else {
151: $result = false;
152: }
153: } else if ($entity == Mage_Core_Model_Store_Group::ENTITY) {
154:
155: $storeGroup = $event->getDataObject();
156: if ($storeGroup && $storeGroup->dataHasChangedFor('website_id')) {
157: $result = true;
158: } else {
159: $result = false;
160: }
161: } else if ($entity == Mage_Core_Model_Config_Data::ENTITY) {
162: $configData = $event->getDataObject();
163: if ($configData && in_array($configData->getPath(), $this->_relatedConfigSettings)) {
164: $result = $configData->isValueChanged();
165: } else {
166: $result = false;
167: }
168: } else {
169: $result = parent::matchEvent($event);
170: }
171:
172: $event->addNewData(self::EVENT_MATCH_RESULT_KEY, $result);
173:
174: return $result;
175: }
176:
177: 178: 179: 180: 181:
182: protected function _registerEvent(Mage_Index_Model_Event $event)
183: {
184: $event->addNewData(self::EVENT_MATCH_RESULT_KEY, true);
185: switch ($event->getEntity()) {
186: case Mage_CatalogInventory_Model_Stock_Item::ENTITY:
187: $this->_registerCatalogInventoryStockItemEvent($event);
188: break;
189:
190: case Mage_Catalog_Model_Product::ENTITY:
191: $this->_registerCatalogProductEvent($event);
192: break;
193:
194: case Mage_Catalog_Model_Convert_Adapter_Product::ENTITY:
195: $event->addNewData('cataloginventory_stock_reindex_all', true);
196: break;
197:
198: case Mage_Core_Model_Store::ENTITY:
199: case Mage_Core_Model_Store_Group::ENTITY:
200: case Mage_Core_Model_Config_Data::ENTITY:
201: $event->addNewData('cataloginventory_stock_skip_call_event_handler', true);
202: $process = $event->getProcess();
203: $process->changeStatus(Mage_Index_Model_Process::STATUS_REQUIRE_REINDEX);
204:
205: if ($event->getEntity() == Mage_Core_Model_Config_Data::ENTITY) {
206: $configData = $event->getDataObject();
207: if ($configData->getPath() == Mage_CatalogInventory_Helper_Data::XML_PATH_SHOW_OUT_OF_STOCK) {
208: Mage::getSingleton('index/indexer')->getProcessByCode('catalog_product_price')
209: ->changeStatus(Mage_Index_Model_Process::STATUS_REQUIRE_REINDEX);
210: Mage::getSingleton('index/indexer')->getProcessByCode('catalog_product_attribute')
211: ->changeStatus(Mage_Index_Model_Process::STATUS_REQUIRE_REINDEX);
212: }
213: }
214: break;
215: }
216: }
217:
218: 219: 220: 221: 222:
223: protected function _registerCatalogProductEvent(Mage_Index_Model_Event $event)
224: {
225: switch ($event->getType()) {
226: case Mage_Index_Model_Event::TYPE_SAVE:
227: $product = $event->getDataObject();
228: if ($product && $product->getStockData()) {
229: $product->setForceReindexRequired(true);
230: }
231: break;
232: case Mage_Index_Model_Event::TYPE_MASS_ACTION:
233: $this->_registerCatalogProductMassActionEvent($event);
234: break;
235:
236: case Mage_Index_Model_Event::TYPE_DELETE:
237: $this->_registerCatalogProductDeleteEvent($event);
238: break;
239: }
240: }
241:
242: 243: 244: 245: 246:
247: protected function _registerCatalogInventoryStockItemEvent(Mage_Index_Model_Event $event)
248: {
249: switch ($event->getType()) {
250: case Mage_Index_Model_Event::TYPE_SAVE:
251: $this->_registerStockItemSaveEvent($event);
252: break;
253: }
254: }
255:
256: 257: 258: 259: 260: 261:
262: protected function _registerStockItemSaveEvent(Mage_Index_Model_Event $event)
263: {
264:
265: $object = $event->getDataObject();
266:
267: $event->addNewData('reindex_stock', 1);
268: $event->addNewData('product_id', $object->getProductId());
269:
270:
271:
272: if (!Mage::helper('cataloginventory')->isShowOutOfStock() && !$object->getProduct()) {
273: $massObject = new Varien_Object();
274: $massObject->setAttributesData(array('force_reindex_required' => 1));
275: $massObject->setProductIds(array($object->getProductId()));
276: Mage::getSingleton('index/indexer')->logEvent(
277: $massObject, Mage_Catalog_Model_Product::ENTITY, Mage_Index_Model_Event::TYPE_MASS_ACTION
278: );
279: }
280:
281: return $this;
282: }
283:
284: 285: 286: 287: 288: 289:
290: protected function _registerCatalogProductDeleteEvent(Mage_Index_Model_Event $event)
291: {
292:
293: $product = $event->getDataObject();
294:
295: $parentIds = $this->_getResource()->getProductParentsByChild($product->getId());
296: if ($parentIds) {
297: $event->addNewData('reindex_stock_parent_ids', $parentIds);
298: }
299:
300: return $this;
301: }
302:
303: 304: 305: 306: 307: 308:
309: protected function _registerCatalogProductMassActionEvent(Mage_Index_Model_Event $event)
310: {
311:
312: $actionObject = $event->getDataObject();
313: $attributes = array(
314: 'status'
315: );
316: $reindexStock = false;
317:
318:
319: $attrData = $actionObject->getAttributesData();
320: if (is_array($attrData)) {
321: foreach ($attributes as $attributeCode) {
322: if (array_key_exists($attributeCode, $attrData)) {
323: $reindexStock = true;
324: break;
325: }
326: }
327: }
328:
329:
330: if ($actionObject->getWebsiteIds()) {
331: $reindexStock = true;
332: }
333:
334:
335: if ($reindexStock) {
336: $event->addNewData('reindex_stock_product_ids', $actionObject->getProductIds());
337: }
338:
339: return $this;
340: }
341:
342: 343: 344: 345: 346:
347: protected function _processEvent(Mage_Index_Model_Event $event)
348: {
349: $data = $event->getNewData();
350: if (!empty($data['cataloginventory_stock_reindex_all'])) {
351: $this->reindexAll();
352: }
353: if (empty($data['cataloginventory_stock_skip_call_event_handler'])) {
354: $this->callEventHandler($event);
355: }
356: }
357: }
358: