SlideShare une entreprise Scribd logo
1  sur  38
Индексация в Magento Виктор Тихончук Magento System Architect
Модуль Mage_Index События Индексатор Индекс Процесс
Событие Mage_Index_Model_Event Событие – то, что происходит в некоторый момент времени и рассматривается как изменение состояния сущности. Событие хранит информацию о сущности, с которой произошло действие и тип действия. Типы изменений сущности (event type) Сохранение (SAVE) Удаление (DELETE) Групповая обработка (MASS_ACTION)
Обработчик Mage_Index_Model_Indexer processEntityAction($entity, $entityType, $eventType) logEvent($entity, $entityType, $eventType) registerEvent(Mage_Index_Model_Event $event) indexEvent(Mage_Index_Model_Event $event) indexEvents($entity = null, $type = null)
Изменения в абстрактной модели Процесс сохранения _getResource()->beginTransaction() _beforeSave() _getResource()->save() _afterSave() _getResource()->commit() afterCommitCallback() Новые события model_save_commit_after {eventPrefix}_save_commit_after
Изменения в абстрактной модели Процесс удаления _getResource()->beginTransaction() _beforeDelete() _getResource()->delete() _afterDelete() _getResource()->commit() _afterDeleteCommit() Новые события model_delete_commit_after {eventPrefix}_delete_commit_after
Сущности catalog/product (SAVE, DELETE, MASS_ACTION) catalog/category (SAVE, DELETE) catalog/resource_eav_attribute (SAVE, DELETE) customer/group (SAVE) cataloginventory/stock_item (SAVE) tag/tag (SAVE) core/store (SAVE, DELETE) core/store_group (SAVE, DELETE) core/website (SAVE, DELETE)
Процессы и индексаторы Индексатор может работать в 2х режимах: в режиме реального времени (MODE_REAL_TIME) в ручном режиме (MODE_MANUAL) У каждого индексатора есть текущий статус: работает (STATUS_RUNNING) режим ожидания (STATUS_PENDING) необходимо перестроить (STATUS_REQUIRE_REINDEX) Событие REQUIRE_REINDEX MODE MANUAL New Indexer
Процесс Mage_Index_Model_Process matchEvent(Mage_Index_Model_Event $event) register(Mage_Index_Model_Event $event) processEvent(Mage_Index_Model_Event $event) reindexAll() reindexEverything() indexEvents() changeStatus($status) getIndexer()
CatalogInventory Stock Status Цель      оптимизировать затраты на подсчет возможности покупки товара при отображении товаров в каталоге, поиске и т.д. Мотивация      для простых (simple) товаров - динамически определить доступность не является трудозатратной операцией, чего не скажешь о составных (composite), для которых нужно учитывать статус всех его составляющих Задача      сделать предварительно подсчитанный статус для каждого товара с учетом склада и веб сайта
Шаг 1: Структура данных индекса
Шаг 2: Создаем индексатор Mage_CatalogInventory_Model_Indexer_Stock
Шаг 2: Создаем индексатор Mage_Index_Model_Indexer_Abstract Mage_CatalogInventory_Model_Indexer_Stock
Шаг 2: Создаем индексатор Mage_Core_Model_Abstract Mage_Index_Model_Indexer_Abstract Mage_CatalogInventory_Model_Indexer_Stock
Шаг 2: Создаем индексатор Mage_Core_Model_Mysql4_Abstract Mage_Index_Model_Mysql4_Indexer_Abstract Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Indexer_Abstract Mage_CatalogInventory_Model_Mysql4_Indexer_Stock
Шаг 2: Создаем индексатор Абстрактные методы индексатора getName() getDescription() _registerEvent() _processEvent()
Шаг 3: События protected$_matchedEntities = array(     Mage_CatalogInventory_Model_Stock_Item::ENTITY => array(         Mage_Index_Model_Event::TYPE_SAVE     ),     Mage_Catalog_Model_Product::ENTITY => array(         Mage_Index_Model_Event::TYPE_SAVE,         Mage_Index_Model_Event::TYPE_MASS_ACTION,         Mage_Index_Model_Event::TYPE_DELETE     ),     Mage_Core_Model_Store::ENTITY => array(         Mage_Index_Model_Event::TYPE_SAVE     ),     Mage_Core_Model_Store_Group::ENTITY => array(         Mage_Index_Model_Event::TYPE_SAVE     ),     Mage_Core_Model_Config_Data::ENTITY => array(         Mage_Index_Model_Event::TYPE_SAVE     ),     Mage_Catalog_Model_Convert_Adapter_Product::ENTITY => array(         Mage_Index_Model_Event::TYPE_SAVE     ) );
Шаг 4: Изменение конфигурации protected$_relatedConfigSettings = array(    Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK,    Mage_CatalogInventory_Helper_Data::XML_PATH_SHOW_OUT_OF_STOCK); public functionmatchEvent(Mage_Index_Model_Event$event) { // check saved result in $event and return it     if ($entity == Mage_Core_Model_Config_Data::ENTITY) { $configData= $event->getDataObject(); $path = $configData->getPath(); if (in_array($path, $this->_relatedConfigSettings)) { $result = $configData->isValueChanged();         } else { $result = false;         }    } else { $result = parent::matchEvent($event);    }// save result in $event and return it }
Шаг 5: Регистрация события protected function _registerEvent(Mage_Index_Model_Event$event) {     switch ($event->getEntity()) {         caseMage_Catalog_Model_Product::ENTITY:             $this->_registerCatalogProductEvent($event);             break;         // skip some cases         caseMage_Core_Model_Store::ENTITY:         caseMage_Core_Model_Config_Data::ENTITY: $reindex = Mage_Index_Model_Process::STATUS_REQUIRE_REINDEX;             $event->addNewData('skip_call_event_handler', true);             $process = $event->getProcess();             $process->changeStatus($reindex);               if ($event->getEntity() == Mage_Core_Model_Config_Data::ENTITY) {                 $configData = $event->getDataObject(); $indexer = Mage::getSingleton('index/indexer');                 if ($configData->getPath() == XML_PATH_SHOW_OUT_OF_STOCK) {                     $index->getProcessByCode('catalog_product_price')                         ->changeStatus($reindex);                     $indexer->getProcessByCode('catalog_product_attribute')                         ->changeStatus($reindex);                 }             }             break;     } }
Шаг 5: Регистрация события protected function _registerCatalogProductDeleteEvent (Mage_Index_Model_Event$event) {     /**@var $product Mage_Catalog_Model_Product */     $product = $event->getDataObject();       $parentIds = $this->_getResource() ->getProductParentsByChild($product->getId());     if ($parentIds) {         $event->addNewData('reindex_stock_parent_ids', $parentIds);     }       return$this; }
Шаг 6: Обработка события protected function _processEvent(Mage_Index_Model_Event$event) { $data = $event->getNewData(); if (!empty($data['cataloginventory_stock_reindex_all'])) { $this->reindexAll();     } if (empty($data['skip_call_event_handler'])) { $this->callEventHandler($event);     } }
Шаг 7: Ресурс модель Resource Model Type Indexer Interface Type Indexer Default Type Indexer Configurable
Шаг 7: Ресурс модель protected function _getTypeIndexers()     { if (is_null($this->_indexers)) { $this->_indexers = array(); $types = Mage::getSingleton('catalog/product_type')                 ->getTypesByPriority(); foreach ($typesas$typeId => $typeInfo) { if (isset($typeInfo['stock_indexer'])) { $modelName = $typeInfo['stock_indexer'];                 } else { $modelName = $this->_defaultIndexer;                 } $isComposite = !empty($typeInfo['composite']); $indexer = Mage::getResourceModel($modelName)                     ->setTypeId($typeId)                     ->setIsComposite($isComposite); $this->_indexers[$typeId] = $indexer;             }         } return$this->_indexers;     }
Шаг 7: Ресурс модель public functionreindexAll()     { $this->useIdxTable(true); $this->clearTemporaryIndexTable(); foreach ($this->_getTypeIndexers() as$indexer) { $indexer->reindexAll();         } $this->syncData(); return$this;     }
Шаг 7: Ресурс модель public functioncatalogProductDelete(Mage_Index_Model_Event$event)     { $data = $event->getNewData(); if (empty($data['reindex_stock_parent_ids'])) { return$this;         } $adapter = $this->_getWriteAdapter(); $parentIds  = array(); foreach ($data['reindex_stock_parent_ids'] as$parentId => $parentType) { $parentIds[$parentType][$parentId] = $parentId;         } $adapter->beginTransaction(); try { foreach ($parentIdsas$parentType => $entityIds) { $this->_getIndexer($parentType)->reindexEntity($entityIds);             }         } catch (Exception $e) { $adapter->rollback(); throw$e;         } $adapter->commit(); return$this;     }
Шаг 8: Ресурс модели (TYPE Default) public functionsetTypeId($typeId)     { $this->_typeId = $typeId; return $this;     } public function getTypeId()     { if (is_null($this->_typeId)) {             Mage::throwException(Mage::helper('cataloginventory') ->__('Undefined product type.'));         } return$this->_typeId;     } public function reindexAll()     { $this->useIdxTable(true); $this->_prepareIndexTable(); return$this;     } public function reindexEntity($entityIds)     { $this->_updateIndex($entityIds); return$this;     }
Шаг 9: Декларация индексатора <config> <!-- ... --> <global> <!-- ... --> <index>             <indexer> <cataloginventory_stock>                     <model>cataloginventory/indexer_stock</model>                 </cataloginventory_stock>                 <catalog_product_attribute>                     <depends>                         <cataloginventory_stock />                     </depends>                 </catalog_product_attribute>                 <catalog_product_price>                     <depends>                         <cataloginventory_stock />                     </depends>                 </catalog_product_price>             </indexer>         </index>     </global> </config>
Индекс цен для B2B Цель      Создать новый тип товара B2B Справка      В2В – сокращение от английских слов «businesstobusiness», в буквальном переводе – бизнес для бизнеса. Это сектор рынка, который работает не на конечного, рядового потребителя, а на такие же компании, то есть на другой бизнес. Задача      Новый тип товара, который наследует поведение простого товара (simple), но имеет возможность указать цену для каждой группы пользователей (customer group)
Индекс цен для B2B Знакомство с интерфейсом Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Indexer_Price_Interface public functionreindexAll(); public functionreindexEntity($entityIds); public functionregisterEvent(Mage_Index_Model_Event$event); Создаем свой индексатор class Mageconf_B2b_Model_Mysql4_Indexer_Price    extends Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Indexer_Price_Default { }
Индекс цен для B2B Знакомство с …Indexer_Price_Default public functionreindexAll() { $this->useIdxTable(true); $this->_prepareFinalPriceData(); $this->_applyCustomOption(); $this->_movePriceDataToIndexTable(); return$this; } public functionreindexEntity($entityIds) { $this->_prepareFinalPriceData($entityIds); $this->_applyCustomOption(); $this->_movePriceDataToIndexTable(); return$this; }
Индекс цен для B2B protected function _getDefaultFinalPriceTable() { if($this->useIdxTable()) { return$this->getTable('catalog/product_price_indexer_final_idx'); } return$this->getTable('catalog/product_price_indexer_final_tmp'); }
Индекс цен для B2B
Индекс цен для B2B protected function _prepareFinalPriceData($entityIds = null) {    // удаляем данные из таблицы, если они есть $this->_prepareDefaultFinalPriceTable(); $write  = $this->_getWriteAdapter(); $select = $write->select()         ->from(array('e' => $this->getTable('catalog/product')), array('entity_id'))         ->joinCross( array('cg' => $this->getTable('customer/customer_group')), array('customer_group_id')) ->joinCross( array('cw' => $this->getTable('core/website')), array('website_id'))         ->join( array('cwd' => $this->_getWebsiteDateTable()), 'cw.website_id = cwd.website_id', array())         ->join( array('csg' => $this->getTable('core/store_group')), 'csg.website_id = cw.website_id AND cw.default_group_id = csg.group_id', array())         ->join( array('cs' => $this->getTable('core/store')), 'csg.default_store_id = cs.store_id AND cs.store_id != 0', array());// next slide
Индекс цен для B2B // protected function _prepareFinalPriceData($entityIds = null)     $select        ->join( array('pw' => $this->getTable('catalog/product_website')), 'pw.product_id = e.entity_id AND pw.website_id = cw.website_id', array()) ->joinLeft( array('tp' => $this->_getTierPriceIndexTable()), 'tp.entity_id = e.entity_id AND tp.website_id = cw.website_id' . ' AND tp.customer_group_id = cg.customer_group_id', array())        ->join( array('b2d' => $this->getTable('b2b/price')), 'b2d.entity_id = e.entity_id AND b2d.customer IS NULL AND website_id=0'array()) ->join( array('b2w'=> $this->getTable('b2b/price')), 'b2w.entity_id = e.entity_id AND b2w.customer = cg.customer_group_id'                 . ' AND b2w.website_id = cw.website_id', array())         ->where('e.type_id=?', $this->getTypeId()); $statusCond = $write->quoteInto('=?', Mage_Catalog_Model_Product_Status::STATUS_ENABLED); $this->_addAttributeToSelect($select, 'status', 'e.entity_id', 'cs.store_id',  $statusCond, true);
Индекс цен для B2B // protected function _prepareFinalPriceData($entityIds = null) $taxClassId = $this->_addAttributeToSelect($select, 'tax_class_id', 'e.entity_id', 'cs.store_id'); $select->columns(array('tax_class_id' => $taxClassId)); $finalPrice= newZend_Db_Expr('IFNULL(b2w.price, b2d.price)');     $select->columns(array( 'orig_price'    => $price, 'price'         => $finalPrice, 'min_price'     => $finalPrice, 'max_price'     => $finalPrice, 'tier_price'    => newZend_Db_Expr('NULL'), 'base_tier'     => newZend_Db_Expr('NULL'), )); if(!is_null($entityIds)) { $select->where('e.entity_id IN(?)', $entityIds);     }
Индекс цен для B2B // protected function _prepareFinalPriceData($entityIds = null) Mage::dispatchEvent('prepare_catalog_product_index_select', array( 'select'        => $select, 'entity_field'  => newZend_Db_Expr('e.entity_id'), 'website_field' => newZend_Db_Expr('cw.website_id'), 'store_field'   => newZend_Db_Expr('cs.store_id') )); $query = $select->insertromSelect($this->_getDefaultFinalPriceTable()); $write->query($query); return$this; } public functionregisterEvent(Mage_Index_Model_Event$event) { $entity = $event->getEntity(); if($entity == Mage_Catalog_Model_Product::ENTITY) { if ($event->getType() == Mage_Index_Model_Event::TYPE_SAVE) { // check attributes            // add data to event          }    } }
Обзор индексаторов в Magento Product Attributes Product Prices Catalog URL Rewrites Product Flat Data Category Flat Data Category Products Catalog Search Index Stock Status Tag Aggregation Data
Спасибо за внимание Email: victor@magento.com

Contenu connexe

Tendances

Ubercart -nemnogo_primerov_iz_zhizni
Ubercart  -nemnogo_primerov_iz_zhizniUbercart  -nemnogo_primerov_iz_zhizni
Ubercart -nemnogo_primerov_iz_zhiznidrupalconf
 
Enterprise Patterns in Magento
Enterprise Patterns in MagentoEnterprise Patterns in Magento
Enterprise Patterns in MagentoVrann Tulika
 
Yii development
Yii developmentYii development
Yii developmentMageCloud
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?yiiconf
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоAlexander Makarov
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвMail.ru Group
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Быть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyБыть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyEvgeny Kompaniyets
 
Caching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander ShumenkoCaching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander ShumenkoDrupalCampDN
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноKrivoy Rog IT Community
 
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...ZFConf Conference
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2Paul Klimov
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jqueryITmozg
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf Conference
 
Yii2
Yii2Yii2
Yii2Noveo
 

Tendances (20)

Ubercart -nemnogo_primerov_iz_zhizni
Ubercart  -nemnogo_primerov_iz_zhizniUbercart  -nemnogo_primerov_iz_zhizni
Ubercart -nemnogo_primerov_iz_zhizni
 
Enterprise Patterns in Magento
Enterprise Patterns in MagentoEnterprise Patterns in Magento
Enterprise Patterns in Magento
 
Yii development
Yii developmentYii development
Yii development
 
I Net
I NetI Net
I Net
 
Dependency injection, phemto
Dependency injection, phemtoDependency injection, phemto
Dependency injection, phemto
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что нового
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий Копачёв
 
Render API.
Render API.Render API.
Render API.
 
Javascript
JavascriptJavascript
Javascript
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Быть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyБыть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря Groovy
 
Perl: Symbol table
Perl: Symbol tablePerl: Symbol table
Perl: Symbol table
 
Caching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander ShumenkoCaching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander Shumenko
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jquery
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
 
Yii2
Yii2Yii2
Yii2
 

En vedette

Система рендеринга в Magento
Система рендеринга в MagentoСистема рендеринга в Magento
Система рендеринга в MagentoMagecom Ukraine
 
1000 миллисекунд из жизни Magento
1000 миллисекунд из жизни Magento1000 миллисекунд из жизни Magento
1000 миллисекунд из жизни MagentoMagecom Ukraine
 
Применение компонент-ориентированной архитектуры для написания Magento Extens...
Применение компонент-ориентированной архитектуры для написания Magento Extens...Применение компонент-ориентированной архитектуры для написания Magento Extens...
Применение компонент-ориентированной архитектуры для написания Magento Extens...Magecom Ukraine
 
NoSQL и Zend Framework (Никита Грошин)
NoSQL и Zend Framework (Никита Грошин)NoSQL и Zend Framework (Никита Грошин)
NoSQL и Zend Framework (Никита Грошин)zfconfua
 
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...zfconfua
 
Применение Scrum и Kanban для разработки web-приложений
Применение Scrum и Kanban для разработки web-приложенийПрименение Scrum и Kanban для разработки web-приложений
Применение Scrum и Kanban для разработки web-приложенийKirill Klimov
 
Мобильные клиенты интернет-магазинов
Мобильные клиенты интернет-магазиновМобильные клиенты интернет-магазинов
Мобильные клиенты интернет-магазиновMagecom Ukraine
 
Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0zfconfua
 
Преимущества использования полнотекстового поиска в интернет-магазинах
Преимущества использования полнотекстового поиска в интернет-магазинахПреимущества использования полнотекстового поиска в интернет-магазинах
Преимущества использования полнотекстового поиска в интернет-магазинахMagecom Ukraine
 
Doctrine 2
Doctrine 2Doctrine 2
Doctrine 2zfconfua
 
Эволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторингЭволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторингzfconfua
 
Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0zfconfua
 
Управление продуктом в стиле Magento Unified Process
Управление продуктом в стиле Magento Unified ProcessУправление продуктом в стиле Magento Unified Process
Управление продуктом в стиле Magento Unified ProcessMagecom Ukraine
 
Ключ успеха – процесс или продукт?
Ключ успеха – процесс или продукт?Ключ успеха – процесс или продукт?
Ключ успеха – процесс или продукт?Magecom Ukraine
 
Применение TDD при разработке веб-сервисов
Применение TDD при разработке веб-сервисовПрименение TDD при разработке веб-сервисов
Применение TDD при разработке веб-сервисовMagecom Ukraine
 
NoSQL и Zend Framework (Ростислав Михайлив)
NoSQL и Zend Framework (Ростислав Михайлив)NoSQL и Zend Framework (Ростислав Михайлив)
NoSQL и Zend Framework (Ростислав Михайлив)zfconfua
 
«1С-Битрикс: Управление сайтом» 15.5
«1С-Битрикс: Управление сайтом» 15.5«1С-Битрикс: Управление сайтом» 15.5
«1С-Битрикс: Управление сайтом» 15.51С-Битрикс
 
Обгони конкурентов: лучшие технологии борьбы за покупателя в Интернете
Обгони конкурентов: лучшие технологии борьбы за покупателя в ИнтернетеОбгони конкурентов: лучшие технологии борьбы за покупателя в Интернете
Обгони конкурентов: лучшие технологии борьбы за покупателя в Интернете1С-Битрикс
 
Новинки «1С-Битрикс: Управление сайтом» 16.5
Новинки «1С-Битрикс: Управление сайтом» 16.5Новинки «1С-Битрикс: Управление сайтом» 16.5
Новинки «1С-Битрикс: Управление сайтом» 16.5Наталья Сергеева
 
Современные технологии сайтостроения для решения бизнес-задач
Современные технологии сайтостроения для решения бизнес-задачСовременные технологии сайтостроения для решения бизнес-задач
Современные технологии сайтостроения для решения бизнес-задач1С-Битрикс
 

En vedette (20)

Система рендеринга в Magento
Система рендеринга в MagentoСистема рендеринга в Magento
Система рендеринга в Magento
 
1000 миллисекунд из жизни Magento
1000 миллисекунд из жизни Magento1000 миллисекунд из жизни Magento
1000 миллисекунд из жизни Magento
 
Применение компонент-ориентированной архитектуры для написания Magento Extens...
Применение компонент-ориентированной архитектуры для написания Magento Extens...Применение компонент-ориентированной архитектуры для написания Magento Extens...
Применение компонент-ориентированной архитектуры для написания Magento Extens...
 
NoSQL и Zend Framework (Никита Грошин)
NoSQL и Zend Framework (Никита Грошин)NoSQL и Zend Framework (Никита Грошин)
NoSQL и Zend Framework (Никита Грошин)
 
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
 
Применение Scrum и Kanban для разработки web-приложений
Применение Scrum и Kanban для разработки web-приложенийПрименение Scrum и Kanban для разработки web-приложений
Применение Scrum и Kanban для разработки web-приложений
 
Мобильные клиенты интернет-магазинов
Мобильные клиенты интернет-магазиновМобильные клиенты интернет-магазинов
Мобильные клиенты интернет-магазинов
 
Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0
 
Преимущества использования полнотекстового поиска в интернет-магазинах
Преимущества использования полнотекстового поиска в интернет-магазинахПреимущества использования полнотекстового поиска в интернет-магазинах
Преимущества использования полнотекстового поиска в интернет-магазинах
 
Doctrine 2
Doctrine 2Doctrine 2
Doctrine 2
 
Эволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторингЭволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторинг
 
Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0
 
Управление продуктом в стиле Magento Unified Process
Управление продуктом в стиле Magento Unified ProcessУправление продуктом в стиле Magento Unified Process
Управление продуктом в стиле Magento Unified Process
 
Ключ успеха – процесс или продукт?
Ключ успеха – процесс или продукт?Ключ успеха – процесс или продукт?
Ключ успеха – процесс или продукт?
 
Применение TDD при разработке веб-сервисов
Применение TDD при разработке веб-сервисовПрименение TDD при разработке веб-сервисов
Применение TDD при разработке веб-сервисов
 
NoSQL и Zend Framework (Ростислав Михайлив)
NoSQL и Zend Framework (Ростислав Михайлив)NoSQL и Zend Framework (Ростислав Михайлив)
NoSQL и Zend Framework (Ростислав Михайлив)
 
«1С-Битрикс: Управление сайтом» 15.5
«1С-Битрикс: Управление сайтом» 15.5«1С-Битрикс: Управление сайтом» 15.5
«1С-Битрикс: Управление сайтом» 15.5
 
Обгони конкурентов: лучшие технологии борьбы за покупателя в Интернете
Обгони конкурентов: лучшие технологии борьбы за покупателя в ИнтернетеОбгони конкурентов: лучшие технологии борьбы за покупателя в Интернете
Обгони конкурентов: лучшие технологии борьбы за покупателя в Интернете
 
Новинки «1С-Битрикс: Управление сайтом» 16.5
Новинки «1С-Битрикс: Управление сайтом» 16.5Новинки «1С-Битрикс: Управление сайтом» 16.5
Новинки «1С-Битрикс: Управление сайтом» 16.5
 
Современные технологии сайтостроения для решения бизнес-задач
Современные технологии сайтостроения для решения бизнес-задачСовременные технологии сайтостроения для решения бизнес-задач
Современные технологии сайтостроения для решения бизнес-задач
 

Similaire à Индексирование в Magento

Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капляmeet_magento
 
Magento code debugging
Magento code debuggingMagento code debugging
Magento code debuggingaheadWorks
 
iMetrics 2012. Станислав Видяев - Google Russia. Настройка, обзор системы, но...
iMetrics 2012. Станислав Видяев - Google Russia. Настройка, обзор системы, но...iMetrics 2012. Станислав Видяев - Google Russia. Настройка, обзор системы, но...
iMetrics 2012. Станислав Видяев - Google Russia. Настройка, обзор системы, но...Artyom Tsiplakov
 
Мастер-класс по Google Analytics
Мастер-класс по Google AnalyticsМастер-класс по Google Analytics
Мастер-класс по Google AnalyticsiMetrics
 
Новая eCommerce платформа D7: скидки, управление заказами, автоматизация
Новая eCommerce платформа D7:  скидки, управление заказами, автоматизацияНовая eCommerce платформа D7:  скидки, управление заказами, автоматизация
Новая eCommerce платформа D7: скидки, управление заказами, автоматизация1С-Битрикс
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном кодеСтрах и ненависть в исходном коде
Страх и ненависть в исходном кодеKolya Korobochkin
 
MyBatis на практике
MyBatis на практикеMyBatis на практике
MyBatis на практикеVitebsk Miniq
 
Form api в drupal 7
Form api в drupal 7Form api в drupal 7
Form api в drupal 7dimateus
 
Антон Веретенников и Илья Семаков. Презентация
Антон Веретенников и Илья Семаков. ПрезентацияАнтон Веретенников и Илья Семаков. Презентация
Антон Веретенников и Илья Семаков. ПрезентацияDaria Oreshkina
 
SUP 006. 1C-Битрикс. события
SUP 006. 1C-Битрикс. событияSUP 006. 1C-Битрикс. события
SUP 006. 1C-Битрикс. событияПиксель Плюс
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеAlexander Byndyu
 
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020OdessaJS Conf
 
Android Development Course in HSE lecture #3
Android Development Course in HSE lecture #3Android Development Course in HSE lecture #3
Android Development Course in HSE lecture #3Empatika
 
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...CodeFest
 
MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)GoSharp
 
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...Viktor Likin
 
Не JS во фронтенде
Не JS во фронтендеНе JS во фронтенде
Не JS во фронтендеNitive
 

Similaire à Индексирование в Magento (20)

Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капля
 
Magento code debugging
Magento code debuggingMagento code debugging
Magento code debugging
 
iMetrics 2012. Станислав Видяев - Google Russia. Настройка, обзор системы, но...
iMetrics 2012. Станислав Видяев - Google Russia. Настройка, обзор системы, но...iMetrics 2012. Станислав Видяев - Google Russia. Настройка, обзор системы, но...
iMetrics 2012. Станислав Видяев - Google Russia. Настройка, обзор системы, но...
 
Мастер-класс по Google Analytics
Мастер-класс по Google AnalyticsМастер-класс по Google Analytics
Мастер-класс по Google Analytics
 
Новая eCommerce платформа D7: скидки, управление заказами, автоматизация
Новая eCommerce платформа D7:  скидки, управление заказами, автоматизацияНовая eCommerce платформа D7:  скидки, управление заказами, автоматизация
Новая eCommerce платформа D7: скидки, управление заказами, автоматизация
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном кодеСтрах и ненависть в исходном коде
Страх и ненависть в исходном коде
 
Введение в Django
Введение в DjangoВведение в Django
Введение в Django
 
My batis
My batisMy batis
My batis
 
Ci
CiCi
Ci
 
MyBatis на практике
MyBatis на практикеMyBatis на практике
MyBatis на практике
 
Form api в drupal 7
Form api в drupal 7Form api в drupal 7
Form api в drupal 7
 
Антон Веретенников и Илья Семаков. Презентация
Антон Веретенников и Илья Семаков. ПрезентацияАнтон Веретенников и Илья Семаков. Презентация
Антон Веретенников и Илья Семаков. Презентация
 
SUP 006. 1C-Битрикс. события
SUP 006. 1C-Битрикс. событияSUP 006. 1C-Битрикс. события
SUP 006. 1C-Битрикс. события
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
 
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
 
Android Development Course in HSE lecture #3
Android Development Course in HSE lecture #3Android Development Course in HSE lecture #3
Android Development Course in HSE lecture #3
 
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
 
MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)
 
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
 
Не JS во фронтенде
Не JS во фронтендеНе JS во фронтенде
Не JS во фронтенде
 

Plus de Magecom Ukraine

10 000 вёдер или в погоне за Ключом от всех дверей
10 000 вёдер или в погоне за Ключом от всех дверей10 000 вёдер или в погоне за Ключом от всех дверей
10 000 вёдер или в погоне за Ключом от всех дверейMagecom Ukraine
 
Flexibility vs Conformity - lessons learned in Open Source
Flexibility vs Conformity - lessons learned in Open SourceFlexibility vs Conformity - lessons learned in Open Source
Flexibility vs Conformity - lessons learned in Open SourceMagecom Ukraine
 
Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP Magecom Ukraine
 
Деплоймент и распространение обновлений для веб-приложений
Деплоймент и распространение обновлений для веб-приложенийДеплоймент и распространение обновлений для веб-приложений
Деплоймент и распространение обновлений для веб-приложенийMagecom Ukraine
 
Расширение функциональности модульного MVC приложения
Расширение функциональности модульного MVC приложенияРасширение функциональности модульного MVC приложения
Расширение функциональности модульного MVC приложенияMagecom Ukraine
 
Тестирование Magento с использованием Selenium
Тестирование Magento с использованием SeleniumТестирование Magento с использованием Selenium
Тестирование Magento с использованием SeleniumMagecom Ukraine
 
Архитектура веб-приложений на примере Zend Framework и Magento
Архитектура веб-приложений  на примере Zend Framework и MagentoАрхитектура веб-приложений  на примере Zend Framework и Magento
Архитектура веб-приложений на примере Zend Framework и MagentoMagecom Ukraine
 
Extension Marketplace. Площадки для распространения ПО
Extension Marketplace. Площадки для распространения ПОExtension Marketplace. Площадки для распространения ПО
Extension Marketplace. Площадки для распространения ПОMagecom Ukraine
 
Стандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложенияхСтандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложенияхMagecom Ukraine
 

Plus de Magecom Ukraine (9)

10 000 вёдер или в погоне за Ключом от всех дверей
10 000 вёдер или в погоне за Ключом от всех дверей10 000 вёдер или в погоне за Ключом от всех дверей
10 000 вёдер или в погоне за Ключом от всех дверей
 
Flexibility vs Conformity - lessons learned in Open Source
Flexibility vs Conformity - lessons learned in Open SourceFlexibility vs Conformity - lessons learned in Open Source
Flexibility vs Conformity - lessons learned in Open Source
 
Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP
 
Деплоймент и распространение обновлений для веб-приложений
Деплоймент и распространение обновлений для веб-приложенийДеплоймент и распространение обновлений для веб-приложений
Деплоймент и распространение обновлений для веб-приложений
 
Расширение функциональности модульного MVC приложения
Расширение функциональности модульного MVC приложенияРасширение функциональности модульного MVC приложения
Расширение функциональности модульного MVC приложения
 
Тестирование Magento с использованием Selenium
Тестирование Magento с использованием SeleniumТестирование Magento с использованием Selenium
Тестирование Magento с использованием Selenium
 
Архитектура веб-приложений на примере Zend Framework и Magento
Архитектура веб-приложений  на примере Zend Framework и MagentoАрхитектура веб-приложений  на примере Zend Framework и Magento
Архитектура веб-приложений на примере Zend Framework и Magento
 
Extension Marketplace. Площадки для распространения ПО
Extension Marketplace. Площадки для распространения ПОExtension Marketplace. Площадки для распространения ПО
Extension Marketplace. Площадки для распространения ПО
 
Стандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложенияхСтандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложениях
 

Индексирование в Magento

  • 1. Индексация в Magento Виктор Тихончук Magento System Architect
  • 2. Модуль Mage_Index События Индексатор Индекс Процесс
  • 3. Событие Mage_Index_Model_Event Событие – то, что происходит в некоторый момент времени и рассматривается как изменение состояния сущности. Событие хранит информацию о сущности, с которой произошло действие и тип действия. Типы изменений сущности (event type) Сохранение (SAVE) Удаление (DELETE) Групповая обработка (MASS_ACTION)
  • 4. Обработчик Mage_Index_Model_Indexer processEntityAction($entity, $entityType, $eventType) logEvent($entity, $entityType, $eventType) registerEvent(Mage_Index_Model_Event $event) indexEvent(Mage_Index_Model_Event $event) indexEvents($entity = null, $type = null)
  • 5. Изменения в абстрактной модели Процесс сохранения _getResource()->beginTransaction() _beforeSave() _getResource()->save() _afterSave() _getResource()->commit() afterCommitCallback() Новые события model_save_commit_after {eventPrefix}_save_commit_after
  • 6. Изменения в абстрактной модели Процесс удаления _getResource()->beginTransaction() _beforeDelete() _getResource()->delete() _afterDelete() _getResource()->commit() _afterDeleteCommit() Новые события model_delete_commit_after {eventPrefix}_delete_commit_after
  • 7. Сущности catalog/product (SAVE, DELETE, MASS_ACTION) catalog/category (SAVE, DELETE) catalog/resource_eav_attribute (SAVE, DELETE) customer/group (SAVE) cataloginventory/stock_item (SAVE) tag/tag (SAVE) core/store (SAVE, DELETE) core/store_group (SAVE, DELETE) core/website (SAVE, DELETE)
  • 8. Процессы и индексаторы Индексатор может работать в 2х режимах: в режиме реального времени (MODE_REAL_TIME) в ручном режиме (MODE_MANUAL) У каждого индексатора есть текущий статус: работает (STATUS_RUNNING) режим ожидания (STATUS_PENDING) необходимо перестроить (STATUS_REQUIRE_REINDEX) Событие REQUIRE_REINDEX MODE MANUAL New Indexer
  • 9. Процесс Mage_Index_Model_Process matchEvent(Mage_Index_Model_Event $event) register(Mage_Index_Model_Event $event) processEvent(Mage_Index_Model_Event $event) reindexAll() reindexEverything() indexEvents() changeStatus($status) getIndexer()
  • 10. CatalogInventory Stock Status Цель оптимизировать затраты на подсчет возможности покупки товара при отображении товаров в каталоге, поиске и т.д. Мотивация для простых (simple) товаров - динамически определить доступность не является трудозатратной операцией, чего не скажешь о составных (composite), для которых нужно учитывать статус всех его составляющих Задача сделать предварительно подсчитанный статус для каждого товара с учетом склада и веб сайта
  • 11. Шаг 1: Структура данных индекса
  • 12. Шаг 2: Создаем индексатор Mage_CatalogInventory_Model_Indexer_Stock
  • 13. Шаг 2: Создаем индексатор Mage_Index_Model_Indexer_Abstract Mage_CatalogInventory_Model_Indexer_Stock
  • 14. Шаг 2: Создаем индексатор Mage_Core_Model_Abstract Mage_Index_Model_Indexer_Abstract Mage_CatalogInventory_Model_Indexer_Stock
  • 15. Шаг 2: Создаем индексатор Mage_Core_Model_Mysql4_Abstract Mage_Index_Model_Mysql4_Indexer_Abstract Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Indexer_Abstract Mage_CatalogInventory_Model_Mysql4_Indexer_Stock
  • 16. Шаг 2: Создаем индексатор Абстрактные методы индексатора getName() getDescription() _registerEvent() _processEvent()
  • 17. Шаг 3: События protected$_matchedEntities = array(     Mage_CatalogInventory_Model_Stock_Item::ENTITY => array(         Mage_Index_Model_Event::TYPE_SAVE     ),     Mage_Catalog_Model_Product::ENTITY => array(         Mage_Index_Model_Event::TYPE_SAVE,         Mage_Index_Model_Event::TYPE_MASS_ACTION,         Mage_Index_Model_Event::TYPE_DELETE     ),     Mage_Core_Model_Store::ENTITY => array(         Mage_Index_Model_Event::TYPE_SAVE     ),     Mage_Core_Model_Store_Group::ENTITY => array(         Mage_Index_Model_Event::TYPE_SAVE     ),     Mage_Core_Model_Config_Data::ENTITY => array(         Mage_Index_Model_Event::TYPE_SAVE     ),     Mage_Catalog_Model_Convert_Adapter_Product::ENTITY => array(         Mage_Index_Model_Event::TYPE_SAVE     ) );
  • 18. Шаг 4: Изменение конфигурации protected$_relatedConfigSettings = array(    Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK,    Mage_CatalogInventory_Helper_Data::XML_PATH_SHOW_OUT_OF_STOCK); public functionmatchEvent(Mage_Index_Model_Event$event) { // check saved result in $event and return it if ($entity == Mage_Core_Model_Config_Data::ENTITY) { $configData= $event->getDataObject(); $path = $configData->getPath(); if (in_array($path, $this->_relatedConfigSettings)) { $result = $configData->isValueChanged(); } else { $result = false; } } else { $result = parent::matchEvent($event); }// save result in $event and return it }
  • 19. Шаг 5: Регистрация события protected function _registerEvent(Mage_Index_Model_Event$event) {     switch ($event->getEntity()) {         caseMage_Catalog_Model_Product::ENTITY:             $this->_registerCatalogProductEvent($event);             break;   // skip some cases         caseMage_Core_Model_Store::ENTITY:         caseMage_Core_Model_Config_Data::ENTITY: $reindex = Mage_Index_Model_Process::STATUS_REQUIRE_REINDEX;             $event->addNewData('skip_call_event_handler', true);             $process = $event->getProcess();             $process->changeStatus($reindex);               if ($event->getEntity() == Mage_Core_Model_Config_Data::ENTITY) {                 $configData = $event->getDataObject(); $indexer = Mage::getSingleton('index/indexer');                 if ($configData->getPath() == XML_PATH_SHOW_OUT_OF_STOCK) {                     $index->getProcessByCode('catalog_product_price')                         ->changeStatus($reindex);                     $indexer->getProcessByCode('catalog_product_attribute')                         ->changeStatus($reindex);                 }             }             break;     } }
  • 20. Шаг 5: Регистрация события protected function _registerCatalogProductDeleteEvent (Mage_Index_Model_Event$event) {     /**@var $product Mage_Catalog_Model_Product */     $product = $event->getDataObject();       $parentIds = $this->_getResource() ->getProductParentsByChild($product->getId());     if ($parentIds) {         $event->addNewData('reindex_stock_parent_ids', $parentIds);     }       return$this; }
  • 21. Шаг 6: Обработка события protected function _processEvent(Mage_Index_Model_Event$event) { $data = $event->getNewData(); if (!empty($data['cataloginventory_stock_reindex_all'])) { $this->reindexAll(); } if (empty($data['skip_call_event_handler'])) { $this->callEventHandler($event); } }
  • 22. Шаг 7: Ресурс модель Resource Model Type Indexer Interface Type Indexer Default Type Indexer Configurable
  • 23. Шаг 7: Ресурс модель protected function _getTypeIndexers() { if (is_null($this->_indexers)) { $this->_indexers = array(); $types = Mage::getSingleton('catalog/product_type') ->getTypesByPriority(); foreach ($typesas$typeId => $typeInfo) { if (isset($typeInfo['stock_indexer'])) { $modelName = $typeInfo['stock_indexer']; } else { $modelName = $this->_defaultIndexer; } $isComposite = !empty($typeInfo['composite']); $indexer = Mage::getResourceModel($modelName) ->setTypeId($typeId) ->setIsComposite($isComposite); $this->_indexers[$typeId] = $indexer; } } return$this->_indexers; }
  • 24. Шаг 7: Ресурс модель public functionreindexAll() { $this->useIdxTable(true); $this->clearTemporaryIndexTable(); foreach ($this->_getTypeIndexers() as$indexer) { $indexer->reindexAll(); } $this->syncData(); return$this; }
  • 25. Шаг 7: Ресурс модель public functioncatalogProductDelete(Mage_Index_Model_Event$event) { $data = $event->getNewData(); if (empty($data['reindex_stock_parent_ids'])) { return$this; } $adapter = $this->_getWriteAdapter(); $parentIds = array(); foreach ($data['reindex_stock_parent_ids'] as$parentId => $parentType) { $parentIds[$parentType][$parentId] = $parentId; } $adapter->beginTransaction(); try { foreach ($parentIdsas$parentType => $entityIds) { $this->_getIndexer($parentType)->reindexEntity($entityIds); } } catch (Exception $e) { $adapter->rollback(); throw$e; } $adapter->commit(); return$this; }
  • 26. Шаг 8: Ресурс модели (TYPE Default) public functionsetTypeId($typeId) { $this->_typeId = $typeId; return $this; } public function getTypeId() { if (is_null($this->_typeId)) { Mage::throwException(Mage::helper('cataloginventory') ->__('Undefined product type.')); } return$this->_typeId; } public function reindexAll() { $this->useIdxTable(true); $this->_prepareIndexTable(); return$this; } public function reindexEntity($entityIds) { $this->_updateIndex($entityIds); return$this; }
  • 27. Шаг 9: Декларация индексатора <config> <!-- ... --> <global> <!-- ... --> <index> <indexer> <cataloginventory_stock> <model>cataloginventory/indexer_stock</model> </cataloginventory_stock> <catalog_product_attribute> <depends> <cataloginventory_stock /> </depends> </catalog_product_attribute> <catalog_product_price> <depends> <cataloginventory_stock /> </depends> </catalog_product_price> </indexer> </index> </global> </config>
  • 28. Индекс цен для B2B Цель Создать новый тип товара B2B Справка В2В – сокращение от английских слов «businesstobusiness», в буквальном переводе – бизнес для бизнеса. Это сектор рынка, который работает не на конечного, рядового потребителя, а на такие же компании, то есть на другой бизнес. Задача Новый тип товара, который наследует поведение простого товара (simple), но имеет возможность указать цену для каждой группы пользователей (customer group)
  • 29. Индекс цен для B2B Знакомство с интерфейсом Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Indexer_Price_Interface public functionreindexAll(); public functionreindexEntity($entityIds); public functionregisterEvent(Mage_Index_Model_Event$event); Создаем свой индексатор class Mageconf_B2b_Model_Mysql4_Indexer_Price extends Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Indexer_Price_Default { }
  • 30. Индекс цен для B2B Знакомство с …Indexer_Price_Default public functionreindexAll() { $this->useIdxTable(true); $this->_prepareFinalPriceData(); $this->_applyCustomOption(); $this->_movePriceDataToIndexTable(); return$this; } public functionreindexEntity($entityIds) { $this->_prepareFinalPriceData($entityIds); $this->_applyCustomOption(); $this->_movePriceDataToIndexTable(); return$this; }
  • 31. Индекс цен для B2B protected function _getDefaultFinalPriceTable() { if($this->useIdxTable()) { return$this->getTable('catalog/product_price_indexer_final_idx'); } return$this->getTable('catalog/product_price_indexer_final_tmp'); }
  • 33. Индекс цен для B2B protected function _prepareFinalPriceData($entityIds = null) { // удаляем данные из таблицы, если они есть $this->_prepareDefaultFinalPriceTable(); $write = $this->_getWriteAdapter(); $select = $write->select() ->from(array('e' => $this->getTable('catalog/product')), array('entity_id')) ->joinCross( array('cg' => $this->getTable('customer/customer_group')), array('customer_group_id')) ->joinCross( array('cw' => $this->getTable('core/website')), array('website_id')) ->join( array('cwd' => $this->_getWebsiteDateTable()), 'cw.website_id = cwd.website_id', array()) ->join( array('csg' => $this->getTable('core/store_group')), 'csg.website_id = cw.website_id AND cw.default_group_id = csg.group_id', array()) ->join( array('cs' => $this->getTable('core/store')), 'csg.default_store_id = cs.store_id AND cs.store_id != 0', array());// next slide
  • 34. Индекс цен для B2B // protected function _prepareFinalPriceData($entityIds = null) $select ->join( array('pw' => $this->getTable('catalog/product_website')), 'pw.product_id = e.entity_id AND pw.website_id = cw.website_id', array()) ->joinLeft( array('tp' => $this->_getTierPriceIndexTable()), 'tp.entity_id = e.entity_id AND tp.website_id = cw.website_id' . ' AND tp.customer_group_id = cg.customer_group_id', array()) ->join( array('b2d' => $this->getTable('b2b/price')), 'b2d.entity_id = e.entity_id AND b2d.customer IS NULL AND website_id=0'array()) ->join( array('b2w'=> $this->getTable('b2b/price')), 'b2w.entity_id = e.entity_id AND b2w.customer = cg.customer_group_id' . ' AND b2w.website_id = cw.website_id', array()) ->where('e.type_id=?', $this->getTypeId()); $statusCond = $write->quoteInto('=?', Mage_Catalog_Model_Product_Status::STATUS_ENABLED); $this->_addAttributeToSelect($select, 'status', 'e.entity_id', 'cs.store_id', $statusCond, true);
  • 35. Индекс цен для B2B // protected function _prepareFinalPriceData($entityIds = null) $taxClassId = $this->_addAttributeToSelect($select, 'tax_class_id', 'e.entity_id', 'cs.store_id'); $select->columns(array('tax_class_id' => $taxClassId)); $finalPrice= newZend_Db_Expr('IFNULL(b2w.price, b2d.price)'); $select->columns(array( 'orig_price' => $price, 'price' => $finalPrice, 'min_price' => $finalPrice, 'max_price' => $finalPrice, 'tier_price' => newZend_Db_Expr('NULL'), 'base_tier' => newZend_Db_Expr('NULL'), )); if(!is_null($entityIds)) { $select->where('e.entity_id IN(?)', $entityIds); }
  • 36. Индекс цен для B2B // protected function _prepareFinalPriceData($entityIds = null) Mage::dispatchEvent('prepare_catalog_product_index_select', array( 'select' => $select, 'entity_field' => newZend_Db_Expr('e.entity_id'), 'website_field' => newZend_Db_Expr('cw.website_id'), 'store_field' => newZend_Db_Expr('cs.store_id') )); $query = $select->insertromSelect($this->_getDefaultFinalPriceTable()); $write->query($query); return$this; } public functionregisterEvent(Mage_Index_Model_Event$event) { $entity = $event->getEntity(); if($entity == Mage_Catalog_Model_Product::ENTITY) { if ($event->getType() == Mage_Index_Model_Event::TYPE_SAVE) { // check attributes // add data to event } } }
  • 37. Обзор индексаторов в Magento Product Attributes Product Prices Catalog URL Rewrites Product Flat Data Category Flat Data Category Products Catalog Search Index Stock Status Tag Aggregation Data
  • 38. Спасибо за внимание Email: victor@magento.com