public function testGetProductsPosition() { $this->assertEquals([], $this->_model->getProductsPosition()); $this->_model->unsetData(); $this->_model->load(6); $this->assertEquals([], $this->_model->getProductsPosition()); $this->_model->unsetData(); $this->_model->load(4); $this->assertContains(1, $this->_model->getProductsPosition()); }
public function testGetProductsPosition() { $this->assertEquals([], $this->_model->getProductsPosition()); $this->_model->unsetData(); $this->_model = $this->getCategoryByName('Category 2'); $this->assertEquals([], $this->_model->getProductsPosition()); $this->_model->unsetData(); $this->_model = $this->getCategoryByName('Category 1.1.1'); $this->assertNotEmpty($this->_model->getProductsPosition()); }
/** * Save category products relation * * @param \Magento\Catalog\Model\Category $category * @return $this */ protected function _saveCategoryProducts($category) { $category->setIsChangedProductList(false); $id = $category->getId(); /** * new category-product relationships */ $products = $category->getPostedProducts(); /** * Example re-save category */ if ($products === null) { return $this; } /** * old category-product relationships */ $oldProducts = $category->getProductsPosition(); $insert = array_diff_key($products, $oldProducts); $delete = array_diff_key($oldProducts, $products); /** * Find product ids which are presented in both arrays * and saved before (check $oldProducts array) */ $update = array_intersect_key($products, $oldProducts); $update = array_diff_assoc($update, $oldProducts); $adapter = $this->_getWriteAdapter(); /** * Delete products from category */ if (!empty($delete)) { $cond = array('product_id IN(?)' => array_keys($delete), 'category_id=?' => $id); $adapter->delete($this->_categoryProductTable, $cond); } /** * Add products to category */ if (!empty($insert)) { $data = array(); foreach ($insert as $productId => $position) { $data[] = array('category_id' => (int) $id, 'product_id' => (int) $productId, 'position' => (int) $position); } $adapter->insertMultiple($this->_categoryProductTable, $data); } /** * Update product positions in category */ if (!empty($update)) { foreach ($update as $productId => $position) { $where = array('category_id = ?' => (int) $id, 'product_id = ?' => (int) $productId); $bind = array('position' => (int) $position); $adapter->update($this->_categoryProductTable, $bind, $where); } } if (!empty($insert) || !empty($delete)) { $productIds = array_unique(array_merge(array_keys($insert), array_keys($delete))); $this->_eventManager->dispatch('catalog_category_change_products', array('category' => $category, 'product_ids' => $productIds)); } if (!empty($insert) || !empty($update) || !empty($delete)) { $category->setIsChangedProductList(true); /** * Setting affected products to category for third party engine index refresh */ $productIds = array_keys($insert + $delete + $update); $category->setAffectedProductIds($productIds); } return $this; }
/** * {@inheritdoc} */ public function getProductsPosition() { $pluginInfo = $this->pluginList->getNext($this->subjectType, 'getProductsPosition'); if (!$pluginInfo) { return parent::getProductsPosition(); } else { return $this->___callPlugins('getProductsPosition', func_get_args(), $pluginInfo); } }