diff --git a/bin/Controls/backend/ExternalContent.html b/bin/Controls/backend/ExternalContent.html new file mode 100644 index 0000000000000000000000000000000000000000..1977532d5a6e332fdd5c197c9c325cb6cffbb578 --- /dev/null +++ b/bin/Controls/backend/ExternalContent.html @@ -0,0 +1,71 @@ +<table class="data-table data-table-flexbox" style="margin-bottom: 0; border: none;"> + <tbody> + <tr> + <td style="padding-inline: 0;"> + <label class="field-container"> + <span class="field-container-item"> + {{typeTitle}} + </span> + <select name="externalContent-type" style="width: 100%;" data-ref="select"> + <option value="text">{{typeOptionText}}</option> + <option value="iframe">{{typeOptionIFrame}}</option> + </select> + </label> + </td> + </tr> + + <tr data-ref="variable-option" data-type="text"> + <td style="padding-inline: 0;"> + <label class="field-container"> + <span class="field-container-item"> + {{textTitle}} + </span> + <textarea name="externalContent-text" class="field-container-field field-description" + rows="12"></textarea> + </label> + </td> + </tr> + + <tr data-ref="variable-option" data-type="iframe"> + <td style="padding-inline: 0;"> + <label class="field-container"> + <span class="field-container-item"> + {{urlTitle}} + </span> + <input name="externalContent-url" class="field-container-field field-title"/> + </label> + </td> + </tr> + <tr data-ref="variable-option" data-type="iframe"> + <td style="padding-inline: 0;"> + <label class="field-container"> + <span class="field-container-item"> + {{heightDesktopTitle}} + </span> + <input name="externalContent-height_desktop" class="field-container-field field-text"/> + </label> + </td> + </tr> + <tr data-ref="variable-option" data-type="iframe"> + <td style="padding-top: 0; padding-inline: 0"> + <div class="description"> {{{heightDesktopDesc}}}</div> + </td> + </tr> + <tr data-ref="variable-option" data-type="iframe"> + <td style="padding-inline: 0;"> + <label class="field-container"> + <div class="field-container-item"> + {{heightMobileTitle}} + + </div> + <input name="externalContent-height_mobile" class="field-container-field field-text"/> + </label> + </td> + </tr> + <tr data-ref="variable-option" data-type="iframe"> + <td style="padding-top: 0; padding-inline: 0"> + <div class="description"> {{{heightMobileDesc}}}</div> + </td> + </tr> + </tbody> +</table> diff --git a/bin/Controls/backend/ExternalContent.js b/bin/Controls/backend/ExternalContent.js new file mode 100644 index 0000000000000000000000000000000000000000..446e6aa29ac0073e8a18fcf7de1797f67e0980ab --- /dev/null +++ b/bin/Controls/backend/ExternalContent.js @@ -0,0 +1,167 @@ +/** + * + * @module package/quiqqer/sitetypes/bin/Controls/backend/ExternalContent + * @author Michael Danielczok + * + */ + +define('package/quiqqer/sitetypes/bin/Controls/backend/ExternalContent', [ + + 'qui/controls/Control', + 'Locale', + 'Mustache', + + 'text!package/quiqqer/sitetypes/bin/Controls/backend/ExternalContent.html', + +], function( + QUIControl, + QUILocale, + Mustache, + template +) { + 'use strict'; + + const lg = 'quiqqer/sitetypes'; + + return new Class({ + + Extends: QUIControl, + Type: 'package/quiqqer/sitetypes/bin/Controls/backend/ExternalContent', + + Binds: [ + '$onImport' + ], + + initialize: function(options) { + this.parent(options); + + this.Select = null; + this.variableOptionsNode = null; // NodeList of <tr> elements + this.data = {}; + + this.addEvents({ + onImport: this.$onImport + }); + }, + + /** + * event: on import + */ + $onImport: function() { + this.$Input = this.getElm(); + + this.$loadDataFromInput(); + this.$renderLayout(); + + this.Select.addEventListener('change', (e) => { + this.selectedType = e.target.value; + this.toggleVariableOption(); + }); + + this.$setValuesToInputs(); + + this.variableOptionsNode = this.$Elm.querySelectorAll('[data-ref="variable-option"]'); + + this.toggleVariableOption(); + }, + + /** + * Loads data from the hidden input field. + */ + $loadDataFromInput: function () { + const jsonData = this.$Input.get('value'); + + if (jsonData) { + try { + this.data = JSON.parse(jsonData); + } catch (e) { + this.data = {}; + console.warn('Invalid JSON in ExternalContent input:', e); + } + } else { + this.data = {}; + } + }, + + /** + * Generates the HTML structure of the component. + */ + $renderLayout: function () { + this.$Elm = new Element('div', { + 'class': 'quiqqer-sitetypes-backend-settings-externalContent', + styles: { + width: '100%' + } + }).wraps(this.$Input); + + const prefix = 'sitetypes.externalContent.settings.'; + const texts = { + typeTitle: QUILocale.get(lg, prefix + 'type.title'), + typeOptionText: QUILocale.get(lg, prefix + 'type.option.text'), + typeOptionIFrame: QUILocale.get(lg, prefix + 'type.option.iframe'), + textTitle: QUILocale.get(lg, prefix + 'text.title'), + urlTitle: QUILocale.get(lg, prefix + 'url.title'), + heightDesktopTitle: QUILocale.get(lg, prefix + 'heightDesktop.title'), + heightDesktopDesc: QUILocale.get(lg, prefix + 'heightDesktop.desc'), + heightMobileTitle: QUILocale.get(lg, prefix + 'heightMobile.title'), + heightMobileDesc: QUILocale.get(lg, prefix + 'heightMobile.desc'), + }; + + new Element('div', { + html: Mustache.render(template, texts) + }).inject(this.$Elm); + + this.Select = this.$Elm.querySelector('[data-ref="select"]'); + this.selectedType = 'text'; + }, + + /** + * Sets the values of the input fields, selects and textareas based on the current data. + */ + $setValuesToInputs: function () { + const inputs = this.$Elm.getElements('input, select, textarea'); + + inputs.each((input) => { + input.addEventListener('blur', this.onInputBlur.bind(this)); + + const name = input.getAttribute('name'); + const value = this.data[name]; + + if (!value) return; + + if (input.type === 'select-one') { + input.value = value; + this.selectedType = value; + } else { + input.set('value', value); + } + }); + }, + + /** + * Toggles the visibility of variable options based on the selected type. + */ + toggleVariableOption: function() { + this.variableOptionsNode.forEach((Node) => { + if (Node.getAttribute('data-type') === this.selectedType) { + Node.style.display = null; + } else { + Node.style.display = 'none'; + } + }); + }, + + /** + * Handles the blur event of input fields, selects and textareas. + * Updates the data object with the new value and sets the hidden input field. + * + * @param {Event} event - The blur event object. + */ + onInputBlur: function(event) { + const input = event.target; + this.data[input.getAttribute('name')] = input.get('value'); + const jsonData = JSON.stringify(this.data); + this.$Input.set('value', jsonData); + } + }); +}); diff --git a/locale.xml b/locale.xml index 4c3b4ef8100405064b87985572342dfa56090489..2684f2b12b00205b6fb8f5644ce7b03006815769 100644 --- a/locale.xml +++ b/locale.xml @@ -34,13 +34,13 @@ Haben Sie z.B Ihre Community auf einer externen Webseite, leiten Sie den Nutzer von Ihrer Weiterleitungs-Seite "Community" auf die externe Seite um.]]></de> <en><![CDATA[]]></en> </locale> - <locale name="admin.types.iframe"> - <de><![CDATA[iFrame]]></de> - <en><![CDATA[iFrame]]></en> + <locale name="admin.types.externalContent"> + <de><![CDATA[Externer Inhalt]]></de> + <en><![CDATA[External content]]></en> </locale> - <locale name="admin.types.iframe.description"> - <de><![CDATA[Ein iFrame-Seitentyp ermöglicht es, eine externe Webseite oder ein anderes HTML-Dokument innerhalb einer eigenen Webseite zu laden und anzuzeigen.]]></de> - <en><![CDATA[A page type of iFrame allows you to load and display an external website or another HTML document within your own website.]]></en> + <locale name="admin.types.externalContent.description"> + <de><![CDATA[Der Seitentyp ermöglicht es, eine externe Webseite oder ein anderes HTML-Dokument innerhalb einer eigenen Webseite zu laden und anzuzeigen.]]></de> + <en><![CDATA[This site type allows you to load and display an external website or another HTML document within your own website.]]></en> </locale> <locale name="quiqqer/sitetypes:types/list.title"> <de><![CDATA[Standard-Liste]]></de> @@ -127,6 +127,47 @@ The page type automatically serves the QUIQQER system to access the content of this type and display it in a suitable place. ]]></en> </locale> + + <locale name="sitetypes.externalContent.settings.title"> + <de><![CDATA[Externer Inhalt]]></de> + <en><![CDATA[External content]]></en> + </locale> + <locale name="sitetypes.externalContent.settings.type.title"> + <de><![CDATA[Externer Inhalt Typ]]></de> + <en><![CDATA[External content type]]></en> + </locale> + <locale name="sitetypes.externalContent.settings.type.option.text"> + <de><![CDATA[Text Eingabe]]></de> + <en><![CDATA[Text input]]></en> + </locale> + <locale name="sitetypes.externalContent.settings.type.option.iframe"> + <de><![CDATA[iFrame]]></de> + <en><![CDATA[iFrame]]></en> + </locale> + <locale name="sitetypes.externalContent.settings.text.title"> + <de><![CDATA[Externer Inhalt]]></de> + <en><![CDATA[External content]]></en> + </locale> + <locale name="sitetypes.externalContent.settings.url.title"> + <de><![CDATA[Link]]></de> + <en><![CDATA[Url]]></en> + </locale> + <locale name="sitetypes.externalContent.settings.heightDesktop.title"> + <de><![CDATA[Höhe des iFrames]]></de> + <en><![CDATA[Height of iFrame]]></en> + </locale> + <locale name="sitetypes.externalContent.settings.heightDesktop.desc"> + <de><![CDATA[Erlaubt sind alle valide CSS Werte, z.B. 250px, 100%, 50vh, etc. Wert ohne Einheit wird als Pixel interpretiert.]]></de> + <en><![CDATA[Allowed are all valid CSS values, e.g. 250px, 100%, 50vh, etc. Values without a unit are interpreted as pixels.]]></en> + </locale> + <locale name="sitetypes.externalContent.settings.heightMobile.title"> + <de><![CDATA[Höhe des iFrames (auf mobilen Geräten)]]></de> + <en><![CDATA[Height of iFrame (on mobile devices)]]></en> + </locale> + <locale name="sitetypes.externalContent.settings.heightMobile.desc"> + <de><![CDATA[Erlaubt sind alle valide CSS Werte, z.B. 250px, 100%, 50vh, etc. Wert ohne Einheit wird als Pixel interpretiert.<br>Diese Einstellung ist optional. Wird kein Wert eingetragen, wird die Desktop-Einstellung verwendet.]]></de> + <en><![CDATA[Allowed are all valid CSS values, e.g. 250px, 100%, 50vh, etc. Values without a unit are interpreted as pixels.<br>This setting is optional. If no value is entered, the desktop setting is used.]]></en> + </locale> </groups> <groups name="quiqqer/sitetypes" datatype="php"> <locale name="quiqqer.sitetypes.privacypolicy.settings.title"> @@ -392,32 +433,6 @@ <en><![CDATA[Target page]]></en> </locale> - - <locale name="sitetypes.iframe.settings.title"> - <de><![CDATA[iFrame]]></de> - <en><![CDATA[iFrame]]></en> - </locale> - <locale name="sitetypes.iframe.settings.url"> - <de><![CDATA[Link]]></de> - <en><![CDATA[Url]]></en> - </locale> - <locale name="sitetypes.iframe.settings.height.desktop"> - <de><![CDATA[Höhe des iFrames]]></de> - <en><![CDATA[Height of iFrame]]></en> - </locale> - <locale name="sitetypes.iframe.settings.height.desktop.desc"> - <de><![CDATA[Erlaubt sind alle valide CSS Werte, z.B. 250px, 100%, 50vh, etc. Wert ohne Einheit wird als Pixel interpretiert.]]></de> - <en><![CDATA[Allowed are all valid CSS values, e.g. 250px, 100%, 50vh, etc. Values without a unit are interpreted as pixels.]]></en> - </locale> - <locale name="sitetypes.iframe.settings.height.mobile"> - <de><![CDATA[Höhe des iFrames (auf mobilen Geräten)]]></de> - <en><![CDATA[Height of iFrame (on mobile devices)]]></en> - </locale> - <locale name="sitetypes.iframe.settings.height.mobile.desc"> - <de><![CDATA[Erlaubt sind alle valide CSS Werte, z.B. 250px, 100%, 50vh, etc. Wert ohne Einheit wird als Pixel interpretiert.<br>Diese Einstellung ist optional. Wird kein Wert eingetragen, wird die Desktop-Einstellung verwendet.]]></de> - <en><![CDATA[Allowed are all valid CSS values, e.g. 250px, 100%, 50vh, etc. Values without a unit are interpreted as pixels.<br>This setting is optional. If no value is entered, the desktop setting is used.]]></en> - </locale> - <locale name="tpl.search.no.results"> <de><![CDATA[Keine Ergebnisse gefunden. Bitte nutzen Sie einen anderen Suchbegriff.]]></de> <en><![CDATA[No results found. Please use a different search.]]></en> diff --git a/site.xml b/site.xml index f333a5d06ee868ee967cb323bf69a69d21cf172b..493d0ebb2fd0b09f1d017c9d3fc2f2e624e77e97 100644 --- a/site.xml +++ b/site.xml @@ -260,59 +260,32 @@ </settings> </type> - <!-- iframe --> - <type type="types/iframe" icon="fa-solid fa-laptop-code"> - <locale group="quiqqer/sitetypes" var="admin.types.iframe"/> + <!-- externalContent (ifrmae) --> + <type type="types/externalContent" icon="fa-solid fa-laptop-code"> + <locale group="quiqqer/sitetypes" var="admin.types.externalContent"/> <desc> - <locale group="quiqqer/sitetypes" var="admin.types.iframe.desc"/> + <locale group="quiqqer/sitetypes" var="admin.types.externalContent.desc"/> </desc> <attributes> - <attribute>quiqqer.settings.sitetypes.iframe.url</attribute> - <attribute>quiqqer.settings.sitetypes.iframe.height.desktop</attribute> - <attribute>quiqqer.settings.sitetypes.iframe.height.mobile</attribute> + <attribute>quiqqer.settings.sitetypes.externalContent.settings</attribute> </attributes> <settings> - <category name="sitetypes-iframe-settings"> + <category name="sitetypes-externalContent-settings"> <settings> <title> <locale group="quiqqer/sitetypes" - var="sitetypes.iframe.settings.title" + var="sitetypes.externalContent.settings.title" /> </title> - <input conf="quiqqer.settings.sitetypes.iframe.url"> - <text> - <locale group="quiqqer/sitetypes" - var="sitetypes.iframe.settings.url" - /> - </text> - </input> - <input conf="quiqqer.settings.sitetypes.iframe.height.desktop"> - <text> - <locale group="quiqqer/sitetypes" - var="sitetypes.iframe.settings.height.desktop" - /> - </text> - <description> - <locale group="quiqqer/sitetypes" - var="sitetypes.iframe.settings.height.desktop.desc" - /> - </description> - </input> - <input conf="quiqqer.settings.sitetypes.iframe.height.mobile"> - <text> - <locale group="quiqqer/sitetypes" - var="sitetypes.iframe.settings.height.mobile" - /> - </text> - <description> - <locale group="quiqqer/sitetypes" - var="sitetypes.iframe.settings.height.mobile.desc" - /> - </description> + <input conf="quiqqer.settings.sitetypes.externalContent.settings" type="hidden" + data-qui="package/quiqqer/sitetypes/bin/Controls/backend/ExternalContent" + > + </input> + </settings> </category> </settings> diff --git a/src/QUI/Controls/ExternalContent.css b/src/QUI/Controls/ExternalContent.css new file mode 100644 index 0000000000000000000000000000000000000000..8a2fed73a907d460ddf7bcc30e6a7c4475f2e077 --- /dev/null +++ b/src/QUI/Controls/ExternalContent.css @@ -0,0 +1,25 @@ +.quiqqer-sitetypes-controls-externalContent { + --_qui-sitetypes-controls-externalContent-contentText-height: var(--qui-sitetypes-controls-externalContent-contentText-height, auto); +} + +/* text */ +.quiqqer-sitetypes-controls-externalContent__contentText { + height: var(--_qui-sitetypes-controls-externalContent-contentText-height); +} + +/* iframe */ +.quiqqer-sitetypes-externalContent__iframe { + display: block; + border: none; + height: var(--_qui-sitetypes-controls-externalContent-iframe-height--desktop); + width: var(--_qui-sitetypes-controls-externalContent-iframe-width); + max-width: 100%; + margin-inline: auto; +} + +@media screen and (max-width: 767px) { + + .quiqqer-sitetypes-externalContent__iframe { + height: var(--_qui-sitetypes-controls-externalContent-iframe-height--mobile); + } +} \ No newline at end of file diff --git a/src/QUI/Controls/ExternalContent.html b/src/QUI/Controls/ExternalContent.html new file mode 100644 index 0000000000000000000000000000000000000000..a32c565497bcea202e05dd9f67891f201aa2445d --- /dev/null +++ b/src/QUI/Controls/ExternalContent.html @@ -0,0 +1,21 @@ +{if $this->getAttribute('showTitle') && $this->getAttribute('frontendTitle')} + <header class="control-header"> + <h1>{$this->getAttribute('frontendTitle')}</h1> + </header> +{/if} + +{if $this->getAttribute('content') != ""} + <div class="control-content"> + {$this->getAttribute('content')} + </div> +{/if} + +<div class="control-template quiqqer-sitetypes-controls-externalContent-controlWrapper"> + {if $type === 'text' && $externalContentText} + <div class="quiqqer-sitetypes-controls-externalContent__contentText"> + {$externalContentText} + </div> + {elseif $iframeUrl} + <iframe src="{$iframeUrl}" class="quiqqer-sitetypes-externalContent__iframe"></iframe> + {/if} +</div> \ No newline at end of file diff --git a/src/QUI/Controls/InlineFrame.php b/src/QUI/Controls/ExternalContent.php similarity index 56% rename from src/QUI/Controls/InlineFrame.php rename to src/QUI/Controls/ExternalContent.php index 8b62a301ac09ea96ca24f99dc361631ab6c0d52a..f75d7b400fe7742e2e7ba7feec14c6634fef7c0e 100644 --- a/src/QUI/Controls/InlineFrame.php +++ b/src/QUI/Controls/ExternalContent.php @@ -1,7 +1,7 @@ <?php /** - * This file contains QUI\Controls\InlineFrame + * This file contains QUI\Controls\ExternalContent */ namespace QUI\Controls; @@ -17,11 +17,11 @@ use function is_array; /** - * Class InlineFrame + * Class ExternalContent * * @package quiqqer/sitetypes */ -class InlineFrame extends QUI\Control +class ExternalContent extends QUI\Control { /** * constructor @@ -32,8 +32,10 @@ public function __construct(array $attributes = []) { // default options $this->setAttributes([ - 'class' => 'quiqqer-sitetypes-controls-inlineframe', - 'url' => '', + 'class' => 'quiqqer-sitetypes-controls-externalContent', + 'externalContentType' => 'text', // 'text' or 'iframe' + 'externalContentText' => '', // it may by script tag and / or HTML Node <div> + 'iframeUrl' => '', 'iFrameHeightDesktop' => 400, 'iFrameHeightMobile' => '', 'iFrameWidth' => '100%' @@ -41,7 +43,7 @@ public function __construct(array $attributes = []) parent::__construct($attributes); - $this->addCSSFile(dirname(__FILE__) . '/InlineFrame.css'); + $this->addCSSFile(dirname(__FILE__) . '/ExternalContent.css'); $this->setAttribute('cacheable', 0); } @@ -59,7 +61,13 @@ public function getBody(): string { $Engine = QUI::getTemplateManager()->getEngine(); - if (!$this->getAttribute('url')) { + $type = $this->getAttribute('externalContentType'); + $externalContentText = $this->getAttribute('externalContentText'); + $iframeUrl = $this->getAttribute('iframeUrl'); + + if (!$externalContentText && !$iframeUrl) { + QUI\System\Log::addWarning('QUI\Controls\ExternalContent: nor externalContentText or iframeUrl found.'); + return ''; } @@ -71,13 +79,16 @@ public function getBody(): string $heightMobile = $heightDesktop; } - $this->setCustomVariable('height--desktop', $this->getValue($heightDesktop)); - $this->setCustomVariable('height--mobile', $this->getValue($heightMobile)); - $this->setCustomVariable('width', $this->getValue($width)); + $this->setCustomVariable('iframe-height--desktop', $this->getValue($heightDesktop)); + $this->setCustomVariable('iframe-height--mobile', $this->getValue($heightMobile)); + $this->setCustomVariable('iframe-width', $this->getValue($width)); + $this->setCustomVariable('iframe-width', $this->getValue($width)); $Engine->assign([ 'this' => $this, - 'url' => $this->getAttribute('url') + 'type' => $type, + 'externalContentText' => $externalContentText, + 'iframeUrl' => $iframeUrl ]); return $Engine->fetch($this->getTemplateFile()); @@ -104,10 +115,10 @@ protected function getValue($value): string /** * Set custom css variable to the control as inline style - * --_qui-sitetypes-controls-inlineFrame-$name: var(--qui-sitetypes-controls-inlineFrame-$name, $value); + * --_qui-sitetypes-controls-externalContent-$name: var(--qui-sitetypes-controls-externalContent-$name, $value); * * Example: - * --_qui-sitetypes-controls-inlineFrame-iFrameHeight--desktop: var(--qui-sitetypes-controls-inlineFrame-iFrameHeight--desktop, '50vh'); + * --_qui-sitetypes-controls-externalContent-iFrameHeight--desktop: var(--qui-sitetypes-controls-externalContent-iFrameHeight--desktop, '50vh'); * * @param string $name * @param string $value @@ -121,8 +132,8 @@ private function setCustomVariable(string $name, string $value): void } $this->setStyle( - '--_qui-sitetypes-controls-inlineFrame-' . $name, - 'var(--qui-sitetypes-controls-inlineFrame-' . $name . ', ' . $value . ')' + '--_qui-sitetypes-controls-externalContent-' . $name, + 'var(--qui-sitetypes-controls-externalContent-' . $name . ', ' . $value . ')' ); } } diff --git a/src/QUI/Controls/InlineFrame.css b/src/QUI/Controls/InlineFrame.css deleted file mode 100644 index 9a76b33df4e68863bdb063a3bd7d58292f28065e..0000000000000000000000000000000000000000 --- a/src/QUI/Controls/InlineFrame.css +++ /dev/null @@ -1,14 +0,0 @@ -.quiqqer-sitetypes-inlineframe__iframe { - display: block; - border: none; - height: var(--_qui-sitetypes-controls-inlineFrame-height--desktop); - width: var(--_qui-sitetypes-controls-inlineFrame-width); - max-width: 100%; - margin-inline: auto; -} - -@media screen and (max-width: 767px) { - .quiqqer-sitetypes-inlineframe__iframe { - height: var(--_qui-sitetypes-controls-inlineFrame-height--mobile); - } -} \ No newline at end of file diff --git a/src/QUI/Controls/InlineFrame.html b/src/QUI/Controls/InlineFrame.html deleted file mode 100644 index 6f0ef24c2013536e6fd069048fe7e929b14b6ba2..0000000000000000000000000000000000000000 --- a/src/QUI/Controls/InlineFrame.html +++ /dev/null @@ -1,15 +0,0 @@ -{if $this->getAttribute('showTitle') && $this->getAttribute('frontendTitle')} - <header class="control-header"> - <h1>{$this->getAttribute('frontendTitle')}</h1> - </header> -{/if} - -{if $this->getAttribute('content') != ""} - <div class="control-content"> - {$this->getAttribute('content')} - </div> -{/if} - -<div class="control-template quiqqer-sitetypes-controls-inlineframe-controlWrapper"> - <iframe src="{$url}" class="quiqqer-sitetypes-inlineframe__iframe"></iframe> -</div> \ No newline at end of file diff --git a/types/iframe.html b/types/externalContent.html similarity index 89% rename from types/iframe.html rename to types/externalContent.html index a34dbc363d9460f9c65c77e2482b5da5cd1a5ff7..95df18ff6d7c3631d05912298924dda38c9298da 100644 --- a/types/iframe.html +++ b/types/externalContent.html @@ -5,5 +5,5 @@ {/if} <section class="content-template"> - {$InlineFrame->create()} + {$ExternalContent->create()} </section> \ No newline at end of file diff --git a/types/externalContent.php b/types/externalContent.php new file mode 100644 index 0000000000000000000000000000000000000000..2b2b57fcb52c5d5305668344faf4dc0fc5e8aba5 --- /dev/null +++ b/types/externalContent.php @@ -0,0 +1,41 @@ +<?php + +/** + * This file contains the iframe site type + * + * @var QUI\Projects\Project $Project + * @var QUI\Projects\Site $Site + * @var QUI\Interfaces\Template\EngineInterface $Engine + * @var QUI\Template $Template + **/ + + +$settingsRaw = $Site->getAttribute('quiqqer.settings.sitetypes.externalContent.settings'); + +if (!$settingsRaw || !is_string($settingsRaw)) { + QUI\System\Log::addWarning('ExternalContent: No settings found or settings are not a valid string.'); + + return; +} + +$settings = json_decode($settingsRaw, true); + +if (json_last_error() !== JSON_ERROR_NONE || !is_array($settings)) { + QUI\System\Log::addWarning( + 'Site type external content: Failed to decode settings – JSON error: ' . json_last_error_msg() + ); + + return; +} + +$ExternalContent = new QUI\Controls\ExternalContent([ + 'externalContentType' => $settings['externalContent-type'] ?? 'text', + 'externalContentText' => $settings['externalContent-text'] ?? '', + 'iframeUrl' => $settings['externalContent-url'] ?? '', + 'iFrameHeightDesktop' => $settings['externalContent-height_desktop'] ?? null, + 'iFrameHeightMobile' => $settings['externalContent-height_mobile'] ?? null +]); + +$Engine->assign([ + 'ExternalContent' => $ExternalContent +]); diff --git a/types/iframe.php b/types/iframe.php deleted file mode 100644 index 638fb803572b7c9660f1ee5e6f14f46872c7ea4b..0000000000000000000000000000000000000000 --- a/types/iframe.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php - -/** - * This file contains the iframe site type - * - * @var QUI\Projects\Project $Project - * @var QUI\Projects\Site $Site - * @var QUI\Interfaces\Template\EngineInterface $Engine - * @var QUI\Template $Template - **/ - -$InlineFrame = new QUI\Controls\InlineFrame([ - 'url' => $Site->getAttribute('quiqqer.settings.sitetypes.iframe.url'), - 'iFrameHeightDesktop' => $Site->getAttribute('quiqqer.settings.sitetypes.iframe.height.desktop'), - 'iFrameHeightMobile' => $Site->getAttribute('quiqqer.settings.sitetypes.iframe.height.mobile'), -]); - -$Engine->assign([ - 'InlineFrame' => $InlineFrame -]);