- Introduced ImportDynamicPagesSeeder for dynamic pages. - Added JSON files for dynamic pages and page configurations.
169 lines
5.2 KiB
PHP
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
|
|
);
|
|
}
|
|
}
|
|
}
|