/** * @param \Magento\Catalog\Model\Category $category * @param boolean $recursive * @return int[] */ public function getChildrenIds(Category $category, $recursive = false) { $cacheKey = $category->getId() . '_' . (int) $recursive; if (!isset($this->childrenIds[$cacheKey])) { $connection = $category->getResource()->getReadConnection(); $select = $connection->select()->from($category->getResource()->getEntityTable(), 'entity_id')->where($connection->quoteIdentifier('path') . ' LIKE :c_path'); $bind = ['c_path' => $category->getPath() . '/%']; if (!$recursive) { $select->where($connection->quoteIdentifier('level') . ' <= :c_level'); $bind['c_level'] = $category->getLevel() + 1; } $this->childrenIds[$cacheKey] = $connection->fetchCol($select, $bind); } return $this->childrenIds[$cacheKey]; }
/** * @param Category $category * @return void */ public function processDelete(Category $category) { /** @var \Magento\Catalog\Model\ResourceModel\Category $resourceModel */ $resourceModel = $category->getResource(); /** * Update children count for all parent categories */ $parentIds = $category->getParentIds(); if ($parentIds) { $childDecrease = $category->getChildrenCount() + 1; // +1 is itself $data = ['children_count' => new \Zend_Db_Expr('children_count - ' . $childDecrease)]; $where = ['entity_id IN(?)' => $parentIds]; $resourceModel->getConnection()->update($resourceModel->getEntityTable(), $data, $where); } }
/** * Retrieve category attributes * * @param string $attributeCode * @param int|array $categoryIds * @param int $storeId * @return array */ protected function _getCategoryAttribute($attributeCode, $categoryIds, $storeId) { $linkField = $this->metadataPool->getMetadata(CategoryInterface::class)->getLinkField(); $identifierFiled = $this->metadataPool->getMetadata(CategoryInterface::class)->getIdentifierField(); $connection = $this->getConnection(); if (!isset($this->_categoryAttributes[$attributeCode])) { $attribute = $this->_catalogCategory->getResource()->getAttribute($attributeCode); $this->_categoryAttributes[$attributeCode] = ['entity_type_id' => $attribute->getEntityTypeId(), 'attribute_id' => $attribute->getId(), 'table' => $attribute->getBackend()->getTable(), 'is_global' => $attribute->getIsGlobal(), 'is_static' => $attribute->isStatic()]; unset($attribute); } if (!is_array($categoryIds)) { $categoryIds = [$categoryIds]; } $attributeTable = $this->_categoryAttributes[$attributeCode]['table']; $select = $connection->select(); $bind = []; if ($this->_categoryAttributes[$attributeCode]['is_static']) { $select->from($this->getTable('catalog_category_entity'), ['value' => $attributeCode, 'entity_id' => 'entity_id'])->where('entity_id IN(?)', $categoryIds); } elseif ($this->_categoryAttributes[$attributeCode]['is_global'] || $storeId == 0) { $select->from(['t1' => $this->getTable('catalog_category_entity')], [$identifierFiled])->joinLeft(['e' => $attributeTable], "t1.{$linkField} = e.{$linkField}", ['value'])->where("t1.{$identifierFiled} IN(?)", $categoryIds)->where('e.attribute_id = :attribute_id')->where('e.store_id = ?', 0); $bind['attribute_id'] = $this->_categoryAttributes[$attributeCode]['attribute_id']; } else { $valueExpr = $connection->getCheckSql('t2.value_id > 0', 't2.value', 't1.value'); $select->from(['t1' => $attributeTable], [$identifierFiled => 'e.' . $identifierFiled, 'value' => $valueExpr])->joinLeft(['t2' => $attributeTable], "t1.{$linkField} = t2.{$linkField} AND t1.attribute_id = t2.attribute_id AND t2.store_id = :store_id", [])->joinLeft(['e' => $this->getTable('catalog_category_entity')], "e.{$linkField} = t1.{$linkField}", [])->where('t1.store_id = ?', 0)->where('t1.attribute_id = :attribute_id')->where("e.entity_id IN(?)", $categoryIds)->group('e.entity_id'); $bind['attribute_id'] = $this->_categoryAttributes[$attributeCode]['attribute_id']; $bind['store_id'] = $storeId; } $rowSet = $connection->fetchAll($select, $bind); $attributes = []; foreach ($rowSet as $row) { $attributes[$row[$identifierFiled]] = $row['value']; } unset($rowSet); foreach ($categoryIds as $categoryId) { if (!isset($attributes[$categoryId])) { $attributes[$categoryId] = null; } } return $attributes; }
/** * Retrieve category attributes * * @param string $attributeCode * @param int|array $categoryIds * @param int $storeId * @return array */ protected function _getCategoryAttribute($attributeCode, $categoryIds, $storeId) { $adapter = $this->_getWriteAdapter(); if (!isset($this->_categoryAttributes[$attributeCode])) { $attribute = $this->_catalogCategory->getResource()->getAttribute($attributeCode); $this->_categoryAttributes[$attributeCode] = ['entity_type_id' => $attribute->getEntityTypeId(), 'attribute_id' => $attribute->getId(), 'table' => $attribute->getBackend()->getTable(), 'is_global' => $attribute->getIsGlobal(), 'is_static' => $attribute->isStatic()]; unset($attribute); } if (!is_array($categoryIds)) { $categoryIds = [$categoryIds]; } $attributeTable = $this->_categoryAttributes[$attributeCode]['table']; $select = $adapter->select(); $bind = []; if ($this->_categoryAttributes[$attributeCode]['is_static']) { $select->from($this->getTable('catalog_category_entity'), ['value' => $attributeCode, 'entity_id' => 'entity_id'])->where('entity_id IN(?)', $categoryIds); } elseif ($this->_categoryAttributes[$attributeCode]['is_global'] || $storeId == 0) { $select->from($attributeTable, ['entity_id', 'value'])->where('attribute_id = :attribute_id')->where('store_id = ?', 0)->where('entity_id IN(?)', $categoryIds); $bind['attribute_id'] = $this->_categoryAttributes[$attributeCode]['attribute_id']; } else { $valueExpr = $adapter->getCheckSql('t2.value_id > 0', 't2.value', 't1.value'); $select->from(['t1' => $attributeTable], ['entity_id', 'value' => $valueExpr])->joinLeft(['t2' => $attributeTable], 't1.entity_id = t2.entity_id AND t1.attribute_id = t2.attribute_id AND t2.store_id = :store_id', [])->where('t1.store_id = ?', 0)->where('t1.attribute_id = :attribute_id')->where('t1.entity_id IN(?)', $categoryIds); $bind['attribute_id'] = $this->_categoryAttributes[$attributeCode]['attribute_id']; $bind['store_id'] = $storeId; } $rowSet = $adapter->fetchAll($select, $bind); $attributes = []; foreach ($rowSet as $row) { $attributes[$row['entity_id']] = $row['value']; } unset($rowSet); foreach ($categoryIds as $categoryId) { if (!isset($attributes[$categoryId])) { $attributes[$categoryId] = null; } } return $attributes; }
public function getObject(Category $category) { /** @var $productCollection Mage_Catalog_Model_Resource_Product_Collection */ $productCollection = $category->getProductCollection(); $productCollection = $productCollection->addMinimalPrice(); $category->setProductCount($productCollection->getSize()); $transport = new DataObject(); $this->eventManager->dispatch('algolia_category_index_before', ['category' => $category, 'custom_data' => $transport]); $customData = $transport->getData(); $storeId = $category->getStoreId(); $category->getUrlInstance()->setStore($storeId); $path = ''; foreach ($category->getPathIds() as $categoryId) { if ($path != '') { $path .= ' / '; } $path .= $this->getCategoryName($categoryId, $storeId); } $image_url = null; try { $image_url = $category->getImageUrl(); } catch (\Exception $e) { /* no image, no default: not fatal */ } $data = ['objectID' => $category->getId(), 'name' => $category->getName(), 'path' => $path, 'level' => $category->getLevel(), 'url' => $category->getUrl(), 'include_in_menu' => $category->getIncludeInMenu(), '_tags' => ['category'], 'popularity' => 1, 'product_count' => $category->getProductCount()]; if (!empty($image_url)) { $data['image_url'] = $image_url; } foreach ($this->config->getCategoryAdditionalAttributes($storeId) as $attribute) { $value = $category->getData($attribute['attribute']); $attribute_resource = $category->getResource()->getAttribute($attribute['attribute']); if ($attribute_resource) { $value = $attribute_resource->getFrontend()->getValue($category); } if (isset($data[$attribute['attribute']])) { $value = $data[$attribute['attribute']]; } if ($value) { $data[$attribute['attribute']] = $value; } } $data = array_merge($data, $customData); foreach ($data as &$data0) { $data0 = $this->try_cast($data0); } return $data; }
/** * Validate category process * * @param Category $category * @return void * @throws \Magento\Framework\Model\Exception */ protected function validateCategory(Category $category) { $useConfigFields = []; foreach ($this->useConfigFields as $field) { if (!$category->getData($field)) { $useConfigFields[] = $field; } } $category->setData('use_post_data_config', $useConfigFields); $validate = $category->validate(); if ($validate !== true) { foreach ($validate as $code => $error) { if ($error === true) { $attribute = $category->getResource()->getAttribute($code)->getFrontend()->getLabel(); throw new \Magento\Framework\Model\Exception(__('Attribute "%1" is required.', $attribute)); } else { throw new \Magento\Framework\Model\Exception($error); } } } $category->unsetData('use_post_data_config'); }
/** * {@inheritdoc} */ public function getResource() { $pluginInfo = $this->pluginList->getNext($this->subjectType, 'getResource'); if (!$pluginInfo) { return parent::getResource(); } else { return $this->___callPlugins('getResource', func_get_args(), $pluginInfo); } }