diff --git a/ajax/backend/independent/get.php b/ajax/backend/independent/get.php index bf177742c557a228d777ecd6677e7c6363f4b54f..f7ec12162f7fc70bd02cc1ebfe7d46ace24ed36f 100644 --- a/ajax/backend/independent/get.php +++ b/ajax/backend/independent/get.php @@ -20,6 +20,10 @@ function parseChildren(&$data) } foreach ($data['children'] as $key => $entry) { + if (!class_exists($entry['type'])) { + continue; + } + /* @var $Item \QUI\Menu\Independent\Items\AbstractMenuItem */ $Item = new $entry['type']($entry); $icon = QUI\Menu\Independent\Items\Site::itemIcon(); // default diff --git a/bin/Controls/Independent/Items/Anchor.html b/bin/Controls/Independent/Items/Anchor.html new file mode 100644 index 0000000000000000000000000000000000000000..9cbb3eac11b649a8bc5088cd61f7857abd3fd1ed --- /dev/null +++ b/bin/Controls/Independent/Items/Anchor.html @@ -0,0 +1,59 @@ +<form> + + <table class="data-table data-table-flexbox site-data"> + <tbody> + <tr> + <td> + <label class="field-container"> + <span class="field-container-item"> + Titel + </span> + <input class="field-container-field" + type="text" + name="title" + data-qui="controls/lang/InputMultiLang" + /> + </label> + </td> + </tr> + <tr> + <td> + <label class="field-container"> + <span class="field-container-item"> + Name + </span> + <input class="field-container-field" + type="text" + name="name" + data-qui="controls/lang/InputMultiLang" + /> + </label> + </td> + </tr> + <tr> + <td> + <label class="field-container"> + <span class="field-container-item"> + Icon + </span> + <input class="field-container-field" + type="text" + name="icon" + data-qui="controls/projects/project/media/Input" + data-qui-options-cssclasses="1" + /> + </label> + </td> + </tr> + <tr> + <td> + <label class="field-container"> + <span class="field-container-item"> + Anker + </span> + <input class="field-container-field" type="text" name="url"/> + </label> + </td> + </tr> + </table> +</form> diff --git a/bin/Controls/Independent/Items/Anchor.js b/bin/Controls/Independent/Items/Anchor.js index e39ede9cfdb2b891c1e2881ff79a42200e0dc143..fb02007389a7f29274b46592f96c331faf3c7866 100644 --- a/bin/Controls/Independent/Items/Anchor.js +++ b/bin/Controls/Independent/Items/Anchor.js @@ -5,9 +5,12 @@ define('package/quiqqer/menu/bin/Controls/Independent/Items/Anchor', [ 'qui/QUI', - 'qui/controls/Control' + 'qui/controls/Control', + 'Mustache', -], function (QUI, QUIControl) { + 'text!package/quiqqer/menu/bin/Controls/Independent/Items/Anchor.html' + +], function (QUI, QUIControl, Mustache, template) { "use strict"; return new Class({ @@ -28,8 +31,65 @@ define('package/quiqqer/menu/bin/Controls/Independent/Items/Anchor', [ }, $onInject: function () { - this.getElm().addClass(); this.getElm().set('data-qui', this.getType()); + this.getElm().set('html', Mustache.render(template, {})); + + let title = this.getAttribute('title'); + let icon = this.getAttribute('icon'); + let data = this.getAttribute('data'); + + try { + title = JSON.decode(title); + } catch (e) { + } + + try { + data = JSON.decode(data); + } catch (e) { + } + + if (!data) { + data = {}; + } + + if (typeof data.url === 'undefined') { + data.url = ''; + } + + if (typeof data.name === 'undefined') { + data.name = ''; + } + + this.getElm().getElement('[name="icon"]').set('value', icon); + this.getElm().getElement('[name="url"]').set('value', data.url); + + QUI.parse(this.getElm()).then(() => { + this.$Title = QUI.Controls.getById( + this.getElm().getElement('[name="title"]').get('data-quiid') + ); + + this.$Name = QUI.Controls.getById( + this.getElm().getElement('[name="name"]').get('data-quiid') + ); + + this.$Title.setData(title); + this.$Name.setData(data.name); + + this.fireEvent('load'); + }); + }, + + save: function () { + const Form = this.getElm().getElement('form'); + + return { + title: this.$Title.getValue(), + icon : Form.elements.icon.value, + data : { + url : Form.elements.url.value, + name: this.$Name.getValue() + } + }; } }); }); \ No newline at end of file diff --git a/bin/Controls/Independent/Items/Custom.js b/bin/Controls/Independent/Items/Custom.js index 76f1a77eaba13959f045db7a26883b65c1804ba3..430d69523f24a73797720d0439f596e8893e7a48 100644 --- a/bin/Controls/Independent/Items/Custom.js +++ b/bin/Controls/Independent/Items/Custom.js @@ -1,6 +1,8 @@ /** * @module package/quiqqer/menu/bin/Controls/Independent/Items/Custom * @author www.pcsg.de + * + * @todo click speichern -> js + textarea */ define('package/quiqqer/menu/bin/Controls/Independent/Items/Custom', [ diff --git a/bin/Controls/Independent/Items/Url.html b/bin/Controls/Independent/Items/Url.html new file mode 100644 index 0000000000000000000000000000000000000000..a9b2a084e980b0ff2dba6f4a7b3a334bd49b0808 --- /dev/null +++ b/bin/Controls/Independent/Items/Url.html @@ -0,0 +1,59 @@ +<form> + + <table class="data-table data-table-flexbox site-data"> + <tbody> + <tr> + <td> + <label class="field-container"> + <span class="field-container-item"> + Titel + </span> + <input class="field-container-field" + type="text" + name="title" + data-qui="controls/lang/InputMultiLang" + /> + </label> + </td> + </tr> + <tr> + <td> + <label class="field-container"> + <span class="field-container-item"> + Name + </span> + <input class="field-container-field" + type="text" + name="name" + data-qui="controls/lang/InputMultiLang" + /> + </label> + </td> + </tr> + <tr> + <td> + <label class="field-container"> + <span class="field-container-item"> + Icon + </span> + <input class="field-container-field" + type="text" + name="icon" + data-qui="controls/projects/project/media/Input" + data-qui-options-cssclasses="1" + /> + </label> + </td> + </tr> + <tr> + <td> + <label class="field-container"> + <span class="field-container-item"> + URL + </span> + <input class="field-container-field" type="text" name="url"/> + </label> + </td> + </tr> + </table> +</form> diff --git a/bin/Controls/Independent/Items/Url.js b/bin/Controls/Independent/Items/Url.js index 34abf6cad34de04a9d5ade3558f96d8ce0737dfe..c61c5c3f83ae9cad6b4e9668fdd9071a43f7a65f 100644 --- a/bin/Controls/Independent/Items/Url.js +++ b/bin/Controls/Independent/Items/Url.js @@ -5,9 +5,12 @@ define('package/quiqqer/menu/bin/Controls/Independent/Items/Url', [ 'qui/QUI', - 'qui/controls/Control' + 'qui/controls/Control', + 'Mustache', -], function (QUI, QUIControl) { + 'text!package/quiqqer/menu/bin/Controls/Independent/Items/Url.html' + +], function (QUI, QUIControl, Mustache, template) { "use strict"; return new Class({ @@ -28,9 +31,65 @@ define('package/quiqqer/menu/bin/Controls/Independent/Items/Url', [ }, $onInject: function () { - this.getElm().addClass(); this.getElm().set('data-qui', this.getType()); - } + this.getElm().set('html', Mustache.render(template, {})); + + let title = this.getAttribute('title'); + let icon = this.getAttribute('icon'); + let data = this.getAttribute('data'); + + try { + title = JSON.decode(title); + } catch (e) { + } + + try { + data = JSON.decode(data); + } catch (e) { + } + + if (!data) { + data = {}; + } + + if (typeof data.url === 'undefined') { + data.url = ''; + } + + if (typeof data.name === 'undefined') { + data.name = ''; + } + + this.getElm().getElement('[name="icon"]').set('value', icon); + this.getElm().getElement('[name="url"]').set('value', data.url); + QUI.parse(this.getElm()).then(() => { + this.$Title = QUI.Controls.getById( + this.getElm().getElement('[name="title"]').get('data-quiid') + ); + + this.$Name = QUI.Controls.getById( + this.getElm().getElement('[name="name"]').get('data-quiid') + ); + + this.$Title.setData(title); + this.$Name.setData(data.name); + + this.fireEvent('load'); + }); + }, + + save: function () { + const Form = this.getElm().getElement('form'); + + return { + title: this.$Title.getValue(), + icon : Form.elements.icon.value, + data : { + url : Form.elements.url.value, + name: this.$Name.getValue() + } + }; + } }); }); \ No newline at end of file diff --git a/database.xml b/database.xml new file mode 100644 index 0000000000000000000000000000000000000000..555e4fbfd0bf9ffd3a9dc38d12faa81af8c40cad --- /dev/null +++ b/database.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<database> + <global> + <table name="menus"> + <field type="BIGINT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY">id</field> + <field type="TEXT DEFAULT NULL">title</field> + <field type="TEXT DEFAULT NULL">workingTitle</field> + <field type="TEXT NULL">data</field> + </table> + </global> +</database> diff --git a/src/QUI/Menu/Independent/Items/Anchor.php b/src/QUI/Menu/Independent/Items/Anchor.php index 451e99b87556e1c4d803b2d2980adcc1e4f0830c..862f3d830a6e7c5ac84b4ff8700f620b3dd69f15 100644 --- a/src/QUI/Menu/Independent/Items/Anchor.php +++ b/src/QUI/Menu/Independent/Items/Anchor.php @@ -4,8 +4,50 @@ use QUI; +use function is_array; + +/** + * menu item to an anchor + */ class Anchor extends AbstractMenuItem { + //region frontend item methods + + /** + * @return string + */ + public function getUrl(): string + { + $data = $this->getCustomData(); + + if (is_array($data) && isset($data['url'])) { + return $data['url']; + } + + return ''; + } + + /** + * @return string + */ + public function getName(): string + { + $data = $this->getCustomData(); + + if (is_array($data) && isset($data['name'])) { + return $data['name']; + } + + return ''; + } + + //endregion + + //region type stuff + + /** + * @return string + */ public static function itemTitle(): string { return QUI::getLocale()->get('quiqqer/menu', 'item.anchor.title'); @@ -19,8 +61,13 @@ public static function itemIcon(): string return 'fa fa-anchor'; } + /** + * @return string + */ public static function itemJsControl(): string { return 'package/quiqqer/menu/bin/Controls/Independent/Items/Anchor'; } + + //endregion } diff --git a/src/QUI/Menu/Independent/Items/Site.php b/src/QUI/Menu/Independent/Items/Site.php index 69bd0eb0474fbfb18f9aefe6ade3b2fa9387a6f4..31af78a7b3edf2d41b461fead8ed759f95a638d3 100644 --- a/src/QUI/Menu/Independent/Items/Site.php +++ b/src/QUI/Menu/Independent/Items/Site.php @@ -7,7 +7,7 @@ use function is_array; /** - * + * menu item which gets its data from a site */ class Site extends AbstractMenuItem { diff --git a/src/QUI/Menu/Independent/Items/Url.php b/src/QUI/Menu/Independent/Items/Url.php index c632f1953d5091f8e640ee0a7a9b30a6d41ce64a..53b5402a3eeb548441a285911b0a4aa879ec1791 100644 --- a/src/QUI/Menu/Independent/Items/Url.php +++ b/src/QUI/Menu/Independent/Items/Url.php @@ -4,8 +4,14 @@ use QUI; +/** + * menu item to an external url + */ class Url extends AbstractMenuItem { + /** + * @return string + */ public static function itemTitle(): string { return QUI::getLocale()->get('quiqqer/menu', 'item.url.title'); @@ -19,6 +25,9 @@ public static function itemIcon(): string return 'fa fa-globe'; } + /** + * @return string + */ public static function itemJsControl(): string { return 'package/quiqqer/menu/bin/Controls/Independent/Items/Url';