10 private const PROVISION_VERSION = 5;
11 private const CONFIG_KEY =
'context_help_provision_version';
13 public static function run(): void {
14 $version = (int)
dbx()->get_config(
'dbxContent', self::CONFIG_KEY);
15 if ($version >= self::PROVISION_VERSION) {
19 $db =
dbx()->get_system_obj(
'dbxDB');
20 if (!is_object(
$db)) {
30 if (empty(
$result[
'errors']) && ((
int) (
$result[
'created'] ?? 0) + (
int) (
$result[
'updated'] ?? 0)) > 0) {
31 self::markProvisioned();
36 $result = array(
'folders' => 0,
'created' => 0,
'updated' => 0,
'skipped' => 0,
'errors' => array());
37 if (!is_object(
$db)) {
38 $result[
'errors'][] =
'Keine DB-Verbindung.';
42 $helpFolderId = self::ensureHelpFolder(
$db,
$result);
43 if ($helpFolderId <= 0) {
47 $help = new \dbx\dbxAdmin\dbxAdminHelp();
49 $contextHelp =
new dbxContentContextHelp();
50 $tplDir = dirname(__DIR__, 2) .
'/dbxAdmin/tpl/htm/';
52 $sorter = self::nextContentSorter(
$db, $helpFolderId);
54 foreach ($help->topics() as $topic => $meta) {
55 if (!is_array($meta)) {
59 $permalink = $contextHelp->permalinkForTopic((
string) $topic);
60 if ($permalink ===
'') {
61 $result[
'errors'][] =
'Permalink fuer Topic ' . $topic .
' leer.';
65 $tplName = trim((
string) ($meta[
'tpl'] ??
''));
66 $title = trim((
string) ($meta[
'title'] ?? $topic));
67 $content = self::loadTemplateHtml($tplDir, $tplName);
68 if ($content ===
'') {
69 $result[
'errors'][] =
'Template fehlt: ' . $tplName;
73 $existing =
$db->select1($dd, array(
'permalink' => $permalink),
'id,content', 0);
74 $groupRead = in_array($topic, array(
'consent_privacy',
'impressum'),
true) ?
'*' :
'admin';
75 $pageData = self::pageData($helpFolderId, $title, $permalink, $content, $sorter, $groupRead);
77 if (is_array($existing) && (
int) ($existing[
'id'] ?? 0) > 0) {
78 $id = (int) $existing[
'id'];
79 unset($pageData[
'sorter']);
80 if (
$db->update($dd, $pageData, $id, 0, 1, 1, 0) === 1) {
82 self::syncPermalinkIndex(
$db, $id, $permalink, $groupRead);
85 $result[
'errors'][] =
'Update fehlgeschlagen: ' . $permalink;
90 if (
$db->insert($dd, $pageData, 0, 1, 0, 0) !== 1) {
91 $result[
'errors'][] =
'Insert fehlgeschlagen: ' . $permalink;
95 $id = (int)
$db->get_insert_id();
97 $result[
'errors'][] =
'Keine ID nach Insert: ' . $permalink;
102 self::syncPermalinkIndex(
$db, $id, $permalink, $groupRead);
104 $sorter = self::nextSorterAfter($sorter);
114 private static function markProvisioned(): void {
119 $config[self::CONFIG_KEY] = self::PROVISION_VERSION;
123 private static function ensureHelpFolder(
$db, array &
$result): int {
124 $outsideId = self::findFolderByName(
$db,
'outside', 0);
125 if ($outsideId <= 0) {
126 $outsideId = self::insertFolder(
$db,
'outside', 0,
'admin',
$result);
128 if ($outsideId <= 0) {
129 $result[
'errors'][] =
'Ordner outside konnte nicht angelegt werden.';
133 $helpId = self::findFolderByName(
$db,
'help', $outsideId);
135 $helpId = self::insertFolder(
$db,
'help', $outsideId,
'parent',
$result);
138 $result[
'errors'][] =
'Ordner help konnte nicht angelegt werden.';
145 private static function findFolderByName(
$db,
string $name,
int $parentId): int {
146 $dd = dbxContentLng::ddFolder();
148 $parentId = (int) $parentId;
149 $where =
"name = '" . str_replace(
"'",
"''", $name) .
"' AND parent_id = " . $parentId;
150 $rows =
$db->select($dd, $where,
'id',
'id',
'ASC',
'', 1, 0, 0);
151 if (!is_array($rows) || !isset($rows[0][
'id'])) {
154 return (
int) $rows[0][
'id'];
157 private static function insertFolder(
$db,
string $name,
int $parentId,
string $groupRead, array &
$result): int {
158 $parentId = (int) $parentId;
159 $sorter = self::nextFolderSorter(
$db, $parentId);
162 'parent_id' => $parentId,
164 'group_read' => $groupRead,
165 'template' => $parentId > 0 ?
'parent' :
'c-content',
166 'hero_template' => $parentId > 0 ?
'parent' :
'image-hero',
167 'hero_image_id' =>
'parent',
168 'hero_margin_top' =>
'parent',
169 'hero_height' =>
'parent',
170 'hero_variant' =>
'parent',
171 'hero_sticky' =>
'parent',
172 'hero_scroll_layer' =>
'parent',
175 if (
$db->insert(dbxContentLng::ddFolder(), $data, 0, 1, 0, 0) !== 1) {
179 $id = (int)
$db->get_insert_id();
181 dbxContentLngSync::afterFolderSave(
$db, $id,
true);
187 private static function pageData(
int $folderId,
string $title,
string $permalink,
string $content,
string $sorter,
string $groupRead =
'admin'): array {
190 'folder' => $folderId,
191 'title' => substr($title, 0, 254),
192 'permalink' => substr($permalink, 0, 254),
195 'group_read' => $groupRead,
197 'template' =>
'parent',
198 'hero_template' =>
'parent',
199 'hero_image_id' =>
'parent',
200 'hero_margin_top' =>
'parent',
201 'hero_height' =>
'parent',
202 'hero_variant' =>
'parent',
203 'hero_sticky' =>
'parent',
204 'hero_scroll_layer' =>
'parent',
205 'gallery_template' =>
'image-gallery',
206 'gallery_visible_count' =>
'3',
207 'gallery_image_size' =>
'original',
208 'gallery_lightbox_width' =>
'100vw',
209 'gallery_overflow' =>
'grid',
210 'gallery_click_behavior' =>
'lightbox',
211 'content' => $content,
215 private static function loadTemplateHtml(
string $tplDir,
string $tplName): string {
216 $tplName = trim($tplName);
217 if ($tplName ===
'') {
220 $path = rtrim($tplDir,
'/\\') . DIRECTORY_SEPARATOR . $tplName .
'.htm';
221 if (!is_file($path) || !is_readable($path)) {
224 $html = file_get_contents($path);
225 return is_string($html) ? trim($html) :
'';
228 private static function syncPermalinkIndex(
$db,
int $cid,
string $permalink,
string $rights =
'admin'): void {
230 $permalink = dbxContentPermalinkIndex::normalizePermalink($permalink);
231 if ($cid <= 0 || $permalink ===
'') {
234 dbxContentPermalinkIndex::upsertPage($cid, $permalink, $rights, 1);
237 private static function nextContentSorter(
$db,
int $folderId): string {
238 $folderId = (int) $folderId;
239 $rows =
$db->select(dbxContentLng::ddContent(),
'folder = ' . $folderId,
'sorter',
'sorter,id',
'DESC',
'', 1, 0, 0);
241 if (is_array($rows) && isset($rows[0]) && is_array($rows[0])) {
242 $max = (int) ($rows[0][
'sorter'] ?? 0);
244 return sprintf(
'%04d', $max + 10);
247 private static function nextFolderSorter(
$db,
int $parentId): string {
248 $parentId = (int) $parentId;
249 $rows =
$db->select(dbxContentLng::ddFolder(),
'parent_id = ' . $parentId,
'sorter',
'sorter,id',
'DESC',
'', 1, 0, 0);
251 if (is_array($rows) && isset($rows[0]) && is_array($rows[0])) {
252 $max = (int) ($rows[0][
'sorter'] ?? 0);
254 return sprintf(
'%04d', $max + 10);
257 private static function nextSorterAfter(
string $sorter): string {
258 $num = (int) $sorter;
259 return sprintf(
'%04d', $num + 10);
static ddContent(string $lng='')
static afterPageSave($db, int $id, bool $isNew=false)
if(! $db->connect_db_server($server)) $result