├── pages ├── index.php ├── yrewrite.metainfo.field.php ├── yrewrite.metainfo.domain.php └── yrewrite.metainfo.domain_icon.php ├── update.php ├── .gitignore ├── .github ├── FUNDING.yml ├── workflows │ ├── publish-to-redaxo-org.yml │ └── code-style.yml └── copilot-instructions.md ├── .php-cs-fixer.dist.php ├── uninstall.php ├── lib ├── rex_var_head.php ├── rex_var_setting.php ├── Field │ └── value │ │ └── yrewrite_metainfo_be_media_preview.php ├── icon.php └── domain.php ├── composer.json ├── LICENSE ├── package.yml ├── fragments └── yrewrite_metainfo │ └── head.php ├── install.php ├── lang ├── en_gb.lang ├── de_de.lang ├── sv_se.lang ├── ru_ru.lang ├── pt_br.lang ├── it_it.lang ├── nl_nl.lang ├── es_es.lang └── fr_fr.lang ├── assets ├── media_preview.css └── media_preview.js ├── boot.php ├── ytemplates └── bootstrap │ ├── value.yrewrite_metainfo_be_media_preview-view.tpl.php │ └── value.yrewrite_metainfo_be_media_preview.tpl.php ├── README.md ├── install ├── rex_yrewrite_metainfo.tableset.json └── rex_yrewrite_metainfo_icon.tableset.json └── api.md /pages/index.php: -------------------------------------------------------------------------------- 1 | in(__DIR__) 7 | ; 8 | 9 | return (new Redaxo\PhpCsFixerConfig\Config()) 10 | ->setFinder($finder) 11 | ; 12 | -------------------------------------------------------------------------------- /uninstall.php: -------------------------------------------------------------------------------- 1 | isAvailable() && !rex::isSafeMode()) { 4 | rex_yform_manager_table_api::removeTable('rex_yrewrite_metainfo'); 5 | rex_yform_manager_table_api::removeTable('rex_yrewrite_metainfo_icon'); 6 | } 7 | -------------------------------------------------------------------------------- /pages/yrewrite.metainfo.field.php: -------------------------------------------------------------------------------- 1 | 'yform/manager/table_field', 'table_name' => 'rex_yrewrite_metainfo'], false)); 9 | -------------------------------------------------------------------------------- /lib/rex_var_head.php: -------------------------------------------------------------------------------- 1 | getParsedArg('key', null, true); 12 | if (null === $key) { 13 | return false; 14 | } 15 | return "FriendsOfRedaxo\\YrewriteMetainfo\\Domain::getCurrentValue($key)"; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /.github/workflows/publish-to-redaxo-org.yml: -------------------------------------------------------------------------------- 1 | # Instructions: https://github.com/FriendsOfREDAXO/installer-action/ 2 | 3 | name: Publish to REDAXO.org 4 | on: 5 | release: 6 | types: 7 | - published 8 | 9 | jobs: 10 | redaxo_publish: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v3 14 | - uses: FriendsOfREDAXO/installer-action@v1 15 | with: 16 | myredaxo-username: ${{ secrets.MYREDAXO_USERNAME }} 17 | myredaxo-api-key: ${{ secrets.MYREDAXO_API_KEY }} 18 | description: ${{ github.event.release.body }} 19 | version: ${{ github.event.release.tag_name }} 20 | -------------------------------------------------------------------------------- /pages/yrewrite.metainfo.domain.php: -------------------------------------------------------------------------------- 1 | getParam('yform')->table->getTableName() === $ep->getParam('table_name')) { // @phpstan-ignore-line 15 | return ''; 16 | } 17 | }, 18 | rex_extension::EARLY, 19 | ['table_name' => $table_name], 20 | ); 21 | 22 | $_REQUEST['table_name'] = $table_name; /** @phpstan-ignore-line */ 23 | 24 | if (is_file(rex_path::addon('yform', 'pages/manager.data_edit.php'))) { 25 | include rex_path::addon('yform', 'pages/manager.data_edit.php'); 26 | } else { 27 | include rex_path::plugin('yform', 'manager', 'pages/data_edit.php'); 28 | } 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | # MIT License 2 | 3 | Copyright (c) Friends of REDAXO 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/code-style.yml: -------------------------------------------------------------------------------- 1 | name: PHP-CS-Fixer 2 | 3 | on: 4 | push: 5 | branches: [ master, main ] 6 | pull_request: 7 | branches: [ master, main ] 8 | 9 | permissions: 10 | contents: read 11 | 12 | jobs: 13 | code-style: 14 | 15 | runs-on: ubuntu-latest 16 | permissions: 17 | contents: write # for Git to git apply 18 | 19 | steps: 20 | - uses: actions/checkout@v3 21 | 22 | - name: Setup PHP 23 | uses: shivammathur/setup-php@v2 24 | with: 25 | php-version: '8.1' 26 | extensions: gd, intl, pdo_mysql 27 | coverage: none # disable xdebug, pcov 28 | 29 | # install dependencies from composer.json 30 | - name: Install test dependencies 31 | env: 32 | COMPOSER: composer.json 33 | run: composer install --prefer-dist --no-progress 34 | 35 | # run php-cs-fixer, fix code styles 36 | - name: Run PHP CS Fixer 37 | run: composer cs-fix 38 | 39 | # commit and push fixed files 40 | - uses: stefanzweifel/git-auto-commit-action@v4 41 | with: 42 | commit_message: Apply php-cs-fixer changes 43 | -------------------------------------------------------------------------------- /package.yml: -------------------------------------------------------------------------------- 1 | package: yrewrite_metainfo 2 | version: "4.0.0" 3 | author: Friends of REDAXO 4 | supportpage: https://github.com/FriendsOfRedaxo/yrewrite_metainfo/ 5 | 6 | requires: 7 | php: 8 | version: "^8.2" 9 | redaxo: ^5.19 10 | packages: 11 | yrewrite: "^2" 12 | yform: ">=4,<6" 13 | 14 | conflicts: 15 | packages: 16 | yrewrite_metainfo: "^1" 17 | 18 | pages: 19 | yrewrite/metainfo: 20 | title: translate:yrewrite_metainfo_title 21 | perm: yrewrite_metainfo[] 22 | icon: rex-icon fa-tags 23 | subpages: 24 | help: { title: 'translate:package_hhelp', subPath: README.md, itemClass: 'pull-right', icon: 'rex-icon fa-info-circle' } 25 | api: { title: 'translate:yrewrite_metainfo_api', subPath: api.md, itemClass: 'pull-right', icon: 'rex-icon fa-code' } 26 | yrewrite/metainfo/domain: 27 | title: translate:yrewrite_metainfo_domain 28 | perm: yrewrite_metainfo[domain] 29 | icon: rex-icon fa-tags 30 | yrewrite/metainfo/domain_icon: 31 | title: translate:yrewrite_metainfo_domain_icon 32 | perm: yrewrite_metainfo[icon] 33 | icon: rex-icon fa-image 34 | yrewrite/metainfo/field: 35 | title: translate:yrewrite_metainfo_fields 36 | perm: yrewrite_metainfo[fields] 37 | icon: rex-icon fa-list 38 | -------------------------------------------------------------------------------- /fragments/yrewrite_metainfo/head.php: -------------------------------------------------------------------------------- 1 | getVar('domain')) { 10 | $domain = Domain::getCurrent(); 11 | } 12 | if ($domain instanceof Domain) { 13 | ?> 14 | 15 | 16 | 17 | 18 | 19 | 20 | getTags(); 21 | ?> 22 | getIcon()) { 24 | /** @var Icon $icon */ 25 | ?> 26 | 27 | getAppleTouchIcon()) { ?> 28 | 30 | 31 | getManifest()) { ?> 32 | 33 | 34 | getShortcutIcon()) { ?> 35 | 36 | 37 | getFaviconPng96()) { ?> 38 | 39 | 40 | getFaviconSvg()) { ?> 41 | 42 | 43 | 45 | 46 | 47 | 48 | show(); 55 | } 56 | 57 | if (rex_addon::get('wenns_sein_muss')->isAvailable()) { 58 | echo Fragment::getCss(); 59 | echo Fragment::getScripts(); 60 | echo Fragment::getJs(); 61 | } ?> 62 | -------------------------------------------------------------------------------- /install.php: -------------------------------------------------------------------------------- 1 | ensurePrimaryIdColumn() 5 | ->ensureColumn(new rex_sql_column('yrewrite_domain_id', 'int(10) unsigned')) 6 | ->ensureColumn(new rex_sql_column('name', 'varchar(191)', false, '')) 7 | ->ensureColumn(new rex_sql_column('logo', 'text')) 8 | ->ensureColumn(new rex_sql_column('type', 'varchar(191)', false, 'website')) 9 | ->ensureColumn(new rex_sql_column('thumbnail', 'text')) 10 | ->ensureColumn(new rex_sql_column('icon', 'int(10) unsigned')) 11 | ->ensureColumn(new rex_sql_column('favicon_png_96', 'text')) 12 | ->ensureColumn(new rex_sql_column('favicon_svg', 'text')) 13 | ->ensureIndex(new rex_sql_index('yrewrite_domain_id', ['yrewrite_domain_id'])) 14 | ->ensure(); 15 | 16 | rex_sql_table::get(rex::getTable('yrewrite_metainfo_icon')) 17 | ->ensurePrimaryIdColumn() 18 | ->ensureColumn(new rex_sql_column('name', 'varchar(191)', false, '')) 19 | ->ensureColumn(new rex_sql_column('short_name', 'varchar(191)', false, '')) 20 | ->ensureColumn(new rex_sql_column('display', 'varchar(191)')) 21 | ->ensureColumn(new rex_sql_column('theme_color', 'varchar(191)', false, '#ffffff')) 22 | ->ensureColumn(new rex_sql_column('background_color', 'varchar(191)', false, '')) 23 | ->ensureColumn(new rex_sql_column('shortcut_icon', 'text')) 24 | ->ensureColumn(new rex_sql_column('apple_touch_icon', 'text')) 25 | ->ensureColumn(new rex_sql_column('manifest', 'text')) 26 | ->removeColumn('icon_16') 27 | ->removeColumn('icon_32') 28 | ->removeColumn('safari_pinned_tab') 29 | ->removeColumn('msapplication_title_color') 30 | ->removeColumn('yrewrite_metainfo_theme_color') 31 | ->ensure(); 32 | 33 | $addon = rex_addon::get('yrewrite_metainfo'); 34 | 35 | if (rex_addon::get('yform')->isAvailable() && !rex::isSafeMode()) { 36 | rex_yform_manager_table_api::importTablesets(rex_file::get(__DIR__ . '/install/rex_yrewrite_metainfo.tableset.json')); // @phpstan-ignore-line 37 | rex_yform_manager_table_api::importTablesets(rex_file::get(__DIR__ . '/install/rex_yrewrite_metainfo_icon.tableset.json')); // @phpstan-ignore-line 38 | rex_yform_manager_table::deleteCache(); 39 | } 40 | -------------------------------------------------------------------------------- /lang/en_gb.lang: -------------------------------------------------------------------------------- 1 | yrewrite_metainfo = YRewrite Domain Meta-Infos 2 | yrewrite_metainfo_title = Meta-Infos 3 | 4 | # Menu Tabs 5 | yrewrite_metainfo_domain = General 6 | yrewrite_metainfo_domain_icon = Icons and PWA Profiles 7 | yrewrite_metainfo_api = API Documentation 8 | 9 | # YForm Fields 10 | rex_yrewrite_metainfo_icon_table = 🌍 Icons and PWA Profiles 11 | rex_yrewrite_metainfo_domain_table = 🌍 Domain Meta-Infos 12 | yrewrite_metainfo_fields = Fields 13 | 14 | yrewrite_metainfo_logo_label = Logo 15 | yrewrite_metainfo_logo_notice = Logo that can be output in the template. 16 | 17 | yrewrite_metainfo_type_label = og:type 18 | yrewrite_metainfo_type_notice = OpenGraph-Type (default: website) 19 | yrewrite_metainfo_thumbnail_label = og:image 20 | yrewrite_metainfo_thumbnail_notification = OpenGraph image (link preview, will be dynamically generated per article page in a later version) 21 | 22 | yrewrite_metainfo_icon_label = Profile (Icons, PWA) 23 | yrewrite_metainfo_icon_notice = In this profile, favicon and browser icons, color scheme, and many other properties for Progressive Web Apps can be specified, possibly for multiple domains. 24 | 25 | yrewrite_metainfo_icon_name_label = Profile name 26 | yrewrite_metainfo_icon_name_notice = Name of the profile (used only for display under "General") 27 | yrewrite_metainfo_shortname_label = PWA Short name (App shortcut) 28 | yrewrite_metainfo_shortname_notice = Used when the website is displayed as a PWA shortcut on the home screen or start menu. 29 | yrewrite_metainfo_display_label = PWA Browser UI 30 | yrewrite_metainfo_display_notice = Specifies how much browser UI is still visible within the PWA, e.g., reload button 31 | yrewrite_metainfo_theme_color = PWA Theme color 32 | yrewrite_metainfo_background_color_label = PWA Background color 33 | yrewrite_metainfo_background_color_notice = Background color, e.g., when starting the PWA 34 | 35 | yrewrite_metainfo_shortcut_icon = Favicon 36 | yrewrite_metainfo_apple_touch_icon = Apple Touch 37 | yrewrite_metainfo_manifest = webmanifest.json 38 | yrewrite_metainfo_favicon_png_96 = PNG Favicon 96x96 39 | yrewrite_metainfo_favicon_svg = SVG Favicon 40 | 41 | yrewrite_metainfo_add = Add 42 | yrewrite_metainfo_edit = Edit 43 | 44 | yrewrite_metainfo_domain_icon_zip_upload_title = Upload realfavicongenerator.net ZIP 45 | yrewrite_metainfo_domain_icon_zip_upload_notice = Upload a ZIP archive from https://realfavicongenerator.net/ to automatically import the icons. 46 | yrewrite_metainfo_domain_icon_zip_upload_label = ZIP file 47 | yrewrite_metainfo_domain_icon_zip_upload_submit = Upload and add 48 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_root = -- no category -- 49 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_new = Automatically create new category 50 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_label = Media category 51 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_notice = Media category for the uploaded files 52 | 53 | 54 | -------------------------------------------------------------------------------- /lang/de_de.lang: -------------------------------------------------------------------------------- 1 | yrewrite_metainfo = YRewrite Domain Meta-Infos 2 | yrewrite_metainfo_title = Meta-Infos 3 | 4 | # Menü-Reiter 5 | yrewrite_metainfo_domain = Allgemein 6 | yrewrite_metainfo_domain_icon = Icons und PWA-Profile 7 | yrewrite_metainfo_api = API-Dokumentation 8 | 9 | # YForm Felder 10 | rex_yrewrite_metainfo_icon_table = 🌍 Icons und PWA-Profile 11 | rex_yrewrite_metainfo_domain_table = 🌍 Domain-Metainfos 12 | yrewrite_metainfo_fields = Felder 13 | 14 | yrewrite_metainfo_logo_label = Logo 15 | yrewrite_metainfo_logo_notice = Logo, das im Template ausgegeben werden kann. 16 | 17 | yrewrite_metainfo_type_label = og:type 18 | yrewrite_metainfo_type_notice = OpenGraph-Type (Standard: website) 19 | yrewrite_metainfo_thumbnail_label = og:image 20 | yrewrite_metainfo_thumbnail_notification = OpenGraph-Bild (Linkvorschau, wird zu einer späteren Version dynamisch pro Artikelseite) 21 | 22 | yrewrite_metainfo_icon_label = Profil (Icons, PWA) 23 | yrewrite_metainfo_icon_notice = In diesem Profil können Favicon- und Browser-Icons, Farbschema u.v.a. Eigenschaften für Progessive Web Apps ggf. für mehrere Domains angegeben werden. 24 | 25 | yrewrite_metainfo_icon_name_label = Profilname 26 | yrewrite_metainfo_icon_name_notice = Name des Profils (wird nur für die Anzeige unter "Allgemein" verwendet) 27 | yrewrite_metainfo_shortname_label = PWA Kurzname (App-Verknüpfung) 28 | yrewrite_metainfo_shortname_notice = Wird verwendet, wenn die Website als PWA-Verknüpfung auf dem Home-Screen oder Startmenü dargestellt wird. 29 | yrewrite_metainfo_display_label = PWA Browser-UI 30 | yrewrite_metainfo_display_notice = Gibt an, wie viel Browser-UI innerhalb der PWA noch sichtbar ist, z.B. Reload-Button 31 | yrewrite_metainfo_theme_color = PWA Theme-Farbe 32 | yrewrite_metainfo_background_color_label = PWA Hintergrund-Farbe 33 | yrewrite_metainfo_background_color_notice = Hintergrundfarbe, z.B. beim Starten der PWA 34 | 35 | yrewrite_metainfo_shortcut_icon = Favicon 36 | yrewrite_metainfo_apple_touch_icon = Apple Touch 37 | yrewrite_metainfo_manifest = webmanifest.json 38 | yrewrite_metainfo_favicon_png_96 = PNG Favicon 96x96 39 | yrewrite_metainfo_favicon_svg = SVG Favicon 40 | 41 | yrewrite_metainfo_add = Hinzufügen 42 | yrewrite_metainfo_edit = Bearbeiten 43 | 44 | yrewrite_metainfo_domain_icon_zip_upload_title = realfavicongenerator.net ZIP hochladen 45 | yrewrite_metainfo_domain_icon_zip_upload_notice = Lade ein ZIP-Archiv von https://realfavicongenerator.net/ hoch, um die Icons automatisch zu importieren. 46 | yrewrite_metainfo_domain_icon_zip_upload_label = ZIP-Datei 47 | yrewrite_metainfo_domain_icon_zip_upload_submit = Hochladen und hinzufügen 48 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_root = -- keine Kategorie -- 49 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_new = Neue Kategorie automatisch anlegen 50 | 51 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_label = Medien-Kategorie 52 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_notice = Medien-Kategorie für die hochgeladenen Dateien 53 | 54 | # Media Preview Field 55 | yrewrite_metainfo_click_to_enlarge = Zum Vergrößern klicken 56 | -------------------------------------------------------------------------------- /lang/sv_se.lang: -------------------------------------------------------------------------------- 1 | yrewrite_metainfo = YRewrite Domän Meta-Info 2 | yrewrite_metainfo_title = Meta-Info 3 | 4 | # Menyflikar 5 | yrewrite_metainfo_domain = Allmänt 6 | yrewrite_metainfo_domain_icon = Ikoner och PWA-profiler 7 | yrewrite_metainfo_docs = Dokumentation 8 | 9 | # YForm-fält 10 | rex_yrewrite_metainfo_icon_table = 🌍 Ikoner och PWA-profiler 11 | rex_yrewrite_metainfo_domain_table = 🌍 Domän Meta-Info 12 | yrewrite_metainfo_fields = Fält 13 | 14 | yrewrite_metainfo_logo_label = Logotyp 15 | yrewrite_metainfo_logo_notice = Logotyp som kan visas i mallen. 16 | 17 | yrewrite_metainfo_type_label = og:type 18 | yrewrite_metainfo_type_notice = OpenGraph-typ (standard: website) 19 | yrewrite_metainfo_thumbnail_label = og:image 20 | yrewrite_metainfo_thumbnail_notification = OpenGraph-bild (länkförhandsvisning, kommer att genereras dynamiskt per artikelsida i en senare version) 21 | 22 | yrewrite_metainfo_icon_label = Profil (Ikoner, PWA) 23 | yrewrite_metainfo_icon_notice = I denna profil kan favicon- och webbläsarikoner, färgschema och många andra egenskaper för Progressive Web Apps anges, eventuellt för flera domäner. 24 | 25 | yrewrite_metainfo_icon_name_label = Profilnamn 26 | yrewrite_metainfo_icon_name_notice = Namn på profilen (används endast för visning under "Allmänt") 27 | yrewrite_metainfo_shortname_label = PWA Kortnamn (appgenväg) 28 | yrewrite_metainfo_shortname_notice = Används när webbplatsen visas som PWA-genväg på hemskärmen eller startmenyn. 29 | yrewrite_metainfo_display_label = PWA Webbläsargränssnitt 30 | yrewrite_metainfo_display_notice = Anger hur mycket webbläsargränssnitt som fortfarande är synligt i PWA, t.ex. omladdningsknappen 31 | yrewrite_metainfo_theme_color = PWA Temafärg 32 | yrewrite_metainfo_background_color_label = PWA Bakgrundsfärg 33 | yrewrite_metainfo_background_color_notice = Bakgrundsfärg, t.ex. vid start av PWA 34 | 35 | yrewrite_metainfo_shortcut_icon = Favicon 36 | yrewrite_metainfo_apple_touch_icon = Apple Touch 37 | yrewrite_metainfo_manifest = webmanifest.json 38 | yrewrite_metainfo_favicon_png_96 = PNG Favicon 96x96 39 | yrewrite_metainfo_favicon_svg = SVG Favicon 40 | 41 | yrewrite_metainfo_add = Lägg till 42 | yrewrite_metainfo_edit = Redigera 43 | 44 | yrewrite_metainfo_domain_icon_zip_upload_title = Ladda upp realfavicongenerator.net ZIP 45 | yrewrite_metainfo_domain_icon_zip_upload_notice = Ladda upp ett ZIP-arkiv från https://realfavicongenerator.net/ för att automatiskt importera ikonerna. 46 | yrewrite_metainfo_domain_icon_zip_upload_label = ZIP-fil 47 | yrewrite_metainfo_domain_icon_zip_upload_submit = Ladda upp och lägg till 48 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_root = -- ingen kategori -- 49 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_new = Skapa automatiskt ny kategori 50 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_label = Mediekategori 51 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_notice = Mediekategori för de uppladdade filerna 52 | 53 | # Dokumentation 54 | yrewrite_metainfo_docs_intro = Introduktion 55 | yrewrite_metainfo_docs_domain = Domän Meta-Info 56 | yrewrite_metainfo_docs_icon_pwa = Ikoner och PWA 57 | yrewrite_metainfo_docs_fragments = Fragment 58 | -------------------------------------------------------------------------------- /lang/ru_ru.lang: -------------------------------------------------------------------------------- 1 | yrewrite_metainfo = Мета-информация домена YRewrite 2 | yrewrite_metainfo_title = Мета-информация 3 | 4 | # Вкладки меню 5 | yrewrite_metainfo_domain = Общие 6 | yrewrite_metainfo_domain_icon = Иконки и профили PWA 7 | yrewrite_metainfo_docs = Документация 8 | 9 | # Поля YForm 10 | rex_yrewrite_metainfo_icon_table = 🌍 Иконки и профили PWA 11 | rex_yrewrite_metainfo_domain_table = 🌍 Мета-информация домена 12 | yrewrite_metainfo_fields = Поля 13 | 14 | yrewrite_metainfo_logo_label = Логотип 15 | yrewrite_metainfo_logo_notice = Логотип, который можно вывести в шаблоне. 16 | 17 | yrewrite_metainfo_type_label = og:type 18 | yrewrite_metainfo_type_notice = Тип OpenGraph (по умолчанию: website) 19 | yrewrite_metainfo_thumbnail_label = og:image 20 | yrewrite_metainfo_thumbnail_notification = Изображение OpenGraph (превью ссылки, будет динамически генерироваться для каждой страницы статьи в следующей версии) 21 | 22 | yrewrite_metainfo_icon_label = Профиль (Иконки, PWA) 23 | yrewrite_metainfo_icon_notice = В этом профиле можно указать иконки favicon и браузера, цветовую схему и многие другие свойства для Progressive Web Apps, возможно, для нескольких доменов. 24 | 25 | yrewrite_metainfo_icon_name_label = Название профиля 26 | yrewrite_metainfo_icon_name_notice = Название профиля (используется только для отображения в разделе "Общие") 27 | yrewrite_metainfo_shortname_label = Короткое название PWA (ярлык приложения) 28 | yrewrite_metainfo_shortname_notice = Используется, когда сайт отображается как ярлык PWA на главном экране или в меню «Пуск». 29 | yrewrite_metainfo_display_label = Интерфейс браузера PWA 30 | yrewrite_metainfo_display_notice = Указывает, какая часть интерфейса браузера все еще видна в PWA, например, кнопка обновления 31 | yrewrite_metainfo_theme_color = Цвет темы PWA 32 | yrewrite_metainfo_background_color_label = Цвет фона PWA 33 | yrewrite_metainfo_background_color_notice = Цвет фона, например, при запуске PWA 34 | 35 | yrewrite_metainfo_shortcut_icon = Favicon 36 | yrewrite_metainfo_apple_touch_icon = Apple Touch 37 | yrewrite_metainfo_manifest = webmanifest.json 38 | yrewrite_metainfo_favicon_png_96 = PNG Favicon 96x96 39 | yrewrite_metainfo_favicon_svg = SVG Favicon 40 | 41 | yrewrite_metainfo_add = Добавить 42 | yrewrite_metainfo_edit = Редактировать 43 | 44 | yrewrite_metainfo_domain_icon_zip_upload_title = Загрузить ZIP с realfavicongenerator.net 45 | yrewrite_metainfo_domain_icon_zip_upload_notice = Загрузите ZIP-архив с https://realfavicongenerator.net/ для автоматического импорта иконок. 46 | yrewrite_metainfo_domain_icon_zip_upload_label = ZIP-файл 47 | yrewrite_metainfo_domain_icon_zip_upload_submit = Загрузить и добавить 48 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_root = -- без категории -- 49 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_new = Автоматически создать новую категорию 50 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_label = Категория медиа 51 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_notice = Категория медиа для загруженных файлов 52 | 53 | # Документация 54 | yrewrite_metainfo_docs_intro = Введение 55 | yrewrite_metainfo_docs_domain = Мета-информация домена 56 | yrewrite_metainfo_docs_icon_pwa = Иконки и PWA 57 | yrewrite_metainfo_docs_fragments = Фрагменты 58 | -------------------------------------------------------------------------------- /lang/pt_br.lang: -------------------------------------------------------------------------------- 1 | yrewrite_metainfo = Meta-Informações de Domínio YRewrite 2 | yrewrite_metainfo_title = Meta-Informações 3 | 4 | # Abas do menu 5 | yrewrite_metainfo_domain = Geral 6 | yrewrite_metainfo_domain_icon = Ícones e perfis PWA 7 | yrewrite_metainfo_docs = Documentação 8 | 9 | # Campos YForm 10 | rex_yrewrite_metainfo_icon_table = 🌍 Ícones e perfis PWA 11 | rex_yrewrite_metainfo_domain_table = 🌍 Meta-Informações de Domínio 12 | yrewrite_metainfo_fields = Campos 13 | 14 | yrewrite_metainfo_logo_label = Logotipo 15 | yrewrite_metainfo_logo_notice = Logotipo que pode ser exibido no template. 16 | 17 | yrewrite_metainfo_type_label = og:type 18 | yrewrite_metainfo_type_notice = Tipo OpenGraph (padrão: website) 19 | yrewrite_metainfo_thumbnail_label = og:image 20 | yrewrite_metainfo_thumbnail_notification = Imagem OpenGraph (pré-visualização do link, será gerada dinamicamente por página de artigo em uma versão posterior) 21 | 22 | yrewrite_metainfo_icon_label = Perfil (Ícones, PWA) 23 | yrewrite_metainfo_icon_notice = Neste perfil, ícones de favicon e navegador, esquema de cores e muitas outras propriedades para Progressive Web Apps podem ser especificados, possivelmente para vários domínios. 24 | 25 | yrewrite_metainfo_icon_name_label = Nome do perfil 26 | yrewrite_metainfo_icon_name_notice = Nome do perfil (usado apenas para exibição em "Geral") 27 | yrewrite_metainfo_shortname_label = Nome curto PWA (atalho do aplicativo) 28 | yrewrite_metainfo_shortname_notice = Usado quando o site é exibido como atalho PWA na tela inicial ou menu iniciar. 29 | yrewrite_metainfo_display_label = Interface do navegador PWA 30 | yrewrite_metainfo_display_notice = Especifica quanta interface do navegador ainda está visível dentro do PWA, por exemplo, botão de recarregar 31 | yrewrite_metainfo_theme_color = Cor do tema PWA 32 | yrewrite_metainfo_background_color_label = Cor de fundo PWA 33 | yrewrite_metainfo_background_color_notice = Cor de fundo, por exemplo, ao iniciar o PWA 34 | 35 | yrewrite_metainfo_shortcut_icon = Favicon 36 | yrewrite_metainfo_apple_touch_icon = Apple Touch 37 | yrewrite_metainfo_manifest = webmanifest.json 38 | yrewrite_metainfo_favicon_png_96 = Favicon PNG 96x96 39 | yrewrite_metainfo_favicon_svg = Favicon SVG 40 | 41 | yrewrite_metainfo_add = Adicionar 42 | yrewrite_metainfo_edit = Editar 43 | 44 | yrewrite_metainfo_domain_icon_zip_upload_title = Enviar ZIP do realfavicongenerator.net 45 | yrewrite_metainfo_domain_icon_zip_upload_notice = Envie um arquivo ZIP de https://realfavicongenerator.net/ para importar automaticamente os ícones. 46 | yrewrite_metainfo_domain_icon_zip_upload_label = Arquivo ZIP 47 | yrewrite_metainfo_domain_icon_zip_upload_submit = Enviar e adicionar 48 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_root = -- sem categoria -- 49 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_new = Criar automaticamente nova categoria 50 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_label = Categoria de mídia 51 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_notice = Categoria de mídia para os arquivos enviados 52 | 53 | # Documentação 54 | yrewrite_metainfo_docs_intro = Introdução 55 | yrewrite_metainfo_docs_domain = Meta-Informações de Domínio 56 | yrewrite_metainfo_docs_icon_pwa = Ícones e PWA 57 | yrewrite_metainfo_docs_fragments = Fragmentos 58 | -------------------------------------------------------------------------------- /lang/it_it.lang: -------------------------------------------------------------------------------- 1 | yrewrite_metainfo = Meta-Info del dominio YRewrite 2 | yrewrite_metainfo_title = Meta-Info 3 | 4 | # Schede del menu 5 | yrewrite_metainfo_domain = Generale 6 | yrewrite_metainfo_domain_icon = Icone e profili PWA 7 | yrewrite_metainfo_docs = Documentazione 8 | 9 | # Campi YForm 10 | rex_yrewrite_metainfo_icon_table = 🌍 Icone e profili PWA 11 | rex_yrewrite_metainfo_domain_table = 🌍 Meta-Info del dominio 12 | yrewrite_metainfo_fields = Campi 13 | 14 | yrewrite_metainfo_logo_label = Logo 15 | yrewrite_metainfo_logo_notice = Logo che può essere visualizzato nel template. 16 | 17 | yrewrite_metainfo_type_label = og:type 18 | yrewrite_metainfo_type_notice = Tipo OpenGraph (predefinito: website) 19 | yrewrite_metainfo_thumbnail_label = og:image 20 | yrewrite_metainfo_thumbnail_notification = Immagine OpenGraph (anteprima del link, sarà generata dinamicamente per pagina articolo in una versione successiva) 21 | 22 | yrewrite_metainfo_icon_label = Profilo (Icone, PWA) 23 | yrewrite_metainfo_icon_notice = In questo profilo è possibile specificare icone favicon e browser, schema di colori e molte altre proprietà per Progressive Web Apps, eventualmente per più domini. 24 | 25 | yrewrite_metainfo_icon_name_label = Nome del profilo 26 | yrewrite_metainfo_icon_name_notice = Nome del profilo (utilizzato solo per la visualizzazione sotto "Generale") 27 | yrewrite_metainfo_shortname_label = Nome breve PWA (collegamento app) 28 | yrewrite_metainfo_shortname_notice = Utilizzato quando il sito web viene visualizzato come collegamento PWA sulla schermata iniziale o nel menu di avvio. 29 | yrewrite_metainfo_display_label = UI del browser PWA 30 | yrewrite_metainfo_display_notice = Specifica quanta UI del browser è ancora visibile all'interno della PWA, ad esempio il pulsante di ricarica 31 | yrewrite_metainfo_theme_color = Colore del tema PWA 32 | yrewrite_metainfo_background_color_label = Colore di sfondo PWA 33 | yrewrite_metainfo_background_color_notice = Colore di sfondo, ad esempio all'avvio della PWA 34 | 35 | yrewrite_metainfo_shortcut_icon = Favicon 36 | yrewrite_metainfo_apple_touch_icon = Apple Touch 37 | yrewrite_metainfo_manifest = webmanifest.json 38 | yrewrite_metainfo_favicon_png_96 = Favicon PNG 96x96 39 | yrewrite_metainfo_favicon_svg = Favicon SVG 40 | 41 | yrewrite_metainfo_add = Aggiungi 42 | yrewrite_metainfo_edit = Modifica 43 | 44 | yrewrite_metainfo_domain_icon_zip_upload_title = Carica ZIP da realfavicongenerator.net 45 | yrewrite_metainfo_domain_icon_zip_upload_notice = Carica un archivio ZIP da https://realfavicongenerator.net/ per importare automaticamente le icone. 46 | yrewrite_metainfo_domain_icon_zip_upload_label = File ZIP 47 | yrewrite_metainfo_domain_icon_zip_upload_submit = Carica e aggiungi 48 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_root = -- nessuna categoria -- 49 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_new = Crea automaticamente nuova categoria 50 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_label = Categoria media 51 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_notice = Categoria media per i file caricati 52 | 53 | # Documentazione 54 | yrewrite_metainfo_docs_intro = Introduzione 55 | yrewrite_metainfo_docs_domain = Meta-Info del dominio 56 | yrewrite_metainfo_docs_icon_pwa = Icone e PWA 57 | yrewrite_metainfo_docs_fragments = Frammenti 58 | -------------------------------------------------------------------------------- /lang/nl_nl.lang: -------------------------------------------------------------------------------- 1 | yrewrite_metainfo = YRewrite Domein Meta-Infos 2 | yrewrite_metainfo_title = Meta-Infos 3 | 4 | # Menu-tabbladen 5 | yrewrite_metainfo_domain = Algemeen 6 | yrewrite_metainfo_domain_icon = Pictogrammen en PWA-profielen 7 | yrewrite_metainfo_docs = Documentatie 8 | 9 | # YForm-velden 10 | rex_yrewrite_metainfo_icon_table = 🌍 Pictogrammen en PWA-profielen 11 | rex_yrewrite_metainfo_domain_table = 🌍 Domein Meta-Infos 12 | yrewrite_metainfo_fields = Velden 13 | 14 | yrewrite_metainfo_logo_label = Logo 15 | yrewrite_metainfo_logo_notice = Logo dat in de sjabloon kan worden weergegeven. 16 | 17 | yrewrite_metainfo_type_label = og:type 18 | yrewrite_metainfo_type_notice = OpenGraph-Type (standaard: website) 19 | yrewrite_metainfo_thumbnail_label = og:image 20 | yrewrite_metainfo_thumbnail_notification = OpenGraph-afbeelding (linkvoorbeeld, wordt dynamisch per artikelpagina gegenereerd in een latere versie) 21 | 22 | yrewrite_metainfo_icon_label = Profiel (Pictogrammen, PWA) 23 | yrewrite_metainfo_icon_notice = In dit profiel kunnen favicon- en browserpictogrammen, kleurenschema en vele andere eigenschappen voor Progressive Web Apps worden opgegeven, mogelijk voor meerdere domeinen. 24 | 25 | yrewrite_metainfo_icon_name_label = Profielnaam 26 | yrewrite_metainfo_icon_name_notice = Naam van het profiel (alleen gebruikt voor weergave onder "Algemeen") 27 | yrewrite_metainfo_shortname_label = PWA Korte naam (app-snelkoppeling) 28 | yrewrite_metainfo_shortname_notice = Wordt gebruikt wanneer de website wordt weergegeven als PWA-snelkoppeling op het startscherm of startmenu. 29 | yrewrite_metainfo_display_label = PWA Browser-UI 30 | yrewrite_metainfo_display_notice = Geeft aan hoeveel browser-UI nog zichtbaar is binnen de PWA, bijvoorbeeld de herlaadknop 31 | yrewrite_metainfo_theme_color = PWA Themakleur 32 | yrewrite_metainfo_background_color_label = PWA Achtergrondkleur 33 | yrewrite_metainfo_background_color_notice = Achtergrondkleur, bijvoorbeeld bij het starten van de PWA 34 | 35 | yrewrite_metainfo_shortcut_icon = Favicon 36 | yrewrite_metainfo_apple_touch_icon = Apple Touch 37 | yrewrite_metainfo_manifest = webmanifest.json 38 | yrewrite_metainfo_favicon_png_96 = PNG Favicon 96x96 39 | yrewrite_metainfo_favicon_svg = SVG Favicon 40 | 41 | yrewrite_metainfo_add = Toevoegen 42 | yrewrite_metainfo_edit = Bewerken 43 | 44 | yrewrite_metainfo_domain_icon_zip_upload_title = realfavicongenerator.net ZIP uploaden 45 | yrewrite_metainfo_domain_icon_zip_upload_notice = Upload een ZIP-archief van https://realfavicongenerator.net/ om de pictogrammen automatisch te importeren. 46 | yrewrite_metainfo_domain_icon_zip_upload_label = ZIP-bestand 47 | yrewrite_metainfo_domain_icon_zip_upload_submit = Uploaden en toevoegen 48 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_root = -- geen categorie -- 49 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_new = Automatisch nieuwe categorie aanmaken 50 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_label = Mediacategorie 51 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_notice = Mediacategorie voor de geüploade bestanden 52 | 53 | # Documentatie 54 | yrewrite_metainfo_docs_intro = Introductie 55 | yrewrite_metainfo_docs_domain = Domein Meta-Infos 56 | yrewrite_metainfo_docs_icon_pwa = Pictogrammen en PWA 57 | yrewrite_metainfo_docs_fragments = Fragmenten 58 | -------------------------------------------------------------------------------- /lang/es_es.lang: -------------------------------------------------------------------------------- 1 | yrewrite_metainfo = Meta-Infos de dominio YRewrite 2 | yrewrite_metainfo_title = Meta-Infos 3 | 4 | # Pestañas del menú 5 | yrewrite_metainfo_domain = General 6 | yrewrite_metainfo_domain_icon = Iconos y perfiles PWA 7 | yrewrite_metainfo_docs = Documentación 8 | 9 | # Campos YForm 10 | rex_yrewrite_metainfo_icon_table = 🌍 Iconos y perfiles PWA 11 | rex_yrewrite_metainfo_domain_table = 🌍 Meta-Infos de dominio 12 | yrewrite_metainfo_fields = Campos 13 | 14 | yrewrite_metainfo_logo_label = Logotipo 15 | yrewrite_metainfo_logo_notice = Logotipo que se puede mostrar en la plantilla. 16 | 17 | yrewrite_metainfo_type_label = og:type 18 | yrewrite_metainfo_type_notice = Tipo OpenGraph (predeterminado: website) 19 | yrewrite_metainfo_thumbnail_label = og:image 20 | yrewrite_metainfo_thumbnail_notification = Imagen OpenGraph (vista previa del enlace, se generará dinámicamente por página de artículo en una versión posterior) 21 | 22 | yrewrite_metainfo_icon_label = Perfil (Iconos, PWA) 23 | yrewrite_metainfo_icon_notice = En este perfil se pueden especificar iconos de favicon y navegador, esquema de colores y muchas otras propiedades para Progressive Web Apps, posiblemente para varios dominios. 24 | 25 | yrewrite_metainfo_icon_name_label = Nombre del perfil 26 | yrewrite_metainfo_icon_name_notice = Nombre del perfil (se usa solo para mostrar en "General") 27 | yrewrite_metainfo_shortname_label = Nombre corto PWA (acceso directo de aplicación) 28 | yrewrite_metainfo_shortname_notice = Se usa cuando el sitio web se muestra como acceso directo PWA en la pantalla de inicio o menú de inicio. 29 | yrewrite_metainfo_display_label = Interfaz de usuario del navegador PWA 30 | yrewrite_metainfo_display_notice = Especifica cuánta interfaz de usuario del navegador sigue visible dentro de la PWA, por ejemplo, botón de recarga 31 | yrewrite_metainfo_theme_color = Color de tema PWA 32 | yrewrite_metainfo_background_color_label = Color de fondo PWA 33 | yrewrite_metainfo_background_color_notice = Color de fondo, por ejemplo, al iniciar la PWA 34 | 35 | yrewrite_metainfo_shortcut_icon = Favicon 36 | yrewrite_metainfo_apple_touch_icon = Apple Touch 37 | yrewrite_metainfo_manifest = webmanifest.json 38 | yrewrite_metainfo_favicon_png_96 = Favicon PNG 96x96 39 | yrewrite_metainfo_favicon_svg = Favicon SVG 40 | 41 | yrewrite_metainfo_add = Añadir 42 | yrewrite_metainfo_edit = Editar 43 | 44 | yrewrite_metainfo_domain_icon_zip_upload_title = Subir ZIP de realfavicongenerator.net 45 | yrewrite_metainfo_domain_icon_zip_upload_notice = Sube un archivo ZIP desde https://realfavicongenerator.net/ para importar automáticamente los iconos. 46 | yrewrite_metainfo_domain_icon_zip_upload_label = Archivo ZIP 47 | yrewrite_metainfo_domain_icon_zip_upload_submit = Subir y añadir 48 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_root = -- sin categoría -- 49 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_new = Crear automáticamente nueva categoría 50 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_label = Categoría de medios 51 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_notice = Categoría de medios para los archivos subidos 52 | 53 | # Documentación 54 | yrewrite_metainfo_docs_intro = Introducción 55 | yrewrite_metainfo_docs_domain = Meta-Infos de dominio 56 | yrewrite_metainfo_docs_icon_pwa = Iconos y PWA 57 | yrewrite_metainfo_docs_fragments = Fragmentos 58 | -------------------------------------------------------------------------------- /lang/fr_fr.lang: -------------------------------------------------------------------------------- 1 | yrewrite_metainfo = Méta-Infos du domaine YRewrite 2 | yrewrite_metainfo_title = Méta-Infos 3 | 4 | # Onglets du menu 5 | yrewrite_metainfo_domain = Général 6 | yrewrite_metainfo_domain_icon = Icônes et profils PWA 7 | yrewrite_metainfo_docs = Documentation 8 | 9 | # Champs YForm 10 | rex_yrewrite_metainfo_icon_table = 🌍 Icônes et profils PWA 11 | rex_yrewrite_metainfo_domain_table = 🌍 Méta-Infos du domaine 12 | yrewrite_metainfo_fields = Champs 13 | 14 | yrewrite_metainfo_logo_label = Logo 15 | yrewrite_metainfo_logo_notice = Logo qui peut être affiché dans le modèle. 16 | 17 | yrewrite_metainfo_type_label = og:type 18 | yrewrite_metainfo_type_notice = Type OpenGraph (par défaut : website) 19 | yrewrite_metainfo_thumbnail_label = og:image 20 | yrewrite_metainfo_thumbnail_notification = Image OpenGraph (aperçu du lien, sera générée dynamiquement par page d'article dans une version ultérieure) 21 | 22 | yrewrite_metainfo_icon_label = Profil (Icônes, PWA) 23 | yrewrite_metainfo_icon_notice = Dans ce profil, les icônes de favicon et de navigateur, le jeu de couleurs et de nombreuses autres propriétés pour les Progressive Web Apps peuvent être spécifiés, éventuellement pour plusieurs domaines. 24 | 25 | yrewrite_metainfo_icon_name_label = Nom du profil 26 | yrewrite_metainfo_icon_name_notice = Nom du profil (utilisé uniquement pour l'affichage sous "Général") 27 | yrewrite_metainfo_shortname_label = Nom court PWA (raccourci d'application) 28 | yrewrite_metainfo_shortname_notice = Utilisé lorsque le site Web est affiché comme raccourci PWA sur l'écran d'accueil ou le menu de démarrage. 29 | yrewrite_metainfo_display_label = Interface utilisateur du navigateur PWA 30 | yrewrite_metainfo_display_notice = Indique la quantité d'interface utilisateur du navigateur encore visible dans la PWA, par exemple le bouton de rechargement 31 | yrewrite_metainfo_theme_color = Couleur de thème PWA 32 | yrewrite_metainfo_background_color_label = Couleur d'arrière-plan PWA 33 | yrewrite_metainfo_background_color_notice = Couleur d'arrière-plan, par exemple lors du démarrage de la PWA 34 | 35 | yrewrite_metainfo_shortcut_icon = Favicon 36 | yrewrite_metainfo_apple_touch_icon = Apple Touch 37 | yrewrite_metainfo_manifest = webmanifest.json 38 | yrewrite_metainfo_favicon_png_96 = Favicon PNG 96x96 39 | yrewrite_metainfo_favicon_svg = Favicon SVG 40 | 41 | yrewrite_metainfo_add = Ajouter 42 | yrewrite_metainfo_edit = Modifier 43 | 44 | yrewrite_metainfo_domain_icon_zip_upload_title = Télécharger le ZIP de realfavicongenerator.net 45 | yrewrite_metainfo_domain_icon_zip_upload_notice = Téléchargez une archive ZIP depuis https://realfavicongenerator.net/ pour importer automatiquement les icônes. 46 | yrewrite_metainfo_domain_icon_zip_upload_label = Fichier ZIP 47 | yrewrite_metainfo_domain_icon_zip_upload_submit = Télécharger et ajouter 48 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_root = -- aucune catégorie -- 49 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_new = Créer automatiquement une nouvelle catégorie 50 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_label = Catégorie de média 51 | yrewrite_metainfo_domain_icon_zip_upload_media_category_id_notice = Catégorie de média pour les fichiers téléchargés 52 | 53 | # Documentation 54 | yrewrite_metainfo_docs_intro = Introduction 55 | yrewrite_metainfo_docs_domain = Méta-Infos du domaine 56 | yrewrite_metainfo_docs_icon_pwa = Icônes et PWA 57 | yrewrite_metainfo_docs_fragments = Fragments 58 | -------------------------------------------------------------------------------- /assets/media_preview.css: -------------------------------------------------------------------------------- 1 | /* YRewrite Metainfo Media Preview Styles */ 2 | 3 | .rex-media-preview-container { 4 | background: #f8f9fa; 5 | border-radius: 8px; 6 | padding: 10px; 7 | margin-top: 10px; 8 | } 9 | 10 | .rex-media-preview-item { 11 | position: relative; 12 | transition: all 0.3s ease; 13 | } 14 | 15 | .rex-media-preview-item:hover { 16 | transform: translateY(-2px); 17 | } 18 | 19 | .rex-js-media-preview-click { 20 | box-shadow: 0 2px 8px rgba(0,0,0,0.1); 21 | transition: all 0.3s ease; 22 | } 23 | 24 | .rex-js-media-preview-click:hover { 25 | box-shadow: 0 4px 16px rgba(0,0,0,0.15); 26 | transform: scale(1.05); 27 | } 28 | 29 | /* Modal Styling */ 30 | .rex-media-preview-modal .modal-content { 31 | border-radius: 12px; 32 | overflow: hidden; 33 | box-shadow: 0 10px 40px rgba(0,0,0,0.3); 34 | } 35 | 36 | .rex-media-preview-modal .modal-header { 37 | background: #f8f9fa; 38 | border-bottom: 1px solid #dee2e6; 39 | } 40 | 41 | .rex-media-preview-modal .modal-body { 42 | background: #fff; 43 | } 44 | 45 | /* SVG specific styling */ 46 | .rex-media-preview-item img[src$=".svg"], 47 | .rex-media-preview-item img[title*="(SVG)"] { 48 | background: #f8f9fa; 49 | padding: 8px; 50 | object-fit: contain !important; 51 | } 52 | 53 | .rex-media-preview-view img[src$=".svg"], 54 | .rex-media-preview-view img[title*="(SVG)"] { 55 | background: #f8f9fa; 56 | padding: 4px; 57 | object-fit: contain !important; 58 | } 59 | 60 | /* Responsive Improvements */ 61 | @media (max-width: 768px) { 62 | .rex-media-preview-item img { 63 | width: 60px !important; 64 | height: 60px !important; 65 | } 66 | 67 | .modal-lg { 68 | max-width: 95vw; 69 | } 70 | 71 | .modal-dialog { 72 | margin: 15px auto; 73 | } 74 | } 75 | 76 | /* Lazy Loading Styles */ 77 | .rex-media-lazy { 78 | opacity: 0.7; 79 | background: #f8f9fa; 80 | transition: opacity 0.3s ease; 81 | position: relative; 82 | } 83 | 84 | .rex-media-lazy.loaded { 85 | opacity: 1; 86 | } 87 | 88 | .rex-media-lazy:not(.loaded)::after { 89 | content: ''; 90 | position: absolute; 91 | top: 50%; 92 | left: 50%; 93 | transform: translate(-50%, -50%); 94 | width: 20px; 95 | height: 20px; 96 | border: 2px solid #ddd; 97 | border-top: 2px solid #337ab7; 98 | border-radius: 50%; 99 | animation: spin 1s linear infinite; 100 | pointer-events: none; 101 | } 102 | 103 | @keyframes spin { 104 | 0% { transform: translate(-50%, -50%) rotate(0deg); } 105 | 100% { transform: translate(-50%, -50%) rotate(360deg); } 106 | } 107 | 108 | /* Dark Mode Support */ 109 | @media (prefers-color-scheme: dark) { 110 | .rex-media-preview-container { 111 | background: #343a40; 112 | } 113 | 114 | .rex-js-media-preview-click { 115 | border-color: #495057; 116 | } 117 | 118 | .rex-media-preview-modal .modal-content { 119 | background: #212529; 120 | color: #fff; 121 | } 122 | 123 | .rex-media-preview-modal .modal-header { 124 | background: #343a40; 125 | border-color: #495057; 126 | } 127 | 128 | .rex-media-lazy { 129 | background: #343a40; 130 | } 131 | 132 | .rex-media-lazy:not(.loaded)::after { 133 | border-color: #495057; 134 | border-top-color: #007bff; 135 | } 136 | } -------------------------------------------------------------------------------- /boot.php: -------------------------------------------------------------------------------- 1 | getAssetsUrl('media_preview.css')); 36 | rex_view::addJsFile(rex_addon::get('yrewrite_metainfo')->getAssetsUrl('media_preview.js')); 37 | } 38 | 39 | // Listendarstellung von YRewrite Domains um eine Spalte ergänzen mit Link zu YRewrite Metainfos 40 | rex_extension::register('REX_LIST_GET', static function (rex_extension_point $ep) { 41 | if ('yrewrite/domains' !== $ep->getSubject()->getParams()['page']) { 42 | return; 43 | } 44 | $list = $ep->getSubject(); 45 | /** @var rex_list $list */ 46 | $list->addColumn(rex_i18n::msg('yrewrite_metainfo_title'), '', 3); 47 | $list->setColumnFormat(rex_i18n::msg('yrewrite_metainfo_title'), 'custom', static function ($a) { 48 | $table = rex_yform_manager_table::get('rex_yrewrite_metainfo'); 49 | if (!is_object($table)) { 50 | return ''; 51 | } 52 | $_csrf_key = $table->getCSRFKey(); 53 | $token = rex_csrf_token::factory($_csrf_key)->getUrlParams(); 54 | 55 | $domain = Domain::query() 56 | ->where('yrewrite_domain_id', $a['list']->getValue('id')) 57 | ->findOne(); 58 | 59 | $params = []; 60 | $params['table_name'] = 'rex_yrewrite_metainfo'; 61 | $params['rex_yform_manager_popup'] = '0'; 62 | $params['_csrf_token'] = $token['_csrf_token']; 63 | 64 | if (null !== $domain) { 65 | $params['data_id'] = $domain->getId(); 66 | $params['func'] = 'edit'; 67 | return '' . rex_i18n::msg('yrewrite_metainfo_edit') . ''; 68 | } 69 | 70 | // Link zur neuen YRewrite-Metainfo-Domain erstellen 71 | $params['func'] = 'add'; 72 | return '' . rex_i18n::msg('yrewrite_metainfo_add') . ''; 73 | }); 74 | 75 | return $list; 76 | }); 77 | 78 | rex_extension::register('YFORM_DATA_LIST', static function (rex_extension_point $ep) { 79 | /** @var rex_yform_manager_table $table */ 80 | $table = $ep->getParam('table'); 81 | if ('rex_yrewrite_metainfo_icon' !== $table->getTableName()) { 82 | return; 83 | } 84 | 85 | /** @var rex_yform_list $list */ 86 | $list = $ep->getSubject(); 87 | 88 | // set column format for theme_color and background_color columns as bootstrap 3 badges 89 | $list->setColumnFormat('theme_color', 'custom', static function ($a) { 90 | return '' . $a['list']->getValue('theme_color') . ''; 91 | }); 92 | 93 | $list->setColumnFormat('background_color', 'custom', static function ($a) { 94 | return '' . $a['list']->getValue('background_color') . ''; 95 | }); 96 | 97 | return $list; 98 | }); 99 | -------------------------------------------------------------------------------- /ytemplates/bootstrap/value.yrewrite_metainfo_be_media_preview-view.tpl.php: -------------------------------------------------------------------------------- 1 | getValue(); 8 | $files = []; 9 | if ($value) { 10 | $files = explode(',', $value); 11 | } 12 | 13 | // Eindeutige Modal-ID für View-Modus generieren 14 | $modalId = 'rex-media-view-modal-' . uniqid(); 15 | 16 | if (empty($files) || (1 == count($files) && empty($files[0]))): ?> 17 |

