{"id":21330570,"url":"https://github.com/friendsofredaxo/theme","last_synced_at":"2025-07-12T09:30:35.451Z","repository":{"id":46224586,"uuid":"64840110","full_name":"FriendsOfREDAXO/theme","owner":"FriendsOfREDAXO","description":"Nützliche Verwaltung von Projektdateien (z. B. Assets, Sprachdateien, Funktionen und Klassen) für Frontend und Backend.","archived":false,"fork":false,"pushed_at":"2023-04-16T20:06:10.000Z","size":183,"stargazers_count":50,"open_issues_count":2,"forks_count":5,"subscribers_count":9,"default_branch":"master","last_synced_at":"2024-04-15T00:27:51.239Z","etag":null,"topics":["assets","backend","frontend","hacktoberfest","redaxo","redaxo-addon","theme"],"latest_commit_sha":null,"homepage":"http://www.redaxo.org/de/download/addons/?addon_id=1337","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FriendsOfREDAXO.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-08-03T11:13:05.000Z","updated_at":"2023-12-31T15:11:19.000Z","dependencies_parsed_at":"2023-02-17T21:45:49.043Z","dependency_job_id":null,"html_url":"https://github.com/FriendsOfREDAXO/theme","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FriendsOfREDAXO%2Ftheme","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FriendsOfREDAXO%2Ftheme/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FriendsOfREDAXO%2Ftheme/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FriendsOfREDAXO%2Ftheme/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FriendsOfREDAXO","download_url":"https://codeload.github.com/FriendsOfREDAXO/theme/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225809968,"owners_count":17527576,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["assets","backend","frontend","hacktoberfest","redaxo","redaxo-addon","theme"],"created_at":"2024-11-21T22:22:00.357Z","updated_at":"2024-11-21T22:22:00.920Z","avatar_url":"https://github.com/FriendsOfREDAXO.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Theme\nRedaxo 5 AddOn zum Verwalten aller Projektdateien für Frontend und Backend.\n\n## Ordner\nNach der Installation kann auf der Seite Einstellungen des Theme-AddOns mit Klick auf den Button __Theme-Ordner installieren__ eine Ordnerstruktur erstellt werden. \nDie Ordnerstruktur wird auf der Ebene des Ordners __redaxo__ im Ordner __theme__ erstellt.\n\nDer Ordner `theme` enthält zwei Ordner: `public` und `private`: \n* Im Ordner `public` können alle öffentlich zugänglichen Dateien, wie z.B. JavaScript und CSS abgelegt werden. \n* Im Ordner `private` können alle Dateien abgelegt werden, die vor dem Zugriff von außen geschützt werden sollen. Er enthält eine `.htaccess`, die den Zugriff beschränkt.\n\nDie weiteren Unterordner sind ein Vorschlag zur Strukturierung der Projektdateien. Jede andere Variante ist auch möglich. \n\nDie vorgegebene Struktur hat den Vorteil, dass diese Ordner über [__PHP-Methoden__](#PHP-Methoden) ansprechbar sind, bzw. wie die entsprechenden Ordner eines AddOns automatisch eingebunden werden:\n* Alle im Ordner `lib` enthaltenen PHP-Klassen werden automatisch über __autoload__ eingebunden.\n* Alle im Ordner `lang` enthaltenen Dateien mit der Endung `.lang` werden automatisch über __i18n__ eingebunden.\n* Alle Dateien mit der Endung `.php` im Ordner `inc` werden per `include_once` in der `boot.php` des AddOns eingebunden.\n* Der Ordner `fragments` wird über `rex_fragment::addDirectory` eingebunden.\n* Der Ordner `ytemplates` wird über `rex_yform::addTemplatePath` eingebunden, wenn __YForm__ installiert ist.\n* Der Ordner `redaxo` ist ein Platzhalter für die Synchronisierungsdaten des AddOns [__Developer__](#Developer).\n\n## Dateien\nNeben der `.htaccess` werden weitere Dateien erstellt, die - sofern sie nicht gelöscht wurden - vom AddOn automatisch eingebunden werden:\n* `backend.css` und `backend.js` werden auf jeder Seite des Redaxo-Backends geladen. So können auf einfache Weise zusätzliche Scripte, Stile oder Webfonts für das Backend eingebunden werden. Diese Funktion kann in den Einstellungen des Theme-AddOns aktiviert oder deaktiviert werden.\n* `functions.php` wird im Ordner `inc` angelegt *(siehe oben)* und dient nur als schnelle Starthilfe. Sie kann auch umbenannt, gelöscht oder durch andere Dateien ersetzt werden.\n\n## Developer\nWenn das AddOn __Developer__ installiert ist, gibt es die zusätzliche Option, die Synchronisierung der Templates, Module, Actions und YForm-E-Mail-Templates in den Theme-Ordner umzuleiten. Die Synchronisierung in den Data-Ordner wird dadurch deaktiviert. \n\n## PHP-Methoden\n### Pfade / URL\n#### theme_url\nAnalog zu `rex_url` werden relative URLs zurückgegeben.\n```php\n// $filename ist immer optional und kann auch ein Pfad sein. \n$filename = \"path/to/file\";\n\n// Gibt eine URL im Ordner \"theme\" zurück. \n$url = theme_url::base($filename);\n\n// Gibt eine URL im Ordner \"theme/public/assets\" zurück. \n$url = theme_url::assets($filename);\n```\n#### theme_path\nAnalog `rex_path` werden absolute Serverpfade zurückgegeben.\n```php\n// $filename ist immer optional und kann auch ein Pfad sein. \n$filename = \"path/to/file\";\n\n// Gibt einen Pfad im Ordner \"theme\" zurück.\n$path = theme_path::base($filename);\n\n// Gibt einen Pfad im Ordner \"theme/private/fragments\" zurück.\n$path = theme_path::fragments($filename);\n\n// Gibt einen Pfad im Ordner \"theme/private/inc\" zurück.\n$path = theme_path::inc($filename);\n\n// Gibt einen Pfad im Ordner \"theme/private/lang\" zurück.\n$path = theme_path::lang($filename);\n\n// Gibt einen Pfad im Ordner \"theme/private/lib\" zurück.\n$path = theme_path::lib($filename);\n\n// Gibt einen Pfad im Ordner \"theme/private/views\" zurück.\n$path = theme_path::views($filename);\n\n// Gibt einen Pfad im Ordner \"theme/private/ytemplates\" zurück.\n$path = theme_path::ytemplates($filename);\n\n// Gibt einen Pfad im Ordner \"theme/public/assets\" zurück.\n$path = theme_path::assets($filename);\n```\n\n### Daten\n#### theme_setting\nEine einfache Registry mit der Möglichkeit, beim Abruf Default-Werte zu definieren.\nDamit ist es z.B. möglich, in der Datei `functions.php` zentral Einstellungen zu definieren, die in Modulen oder Templates abgerufen werden können.\n```php\n// Erstellt einen Eintrag.\n// Die Daten müssen immer als Array mit alphanumerischen Schlüsseln übergeben werden. \n// Wird die Methode mehrfach mit dem gleichen Schlüssel aufgerufen, \n// werden die Daten über array_merge zusammengeführt.\ntheme_setting::setKey($key, [\n    'index1' =\u003e 'data1', \n    'index2' =\u003e 'data2', \n    ...\n]);\n\n// Holt einen Eintrag. Dabei kann ein Array mit Vorgabe-Werten übergeben werden.\n// Die Arrays werden über array_merge() zusammengeführt. \n// Ist ein Schlüssel in beiden Arrays vorhanden, wird der des Default-Arrays \n// mit denen des ausgelesenen Arrays überschrieben.\n$data = theme_setting::getKey($key, [\n    'index1' =\u003e 'data1', \n    'index2' =\u003e 'data2', \n    ...\n]);\n```\n\n### Assets\n#### theme_assets\nEine Klasse zum Verwalten und Einbinden der CSS-Stylesheets und JavaScript-Dateien einer Website zur Laufzeit.\n\n##### Anwendung\n\nEs ist möglich, Assets über verschiedene Instanzen der Klasse zu gruppieren. Die Asset-Gruppen können entweder über Methoden der Klasse oder mithilfe einer eigenen [REX_VAR](#REX_VAR) an beliebiger Stelle im Quellcode der Website ausgegeben werden.\n\n_**Wichtig:** einige Komfortfunktionen stehen nur bei Nutzung der [REX_VAR](#REX_VAR) zur Verfügung._\n\n```php\n// Erzeugt eine Instanz der Klasse. In der Regel genügt eine Instanz zur Verwaltung aller Assets einer Website.\n// Bei Bedarf kann durch die Angabe von $id zwischen verschiedenen Instanzen unterschieden werden. \n// - $id (string) optional, ist $id nicht angegeben, wird 'default' verwendet.\n$assets = theme_assets::getInstance($id);\n\n// Beispiele\n$assets = theme_assets::getInstance(); // Verwenden der Instanz 'default'\n\n$assets = theme_assets::getInstance('assets'); // Verwenden der Instanz 'assets'\n```\n\n##### Cache-Buster\nDer Cache-Buster hilft, das Browser-Caching einer Website zu beeinflussen. Es handelt sich dabei um einen String, der als Query an die URL einer Asset-Datei angehängt wird.\n\n_**Wichtig:** Der Cache-Buster wird für eine komplette Instanz gesetzt._\n```php\n// 1. Aktuelle Systemzeit\n// Damit wird die Asset-Datei bei jedem Ladevorgang neu vom Server geholt.\n// Der Dateiname wird um die Zeichenfolge '?t=XXXXXXXXXX' ergänzt. XXXXXXXXXX entspricht dabei dem Timestamp der aktuellen Systemzeit.\n// ACHTUNG: Diese Einstellung ist nur während Entwicklung und Debugging sinnvoll.\n$assets-\u003esetCacheBuster('time')\n\n// 2. Änderungsdatum einer Datei\n// Damit wird die Datei neu vom Server geladen, wenn sie geändert wurde. \n// Der Dateiname wird um die Zeichenfolge '?f=XXXXXXXXXX' ergänzt. XXXXXXXXXX entspricht dabei dem Timestamp des Änderungsdatums der Datei.\n$assets-\u003esetCacheBuster('filetime')\n\n// 3. individueller String \n// Damit ist eine manuelle Versionierung der Assets möglich. \n// Der Dateiname wird um die Zeichenfolge '?v=XXXXXXXXXX' ergänzt. XXXXXXXXXX entspricht dabei dem angegebenen String.\n$assets-\u003esetCacheBuster('1.0.0')\n\n// 4. Cache-Buster löschen\n$assets-\u003esetCacheBuster('')\n```\n\n##### CSS-Daten\nEs können sowohl URL von CSS-Dateien übergeben werden, als auch Inline-Styles.\n```php\n// Setzt die URL einer Datei\n// - $id (string) ein String zur Kennung der Datei\n// - $data (string) die URL der Datei. Hierfür kann auch theme_url verwendet werden\n// - $media (string) das Media-Attribut der Datei, optional\n// - $attributes (array) ein Array mit zusätzlichen Attributen, im Format ['Attribut' =\u003e 'Wert'], optional\n$assets-\u003esetCss($id, $data, $media, $attributes);\n\n// Setzt einen CSS-String\n// - $id (string) ein String zur Kennung der Daten\n// - $data (string) der CSS-String. Der String wird innerhalb von \u003cstyle\u003e-Tags ausgegeben \n// - $media (string) das Media-Attribut der Daten, optional\n$assets-\u003esetCssInline($id, $data, $media);\n\n// Löscht die URL einer Datei\n// - $id (string) eine zuvor gesetzte Kennung der Datei\n$assets-\u003eunsetCss($id);\n\n// Löscht einen CSS-String\n// - $id (string) eine zuvor gesetzte Kennung der Daten\n$assets-\u003eunsetCssInline($id);\n\n// Gibt die gesammelten CSS-Dateien der Instanz als \u003clink\u003e-Tags aus\n// HINWEIS: im Normalfall ist es komfortabler die REX_VAR REX_THEME_ASSETS[] zu nutzen\necho $assets-\u003egetCss();\n\n// Gibt die gesammelten CSS-Daten der Instanz als \u003clink\u003e-Tags aus\n// HINWEIS: im Normalfall ist es komfortabler die REX_VAR REX_THEME_ASSETS[] zu nutzen\necho $assets-\u003egetCssInline();\n```\n\n##### JavaScript-Daten\nEs können sowohl URL von JavaScript-Dateien übergeben werden, als auch Inline-Skripte.\n```php\n// Setzt die URL einer Datei\n// - $id (string) ein String zur Kennung der Datei\n// - $data (string) die URL der Datei. Hierfür kann auch theme_url verwendet werden\n// - $header (bool) Flag zur Ausgabe im Header. true gibt die Datei im Header aus, false im Footer, optional - default ist false\n// - $attributes (array) ein Array mit zusätzlichen Attributen, im Format ['Attribut' =\u003e 'Wert'], optional\n$assets-\u003esetJs($id, $data, $header, $attributes);\n\n// Setzt einen JavaScript-String\n// - $id (string) ein String zur Kennung der Daten\n// - $data (string) der JavaScript-String. Der String wird innerhalb von \u003cscript\u003e-Tags ausgegeben \n// - $header (bool) Flag zur Ausgabe im Header. true gibt die Datei im Header aus, false im Footer, optional - default ist false\n// - $attributes (array) ein Array mit zusätzlichen Attributen, im Format ['Attribut' =\u003e 'Wert'], optional\n$assets-\u003esetJsInline($id, $data, $header, $attributes);\n\n// Löscht die URL einer Datei\n// - $id (string) eine zuvor gesetzte Kennung der Datei\n// - $header (bool) Flag zur Ausgabe im Header. true entfernt die Datei im Header, false im Footer, optional - default ist false\n$assets-\u003eunsetJs($id, $header);\n\n// Löscht einen JavaScript-String\n// - $id (string) eine zuvor gesetzte Kennung der Daten\n// - $header (bool) Flag zur Ausgabe im Header. true entfernt die Daten im Header, false im Footer, optional - default ist false\n$assets-\u003eunsetJsInline($id, $header);\n\n// Gibt die gesammelten JavaScript-Dateien der Instanz zurück\n// HINWEIS: im Normalfall ist es komfortabler die REX_VAR REX_THEME_ASSETS[] zu nutzen\n// - $header (bool) Flag zur Ausgabe im Header. true gibt die zum Header zugeordneten Daten aus, false die zum Footer zugeordneten, optional - default ist false\necho $assets-\u003egetJs($header);\n\n// Gibt die gesammelten JavaScript-Daten der Instanz zurück\n// HINWEIS: im Normalfall ist es komfortabler die REX_VAR REX_THEME_ASSETS[] zu nutzen\n// - $header (bool) Flag zur Ausgabe im Header. true gibt die zum Header zugeordneten Daten aus, false die zum Footer zugeordneten, optional - default ist false\necho $assets-\u003egetJsInline($header);\n```\n\n##### HTML-Daten\nEs können HTML-Strings übergeben werden. Nützlich, um z.B. zusätzliche Meta-Tags zu setzen\n```php\n// - $id (string) ein String zur Kennung der Daten\n// - $data der HTML-String. Der String wird unverändert ausgegeben.  \n// - $header (bool) Flag zur Ausgabe im Header. true gibt die Datei im Header aus, false im Footer, optional - default ist false\n$assets-\u003esetHtml($id, $data, $header);\n\n// Löscht einen HTMl-String\n// - $id (string) eine zuvor gesetzte Kennung der Daten\n// - $header (bool) Flag zur Ausgabe im Header. true entfernt die Datei im Header, false im Footer, optional - default ist false\n$assets-\u003eunsetHtml($id, $header);\n\n// Gibt die HTML-Daten der Instanz zurück\n// HINWEIS: im Normalfall ist es komfortabler die REX_VAR REX_THEME_ASSETS[] zu nutzen\n// - $header (bool) Flag zur Ausgabe im Header. true gibt die Datei im Header aus, false im Footer, optional - default ist false\necho $assets-\u003egetHtml($header);\n```\n\n### Extension Points\nDie Klasse `theme_assets` bietet mehrere __Extension Points__ zur Beeinflussung der Ausgabe:\n- `THEME_ASSETS_CSS`\n- `THEME_ASSETS_CSS_INLINE`\n- `THEME_ASSETS_JS`\n- `THEME_ASSETS_JS_INLINE`\n- `THEME_ASSETS_HTML`\n\nÜber sie kann z.B. die [Minifizierung der Asset-Dateien](#Minify) umgesetzt werden.\n\n#### Steuerung der Extensions\n```php\n// Es ist möglich pro Instanz eine Aktion zu definieren, die an die __Extension Points__ übergeben wird.   \n$assets-\u003esetAction($action);\n```\n\n\n## REX_VAR REX_THEME_ASSETS[]\nREX_THEME_ASSETS[] kann statt der Getter-Methoden von `theme_assets` innerhalb von Templates und Modulen verwendet werden.\n\nSie hat gegenüber den Klassenmethoden den Vorteil, dass sie das Einschleusen von Daten in Header und Footer erleichtern.\nSo ist es z.B. möglich, in Modulen Assets anzugeben, die im HTML-Header eines Templates eingebunden werden. Dafür wird intern der Extension-Point `OUTPUT_FILTER` genutzt.\n```php\n// - \"id\" die Kennung der Instanz, wie bei theme_assets::getInstance() angegeben, optional - default ist 'default'\n// - \"type\" der Typ der Ausgabe. Er entspricht den Methodennamen in Kleinbuchstaben, also: 'css', 'cssinline', 'js', 'jsinline' oder 'html'\n// - \"header\" Flag für die Header- oder Footer-Gruppe. 1 für Header, 0 für Footer, optional - default ist 0\nREX_THEME_ASSETS[id=instanz type=typ header=1]\n\n// Beispiele\nREX_THEME_ASSETS[type=js] // JavaScript der Instanz 'default' im Footer ausgeben\n\nREX_THEME_ASSETS[id=assets type=js header=1] // JavaScript der Instanz 'assets' im Header ausgeben\n\nREX_THEME_ASSETS[id=assets type=css] // CSS der Instanz 'assets' ausgeben\n```\n\n\n## FriendsOfREDAXO/minify\nDas AddOn __FriendsOfREDAXO/minify__ zur Minifizierung von CSS- und JavaScript-Dateien wird über eine zusätzliche Klasse unterstützt.\n```php\n// Aktiviert die Unterstützung des AddOns FriendsOfREDAXO/minify.\n// Es werden automatisch die Dateien einer Instanz gruppiert und minifiziert. \n// Muss vor theme_assets::getInstance() aufgerufen werden. Am besten am Anfang der Datei functions.php platzieren. \ntheme_minify::init();\n\n$assets = theme_assets::getInstance();\n// Nach der Aktivierung stehen diese Aktionen zur Verfügung:\n// CSS und JavaScript minifizieren\n$assets-\u003esetAction(`minify`);\n// Nur CSS und minifizieren\n$assets-\u003esetAction(`minify_css`);\n// Nur JavaScript minifizieren\n$assets-\u003esetAction(`minify_js`);\n```\n\n\n## Beispiele\n### Beispiel 1: eine Instanz\n#### functions.php\n```php\ntheme_assets::getInstance()\n    // Styles\n    -\u003esetCss('styles', theme_url::assets('styles/main.css'))\n    // JavaScript im Header\n    -\u003esetJs('jquery', theme_url::assets('vendor/jquery/jquery.min.js'), true)\n    -\u003esetJsInline('inline', 'alert(\"Dies ist ein Beispiel!\");', true)\n    // JavaScript im Footer\n    -\u003esetJs('demo', theme_url::assets('vendor/demo/scripts/demo.js'))\n    -\u003esetJs('scripts', theme_url::assets('scripts/main.js'));\n```\n#### Template\nDie Ausgabe richtet sich nach der Position der REX_VARs.\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n    \u003chead\u003e\n        ...\n        REX_THEME_ASSETS[type=css]\n        REX_THEME_ASSETS[type=js header=1]\n        REX_THEME_ASSETS[type=jsinline header=1]\n    \u003c/head\u003e\n    \u003cbody\u003e\n        ...\n        REX_THEME_ASSETS[type=js]\n    \u003c/body\u003e\n\u003c/html\u003e\n```\n#### HTML\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n    \u003chead\u003e\n        ...\n        \u003clink media=\"all\" href=\"/theme/public/assets/styles/main.css\" rel=\"stylesheet\" type=\"text/css\" /\u003e\n        \u003cscript src=\"/theme/public/assets/vendor/jquery/jquery.min.js\"\u003e\u003c/script\u003e\n        \u003cscript\u003e/*\u003c![CDATA[*/\n            alert(\"Dies ist ein Beispiel!\");\n        /*]]\u003e*/\u003c/script\u003e\n    \u003c/head\u003e\n    \u003cbody\u003e\n        ...\n        \u003cscript src=\"/theme/public/assets/vendor/demo/scripts/demo.js\"\u003e\u003c/script\u003e\n        \u003cscript src=\"/theme/public/assets/scripts/main.js\"\u003e\u003c/script\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n```\n\n### Beispiel 2: mehrere Instanzen\n#### functions.php\n```php\ntheme_assets::getInstance('libraries')\n    -\u003esetJs('jquery', theme_url::assets('vendor/jquery/jquery.min.js'), true)\n    -\u003esetJs('demo', theme_url::assets('vendor/demo/scripts/demo.js'));\n    \ntheme_assets::getInstance('inline')-\u003esetJsInline('inline', 'alert(\"Dies ist ein Beispiel!\");', true);\n    \ntheme_assets::getInstance()\n    -\u003esetCss('styles', theme_url::assets('styles/main.css'))\n    -\u003esetJs('scripts', theme_url::assets('scripts/main.js'));\n```\n#### Template\nDie Ausgabe richtet sich nach der Position der REX_VARs. \nEinige REX_VARs finden keine Werte.\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n    \u003chead\u003e\n        ...\n        \u003c!--Instanz \"libraries\"--\u003e\n        REX_THEME_ASSETS[id=libraries type=css]\n        REX_THEME_ASSETS[id=libraries type=js header=1]\n        \u003c!--Instanz \"default\"--\u003e\n        REX_THEME_ASSETS[type=css]\n        REX_THEME_ASSETS[type=js header=1]\n        \u003c!--Instanz \"inline\"--\u003e\n        REX_THEME_ASSETS[id=inline type=cssinline]\n        REX_THEME_ASSETS[id=inline type=jsinline header=1]\n    \u003c/head\u003e\n    \u003cbody\u003e\n        ...\n        \u003c!--Instanz \"libraries\"--\u003e\n        REX_THEME_ASSETS[id=libraries type=js]\n        \u003c!--Instanz \"default\"--\u003e\n        REX_THEME_ASSETS[type=js]\n    \u003c/body\u003e\n\u003c/html\u003e\n```\n#### HTML\nLeere REX_VARs werden übersprungen und erzeugen keine Ausgabe.\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n    \u003chead\u003e\n        ...\n        \u003c!--Instanz \"libraries\"--\u003e\n        \u003cscript src=\"/theme/public/assets/vendor/jquery/jquery.min.js\"\u003e\u003c/script\u003e\n        \u003c!--Instanz \"default\"--\u003e\n        \u003clink media=\"all\" href=\"/theme/public/assets/styles/main.css\" rel=\"stylesheet\" type=\"text/css\" /\u003e\n        \u003c!--Instanz \"inline\"--\u003e\n        \u003cscript\u003e/*\u003c![CDATA[*/\n            alert(\"Dies ist ein Beispiel!\");\n        /*]]\u003e*/\u003c/script\u003e\n    \u003c/head\u003e\n    \u003cbody\u003e\n        ...\n        \u003c!--Instanz \"libraries\"--\u003e\n        \u003cscript src=\"/theme/public/assets/vendor/demo/scripts/demo.js\"\u003e\u003c/script\u003e\n        \u003c!--Instanz \"default\"--\u003e\n        \u003cscript src=\"/theme/public/assets/scripts/main.js\"\u003e\u003c/script\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n```\n\n### Beispiel 3: Varianten\nEinträge können ergänzt, überschrieben oder gelöscht werden.\n#### functions.php\n```php\ntheme_assets::getInstance()\n    -\u003esetJs('jquery', theme_url::assets('vendor/jquery/jquery.min.js'), true)\n    -\u003esetJs('scripts-main', theme_url::assets('scripts/main.js'))\n    -\u003esetJs('scripts-sub', theme_url::assets('scripts/sub.js'))\n    -\u003esetCss('styles', theme_url::assets('styles/main.css'));\n```\n#### Modul\n- der Eintrag `styles-module` wird ergänzt\n- der Eintrag `scripts-sub` wird überschrieben\n- der Eintrag `jquery` wird gelöscht\n```php\ntheme_assets::getInstance()\n    -\u003esetCss('styles-module', theme_url::assets('styles/module.css'))\n    -\u003esetJs('scripts-sub', theme_url::assets('scripts/module.js'))\n    -\u003eunset('jquery', true);\n```\n#### Template\nDie Ausgabe richtet sich nach der Position der REX_VARs.\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n    \u003chead\u003e\n        ...\n        REX_THEME_ASSETS[type=css]\n        REX_THEME_ASSETS[type=js header=1]\n        REX_THEME_ASSETS[type=jsinline header=1]\n    \u003c/head\u003e\n    \u003cbody\u003e\n        ...\n        REX_THEME_ASSETS[type=js]\n    \u003c/body\u003e\n\u003c/html\u003e\n```\n#### HTML\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n    \u003chead\u003e\n        ...\n        \u003clink media=\"all\" href=\"/theme/public/assets/styles/main.css\" rel=\"stylesheet\" type=\"text/css\" /\u003e\n        \u003clink media=\"all\" href=\"/theme/public/assets/styles/module.css\" rel=\"stylesheet\" type=\"text/css\" /\u003e\n    \u003c/head\u003e\n    \u003cbody\u003e\n        ...\n        \u003cscript src=\"/theme/public/assets/scripts/main.js\"\u003e\u003c/script\u003e\n        \u003cscript src=\"/theme/public/assets/scripts/module.js\"\u003e\u003c/script\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffriendsofredaxo%2Ftheme","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffriendsofredaxo%2Ftheme","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffriendsofredaxo%2Ftheme/lists"}