items[] = $item; } /** * Get all configuration items. */ public function getItems(): Collection { if (! $this->items) { $this->prepareConfigurationItems(); } return collect($this->items) ->sortBy('sort'); } /** * Retrieve Core Config */ private function retrieveCoreConfig(): array { static $items; if ($items) { return $items; } return $items = config('core'); } /** * Prepare configuration items. */ public function prepareConfigurationItems() { $configWithDotNotation = []; foreach ($this->retrieveCoreConfig() as $item) { $configWithDotNotation[$item['key']] = $item; } $configs = Arr::undot(Arr::dot($configWithDotNotation)); foreach ($configs as $configItem) { $subConfigItems = $this->processSubConfigItems($configItem); $this->addItem(new Item( children: $subConfigItems, fields: $configItem['fields'] ?? null, icon: $configItem['icon'] ?? null, icon_class: $configItem['icon_class'] ?? null, info: trans($configItem['info']) ?? null, key: $configItem['key'], name: trans($configItem['name']), route: $configItem['route'] ?? null, sort: $configItem['sort'], )); } } /** * Process sub config items. */ private function processSubConfigItems($configItem): Collection { return collect($configItem) ->sortBy('sort') ->filter(fn ($value) => is_array($value) && isset($value['name'])) ->map(function ($subConfigItem) { $configItemChildren = $this->processSubConfigItems($subConfigItem); return new Item( children: $configItemChildren, fields: $subConfigItem['fields'] ?? null, icon: $subConfigItem['icon'] ?? null, icon_class: $subConfigItem['icon_class'] ?? null, info: trans($subConfigItem['info']) ?? null, key: $subConfigItem['key'], name: trans($subConfigItem['name']), route: $subConfigItem['route'] ?? null, sort: $subConfigItem['sort'] ?? null, ); }); } /** * Get active configuration item. */ public function getActiveConfigurationItem(): ?Item { if (! $slug = request()->route('slug')) { return null; } $activeItem = $this->getItems()->where('key', $slug)->first() ?? null; if (! $activeItem) { return null; } if ($slug2 = request()->route('slug2')) { $activeItem = $activeItem->getChildren()[$slug2]; } return $activeItem; } /** * Get config field. */ public function getConfigField(string $fieldName): ?array { foreach ($this->retrieveCoreConfig() as $coreData) { if (! isset($coreData['fields'])) { continue; } foreach ($coreData['fields'] as $field) { $name = $coreData['key'].'.'.$field['name']; if ($name == $fieldName) { return $field; } } } return null; } /** * Get core config values. */ protected function getCoreConfig(string $field, ?string $channel, ?string $locale): ?CoreConfig { $fields = $this->getConfigField($field); if (! empty($fields['channel_based'])) { if (! empty($fields['locale_based'])) { $coreConfigValue = $this->coreConfigRepository->findOneWhere([ 'code' => $field, 'channel_code' => $channel, 'locale_code' => $locale, ]); } else { $coreConfigValue = $this->coreConfigRepository->findOneWhere([ 'code' => $field, 'channel_code' => $channel, ]); } } else { if (! empty($fields['locale_based'])) { $coreConfigValue = $this->coreConfigRepository->findOneWhere([ 'code' => $field, 'locale_code' => $locale, ]); } else { $coreConfigValue = $this->coreConfigRepository->findOneWhere([ 'code' => $field, ]); } } return $coreConfigValue; } /** * Get default config. */ protected function getDefaultConfig(string $field): mixed { $configFieldInfo = $this->getConfigField($field); $fields = explode('.', $field); array_shift($fields); $field = implode('.', $fields); return Config::get($field, $configFieldInfo['default'] ?? null); } /** * Get the config data. */ public function getConfigData(string $field, ?string $currentChannelCode = null, ?string $currentLocaleCode = null): mixed { if (empty($currentChannelCode)) { $currentChannelCode = core()->getRequestedChannelCode(); } if (empty($currentLocaleCode)) { $currentLocaleCode = core()->getRequestedLocaleCode(); } $coreConfig = $this->getCoreConfig($field, $currentChannelCode, $currentLocaleCode); if (! $coreConfig) { return $this->getDefaultConfig($field); } return $coreConfig->value; } }