-

18 | 19 |
20 | isImage()): 30 | // Prüfe ob es ein SVG ist - dann direkten Zugriff verwenden 31 | $isSvg = 'svg' === strtolower($media->getExtension()); 32 | $viewUrl = $isSvg ? rex_url::media($file) : rex_media_manager::getUrl('rex_media_small', $file); 33 | ?> 34 |
35 | 41 |
42 | 43 |
44 |
45 | 46 |
47 |
48 | 49 |
50 |
51 | 52 |
53 |
54 | 56 |
57 | 58 | 59 | 74 | 75 | 96 | -------------------------------------------------------------------------------- /lib/Field/value/yrewrite_metainfo_be_media_preview.php: -------------------------------------------------------------------------------- 1 | needsOutput() && $this->isViewable()) { 19 | if (!$this->isEditable()) { 20 | $this->params['form_output'][$this->getId()] = $this->parse( 21 | 'value.yrewrite_metainfo_be_media_preview-view.tpl.php', 22 | ['value' => explode(',', $this->getValue()), 'types' => $this->getElement('types') ?? ''], 23 | ); 24 | } else { 25 | $types = $this->getElement('types') ?? ''; 26 | if ('*' == $types) { 27 | $types = ''; 28 | } 29 | 30 | // Eigenes Template mit Preview und Modal 31 | $this->params['form_output'][$this->getId()] = $this->parse( 32 | 'value.yrewrite_metainfo_be_media_preview.tpl.php', 33 | compact('types'), 34 | ); 35 | } 36 | } 37 | } 38 | 39 | /** 40 | * Prefixing-Unterstützung für Feldnamen-Konsistenz. 41 | */ 42 | public function getFieldName($name = '') 43 | { 44 | if ('' === $name) { 45 | $name = $this->getName(); 46 | } 47 | 48 | $prefix = $this->getElement('prefix') ?? ''; 49 | if ($prefix) { 50 | $name = $prefix . '_' . $name; 51 | } 52 | 53 | return parent::getFieldName($name); 54 | } 55 | 56 | public function getDefinitions(): array 57 | { 58 | return [ 59 | 'type' => 'value', 60 | 'name' => 'yrewrite_metainfo_be_media_preview', 61 | 'values' => [ 62 | 'name' => ['type' => 'name', 'label' => rex_i18n::msg('yform_values_defaults_name')], 63 | 'label' => ['type' => 'text', 'label' => rex_i18n::msg('yform_values_defaults_label')], 64 | 'multiple' => ['type' => 'checkbox', 'label' => rex_i18n::msg('yform_values_be_media_multiple')], 65 | 'category' => ['type' => 'text', 'label' => rex_i18n::msg('yform_values_be_media_category')], 66 | 'types' => ['type' => 'text', 'label' => rex_i18n::msg('yform_values_be_media_types'), 'notice' => rex_i18n::msg('yform_values_be_media_types_notice')], 67 | 'prefix' => ['type' => 'text', 'label' => 'Prefix für Feldnamen', 'notice' => 'Optional: Präfix für konsistente Feldnamen (z.B. "meta" für "meta_image")'], 68 | 'notice' => ['type' => 'text', 'label' => rex_i18n::msg('yform_values_defaults_notice')], 69 | ], 70 | 'description' => 'Media field with modern preview and modal enlargement', 71 | 'formbuilder' => false, 72 | 'db_type' => ['text', 'varchar(191)'], 73 | ]; 74 | } 75 | 76 | public static function getListValue($params) 77 | { 78 | $files = explode(',', $params['subject']); 79 | 80 | $return = []; 81 | foreach ($files as $file) { 82 | if ($file) { 83 | $media = rex_media::get($file); 84 | if (!$media) { 85 | continue; 86 | } 87 | if ($media->isImage()) { 88 | // Prüfe ob es ein SVG ist - dann direkten Zugriff verwenden 89 | $isSvg = 'svg' === strtolower($media->getExtension()); 90 | $imageUrl = $isSvg ? rex_url::media($file) : rex_media_manager::getUrl('rex_media_small', $file); 91 | 92 | // Thumbnail mit Modal-Link und CSS-Klassen 93 | $return[] = ''; 98 | } else { 99 | // Dateiname für nicht-Bilder mit Icon 100 | $return[] = '
101 | 102 | ' . rex_escape($file) . ' 103 |
'; 104 | } 105 | } 106 | } 107 | 108 | return implode('
', $return); 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /lib/icon.php: -------------------------------------------------------------------------------- 1 | getValue('name'); 16 | } 17 | 18 | /** @api */ 19 | public function setName(mixed $value): self 20 | { 21 | $this->setValue('name', $value); 22 | return $this; 23 | } 24 | 25 | /* PWA Kurzname (App-Verknüpfung) */ 26 | /** @api */ 27 | public function getShortName(): ?string 28 | { 29 | return $this->getValue('short_name'); 30 | } 31 | 32 | /** @api */ 33 | public function setShortName(mixed $value): self 34 | { 35 | $this->setValue('short_name', $value); 36 | return $this; 37 | } 38 | 39 | /* PWA Browser-UI */ 40 | /** @api */ 41 | public function getDisplay(): ?string 42 | { 43 | return $this->getValue('display'); 44 | } 45 | 46 | /** @api */ 47 | public function setDisplay(mixed $value): self 48 | { 49 | $this->setValue('display', $value); 50 | return $this; 51 | } 52 | 53 | /* PWA Theme-Farbe */ 54 | /** @api */ 55 | public function getThemeColor(): ?string 56 | { 57 | return $this->getValue('theme_color'); 58 | } 59 | 60 | /** @api */ 61 | public function setThemeColor(mixed $value): self 62 | { 63 | $this->setValue('theme_color', $value); 64 | return $this; 65 | } 66 | 67 | /* PWA Hintergrund-Farbe */ 68 | /** @api */ 69 | public function getBackgroundColor(): ?string 70 | { 71 | return $this->getValue('background_color'); 72 | } 73 | 74 | /** @api */ 75 | public function setBackgroundColor(mixed $value): self 76 | { 77 | $this->setValue('background_color', $value); 78 | return $this; 79 | } 80 | 81 | /* Favicon */ 82 | /** @api */ 83 | public function getShortcutIcon(bool $asMedia = false): string|rex_media|null 84 | { 85 | if ($asMedia) { 86 | return rex_media::get($this->getValue('shortcut_icon')); 87 | } 88 | return $this->getValue('shortcut_icon'); 89 | } 90 | 91 | /** @api */ 92 | public function getShortcutIconUrl(): string 93 | { 94 | return rex_url::media() . $this->getValue('shortcut_icon'); 95 | } 96 | 97 | /** @api */ 98 | public function setShortcutIcon(string $filename): self 99 | { 100 | if (null !== rex_media::get($filename)) { 101 | $this->setValue('shortcut_icon', $filename); 102 | } 103 | return $this; 104 | } 105 | 106 | /* Apple Touch */ 107 | /** @api */ 108 | public function getAppleTouchIcon(bool $asMedia = false): string|rex_media|null 109 | { 110 | if ($asMedia) { 111 | return rex_media::get($this->getValue('apple_touch_icon')); 112 | } 113 | return $this->getValue('apple_touch_icon'); 114 | } 115 | 116 | /** @api */ 117 | public function getAppleTouchIconUrl(): string 118 | { 119 | return rex_url::media() . $this->getValue('apple_touch_icon'); 120 | } 121 | 122 | /** @api */ 123 | public function setAppleTouchIcon(string $filename): self 124 | { 125 | if (null !== rex_media::get($filename)) { 126 | $this->setValue('apple_touch_icon', $filename); 127 | } 128 | return $this; 129 | } 130 | 131 | /* webmanifest.json */ 132 | /** @api */ 133 | public function getManifest(bool $asMedia = false): mixed 134 | { 135 | if ($asMedia) { 136 | return rex_media::get($this->getValue('manifest')); 137 | } 138 | return $this->getValue('manifest'); 139 | } 140 | 141 | /** @api */ 142 | public function getManifestUrl(): string 143 | { 144 | return rex_url::media() . $this->getValue('manifest'); 145 | } 146 | 147 | /** @api */ 148 | public function setManifest(string $filename): self 149 | { 150 | if (null !== rex_media::get($filename)) { 151 | $this->setValue('manifest', $filename); 152 | } 153 | return $this; 154 | } 155 | 156 | /** PNG Favicon 96x96 */ 157 | /** @api */ 158 | public function getFaviconPng96(bool $asMedia = false): string|rex_media|null 159 | { 160 | if ($asMedia) { 161 | return rex_media::get($this->getValue('favicon_png_96')); 162 | } 163 | return $this->getValue('favicon_png_96'); 164 | } 165 | 166 | /** @api */ 167 | public function getFaviconPng96Url(): string 168 | { 169 | return rex_url::media() . $this->getValue('favicon_png_96'); 170 | } 171 | 172 | /** @api */ 173 | public function setFaviconPng96(string $filename): self 174 | { 175 | if (null !== rex_media::get($filename)) { 176 | $this->setValue('favicon_png_96', $filename); 177 | } 178 | return $this; 179 | } 180 | 181 | /** SVG Favicon */ 182 | /** @api */ 183 | public function getFaviconSvg(bool $asMedia = false): string|rex_media|null 184 | { 185 | if ($asMedia) { 186 | return rex_media::get($this->getValue('favicon_svg')); 187 | } 188 | return $this->getValue('favicon_svg'); 189 | } 190 | 191 | /** @api */ 192 | public function getFaviconSvgUrl(): string 193 | { 194 | return rex_url::media() . $this->getValue('favicon_svg'); 195 | } 196 | 197 | /** @api */ 198 | public function setFaviconSvg(string $filename): self 199 | { 200 | if (null !== rex_media::get($filename)) { 201 | $this->setValue('favicon_svg', $filename); 202 | } 203 | return $this; 204 | } 205 | } 206 | -------------------------------------------------------------------------------- /.github/copilot-instructions.md: -------------------------------------------------------------------------------- 1 | # YRewrite Metainfo REDAXO Addon 2 | 3 | YRewrite Metainfo is a REDAXO addon that extends YRewrite domains with meta information management capabilities. It provides ready-to-use configuration fields, YOrm dataset methods, and backend pages for managing domain-specific metadata including SEO, Open Graph, PWA icons, and more. 4 | 5 | Always reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here. 6 | 7 | ## Working Effectively 8 | 9 | - Bootstrap and validate the repository: 10 | - `composer install --no-interaction --prefer-dist --no-progress` -- installs PHP CS Fixer and dependencies. Takes 5-30 seconds (up to 5 minutes with GitHub rate limiting). NEVER CANCEL. Set timeout to 10+ minutes. 11 | - `composer cs-dry` -- runs PHP CS Fixer in dry-run mode to check code style. Takes 1 second. 12 | - `composer cs-fix` -- runs PHP CS Fixer to fix code style issues. Takes 1 second. NEVER CANCEL. Set timeout to 2+ minutes. 13 | - `find . -name "*.php" -not -path "./vendor/*" | xargs php -l` -- validates PHP syntax of all files. Takes less than 1 second. 14 | 15 | ## Validation 16 | 17 | - Always run `composer cs-dry` before making changes to see the current code style status. 18 | - Always run `composer cs-fix` after making PHP code changes or the CI (.github/workflows/code-style.yml) will fail. 19 | - Always validate PHP syntax with `php -l` on changed files before committing. 20 | - ALWAYS run through complete workflow validation after making changes: 21 | 1. Check syntax: `find . -name "*.php" -not -path "./vendor/*" | xargs php -l` 22 | 2. Run code style check: `composer cs-fix` 23 | 3. Verify no unexpected changes occurred 24 | 25 | ## Development Context 26 | 27 | ### Repository Structure 28 | - `lib/` - Core PHP classes (Domain.php, Icon.php, rex_var_*.php) 29 | - `pages/` - REDAXO backend page definitions for admin interface 30 | - `fragments/` - Template fragments (especially `fragments/yrewrite_metainfo/head.php` for HTML head output) 31 | - `docs/` - Markdown documentation files loaded in backend 32 | - `lang/` - Translation files (German and English) 33 | - `install/` - YForm table definitions (JSON tablesets) 34 | - `boot.php` - Addon bootstrap and extension registration 35 | - `package.yml` - REDAXO addon configuration and dependencies 36 | 37 | ### Core Classes 38 | - `FriendsOfRedaxo\YrewriteMetainfo\Domain` - Main domain metadata management (extends rex_yform_manager_dataset) 39 | - `FriendsOfRedaxo\YrewriteMetainfo\Icon` - PWA/favicon management (extends rex_yform_manager_dataset) 40 | 41 | ### Key Dependencies 42 | - REDAXO ^5.19 with PHP ^8.2 43 | - YRewrite ^2 (URL rewriting and domain management) 44 | - YForm >=4,<6 (form management and ORM) 45 | - YForm Field >=2.11.0,<4 (additional form fields) 46 | 47 | ## Common Tasks 48 | 49 | The following are outputs from frequently run commands. Reference them instead of running bash commands to save time. 50 | 51 | ### Repository root structure 52 | ``` 53 | .github/ # GitHub workflows and funding 54 | .gitignore # Git ignore rules 55 | .php-cs-fixer.dist.php # PHP CS Fixer configuration 56 | LICENSE # MIT license 57 | README.md # German documentation 58 | boot.php # Addon bootstrap 59 | composer.json # Composer dependencies (PHP CS Fixer) 60 | docs/ # Documentation markdown files 61 | fragments/ # Template fragments 62 | install/ # YForm table definitions 63 | install.php # Addon installation script 64 | lang/ # Translation files 65 | lib/ # Core PHP classes 66 | package.yml # REDAXO addon configuration 67 | pages/ # Backend page definitions 68 | uninstall.php # Addon uninstallation script 69 | update.php # Addon update script 70 | ``` 71 | 72 | ### Composer configuration 73 | ```json 74 | { 75 | "require-dev": { 76 | "redaxo/php-cs-fixer-config": "^2.0", 77 | "friendsofphp/php-cs-fixer": "^3.14" 78 | }, 79 | "scripts": { 80 | "cs-dry": "php-cs-fixer fix -v --ansi --dry-run --config=.php-cs-fixer.dist.php", 81 | "cs-fix": "php-cs-fixer fix -v --ansi --config=.php-cs-fixer.dist.php" 82 | } 83 | } 84 | ``` 85 | 86 | ### REDAXO package configuration (package.yml) 87 | - Package name: yrewrite_metainfo 88 | - Version: 3.0.0-dev-2025-08-02 89 | - Requires REDAXO ^5.19, PHP ^8.2, YRewrite ^2, YForm >=4,<6 90 | - Provides backend pages under yrewrite/metainfo 91 | 92 | ## Specific Development Guidelines 93 | 94 | ### When Working with Domain Metadata: 95 | - Always check `lib/domain.php` for available methods and properties 96 | - The Domain class extends rex_yform_manager_dataset, providing full YOrm functionality 97 | - Use `Domain::getCurrent()` to get the current domain's metadata 98 | - After changing domain-related code, test the `fragments/yrewrite_metainfo/head.php` output 99 | 100 | ### When Working with Icon/PWA Features: 101 | - Check `lib/icon.php` for PWA manifest and favicon methods 102 | - Icon profiles are managed separately from domain data 103 | - Test favicon and manifest generation after making icon-related changes 104 | 105 | ### When Modifying Backend Pages: 106 | - Backend pages are defined in `pages/` directory 107 | - Documentation pages automatically load markdown files from `docs/` 108 | - Always ensure backend pages follow REDAXO admin interface conventions 109 | 110 | ### When Adding New Features: 111 | - Follow the existing namespace pattern: `FriendsOfRedaxo\YrewriteMetainfo` 112 | - Use YForm tablesets for database changes (see `install/` directory) 113 | - Add appropriate language keys in `lang/` files (German and English) 114 | - Update documentation in `docs/` if user-facing 115 | 116 | ### Code Style Requirements: 117 | - This addon uses REDAXO PHP CS Fixer configuration 118 | - All PHP files must pass `composer cs-fix` without changes 119 | - Follow PSR-12 coding standards as enforced by the fixer 120 | - Use strict typing (`declare(strict_types=1);`) in new files 121 | 122 | ## Installation Dependencies 123 | 124 | ### Required for Development: 125 | - PHP ^8.2 with CLI access 126 | - Composer for dependency management 127 | - No additional build tools required 128 | 129 | ### For Full REDAXO Integration Testing: 130 | - Complete REDAXO 5.19+ installation 131 | - YRewrite addon ^2 with configured domain 132 | - YForm addon >=4,<6 133 | - MySQL/MariaDB database 134 | 135 | Note: This addon cannot be fully functionally tested outside of a REDAXO environment, but code validation and syntax checking work independently. -------------------------------------------------------------------------------- /lib/domain.php: -------------------------------------------------------------------------------- 1 | where('yrewrite_domain_id', rex_yrewrite::getCurrentDomain()->getId())->findOne(); 22 | } 23 | 24 | /** @api */ 25 | public static function getCurrentValue(string $key): mixed 26 | { 27 | $domain = self::getCurrent(); 28 | if ($domain instanceof self) { 29 | return $domain->getValue($key); 30 | } 31 | return null; 32 | } 33 | 34 | public static function getHead(): string 35 | { 36 | $fragment = new rex_fragment(); 37 | return $fragment->parse('yrewrite_metainfo/head.php'); 38 | } 39 | 40 | /** @api */ 41 | public function getYRewrite(): ?rex_yrewrite_domain 42 | { 43 | return rex_yrewrite::getDomainById($this->getYrewriteDomainId()); 44 | } 45 | 46 | /** @api */ 47 | public function getColor(): ?string 48 | { 49 | $icon = $this->getRelatedDataset('icon'); 50 | if ($icon instanceof Icon) { 51 | return $icon->getThemeColor(); 52 | } 53 | return null; 54 | } 55 | 56 | /** @api */ 57 | public function getLogoImg(): ?string 58 | { 59 | if (class_exists('Media') && is_object(Media::get($this->getValue('logo')))) { 60 | return Media::get($this->getValue('logo'))->getImg(); 61 | } 62 | if (is_object(rex_media::get($this->getValue('logo')))) { 63 | // Wenn Addon media_manager_responsive installiert ist, wird das responsive Bild zurückgegeben 64 | return rex_media::get($this->getValue('logo'))->getUrl(); 65 | } 66 | return null; 67 | } 68 | 69 | /** Kann in einem Choice-Feld verwendet werden */ 70 | /** @api 71 | * @return array 72 | * */ 73 | public static function getAvailableStyles(): array 74 | { 75 | $files = @scandir(rex_path::assets('styles')); 76 | if (false === $files) { 77 | $files = []; 78 | } 79 | $cssFiles = []; 80 | 81 | foreach ($files as $file) { 82 | if ('css' === pathinfo($file, PATHINFO_EXTENSION)) { 83 | $cssFiles[$file] = $file; 84 | } 85 | } 86 | 87 | return $cssFiles; 88 | } 89 | 90 | /** Kann in einem Choice-Feld verwendet werden */ 91 | /** @api 92 | * @return array 93 | * */ 94 | public static function getAvailableScripts(): array 95 | { 96 | $files = scandir(rex_path::assets('scripts')); 97 | if (false === $files) { 98 | $files = []; 99 | } 100 | 101 | $jsFiles = []; 102 | 103 | foreach ($files as $file) { 104 | if ('js' === pathinfo($file, PATHINFO_EXTENSION)) { 105 | $jsFiles[$file] = $file; 106 | } 107 | } 108 | 109 | return $jsFiles; 110 | } 111 | 112 | /* Domain */ 113 | /** @api */ 114 | public function getYrewriteDomainId(): int 115 | { 116 | return $this->getValue('yrewrite_domain_id'); 117 | } 118 | 119 | /** @api */ 120 | public function setYrewriteDomainId(int $value): self 121 | { 122 | $this->setValue('yrewrite_domain_id', $value); 123 | return $this; 124 | } 125 | 126 | /* Website-Titel */ 127 | /** @api */ 128 | public function getName(): ?string 129 | { 130 | return $this->getValue('name'); 131 | } 132 | 133 | /** @api */ 134 | public function setName(mixed $value): self 135 | { 136 | $this->setValue('name', $value); 137 | return $this; 138 | } 139 | 140 | /* og:type */ 141 | /** @api */ 142 | public function getType(): ?string 143 | { 144 | return $this->getValue('type'); 145 | } 146 | 147 | /** @api */ 148 | public function setType(mixed $value): self 149 | { 150 | $this->setValue('type', $value); 151 | return $this; 152 | } 153 | 154 | /* og:image */ 155 | /** @api */ 156 | public function getThumbnail(bool $asMedia = false): mixed 157 | { 158 | if ($asMedia) { 159 | return rex_media::get($this->getValue('thumbnail')); 160 | } 161 | return $this->getValue('thumbnail'); 162 | } 163 | 164 | /** @api */ 165 | public function setThumbnail(string $filename): self 166 | { 167 | if (null !== rex_media::get($filename)) { 168 | $this->setValue('thumbnail', $filename); 169 | } 170 | return $this; 171 | } 172 | 173 | /* Logo */ 174 | /** @api */ 175 | public function getLogo(bool $asMedia = false): mixed 176 | { 177 | if ($asMedia) { 178 | return rex_media::get($this->getValue('logo')); 179 | } 180 | return $this->getValue('logo'); 181 | } 182 | 183 | /** @api */ 184 | public function setLogo(string $filename): self 185 | { 186 | if (null !== rex_media::get($filename)) { 187 | $this->setValue('logo', $filename); 188 | } 189 | return $this; 190 | } 191 | 192 | /* Profil (Icons, PWA) */ 193 | /** @api */ 194 | public function getIcon(): ?Icon 195 | { 196 | return $this->getRelatedDataset('icon'); 197 | } 198 | 199 | /* JS-Dateien */ 200 | /** @api 201 | * @return array 202 | * */ 203 | public function getScripts(): ?array 204 | { 205 | return explode(',', $this->getValue('scripts')); 206 | } 207 | 208 | /** @api 209 | * @param array $value 210 | */ 211 | public function setScripts(array $value): self 212 | { 213 | $this->setValue('scripts', implode(',', $value)); 214 | return $this; 215 | } 216 | 217 | /* CSS-Dateien */ 218 | /** @api 219 | * @return array 220 | * */ 221 | public function getStyles(): ?array 222 | { 223 | return explode(',', $this->getValue('styles')); 224 | } 225 | 226 | /** @api 227 | * @param array $value 228 | */ 229 | public function setStyles(array $value): self 230 | { 231 | $this->setValue('styles', implode(',', $value)); 232 | return $this; 233 | } 234 | } 235 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # YRewrite Metainfo 2 | 3 | Meta-Informationen und Einstellungen für YRewrite-Domains 4 | 5 | Ermöglicht die Verwaltung von Metainformationen für YRewrite-Domains. Das Addon stellt vorkonfigurierte Felder, YOrm-Dataset-Methoden und Backend-Seiten zur Verfügung. 6 | 7 | ## Installation 8 | 9 | ### Neuinstallation 10 | 11 | Voraussetzungen: YRewrite ^2.10 mit mindestens einer eingerichteten Domain sowie YForm >=4, <6. 12 | 13 | 1. Installiere das Addon über den REDAXO-Installer 14 | 2. Konfiguriere in `YRewrite` > `Metainfo` die gewünschten Angaben für deine YRewrite-Domain 15 | 3. Füge in den ``-Bereich deines Templates folgenden Code ein: `` 16 | 17 | Die konfigurierten Meta-Informationen werden automatisch ausgegeben. 18 | 19 | > **Hinweis:** Das YRewrite-SEO-Objekt sowie OpenGraph- und weitere Meta-Tags, die bereits durch dieses Addon kommen, sollten aus deinem Template entfernt werden. 20 | 21 | ### Upgrade von Version 1 auf 2 22 | 23 | Das Upgrade ist nicht rückwärtskompatibel. Führe das Upgrade im Wartungsmodus durch. Tabellennamen wurden zu `rex_yrewrite_metainfo` und `rex_yrewrite_metainfo_icon` geändert. 24 | 25 | ### Upgrade von Version 2 auf 3 26 | 27 | Methodennamen für Icon-Handling haben sich geändert. Bei überschriebenem `head.php` Fragment sind Anpassungen erforderlich. 28 | 29 | ## Funktionen 30 | 31 | Das Addon bietet folgende Hauptfunktionen: 32 | 33 | - Verwaltung von Meta-Informationen für YRewrite-Domains 34 | - Vorkonfigurierte YForm-Felder für häufig benötigte Metadaten 35 | - YOrm-Dataset-Klassen für programmatischen Zugriff 36 | - Integration von PWA-Features und Icon-Management 37 | - Template-Fragmente für automatische Meta-Tag-Ausgabe 38 | 39 | ### Verfügbare Felder 40 | 41 | - Domain-Name und Beschreibung 42 | - OpenGraph-Metadaten (og:title, og:image, og:type) 43 | - PWA-Einstellungen (App-Name, Icons, Farben) 44 | - Favicon und Touch-Icons 45 | - Custom Meta-Tags 46 | 47 | ### Backend-Verwaltung 48 | 49 | Das Addon basiert auf YForm und integriert sich in die REDAXO-Backend-Struktur mit folgenden Seiten: 50 | 51 | 1. `YRewrite` > `Metainfo` > `Allgemein` - Verwaltung der Meta-Informationen für Domains 52 | 2. `YRewrite` > `Icons und PWA-Profile` - Verwaltung von PWA-Einstellungen und Favicon-Sets 53 | 54 | Icon-Sets können über den [RealFavicon-Generator](https://realfavicongenerator.net/) erstellt und über den Medienpool verwaltet werden. 55 | 56 | ## API-Referenz 57 | 58 | ### Die Klasse `Domain` - YOrm-Dataset für Meta-Informationen 59 | 60 | Das Addon stellt eine YOrm-Dataset-Klasse zur Verfügung: 61 | 62 | #### Grundlegende Methoden 63 | 64 | ```php 65 | // Aktuelles Domain-Dataset abrufen 66 | $domain = Domain::getCurrent(); 67 | 68 | // Original YRewrite-Domain-Objekt 69 | $yrewrite_domain = $domain->getYRewrite(); 70 | 71 | // Domain-ID 72 | $domain_id = $domain->getId(); 73 | ``` 74 | 75 | #### Meta-Informationen abrufen 76 | 77 | ```php 78 | $domain = Domain::getCurrent(); 79 | 80 | // Website-Titel (für PWA, og:title, etc.) 81 | $title = $domain->getName(); 82 | 83 | // Website-Logo aus dem Medienpool 84 | $logo = $domain->getLogo(); 85 | 86 | // OpenGraph-Typ 87 | $og_type = $domain->getType(); 88 | 89 | // OpenGraph-Bild 90 | $og_image = $domain->getThumbnail(); 91 | 92 | // Beschreibung 93 | $description = $domain->getDescription(); 94 | ``` 95 | 96 | #### Icon/PWA-Verwaltung 97 | 98 | ```php 99 | $domain = Domain::getCurrent(); 100 | 101 | // Icon-Profil abrufen 102 | $icon_profile = $domain->getIcon(); 103 | 104 | if ($icon_profile) { 105 | // PWA-Name 106 | $app_name = $icon_profile->getName(); 107 | 108 | // Kurzer App-Name 109 | $short_name = $icon_profile->getShortname(); 110 | 111 | // Theme-Farbe 112 | $theme_color = $icon_profile->getThemeColor(); 113 | 114 | // Hintergrundfarbe 115 | $bg_color = $icon_profile->getBackgroundColor(); 116 | 117 | // Favicon-Dateien 118 | $favicon_png = $icon_profile->getFaviconPng96(); 119 | $favicon_svg = $icon_profile->getFaviconSvg(); 120 | $apple_touch = $icon_profile->getAppleTouchIcon(); 121 | } 122 | ``` 123 | 124 | ### Codebeispiele 125 | 126 | #### Template-Integration 127 | 128 | ```php 129 | // Im Template-Head 130 | 131 | 132 | // Manueller Zugriff auf Metadaten 133 | getName()) { 136 | echo '' . rex_escape($domain->getName()) . ''; 137 | } 138 | ?> 139 | ``` 140 | 141 | #### Bedingte Ausgaben 142 | 143 | ```php 144 | getLogo()) { 149 | $media = rex_media::get($domain->getLogo()); 150 | if ($media) { 151 | echo 'Logo'; 152 | } 153 | } 154 | 155 | // PWA-Manifest nur bei verfügbarem Icon-Profil 156 | if ($domain && $domain->getIcon()) { 157 | echo ''; 158 | } 159 | ?> 160 | ``` 161 | 162 | #### Eigene Meta-Tags ergänzen 163 | 164 | ```php 165 | // Im project-Addon: fragments/yrewrite_metainfo/head.php 166 | subfragment('yrewrite_metainfo/head.php'); 169 | 170 | // Zusätzliche Meta-Tags 171 | $domain = Domain::getCurrent(); 172 | if ($domain) { 173 | echo ''; 174 | echo ''; 175 | } 176 | ?> 177 | ``` 178 | 179 | ### Fragmente 180 | 181 | #### `head.php` - Metadaten für soziale Netzwerke 182 | 183 | Das Fragment erweitert die Standard-YRewrite-Funktionen um zusätzliche Metadaten für soziale Netzwerke, Messenger und andere Dienste. Dies ermöglicht aussagekräftige Linkvorschauen beim Teilen von Inhalten. 184 | 185 | Das Fragment `yrewrite_metainfo/head.php` kann als Ersatz für die Standard-YRewrite-SEO-Methoden verwendet werden. Bei Bedarf lässt sich das Fragment im `project`-Addon anpassen oder erweitern. 186 | 187 | ## Mitarbeit 188 | 189 | Du möchtest dieses Addon weiterentwickeln oder hast Vorschläge für Verbesserungen? Die Community freut sich über deine Unterstützung! 190 | 191 | Möglichkeiten zur Mitarbeit: 192 | - [Issues](https://github.com/FriendsOfREDAXO/yrewrite_metainfo/issues) melden und beheben 193 | - Pull Requests mit Verbesserungen erstellen 194 | 195 | ## Lizenz 196 | 197 | MIT Lizenz, siehe [LICENSE](https://github.com/FriendsOfREDAXO/yrewrite_metainfo/blob/master/LICENSE) 198 | 199 | ## Autor 200 | 201 | **Friends of REDAXO** 202 | 203 | Dank an [Alexander Walther](https://www.alexplus.de) für die ursprüngliche Entwicklung und Projektleitung. 204 | -------------------------------------------------------------------------------- /assets/media_preview.js: -------------------------------------------------------------------------------- 1 | /** 2 | * YRewrite Metainfo Media Preview JavaScript 3 | * Global functions for media preview functionality 4 | */ 5 | 6 | jQuery(function($) { 7 | // Lazy Loading Implementation 8 | function initLazyLoading() { 9 | const lazyImages = document.querySelectorAll('.rex-media-lazy'); 10 | 11 | // Intersection Observer für moderne Browser 12 | if ('IntersectionObserver' in window) { 13 | const imageObserver = new IntersectionObserver(function(entries, observer) { 14 | entries.forEach(function(entry) { 15 | if (entry.isIntersecting) { 16 | const img = entry.target; 17 | const src = img.getAttribute('data-lazy-src'); 18 | if (src) { 19 | img.src = src; 20 | img.classList.add('loaded'); 21 | img.removeAttribute('data-lazy-src'); 22 | } 23 | observer.unobserve(img); 24 | } 25 | }); 26 | }, { 27 | rootMargin: '50px 0px', 28 | threshold: 0.01 29 | }); 30 | 31 | lazyImages.forEach(function(img) { 32 | imageObserver.observe(img); 33 | }); 34 | } else { 35 | // Fallback für ältere Browser 36 | lazyImages.forEach(function(img) { 37 | const src = img.getAttribute('data-lazy-src'); 38 | if (src) { 39 | img.src = src; 40 | img.classList.add('loaded'); 41 | img.removeAttribute('data-lazy-src'); 42 | } 43 | }); 44 | } 45 | } 46 | 47 | // Global media preview function for list views 48 | window.yrewriteMetainfoMediaPreview = function(filename) { 49 | if (!filename) return; 50 | 51 | // Sicherheitsvalidierung: Path Traversal verhindern 52 | filename = filename.replace(/[\/\\]/g, ''); 53 | if (filename.includes('..')) { 54 | console.error('Invalid filename:', filename); 55 | return; 56 | } 57 | 58 | // Check if modal already exists 59 | let modal = $('#yrewrite-metainfo-global-modal'); 60 | if (modal.length === 0) { 61 | // Create modal dynamically 62 | const modalHtml = ` 63 | 79 | `; 80 | $('body').append(modalHtml); 81 | modal = $('#yrewrite-metainfo-global-modal'); 82 | } 83 | 84 | // Robuste URL-Konstruktion für Media-Dateien 85 | let imageUrl; 86 | try { 87 | // Methode 1: Verwende aktuelle URL als Basis 88 | const currentUrl = new URL(window.location.href); 89 | const pathParts = currentUrl.pathname.split('/'); 90 | 91 | // Finde 'redaxo' im Pfad 92 | const redaxoIndex = pathParts.findIndex(part => part === 'redaxo'); 93 | if (redaxoIndex !== -1) { 94 | // Konstruiere Pfad bis vor 'redaxo' 95 | const baseParts = pathParts.slice(0, redaxoIndex); 96 | imageUrl = currentUrl.origin + baseParts.join('/') + '/media/' + filename; 97 | } else { 98 | // Fallback: relative Pfad 99 | imageUrl = '../media/' + filename; 100 | } 101 | } catch (e) { 102 | // Fallback falls URL-Konstruktion fehlschlägt 103 | imageUrl = '../media/' + filename; 104 | } 105 | 106 | console.log('Media URL for', filename + ':', imageUrl); // Debug-Ausgabe 107 | modal.find('#yrewrite-metainfo-global-image').attr('src', imageUrl); 108 | modal.find('#yrewrite-metainfo-global-title').text(filename); 109 | modal.modal('show'); 110 | }; 111 | 112 | // Enhanced hover effects for preview images 113 | $(document).on('mouseenter', '.yrewrite-metainfo-preview-img', function() { 114 | $(this).css({ 115 | 'transform': 'scale(1.1)', 116 | 'box-shadow': '0 8px 25px rgba(0,0,0,0.2)', 117 | 'border-color': '#337ab7' 118 | }); 119 | }); 120 | 121 | $(document).on('mouseleave', '.yrewrite-metainfo-preview-img', function() { 122 | $(this).css({ 123 | 'transform': 'scale(1)', 124 | 'box-shadow': '0 2px 8px rgba(0,0,0,0.1)', 125 | 'border-color': '#ddd' 126 | }); 127 | }); 128 | 129 | // Initialize lazy loading 130 | function initAll() { 131 | initLazyLoading(); 132 | } 133 | 134 | $(document).ready(function() { 135 | initAll(); 136 | 137 | // Re-initialize after DOM changes using MutationObserver 138 | if (window.MutationObserver) { 139 | const observer = new MutationObserver(function(mutations) { 140 | let shouldReinit = false; 141 | mutations.forEach(function(mutation) { 142 | if (mutation.addedNodes.length > 0) { 143 | mutation.addedNodes.forEach(function(node) { 144 | if (node.nodeType === 1 && 145 | (node.matches && node.matches('.rex-form-group') || 146 | node.querySelector && node.querySelector('.rex-form-group'))) { 147 | shouldReinit = true; 148 | } 149 | }); 150 | } 151 | }); 152 | if (shouldReinit) { 153 | setTimeout(initLazyLoading, 50); 154 | } 155 | }); 156 | 157 | observer.observe(document.body, { 158 | childList: true, 159 | subtree: true 160 | }); 161 | } 162 | }); 163 | }); -------------------------------------------------------------------------------- /pages/yrewrite.metainfo.domain_icon.php: -------------------------------------------------------------------------------- 1 | getParam('yform')->table->getTableName() === $ep->getParam('table_name')) { // @phpstan-ignore-line 17 | return ''; 18 | } 19 | }, 20 | rex_extension::EARLY, 21 | ['table_name' => $table_name], 22 | ); 23 | 24 | rex_mediapool::setAllowedMimeTypes([ 25 | 'png' => ['image/png'], 26 | 'jpg' => ['image/jpeg'], 27 | 'jpeg' => ['image/jpeg'], 28 | 'svg' => ['image/svg+xml'], 29 | 'ico' => ['image/x-icon', 'image/vnd.microsoft.icon'], 30 | 'webmanifest' => ['application/json'], 31 | ]); 32 | 33 | $_REQUEST['table_name'] = $table_name; /** @phpstan-ignore-line */ 34 | 35 | // Wenn ein ZIP-File hochgeladen wurde, entpacken und in die Datenbank speichern 36 | if (isset($_FILES['realfaviconzip']) && 0 === $_FILES['realfaviconzip']['error']) { 37 | $zip = new ZipArchive(); 38 | $res = $zip->open($_FILES['realfaviconzip']['tmp_name']); 39 | if (true === $res) { 40 | $extractPath = rex_path::addonCache('yrewrite_metainfo', date('Y-m-d_H-i-s')); 41 | $zip->extractTo($extractPath); 42 | $zip->close(); 43 | 44 | $files = glob($extractPath . DIRECTORY_SEPARATOR . '*'); 45 | $manifestPath = $extractPath . DIRECTORY_SEPARATOR . 'site.webmanifest'; 46 | $manifest = file_exists($manifestPath) ? file_get_contents($manifestPath) : '{}'; 47 | $manifest = json_decode($manifest, true); 48 | if (empty($manifest['short_name'])) { 49 | $manifest['short_name'] = date('Y-m-d-H-i-s'); 50 | } 51 | 52 | $media_category_id = rex_post('media_category_id', 'int', 0); 53 | 54 | /* Neue Medienpool-Kategorie hinzufügen, wenn -1 */ 55 | if (-1 === $media_category_id) { 56 | $category = new rex_media_category_service(); 57 | $category->addCategory('Favicon ' . $manifest['short_name'], 0); 58 | /* Finde zuletzt angelegte Kategorie */ 59 | $latest_category = rex_sql::factory()->setQuery('SELECT id FROM ' . rex::getTable('media_category') . ' ORDER BY id DESC LIMIT 1')->getArray(); 60 | $media_category_id = array_shift($latest_category)['id']; 61 | } 62 | 63 | $prefix = rex_string::normalize($manifest['short_name']) . '_'; 64 | 65 | // Alle relevanten Dateien in den Medienpool importieren 66 | foreach ($files as $file) { 67 | if (is_file($file)) { 68 | $filename = basename($file); 69 | // Nur relevante Dateien importieren 70 | if (in_array($filename, [ 71 | 'apple-touch-icon.png', 72 | 'favicon.ico', 73 | 'favicon.svg', 74 | 'favicon-96x96.png', 75 | 'site.webmanifest', 76 | 'web-app-manifest-192x192.png', 77 | 'web-app-manifest-512x512.png', 78 | ])) { 79 | $data = []; 80 | $data['title'] = 'Icon-Profil: ' . ($manifest['name'] ?? $manifest['short_name']); 81 | $data['category_id'] = $media_category_id; 82 | $data['file'] = [ 83 | 'name' => $prefix . $filename, 84 | 'path' => $file, 85 | ]; 86 | rex_media_service::addMedia($data, false); 87 | } 88 | } 89 | } 90 | 91 | // Zuordnung der wichtigsten Icons aus Manifest und ZIP 92 | $shortcutIcon = null; 93 | $appleTouchIcon = null; 94 | $manifestFile = null; 95 | $faviconPng96 = null; 96 | $faviconSvg = null; 97 | foreach ($files as $file) { 98 | $filename = basename($file); 99 | if ('favicon.ico' === $filename) { 100 | $shortcutIcon = $prefix . $filename; 101 | } 102 | if ('apple-touch-icon.png' === $filename) { 103 | $appleTouchIcon = $prefix . $filename; 104 | } 105 | if ('site.webmanifest' === $filename) { 106 | $manifestFile = $prefix . $filename; 107 | } 108 | if ('favicon-96x96.png' === $filename) { 109 | $faviconPng96 = $prefix . $filename; 110 | } 111 | if ('favicon.svg' === $filename) { 112 | $faviconSvg = $prefix . $filename; 113 | } 114 | } 115 | $dataset = Icon::create(); 116 | $dataset->setName($manifest['name'] ?? $manifest['short_name']); 117 | $dataset->setShortName($manifest['short_name']); 118 | $dataset->setDisplay($manifest['display'] ?? 'standalone'); 119 | $dataset->setThemeColor($manifest['theme_color'] ?? ''); 120 | $dataset->setBackgroundColor($manifest['background_color'] ?? ''); 121 | $dataset->setShortcutIcon($shortcutIcon ?? ''); 122 | $dataset->setAppleTouchIcon($appleTouchIcon ?? ''); 123 | $dataset->setManifest($manifestFile ?? ''); 124 | $dataset->setFaviconPng96($faviconPng96 ?? ''); 125 | $dataset->setFaviconSvg($faviconSvg ?? ''); 126 | $dataset->save(); 127 | } 128 | } 129 | 130 | $select = new rex_media_category_select(true); 131 | $select->setName('media_category_id'); 132 | $select->addOption($this->i18n('yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_new'), -1); 133 | $select->addOption($this->i18n('yrewrite_metainfo_domain_icon_zip_upload_media_category_id_option_root'), 0); 134 | $select->setSelected(-1); 135 | 136 | $form = '
137 | 138 | 139 |

' . $this->i18n('yrewrite_metainfo_domain_icon_zip_upload_notice') . '

140 | 141 | ' . $select->get() . ' 142 |

' . $this->i18n('yrewrite_metainfo_domain_icon_zip_upload_media_category_id_notice') . '

143 | 144 |
'; 145 | 146 | $fragment = new rex_fragment(); 147 | $fragment->setVar('title', $this->i18n('yrewrite_metainfo_domain_icon_zip_upload_title')); 148 | $fragment->setVar('body', $form, false); 149 | $fragment->setVar('class', 'info', false); 150 | 151 | echo $fragment->parse('core/page/section.php'); 152 | 153 | /* Weiter mit YForm */ 154 | if (is_file(rex_path::addon('yform', 'pages/manager.data_edit.php'))) { 155 | include rex_path::addon('yform', 'pages/manager.data_edit.php'); 156 | } else { 157 | include rex_path::plugin('yform', 'manager', 'pages/data_edit.php'); 158 | } 159 | -------------------------------------------------------------------------------- /install/rex_yrewrite_metainfo.tableset.json: -------------------------------------------------------------------------------- 1 | { 2 | "rex_yrewrite_metainfo": { 3 | "table": { 4 | "status": 1, 5 | "table_name": "rex_yrewrite_metainfo", 6 | "name": "translate:rex_yrewrite_metainfo_domain_table", 7 | "description": "", 8 | "list_amount": 50, 9 | "list_sortfield": "name", 10 | "list_sortorder": "ASC", 11 | "search": 0, 12 | "hidden": 1, 13 | "export": 1, 14 | "import": 1, 15 | "mass_deletion": 0, 16 | "mass_edit": 0, 17 | "schema_overwrite": 1, 18 | "history": 0, 19 | "createdate": "0000-00-00 00:00:00", 20 | "updatedate": "0000-00-00 00:00:00", 21 | "createuser": "", 22 | "updateuser": "" 23 | }, 24 | "fields": [ 25 | { 26 | "table_name": "rex_yrewrite_metainfo", 27 | "prio": 1, 28 | "type_id": "value", 29 | "type_name": "html", 30 | "db_type": "none", 31 | "list_hidden": 0, 32 | "search": 0, 33 | "name": "col_start", 34 | "label": "", 35 | "not_required": "", 36 | "html": "
\r\n
" 37 | }, 38 | { 39 | "table_name": "rex_yrewrite_metainfo", 40 | "prio": 2, 41 | "type_id": "value", 42 | "type_name": "choice", 43 | "db_type": "int(10) unsigned", 44 | "list_hidden": 0, 45 | "search": 0, 46 | "name": "yrewrite_domain_id", 47 | "label": "Domain", 48 | "not_required": "", 49 | "multiple": "0", 50 | "expanded": "0", 51 | "choices": "SELECT id, domain as name FROM rex_yrewrite_domain ORDER BY id", 52 | "choice_attributes": "", 53 | "attributes": "", 54 | "default": "", 55 | "no_db": "0", 56 | "notice": "", 57 | "preferred_choices": "", 58 | "group_by": "", 59 | "placeholder": "", 60 | "group_attributes": "", 61 | "choice_label": "" 62 | }, 63 | { 64 | "table_name": "rex_yrewrite_metainfo", 65 | "prio": 3, 66 | "type_id": "value", 67 | "type_name": "text", 68 | "db_type": "varchar(191)", 69 | "list_hidden": 0, 70 | "search": 0, 71 | "name": "name", 72 | "label": "Website-Titel", 73 | "not_required": "", 74 | "attributes": "", 75 | "default": "", 76 | "no_db": "0", 77 | "notice": "", 78 | "append": "", 79 | "prepend": "" 80 | }, 81 | { 82 | "table_name": "rex_yrewrite_metainfo", 83 | "prio": 4, 84 | "type_id": "validate", 85 | "type_name": "unique", 86 | "db_type": "", 87 | "list_hidden": 1, 88 | "search": 0, 89 | "name": "yrewrite_domain_id", 90 | "label": "", 91 | "not_required": "", 92 | "table": "", 93 | "empty_option": "0", 94 | "message": "Bitte Domain zun\u00e4chst in YRewrite anlegen und ausw\u00e4hlen" 95 | }, 96 | { 97 | "table_name": "rex_yrewrite_metainfo", 98 | "prio": 5, 99 | "type_id": "value", 100 | "type_name": "html", 101 | "db_type": "none", 102 | "list_hidden": 0, 103 | "search": 0, 104 | "name": "col_2", 105 | "label": "", 106 | "not_required": "", 107 | "html": "<\/div>\r\n
" 108 | }, 109 | { 110 | "table_name": "rex_yrewrite_metainfo", 111 | "prio": 6, 112 | "type_id": "value", 113 | "type_name": "be_media", 114 | "db_type": "text", 115 | "list_hidden": 0, 116 | "search": 0, 117 | "name": "logo", 118 | "label": "translate:yrewrite_metainfo_logo_label", 119 | "not_required": "", 120 | "multiple": "0", 121 | "notice": "translate:yrewrite_metainfo_logo_notice", 122 | "types": "svg,png,gif", 123 | "preview": "0", 124 | "category": "" 125 | }, 126 | { 127 | "table_name": "rex_yrewrite_metainfo", 128 | "prio": 7, 129 | "type_id": "value", 130 | "type_name": "text", 131 | "db_type": "varchar(191)", 132 | "list_hidden": 1, 133 | "search": 0, 134 | "name": "type", 135 | "label": "translate:yrewrite_metainfo_type_label", 136 | "not_required": "", 137 | "attributes": "", 138 | "default": "website", 139 | "no_db": "0", 140 | "notice": "translate:yrewrite_metainfo_type_notice", 141 | "append": "", 142 | "prepend": "" 143 | }, 144 | { 145 | "table_name": "rex_yrewrite_metainfo", 146 | "prio": 8, 147 | "type_id": "value", 148 | "type_name": "be_media", 149 | "db_type": "text", 150 | "list_hidden": 1, 151 | "search": 0, 152 | "name": "thumbnail", 153 | "label": "translate:yrewrite_metainfo_thumbnail_label", 154 | "not_required": "", 155 | "multiple": "0", 156 | "notice": "translate:yrewrite_metainfo_thumbnail_notification", 157 | "types": "jpg,jpeg,png,gif", 158 | "preview": "0", 159 | "category": "" 160 | }, 161 | { 162 | "table_name": "rex_yrewrite_metainfo", 163 | "prio": 9, 164 | "type_id": "value", 165 | "type_name": "be_manager_relation", 166 | "db_type": "int(10) unsigned", 167 | "list_hidden": 0, 168 | "search": 0, 169 | "name": "icon", 170 | "label": "translate:yrewrite_metainfo_icon_label", 171 | "not_required": "", 172 | "attributes": "", 173 | "notice": "translate:yrewrite_metainfo_icon_notice", 174 | "table": "rex_yrewrite_metainfo_icon", 175 | "empty_option": "1", 176 | "size": "", 177 | "field": "name", 178 | "type": "2", 179 | "empty_value": "translate:yrewrite_metainfo_icon_error", 180 | "relation_table": "", 181 | "filter": "" 182 | }, 183 | { 184 | "table_name": "rex_yrewrite_metainfo", 185 | "prio": 10, 186 | "type_id": "value", 187 | "type_name": "html", 188 | "db_type": "none", 189 | "list_hidden": 0, 190 | "search": 0, 191 | "name": "col_end", 192 | "label": "", 193 | "not_required": "", 194 | "html": "<\/div>\r\n<\/div>" 195 | } 196 | ] 197 | } 198 | } 199 | -------------------------------------------------------------------------------- /ytemplates/bootstrap/value.yrewrite_metainfo_be_media_preview.tpl.php: -------------------------------------------------------------------------------- 1 | getFieldName(); 11 | $value = rex_escape($this->getValue()); 12 | $types ??= $this->getElement('types'); 13 | 14 | $widget_params = []; 15 | $widget_params['category'] = 0; 16 | if ('' != $this->getElement('category')) { 17 | $widget_params['category'] = (int) $this->getElement('category'); 18 | } 19 | $widget_params['preview'] = 1; // Immer Preview aktivieren 20 | if ('' != $types) { 21 | $widget_params['types'] = trim($types); 22 | } 23 | 24 | // Widget erstellen 25 | if (1 == $this->getElement('multiple')) { 26 | $widget = rex_var_medialist::getWidget($buttonId, $name, $value, $widget_params); 27 | } else { 28 | $widget = rex_var_media::getWidget($buttonId, $name, $value, $widget_params); 29 | } 30 | 31 | $class_group = trim('form-group ' . $this->getHTMLClass() . ' ' . $this->getWarningClass()); 32 | 33 | $notice = []; 34 | if ('' != $this->getElement('notice')) { 35 | $notice[] = rex_i18n::translate($this->getElement('notice'), false); 36 | } 37 | if (isset($this->params['warning_messages'][$this->getId()]) && !$this->params['hide_field_warning_messages']) { 38 | $notice[] = '' . rex_i18n::translate($this->params['warning_messages'][$this->getId()], false) . ''; 39 | } 40 | if (count($notice) > 0) { 41 | $notice = '

' . implode('
', $notice) . '

'; 42 | } else { 43 | $notice = ''; 44 | } 45 | 46 | // Media-Dateien für Preview holen 47 | $mediaFiles = []; 48 | if ($value) { 49 | $files = explode(',', $value); 50 | foreach ($files as $file) { 51 | if ($file && rex_media::get($file)) { 52 | $mediaFiles[] = $file; 53 | } 54 | } 55 | } 56 | 57 | ?> 58 |
59 | 60 | 61 | 62 | 63 |
64 | isImage()): 67 | // Prüfe ob es ein SVG ist - dann direkten Zugriff verwenden 68 | $isSvg = 'svg' === strtolower($media->getExtension()); 69 | $previewUrl = $isSvg ? rex_url::media($file) : rex_media_manager::getUrl('rex_media_small', $file); 70 | ?> 71 |
72 | 81 |
82 | 83 |
84 | 85 | 86 | 87 |
88 | 89 | 90 | 107 | 108 | -------------------------------------------------------------------------------- /install/rex_yrewrite_metainfo_icon.tableset.json: -------------------------------------------------------------------------------- 1 | { 2 | "rex_yrewrite_metainfo_icon": { 3 | "fields": [ 4 | { 5 | "db_type": "none", 6 | "html": "
\r\n
", 7 | "label": "", 8 | "list_hidden": 0, 9 | "name": "col_start", 10 | "not_required": "", 11 | "prio": 1, 12 | "search": 0, 13 | "table_name": "rex_yrewrite_metainfo_icon", 14 | "type_id": "value", 15 | "type_name": "html" 16 | }, 17 | { 18 | "append": "", 19 | "attributes": "", 20 | "db_type": "varchar(191)", 21 | "default": "", 22 | "label": "translate:yrewrite_metainfo_icon_name_label", 23 | "list_hidden": 0, 24 | "name": "name", 25 | "no_db": "", 26 | "not_required": "", 27 | "notice": "translate:yrewrite_metainfo_icon_name_notice", 28 | "prepend": "", 29 | "prio": 2, 30 | "search": 0, 31 | "table_name": "rex_yrewrite_metainfo_icon", 32 | "type_id": "value", 33 | "type_name": "text" 34 | }, 35 | { 36 | "append": "", 37 | "attributes": "", 38 | "db_type": "varchar(191)", 39 | "default": "", 40 | "label": "translate:yrewrite_metainfo_shortname_label", 41 | "list_hidden": 0, 42 | "name": "short_name", 43 | "no_db": "", 44 | "not_required": "", 45 | "notice": "translate:yrewrite_metainfo_shortname_notice", 46 | "prepend": "", 47 | "prio": 3, 48 | "search": 0, 49 | "table_name": "rex_yrewrite_metainfo_icon", 50 | "type_id": "value", 51 | "type_name": "text" 52 | }, 53 | { 54 | "attributes": "", 55 | "choice_attributes": "", 56 | "choice_label": "", 57 | "choices": "fullscreen,standalone,minimal-ui,browser", 58 | "db_type": "varchar(191)", 59 | "default": "browser", 60 | "expanded": "", 61 | "group_attributes": "", 62 | "group_by": "", 63 | "label": "translate:yrewrite_metainfo_display_label", 64 | "list_hidden": 1, 65 | "multiple": "", 66 | "name": "display", 67 | "no_db": "", 68 | "not_required": "", 69 | "notice": "translate:yrewrite_metainfo_display_notice", 70 | "placeholder": "", 71 | "preferred_choices": "", 72 | "prio": 4, 73 | "search": 0, 74 | "table_name": "rex_yrewrite_metainfo_icon", 75 | "type_id": "value", 76 | "type_name": "choice" 77 | }, 78 | { 79 | "append": "", 80 | "attributes": "", 81 | "db_type": "varchar(191)", 82 | "default": "#ffffff", 83 | "label": "translate:yrewrite_metainfo_theme_color", 84 | "list_hidden": 0, 85 | "name": "theme_color", 86 | "no_db": "", 87 | "not_required": "", 88 | "notice": "<meta name=\"theme-color\"><\/code>", 89 | "prepend": "", 90 | "prio": 5, 91 | "search": 0, 92 | "table_name": "rex_yrewrite_metainfo_icon", 93 | "type_id": "value", 94 | "type_name": "text" 95 | }, 96 | { 97 | "append": "", 98 | "attributes": "", 99 | "db_type": "varchar(191)", 100 | "default": "", 101 | "label": "translate:yrewrite_metainfo_background_color_label", 102 | "list_hidden": 1, 103 | "name": "background_color", 104 | "no_db": "", 105 | "not_required": "", 106 | "notice": "translate:yrewrite_metainfo_background_color_notice", 107 | "prepend": "", 108 | "prio": 7, 109 | "search": 0, 110 | "table_name": "rex_yrewrite_metainfo_icon", 111 | "type_id": "value", 112 | "type_name": "text" 113 | }, 114 | { 115 | "db_type": "none", 116 | "html": "<\/div>\r\n
", 117 | "label": "", 118 | "list_hidden": 0, 119 | "name": "col_2", 120 | "not_required": "", 121 | "prio": 9, 122 | "search": 0, 123 | "table_name": "rex_yrewrite_metainfo_icon", 124 | "type_id": "value", 125 | "type_name": "html" 126 | }, 127 | { 128 | "category": "", 129 | "db_type": "text", 130 | "label": "translate:yrewrite_metainfo_shortcut_icon", 131 | "list_hidden": 1, 132 | "multiple": "", 133 | "name": "shortcut_icon", 134 | "not_required": "", 135 | "notice": "favicon.ico<\/code>", 136 | "preview": "1", 137 | "prio": 10, 138 | "search": 0, 139 | "table_name": "rex_yrewrite_metainfo_icon", 140 | "type_id": "value", 141 | "type_name": "be_media", 142 | "types": "ico,png,svg" 143 | }, 144 | { 145 | "category": "", 146 | "db_type": "text", 147 | "label": "translate:yrewrite_metainfo_apple_touch_icon", 148 | "list_hidden": 1, 149 | "multiple": "", 150 | "name": "apple_touch_icon", 151 | "not_required": "", 152 | "notice": "apple-touch-icon.png<\/code>", 153 | "preview": "1", 154 | "prio": 11, 155 | "search": 0, 156 | "table_name": "rex_yrewrite_metainfo_icon", 157 | "type_id": "value", 158 | "type_name": "be_media", 159 | "types": "" 160 | }, 161 | { 162 | "append": "", 163 | "attributes": "", 164 | "db_type": "text", 165 | "default": "", 166 | "label": "translate:yrewrite_metainfo_manifest", 167 | "list_hidden": 1, 168 | "name": "manifest", 169 | "no_db": "", 170 | "not_required": "", 171 | "notice": "site.webmanifest<\/code>", 172 | "prepend": "", 173 | "prio": 12, 174 | "search": 0, 175 | "table_name": "rex_yrewrite_metainfo_icon", 176 | "type_id": "value", 177 | "type_name": "text" 178 | }, 179 | { 180 | "category": "", 181 | "db_type": "text", 182 | "label": "translate:yrewrite_metainfo_favicon_png_96", 183 | "list_hidden": 1, 184 | "multiple": "", 185 | "name": "favicon_png_96", 186 | "not_required": "", 187 | "notice": "favicon-96x96.png<\/code>", 188 | "preview": "1", 189 | "prio": 13, 190 | "search": 0, 191 | "table_name": "rex_yrewrite_metainfo_icon", 192 | "type_id": "value", 193 | "type_name": "be_media", 194 | "types": "" 195 | }, 196 | { 197 | "category": "", 198 | "db_type": "text", 199 | "label": "translate:yrewrite_metainfo_favicon_svg", 200 | "list_hidden": 1, 201 | "multiple": "", 202 | "name": "favicon_svg", 203 | "not_required": "", 204 | "notice": "favicon.svg<\/code>", 205 | "preview": "1", 206 | "prio": 14, 207 | "search": 0, 208 | "table_name": "rex_yrewrite_metainfo_icon", 209 | "type_id": "value", 210 | "type_name": "yrewrite_metainfo_be_media_preview", 211 | "types": "" 212 | } 213 | ], 214 | "table": { 215 | "createdate": "0000-00-00 00:00:00", 216 | "createuser": "", 217 | "description": "", 218 | "export": 1, 219 | "hidden": 1, 220 | "history": 0, 221 | "import": 1, 222 | "list_amount": 50, 223 | "list_sortfield": "short_name", 224 | "list_sortorder": "ASC", 225 | "mass_deletion": 0, 226 | "mass_edit": 0, 227 | "name": "translate:rex_yrewrite_metainfo_icon_table", 228 | "schema_overwrite": 1, 229 | "search": 0, 230 | "status": 1, 231 | "table_icon": "", 232 | "table_name": "rex_yrewrite_metainfo_icon", 233 | "updatedate": "0000-00-00 00:00:00", 234 | "updateuser": "" 235 | } 236 | } 237 | } 238 | -------------------------------------------------------------------------------- /api.md: -------------------------------------------------------------------------------- 1 | # YRewrite Metainfo - API-Dokumentation 2 | 3 | Meta-Infos und globale Einstellungen für REDAXO auf Basis von YForm 4+ und YRewrite 4 | 5 | Ergänzt YRewrite-Domains um die Möglichkeit, Metainformationen an Domains zu verwalten. Mit vorgefertigten, einfachen aber sinnvollen Konfigurationsfeldern, passender YOrm-Dataset-Methoden und Backend-Seiten für die Eingabe. 6 | 7 | ## Die Klasse `Domain` 8 | 9 | Kind-Klasse von `rex_yform_manager_dataset`, damit stehen alle Methoden von YOrm-Datasets zur Verfügung. Greift auf die Tabelle `rex_yrewrite_metainfo` zu. 10 | 11 | > Es werden nachfolgend nur die durch dieses Addon ergänzten Methoden beschrieben. Lerne mehr über YOrm und die Methoden für Querys, Datasets und Collections in der [YOrm Doku](https://github.com/yakamara/yform/blob/master/docs/04_yorm.md) 12 | 13 | ### Infos zur aktuellen Domain erhalten 14 | 15 | ```php 16 | $domain = Domain::getCurrent(); // Aktuelle Domain 17 | $domain->getName(); // Website-Titel 18 | $domain->getLogo(); // Logo 19 | $domain->getValue('mein_feld') // Eigene Felder auslesen 20 | 21 | // Statische Methoden 22 | Domain::getCurrentValue('mein_feld'); // Direkt Wert der aktuellen Domain abrufen 23 | Domain::getHead(); // HTML-Head-Fragment ausgeben 24 | ``` 25 | 26 | ### Verfügbare Methoden 27 | 28 | #### `getYrewriteDomainId()` 29 | 30 | Gibt den Wert für das Feld `yrewrite_domain_id` (Domain) zurück: 31 | 32 | ```php 33 | $dataset = Domain::get($id); 34 | echo $dataset->getYrewriteDomainId(); 35 | ``` 36 | 37 | #### `setYrewriteDomainId(mixed $value)` 38 | 39 | Setzt den Wert für das Feld `yrewrite_domain_id` (Domain). 40 | 41 | ```php 42 | $dataset = Domain::create(); 43 | $dataset->setYrewriteDomainId($value); 44 | $dataset->save(); 45 | ``` 46 | 47 | #### `getName()` 48 | 49 | Gibt den Wert für das Feld `name` (Website-Titel) zurück: 50 | 51 | ```php 52 | $dataset = Domain::get($id); 53 | echo $dataset->getName(); 54 | ``` 55 | 56 | #### `setName(mixed $value)` 57 | 58 | Setzt den Wert für das Feld `name` (Website-Titel). 59 | 60 | ```php 61 | $dataset = Domain::create(); 62 | $dataset->setName($value); 63 | $dataset->save(); 64 | ``` 65 | 66 | #### `getLogo(bool $asMedia = false)` 67 | 68 | Gibt den Wert für das Feld `logo` (Logo) zurück: Logo, das im Template ausgegeben werden kann. 69 | 70 | ```php 71 | $dataset = Domain::get($id); 72 | $media = $dataset->getLogo(true); 73 | ``` 74 | 75 | #### `setLogo(string $filename)` 76 | 77 | Setzt den Wert für das Feld `logo` (Logo). 78 | 79 | ```php 80 | $dataset = Domain::create(); 81 | $dataset->setLogo($filename); 82 | $dataset->save(); 83 | ``` 84 | 85 | #### `getType()` 86 | 87 | Gibt den Wert für das Feld `type` (og:type) zurück: OpenGraph-Type (Standard: `website`) 88 | 89 | ```php 90 | $dataset = Domain::get($id); 91 | echo $dataset->getType(); 92 | ``` 93 | 94 | #### `setType(mixed $value)` 95 | 96 | Setzt den Wert für das Feld `type` (og:type). 97 | 98 | ```php 99 | $dataset = Domain::create(); 100 | $dataset->setType($value); 101 | $dataset->save(); 102 | ``` 103 | 104 | #### `getThumbnail(bool $asMedia = false)` 105 | 106 | Gibt den Wert für das Feld `thumbnail` (og:image) zurück: OpenGraph-Bild (Linkvorschau) 107 | 108 | ```php 109 | $dataset = Domain::get($id); 110 | $media = $dataset->getThumbnail(true); 111 | ``` 112 | 113 | #### `setThumbnail(string $filename)` 114 | 115 | Setzt den Wert für das Feld `thumbnail` (og:image). 116 | 117 | ```php 118 | $dataset = Domain::create(); 119 | $dataset->setThumbnail($filename); 120 | $dataset->save(); 121 | ``` 122 | 123 | #### `getIcon()` 124 | 125 | Gibt den Wert für das Feld `icon` (Profil (Icons, PWA)) zurück: In diesem Profil können Favicon- und Browser-Icons, Farbschema u.v.a. Eigenschaften für Progressive Web Apps ggf. für mehrere Domains angegeben werden. 126 | 127 | ```php 128 | $dataset = Domain::get($id); 129 | $beziehung = $dataset->getIcon(); 130 | ``` 131 | 132 | #### `setIcon(mixed $value)` 133 | 134 | Setzt den Wert für das Feld `icon` (Profil (Icons, PWA)). 135 | 136 | ```php 137 | $dataset = Domain::create(); 138 | $dataset->setIcon($value); 139 | $dataset->save(); 140 | ``` 141 | 142 | #### `getYRewrite()` 143 | 144 | Gibt das zugehörige YRewrite-Domain-Objekt zurück: 145 | 146 | ```php 147 | $dataset = Domain::get($id); 148 | $yrewrite_domain = $dataset->getYRewrite(); 149 | ``` 150 | 151 | #### `getColor()` 152 | 153 | Gibt die Theme-Farbe des verknüpften Icon-Profils zurück: 154 | 155 | ```php 156 | $dataset = Domain::get($id); 157 | $theme_color = $dataset->getColor(); 158 | ``` 159 | 160 | #### `getLogoImg()` 161 | 162 | Gibt die Logo-URL zurück (unterstützt Media Manager Responsive): 163 | 164 | ```php 165 | $dataset = Domain::get($id); 166 | $logo_url = $dataset->getLogoImg(); 167 | ``` 168 | 169 | #### `getScripts()` 170 | 171 | Gibt ein Array der konfigurierten JavaScript-Dateien zurück: 172 | 173 | ```php 174 | $dataset = Domain::get($id); 175 | $scripts = $dataset->getScripts(); // Array von Dateinamen 176 | ``` 177 | 178 | #### `setScripts(array $value)` 179 | 180 | Setzt JavaScript-Dateien für die Domain: 181 | 182 | ```php 183 | $dataset = Domain::create(); 184 | $dataset->setScripts(['script1.js', 'script2.js']); 185 | $dataset->save(); 186 | ``` 187 | 188 | #### `getStyles()` 189 | 190 | Gibt ein Array der konfigurierten CSS-Dateien zurück: 191 | 192 | ```php 193 | $dataset = Domain::get($id); 194 | $styles = $dataset->getStyles(); // Array von Dateinamen 195 | ``` 196 | 197 | #### `setStyles(array $value)` 198 | 199 | Setzt CSS-Dateien für die Domain: 200 | 201 | ```php 202 | $dataset = Domain::create(); 203 | $dataset->setStyles(['style1.css', 'style2.css']); 204 | $dataset->save(); 205 | ``` 206 | 207 | #### Statische Hilfsmethoden 208 | 209 | ##### `getCurrentValue(string $key)` 210 | 211 | Ruft direkt einen Wert der aktuellen Domain ab: 212 | 213 | ```php 214 | $website_name = Domain::getCurrentValue('name'); 215 | $logo = Domain::getCurrentValue('logo'); 216 | ``` 217 | 218 | ##### `getHead()` 219 | 220 | Gibt das HTML-Head-Fragment aus: 221 | 222 | ```php 223 | echo Domain::getHead(); // Vollständige Meta-Tags 224 | ``` 225 | 226 | ##### `getAvailableStyles()` 227 | 228 | Gibt verfügbare CSS-Dateien aus dem Assets-Ordner zurück (für Choice-Felder): 229 | 230 | ```php 231 | $css_files = Domain::getAvailableStyles(); // Array für YForm Choice-Feld 232 | ``` 233 | 234 | ##### `getAvailableScripts()` 235 | 236 | Gibt verfügbare JavaScript-Dateien aus dem Assets-Ordner zurück (für Choice-Felder): 237 | 238 | ```php 239 | $js_files = Domain::getAvailableScripts(); // Array für YForm Choice-Feld 240 | ``` 241 | 242 | ## Die Klasse `Icon` 243 | 244 | Kind-Klasse von `rex_yform_manager_dataset`, damit stehen alle Methoden von YOrm-Datasets zur Verfügung. Greift auf die Tabelle `rex_yrewrite_metainfo_icon` zu. 245 | 246 | > Es werden nachfolgend nur die durch dieses Addon ergänzten Methoden beschrieben. Lerne mehr über YOrm und die Methoden für Querys, Datasets und Collections in der [YOrm Doku](https://github.com/yakamara/yform/blob/master/docs/04_yorm.md) 247 | 248 | ### Icons und PWA-Daten abrufen 249 | 250 | ```php 251 | $domain = Domain::getCurrent(); 252 | $icon = $domain->getIcon(); 253 | if ($icon) { 254 | echo $icon->getIcon16(); 255 | echo $icon->getIcon16Url(); 256 | echo $icon->getIcon32(); 257 | echo $icon->getIcon32Url(); 258 | echo $icon->getManifest(); 259 | // usw. 260 | } 261 | ``` 262 | 263 | ### Verfügbare Methoden 264 | 265 | #### `getName()` 266 | 267 | Gibt den Wert für das Feld `name` (Profilname) zurück: Name des Profils (wird nur für die Anzeige unter "Allgemein" verwendet) 268 | 269 | ```php 270 | $dataset = Icon::get($id); 271 | echo $dataset->getName(); 272 | ``` 273 | 274 | #### `setName(mixed $value)` 275 | 276 | Setzt den Wert für das Feld `name` (Profilname). 277 | 278 | ```php 279 | $dataset = Icon::create(); 280 | $dataset->setName($value); 281 | $dataset->save(); 282 | ``` 283 | 284 | #### `getShortName()` 285 | 286 | Gibt den Wert für das Feld `short_name` (PWA Kurzname (App-Verknüpfung)) zurück: Wird verwendet, wenn die Website als PWA-Verknüpfung auf dem Home-Screen oder Startmenü dargestellt wird. 287 | 288 | ```php 289 | $dataset = Icon::get($id); 290 | echo $dataset->getShortName(); 291 | ``` 292 | 293 | #### `setShortName(mixed $value)` 294 | 295 | Setzt den Wert für das Feld `short_name` (PWA Kurzname (App-Verknüpfung)). 296 | 297 | ```php 298 | $dataset = Icon::create(); 299 | $dataset->setShortName($value); 300 | $dataset->save(); 301 | ``` 302 | 303 | #### `getDisplay()` 304 | 305 | Gibt den Wert für das Feld `display` (PWA Browser-UI) zurück: Gibt an, wie viel Browser-UI innerhalb der PWA noch sichtbar ist, z.B. Reload-Button 306 | 307 | ```php 308 | $dataset = Icon::get($id); 309 | echo $dataset->getDisplay(); 310 | ``` 311 | 312 | #### `setDisplay(mixed $value)` 313 | 314 | Setzt den Wert für das Feld `display` (PWA Browser-UI). 315 | 316 | ```php 317 | $dataset = Icon::create(); 318 | $dataset->setDisplay($value); 319 | $dataset->save(); 320 | ``` 321 | 322 | #### `getThemeColor()` 323 | 324 | Gibt den Wert für das Feld `theme_color` (PWA Theme-Farbe) zurück: `` 325 | 326 | ```php 327 | $dataset = Icon::get($id); 328 | echo $dataset->getThemeColor(); 329 | ``` 330 | 331 | #### `setThemeColor(mixed $value)` 332 | 333 | Setzt den Wert für das Feld `theme_color` (PWA Theme-Farbe). 334 | 335 | ```php 336 | $dataset = Icon::create(); 337 | $dataset->setThemeColor($value); 338 | $dataset->save(); 339 | ``` 340 | 341 | #### `getBackgroundColor()` 342 | 343 | Gibt den Wert für das Feld `background_color` (PWA Hintergrund-Farbe) zurück: Hintergrundfarbe, z.B. beim Starten der PWA 344 | 345 | ```php 346 | $dataset = Icon::get($id); 347 | echo $dataset->getBackgroundColor(); 348 | ``` 349 | 350 | #### `setBackgroundColor(mixed $value)` 351 | 352 | Setzt den Wert für das Feld `background_color` (PWA Hintergrund-Farbe). 353 | 354 | ```php 355 | $dataset = Icon::create(); 356 | $dataset->setBackgroundColor($value); 357 | $dataset->save(); 358 | ``` 359 | 360 | #### `getMsapplicationTitleColor()` 361 | 362 | Gibt den Wert für das Feld `msapplication_title_color` (PWA Titelleisten-Farbe) zurück: (nur Microsoft Windows), `` 363 | 364 | ```php 365 | $dataset = Icon::get($id); 366 | echo $dataset->getMsapplicationTitleColor(); 367 | ``` 368 | 369 | #### `setMsapplicationTitleColor(mixed $value)` 370 | 371 | Setzt den Wert für das Feld `msapplication_title_color` (PWA Titelleisten-Farbe). 372 | 373 | ```php 374 | $dataset = Icon::create(); 375 | $dataset->setMsapplicationTitleColor($value); 376 | $dataset->save(); 377 | ``` 378 | 379 | #### `getShortcutIcon(bool $asMedia = false)` 380 | 381 | Gibt den Wert für das Feld `shortcut_icon` (Favicon) zurück: `favicon.ico` 382 | 383 | ```php 384 | $dataset = Icon::get($id); 385 | $media = $dataset->getShortcutIcon(true); 386 | ``` 387 | 388 | #### `setShortcutIcon(string $filename)` 389 | 390 | Setzt den Wert für das Feld `shortcut_icon` (Favicon). 391 | 392 | ```php 393 | $dataset = Icon::create(); 394 | $dataset->setShortcutIcon($filename); 395 | $dataset->save(); 396 | ``` 397 | 398 | #### `getIcon16(bool $asMedia = false)` 399 | 400 | Gibt den Wert für das Feld `icon_16` (16x16) zurück: 16×16px 401 | 402 | ```php 403 | $dataset = Icon::get($id); 404 | $media = $dataset->getIcon16(true); 405 | ``` 406 | 407 | #### `setIcon16(string $filename)` 408 | 409 | Setzt den Wert für das Feld `icon_16` (16x16). 410 | 411 | ```php 412 | $dataset = Icon::create(); 413 | $dataset->setIcon16($filename); 414 | $dataset->save(); 415 | ``` 416 | 417 | #### `getIcon32(bool $asMedia = false)` 418 | 419 | Gibt den Wert für das Feld `icon_32` (32x32) zurück: 32×32px 420 | 421 | ```php 422 | $dataset = Icon::get($id); 423 | $media = $dataset->getIcon32(true); 424 | ``` 425 | 426 | #### `setIcon32(string $filename)` 427 | 428 | Setzt den Wert für das Feld `icon_32` (32x32). 429 | 430 | ```php 431 | $dataset = Icon::create(); 432 | $dataset->setIcon32($filename); 433 | $dataset->save(); 434 | ``` 435 | 436 | #### `getAppleTouchIcon(bool $asMedia = false)` 437 | 438 | Gibt den Wert für das Feld `apple_touch_icon` (Apple Touch) zurück: 180×180px 439 | 440 | ```php 441 | $dataset = Icon::get($id); 442 | $media = $dataset->getAppleTouchIcon(true); 443 | ``` 444 | 445 | #### `setAppleTouchIcon(string $filename)` 446 | 447 | Setzt den Wert für das Feld `apple_touch_icon` (Apple Touch). 448 | 449 | ```php 450 | $dataset = Icon::create(); 451 | $dataset->setAppleTouchIcon($filename); 452 | $dataset->save(); 453 | ``` 454 | 455 | #### `getSafariPinnedTab(bool $asMedia = false)` 456 | 457 | Gibt den Wert für das Feld `safari_pinned_tab` (Safari Pinned Tab) zurück: `safari-pinned-tab.svg` 458 | 459 | ```php 460 | $dataset = Icon::get($id); 461 | $media = $dataset->getSafariPinnedTab(true); 462 | ``` 463 | 464 | #### `setSafariPinnedTab(string $filename)` 465 | 466 | Setzt den Wert für das Feld `safari_pinned_tab` (Safari Pinned Tab). 467 | 468 | ```php 469 | $dataset = Icon::create(); 470 | $dataset->setSafariPinnedTab($filename); 471 | $dataset->save(); 472 | ``` 473 | 474 | #### `getManifest(bool $asMedia = false)` 475 | 476 | Gibt den Wert für das Feld `manifest` (webmanifest.json) zurück: `site.webmanifest` 477 | 478 | ```php 479 | $dataset = Icon::get($id); 480 | $media = $dataset->getManifest(true); 481 | ``` 482 | 483 | #### `setManifest(string $filename)` 484 | 485 | Setzt den Wert für das Feld `manifest` (webmanifest.json). 486 | 487 | ```php 488 | $dataset = Icon::create(); 489 | $dataset->setManifest($filename); 490 | $dataset->save(); 491 | ``` 492 | 493 | #### `getFaviconPng96(bool $asMedia = false)` 494 | 495 | Gibt den Wert für das Feld `favicon_png_96` (PNG Favicon 96x96) zurück: 496 | 497 | ```php 498 | $dataset = Icon::get($id); 499 | $media = $dataset->getFaviconPng96(true); 500 | ``` 501 | 502 | #### `getFaviconPng96Url()` 503 | 504 | Gibt die URL für das PNG Favicon (96x96) zurück: 505 | 506 | ```php 507 | $dataset = Icon::get($id); 508 | $url = $dataset->getFaviconPng96Url(); 509 | ``` 510 | 511 | #### `setFaviconPng96(string $filename)` 512 | 513 | Setzt den Wert für das Feld `favicon_png_96` (PNG Favicon 96x96): 514 | 515 | ```php 516 | $dataset = Icon::create(); 517 | $dataset->setFaviconPng96($filename); 518 | $dataset->save(); 519 | ``` 520 | 521 | #### `getFaviconSvg(bool $asMedia = false)` 522 | 523 | Gibt den Wert für das Feld `favicon_svg` (SVG Favicon) zurück: 524 | 525 | ```php 526 | $dataset = Icon::get($id); 527 | $media = $dataset->getFaviconSvg(true); 528 | ``` 529 | 530 | #### `getFaviconSvgUrl()` 531 | 532 | Gibt die URL für das SVG Favicon zurück: 533 | 534 | ```php 535 | $dataset = Icon::get($id); 536 | $url = $dataset->getFaviconSvgUrl(); 537 | ``` 538 | 539 | #### `setFaviconSvg(string $filename)` 540 | 541 | Setzt den Wert für das Feld `favicon_svg` (SVG Favicon): 542 | 543 | ```php 544 | $dataset = Icon::create(); 545 | $dataset->setFaviconSvg($filename); 546 | $dataset->save(); 547 | ``` 548 | 549 | ### URL-Hilfsmethoden 550 | 551 | Für alle Media-Felder gibt es entsprechende URL-Methoden: 552 | 553 | ```php 554 | $icon = Icon::get($id); 555 | 556 | // URL-Methoden für direkte Ausgabe 557 | echo $icon->getShortcutIconUrl(); // Favicon URL 558 | echo $icon->getAppleTouchIconUrl(); // Apple Touch Icon URL 559 | echo $icon->getManifestUrl(); // Manifest URL 560 | echo $icon->getFaviconPng96Url(); // PNG Favicon URL 561 | echo $icon->getFaviconSvgUrl(); // SVG Favicon URL 562 | ``` 563 | 564 | ## ``-Fragment 565 | 566 | YRewrite Metainfo kommt standardmäßig mit einem passenden Fragment für den ``-Bereich des HTML-Dokuments. 567 | 568 | Das Fragment befindet sich in `fragments/yrewrite_metainfo/head.php`. 569 | 570 | ### Head-Fragment verwenden 571 | 572 | Verwende folgenden Code: `` für die Ausgabe in deinem Template. 573 | 574 | ### Head-Fragment anpassen / überschreiben 575 | 576 | Erstelle eine Datei `fragments/yrewrite_metainfo/head.php` in deinem Project-Addon oder Theme-Verzeichnis, um das mitgelieferte Fragment zu überschreiben. 577 | 578 | > **Hinweis:** Diese Methode ist updatesicher, jedoch können mit zukünftigen Updates weitere Features in `yrewrite_metainfo` aufgenommen werden - diese müssen dann im eigenen ``-Fragment angepasst werden. 579 | 580 | ### Template-Integration 581 | 582 | ```php 583 | // Standard-Integration im Template-Head 584 | 585 | 586 | // Manueller Zugriff auf Metadaten 587 | getName()) { 590 | echo '' . rex_escape($domain->getName()) . ''; 591 | } 592 | ?> 593 | 594 | // Logo nur ausgeben wenn vorhanden 595 | getLogo()) { 598 | $media = rex_media::get($domain->getLogo()); 599 | if ($media) { 600 | echo 'Logo'; 601 | } 602 | } 603 | ?> 604 | 605 | // PWA-Manifest nur bei verfügbarem Icon-Profil 606 | getIcon()) { 609 | echo ''; 610 | } 611 | ?> 612 | ``` 613 | 614 | ### Eigene Meta-Tags ergänzen 615 | 616 | ```php 617 | // Im project-Addon: fragments/yrewrite_metainfo/head.php 618 | subfragment('yrewrite_metainfo/head.php'); 621 | 622 | // Zusätzliche Meta-Tags 623 | $domain = Domain::getCurrent(); 624 | if ($domain) { 625 | echo ''; 626 | echo ''; 627 | } 628 | ?> 629 | ``` 630 | --------------------------------------------------------------------------------