/** * Переносик категорию * @param $parent integer * @param $position integer * @return array */ public function moveCategory($parent, $position) { // Очищаем ВСЕ кеши категорий TagDependency::invalidate(Yii::$app->cache, ['category']); $result = false; $counts = []; $parentCat = Category::findOne($parent); // Новый родитель $oldParentCat = Category::findOne($this->parent); // Старый родитель $this->parent = $parent; // Если position = 0 if ($position === 0) { // Добавляем в начало $result = $this->prependTo($parentCat); } else { // Иначе, ищем категорию, после которой нужно добавить $prevCategory = end($parentCat->children(1)->andWhere(['not in', 'id', $this->id])->limit($position)->all()); // Если нужный элемент найден if ($prevCategory !== null) { // Добавляем новый после нее $result = $this->insertAfter($prevCategory); } } // Пересчитываем cnt_products для всех НОВЫХ и СТАРЫХ родительских категорий // Если товаров в категории нет, то и пересчитывать ничего не нужно if (0 < $this->cnt_products) { $parents = array_unique(array_merge([$oldParentCat->id], Category::getParentsIds($oldParentCat->id), [(int) $this->parent], Category::getParentsIds($this->parent))); foreach ($parents as $p) { $parentCategory = Category::findOne($p); $parentCategory->cnt_products = Product::findAllInCatsAndSubCategories($parentCategory)->count(); $parentCategory->save(); $counts[$parentCategory->id] = $parentCategory->cnt_products; } } return ['result' => $result, 'counts' => $counts]; }