ldc-ovoteam/database/seeders/Mandatory/ImportDynamicPagesSeeder.php
Jérémy Munsch 84f405d50c
feat(seeder): add dynamic pages and page configs seeders
- Introduced ImportDynamicPagesSeeder for dynamic pages.
- Added JSON files for dynamic pages and page configurations.
2026-10-21 15:33:42 +02:00

169 lines
5.2 KiB
PHP

<?php
declare(strict_types=1);
namespace Database\Seeders\Mandatory;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File;
use Uwil\LaravelDynamicPages\Enums\PageStatusEnum;
use Uwil\LaravelDynamicPages\Models\DynamicPage;
use Uwil\LaravelDynamicPages\Models\PageConfig;
class ImportDynamicPagesSeeder extends Seeder
{
/** @var string Associated table to this seeder. */
public static string $table = 'dynamic_pages';
public function run(): void
{
DB::transaction(function (): void {
$this->seedPageConfigs();
$this->seedDynamicPages();
});
DynamicPage::resetCache();
PageConfig::resetCache();
}
private function seedPageConfigs(): void
{
$filePath = database_path('seeders/data/page_configs.json');
if (! File::exists($filePath)) {
return;
}
/** @var array<int, array<string, mixed>>|null $configs */
$configs = json_decode(File::get($filePath), true);
if (! is_array($configs)) {
return;
}
foreach ($configs as $configData) {
$view = $configData['view'] ?? null;
if (! is_string($view)) {
continue;
}
/** @var PageConfig $pageConfig */
$pageConfig = PageConfig::withTrashed()
->firstOrNew(['view' => $view]);
$pageConfig->deleted_at = null;
if (isset($configData['label']) && is_array($configData['label'])) {
/** @var array<string, string> $label */
$label = $configData['label'];
$pageConfig->setTranslations('label', $label);
}
if (isset($configData['config']) && is_array($configData['config'])) {
/** @var array<string, mixed> $config */
$config = $configData['config'];
$pageConfig->setTranslations('config', $config);
}
$pageConfig->saveQuietly();
}
}
private function seedDynamicPages(): void
{
$filePath = database_path('seeders/data/dynamic_pages.json');
if (! File::exists($filePath)) {
return;
}
/** @var array<int, array<string, mixed>>|null $pages */
$pages = json_decode(File::get($filePath), true);
if (! is_array($pages)) {
return;
}
foreach ($pages as $pageData) {
$idKey = isset($pageData['id_key']) && is_string($pageData['id_key']) ?
$pageData['id_key'] : null;
$isRoot = (bool) ($pageData['isRoot'] ?? false);
$dynamicPage = $this->resolveDynamicPage(
$idKey,
$isRoot
);
$this->populateDynamicPage(
$dynamicPage,
$pageData,
$idKey,
$isRoot
);
$dynamicPage->saveQuietly();
}
}
private function resolveDynamicPage(?string $idKey, bool $isRoot): DynamicPage
{
$dynamicPage = null;
if ($isRoot) {
$dynamicPage = DynamicPage::withTrashed()
->where('isRoot', true)
->first();
}
if (! $dynamicPage && $idKey) {
$dynamicPage = DynamicPage::withTrashed()
->where('id_key', $idKey)
->first();
}
$page = $dynamicPage ?? new DynamicPage();
$page->deleted_at = null;
return $page;
}
/**
* @param array<string, mixed> $pageData
*/
private function populateDynamicPage(
DynamicPage $page,
array $pageData,
?string $idKey,
bool $isRoot
): void {
$configId = null;
if (! empty($pageData['config_view']) && is_string($pageData['config_view'])) {
$configId = PageConfig::withTrashed()
->where('view', $pageData['config_view'])->value('id');
}
$page->id_key = (string) $idKey;
$page->config_id = is_numeric($configId) ? (int) $configId : null;
$page->page_id = null;
$page->status = isset($pageData['status']) ?
PageStatusEnum::from((int) $pageData['status']) : PageStatusEnum::published;
$page->isLocked = (bool) ($pageData['isLocked'] ?? true);
$page->isRoot = $isRoot;
if (isset($pageData['title']) && is_array($pageData['title'])) {
/** @var array<string, string> $title */
$title = $pageData['title'];
$page->setTranslations(
'title',
$title
);
}
if (isset($pageData['slug']) && is_array($pageData['slug'])) {
/** @var array<string, string> $slug */
$slug = $pageData['slug'];
$page->setTranslations(
'slug',
$slug
);
}
if (isset($pageData['content']) && is_array($pageData['content'])) {
/** @var array<string, mixed> $content */
$content = $pageData['content'];
$page->setTranslations(
'content',
$content
);
}
}
}