VvebOIDC/admin/controller/editor/reusable.php

134 lines
3.7 KiB
PHP

<?php
/**
* Vvveb
*
* Copyright (C) 2022 Ziadin Givan
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Vvveb\Controller\Editor;
use function Vvveb\__;
use Vvveb\Controller\Base;
use function Vvveb\humanReadable;
use function Vvveb\sanitizeFileName;
use function Vvveb\slugify;
use Vvveb\System\Sites;
class Reusable extends Base {
private $sectionTemplate = <<<TPL
Vvveb.Sections.add("reusable/{name}", {
name: "{title}",
//image: Vvveb.themeBaseUrl + "/../../media/img/logo-small.png",
image: "img/logo-small.png",
html: `{content}`
});
Vvveb.SectionsGroup['Reusable'].push("reusable/{name}");
TPL;
private $blockTemplate = <<<TPL
Vvveb.Blocks.add("reusable/{name}", {
name: "{title}",
//image: Vvveb.themeBaseUrl + "/../../media/img/logo-small.png",
image: "img/logo-small.png",
html: `{content}`
});
Vvveb.BlocksGroup['Reusable'].push("reusable/{name}");
TPL;
private function getThemeFolder() {
return DIR_THEMES . ($this->request->get['theme'] ?? Sites::getTheme(SITE_ID) ?? 'default');
}
private function regenerate($type) {
$themeFolder = $this->getThemeFolder();
$folder = $themeFolder . DS . $type . 's' . DS;
$htmlFolder = $folder . 'reusable' . DS;
$template = ($type == 'section') ? $this->sectionTemplate : $this->blockTemplate;
$js = '';
foreach (scandir($htmlFolder) as $file) {
if (strpos($file, '.html') === false) {
continue;
}
$name = str_replace('.html','', $file);
$title = humanReadable($name);
$content = file_get_contents($htmlFolder . DS . $file);
$data = compact('name', 'title', 'content');
$reusable = $template;
foreach ($data as $key => $value) {
$reusable = str_replace('{' . $key . '}', $value, $reusable);
}
$js .= $reusable;
}
$jsFile = $folder . $type . 's.js';
$typeName = ucfirst($type);
$jsContent = '';
if (file_exists($jsFile)) {
$jsContent = file_get_contents($jsFile);
//remove old reusable
$regex = '\s*Vvveb\.\w+?\.add\([\'"]reusable.+?`\s*\}\);?|' .
'\s*Vvveb\.\w+?Group\[["\']Reusable["\']\]\s*\.push\([^\)]+\);?\s*|' .
'\s*Vvveb\.\w+?Group\[["\']Reusable["\']\]\s*=\s*\[[^\]]*?\];?\s*';
$jsContent = preg_replace("/$regex/ms", '', $jsContent);
}
//append new reusable
$jsContent = $jsContent . "\n\nVvveb." . $typeName . "sGroup[\"Reusable\"] = [];\n" . $js;
return file_put_contents($jsFile, $jsContent);
}
function save() {
$name = slugify(sanitizeFileName($this->request->post['name']));
$type = $this->request->post['type'];
$html = $this->request->post['html'];
$message = ['success' => false, 'message' => __('Error saving!')];
if (($type == 'section' || $type == 'block') && $html) {
$themeFolder = $this->getThemeFolder();
$folder = $themeFolder . DS . $type . 's' . DS . 'reusable' . DS;
$file = "$name.html";
@mkdir($folder, 0755 & ~umask(), true);
if (file_put_contents($folder . $file, $html)) {
if ($this->regenerate($type)) {
$message = ['success' => true, 'message' => __('Element saved!')];
}
} else {
}
}
$this->response->setType('json');
$this->response->output($message);
}
}