/** * Makes an array of category ids from string * * @param array $fields * @param $multipleValuesDelimiter * @param array $additionalFields * @return array|bool */ private function unpackCategories(array $fields, $multipleValuesDelimiter, array $additionalFields) { $categories = isset($fields['categories']) ? $fields['categories'] : (isset($fields['category']) ? $fields['category'] : false); if ($categories === false) { return $this->getCategoryIds(); } if ($categories !== false) { if (strpos($categories, $multipleValuesDelimiter) > 0) { $categories = explode($multipleValuesDelimiter, $categories); } elseif (strpos($multipleValuesDelimiter, '/') === 0) { $categories = preg_split($multipleValuesDelimiter, $categories); } else { $categories = [$categories]; } $typecast = 'id'; if (isset($additionalFields['categories'])) { if (isset($additionalFields['categories']['processValuesAs'])) { $typecast = $additionalFields['categories']['processValuesAs']; } } if ($typecast === 'id') { $categories = array_map('intval', $categories); } elseif ($typecast === 'slug') { $categories = array_map('trim', $categories); $categoryIds = []; foreach ($categories as $part) { $cat = Category::findBySlug($part, 1, -1); if (is_object($cat)) { $categoryIds[] = $cat->id; } unset($cat); } $categories = array_map('intval', $categoryIds); } elseif ($typecast === 'name') { $categories = array_map('trim', $categories); $categoryIds = []; foreach ($categories as $part) { $cat = Category::findByName($part, 1, -1); if (is_object($cat)) { $categoryIds[] = $cat->id; } unset($cat); } $categories = array_map('intval', $categoryIds); } else { // that's unusual behavior $categories = false; } // post-process categories // find & add parent category // if we need to show products of child categories in products list /** @var ShopModule $module */ $module = Yii::$app->getModule('shop'); if (is_array($categories) && $module->showProductsOfChildCategories) { do { $repeat = false; foreach ($categories as $cat) { $model = Category::findById($cat, null, null); if ($model === null) { echo "\n\nUnknown category with id " . intval($cat) . " for model with id:" . $this->id . "\n\n"; continue; } if (intval($model->parent_id) > 0 && in_array($model->parent_id, $categories) === false) { $categories[] = $model->parent_id; $repeat = true; } unset($model); } } while ($repeat === true); } } return $categories; }