13 public const PERMALINK =
'dbxki-anleitung-content-seite-mit-ki';
14 public const TITLE =
'Content-Seite mit ChatGPT oder DeepSeek erstellen';
15 public const TPL =
'cms-anleitung-ki-content-seite';
16 public const CONFIG_KEY =
'cms_anleitung_provision_version';
19 public static function run(): void {
21 if (
$version >= self::PROVISION_VERSION) {
26 self::markProvisioned();
31 $result = array(
'created' => 0,
'updated' => 0,
'folder_id' => 0,
'page_id' => 0,
'permalink' => self::
PERMALINK,
'errors' => array());
33 $db =
dbx()->get_system_obj(
'dbxDB');
34 if (!is_object(
$db) || !
$db->connect_db_server(
'dbx|dbxContent.db3')) {
35 $result[
'errors'][] =
'CMS-Datenbank nicht erreichbar.';
39 dbxContentLngSync::ensureSchema(
$db);
41 $folderId = self::ensureHelpFolder(
$db,
$result);
45 $result[
'folder_id'] = $folderId;
49 $result[
'errors'][] =
'Anleitungs-Template fehlt: ' . self::TPL .
'.htm';
53 $cms =
dbx()->get_include_obj(
'dbxKiCmsService',
'dbxKi');
54 $lng = dbxContentLng::current();
55 $dd = dbxContentLng::ddContent(
$lng);
56 $existing =
$db->select1(
$dd, array(
'permalink' => self::PERMALINK),
'id', 0);
57 $existingId = is_array($existing) ? (int) ($existing[
'id'] ?? 0) : 0;
60 if ($existingId > 0) {
65 'title' => self::TITLE,
66 'group_read' =>
'admin',
68 $plan =
$cms->bundleBuildPlan(
'page.update', $params);
69 $exec =
$cms->bundleExecutePlan(
'page.update', $params,
$plan);
71 $result[
'page_id'] = (int) ($exec[
'id'] ?? $existingId);
75 'folder_id' => $folderId,
76 'title' => self::TITLE,
77 'permalink' => self::PERMALINK,
78 'template' =>
'parent',
80 'group_read' =>
'admin',
81 'description' =>
'Schritt-fuer-Schritt-Anleitung: Neue CMS-Content-Seite mit ChatGPT, DeepSeek und dbxKi-Bundle erstellen.',
82 'keywords' =>
'dbxKi, ChatGPT, DeepSeek, CMS, Bundle, KI',
85 $plan =
$cms->bundleBuildPlan(
'page.create', $params);
86 $exec =
$cms->bundleExecutePlan(
'page.create', $params,
$plan);
88 $result[
'page_id'] = (int) ($exec[
'id'] ?? 0);
90 }
catch (\Throwable $e) {
91 $result[
'errors'][] = $e->getMessage();
96 dbxContentPermalinkIndex::upsertPage(
$result[
'page_id'], self::PERMALINK,
'admin', 1,
$lng);
99 dbxContentPageCache::invalidateAll();
108 private static function markProvisioned(): void {
113 $config[self::CONFIG_KEY] = self::PROVISION_VERSION;
117 private static function loadTemplateHtml(): string {
118 $path = dirname(__DIR__) .
'/tpl/htm/' . self::TPL .
'.htm';
119 if (!is_file($path) || !is_readable($path)) {
122 $html = file_get_contents($path);
126 private static function ensureHelpFolder(
$db, array &
$result): int {
127 $outsideId = self::findFolderByName(
$db,
'outside', 0);
128 if ($outsideId <= 0) {
129 $outsideId = self::insertFolder(
$db,
'outside', 0,
'admin');
131 if ($outsideId <= 0) {
132 $result[
'errors'][] =
'Ordner outside konnte nicht angelegt werden.';
136 $helpId = self::findFolderByName(
$db,
'help', $outsideId);
138 $helpId = self::insertFolder(
$db,
'help', $outsideId,
'admin');
141 $result[
'errors'][] =
'Ordner help konnte nicht angelegt werden.';
148 private static function findFolderByName(
$db,
string $name,
int $parentId): int {
149 $dd = dbxContentLng::ddFolder();
150 $where =
"name = '" . str_replace(
"'",
"''", trim($name)) .
"' AND parent_id = " . (int) $parentId;
151 $rows =
$db->select(
$dd, $where,
'id',
'id',
'ASC',
'', 1, 0, 0);
152 if (!is_array(
$rows) || !isset(
$rows[0][
'id'])) {
155 return (
int)
$rows[0][
'id'];
158 private static function insertFolder(
$db,
string $name,
int $parentId,
string $groupRead): int {
159 $cms =
dbx()->get_include_obj(
'dbxKiCmsService',
'dbxKi');
161 'lng' => dbxContentLng::current(),
163 'parent_id' => $parentId,
164 'group_read' => $groupRead,
165 'template' => $parentId > 0 ?
'parent' :
'c-content',
167 $plan =
$cms->bundleBuildPlan(
'folder.create', $params);
168 $exec =
$cms->bundleExecutePlan(
'folder.create', $params,
$plan);
169 return (
int) ($exec[
'id'] ?? 0);