EasyFavicon

Фавиконка из редактора RealFaviconGenerator прямо в админке: без архивов и FTP.
Автор дополнения
Баха
Пакетов
3
Закачек
1 511
Обычно отвечает в течение 2 часов
Автор дополнения
Пакетов
3
Закачек
1 511
Обычно отвечает в течение 2 часов
Версия 1.0.0-pl
Дата выпуска 25.09.2026
Загрузки 0
Просмотры 10
Как это обычно происходит: открываем RealFaviconGenerator, загружаем логотип, настраиваем, скачиваем архив, распаковываем, заливаем по FTP, копируем десяток тегов в шаблон, а потом ещё правим site.webmanifest, потому что там MyWebSite вместо названия сайта. А через полгода заказчик просит новогоднюю фавиконку — и всё по новой. А после Нового года — обратно.

EasyFavicon делает это из админки:

1. Выбираете картинку в медиа-хранилище MODX.

2. Настраиваете фавиконку в родном редакторе RealFaviconGenerator.

3. Возвращаетесь в MODX — файлы уже лежат в каталоге сайта, манифест заполнен данными сайта, а разметка стоит в <head> каждой страницы.

Никаких архивов, FTP и копирования тегов.

Список профилей EasyFavicon

Сборка в родном редакторе сервиса


Никакого самописного конструктора: вы работаете в редакторе RealFaviconGenerator со всеми его настройками — цвет плитки, поля, скругления, тема, — жмёте Generate, и браузер возвращает вас в менеджер с готовым набором. Компонент сам скачивает архив, распаковывает его в каталог профиля и сохраняет разметку.

Мастер создания профиля

Профили: новогодняя фавиконка в один клик


Несколько наборов на одном сайте, один активный. Архив каждой сборки хранится, поэтому переключение профиля возвращает на сайт и разметку, и файлы. Основная, новогодняя, к распродаже — меняются переключателем в списке, пересобирать ничего не нужно.

Переключение активного профиля

Контексты


У языковой версии или поддомена может быть своя фавиконка: отмечаете у профиля контексты, и в них выводится он, а в остальных — общий профиль без контекстов.

Имена файлов у RealFaviconGenerator одинаковые, поэтому компонент следит, чтобы активные профили разных контекстов не делили один каталог и не затирали друг другу иконки: включить профиль в занятый каталог не получится — EasyFavicon назовёт конфликтующий профиль и попросит указать свой каталог.

Манифест заполняется данными сайта


RealFaviconGenerator кладёт в набор site.webmanifest со своими заглушками ("name": "MyWebSite", "short_name": "MySite") и без start_url — подсказать ему имя приложения через API нельзя.

Поэтому после распаковки EasyFavicon дописывает манифест: name и short_name из site_name, start_url и id из base_url, lang из cultureKey. Заполняются только пустые поля и заглушки сервиса — то, что вы вписали в редакторе, остаётся нетронутым. В сохранённом архиве профиля лежит исходный файл от сервиса.

Автовставка или сниппет


Плагин добавляет разметку активного профиля перед </head> — шаблоны трогать не нужно. Если место вывода хочется выбрать самому, выключаете автовставку и зовёте сниппет:

[[EasyFavicon]]
[[EasyFavicon? &profile=`Новогодняя`]]
Пути учитывают base_url, так что сайт в подкаталоге тоже не проблема. К ссылкам добавляется метка сборки, поэтому после смены профиля никто не будет разглядывать старую иконку из кеша браузера.

Просмотр результата


После сборки видно, как иконка выглядит в браузерах и на мобильных, какая разметка встала на страницы и какие файлы легли в каталог.

Результат сборки

Безопасность


Компонент распаковывает архив в открытый каталог сайта, поэтому:

  • вернуться из редактора можно только в ту сессию менеджера, где сборку начали;
  • скачивание идёт только с realfavicongenerator.net;
  • из архива на сайт попадают только файлы набора: png, ico, svg, webmanifest и компания;
  • страница и все процессоры требуют право settings.

Интерфейс


Страница компонента выглядит родной частью менеджера и в MODX 3, и в MODX 2: те же кнопки, окна, уведомления и подтверждения. В списке — поиск, сортировка по столбцам и меню действий по правому клику, как в таблицах MODX. ExtJS в интерфейсе нет.

EasyFavicon в MODX 2

Нужен бесплатный API-ключ RealFaviconGenerator


EasyFavicon работает через интерактивный API RealFaviconGenerator, поэтому ключ обязателен. Он бесплатный: получается на realfavicongenerator.net/api и вписывается в системную настройку easyfavicon.api_key. Кнопка «Системные настройки» на странице компонента откроет нужный раздел сразу с фильтром.

EasyFavicon — независимый продукт. Он не связан с RealFaviconGenerator.net, не одобрен и не поддерживается этим сервисом; название упоминается только для того, чтобы сказать, куда компонент обращается. Работа с сервисом подчиняется его условиям.

1.0.0-pl

  • Контексты у профиля: поле «Контексты» в форме (появляется, когда контекстов на сайте больше одного) и колонка в таблице. Активным может быть один профиль на контекст, а профиль с отмеченными контекстами главнее профиля без них: тот выводится во всех остальных. Включение профиля выключает активные профили тех же контекстов; плагин и сниппет берут активный профиль контекста страницы. Поле contexts добавляется в таблицу профилей резолвером при обновлении.
  • Активные профили разных контекстов не делят каталог: имена файлов у RealFaviconGenerator общие, и наборы затёрли бы друг друга. Включить профиль в занятый каталог не получится — EasyFavicon назовёт профиль, который его занял, и попросит указать свой. Включённый профиль выкладывает на сайт свой сохранённый набор, а не тот, что остался от соседнего.
  • Переключатель в строке профиля теперь и выключает активный профиль, а не только включает.
  • Таблица профилей сортируется по колонкам «Профиль», «Исходник», «Каталог» и «Обновлён»: щелчок по заголовку — по этой колонке, повторный — в обратную сторону, у активной колонки стрелка. Сортирует сервер, поэтому порядок общий для всех страниц списка.
  • Правый клик по строке профиля открывает меню с её действиями — «Собрать», «Проверить», «Изменить», «Удалить», — как контекстное меню грида MODX. В полях ввода остаётся меню браузера.
  • Переход у кнопок — как у .x-btn: в MODX 3 плавно меняется только фон (0.2s), в MODX 2 перехода нет. Раньше плавно менялись фон и текст, а рамка — сразу, и синяя кнопка MODX 2 проявлялась рывками.
  • Строки таблицы профилей не подсвечиваются при наведении: гриды MODX строку под курсором не красят (trackMouseOver: false).
  • Иконки пейджера стоят по центру кнопок на любом масштабе: сдвиги переснятые по снимкам на 100, 125, 150 и 200%. В MODX 3 круговая стрелка сидела на 1–2px выше центра.
  • Крестик окна — SVG вместе с кругом подсветки, а не глиф Font Awesome: глиф прилипал к пиксельной сетке, и на масштабе 125–150% крестик съезжал с центра круга.
  • Окна снова закрываются по Escape: клавишу перехватывал ExtJS менеджера (слушает keydown на document и останавливает всплытие), и обработчик на window её не получал. Теперь окно ловит Escape на самом себе, раньше document; Escape, адресованный окну ExtJS поверх него, по-прежнему окно не закрывает.
  • Перевод на таджикский (tg): интерфейс, ошибки и системные настройки.
  • Релиз собирает GitHub Actions на MODX 2.8.6: PHP в пакете без комментариев, содержимое зашифровано ключом modstore.pro — вместе с файлами компонента, а не только элементы. Без покупки для сайта пакет не ставится, открытого PHP в архиве нет. К релизу прикладываются архив и заметки из истории коммитов.
  • Убрана сборка без редактора: неинтерактивный API RealFaviconGenerator в новой документации сервиса отмечен как недоступный. Вместе с ней ушли процессор generate, поля профиля design, settings и non_interactive_request, JSON-редакторы в форме и системные настройки api_url, compression, scaling_algorithm. Дизайн по умолчанию, где ещё жили плитки Windows, маска Safari и объявления Android из старого пакета, ушёл вместе с ними.
  • Режим разработки больше не системная настройка: у клиентов easyfavicon.dev_mode и easyfavicon.dev_url висели в настройках без пользы. Теперь его включает только переменная окружения EASYFAVICON_DEV_URL стенда. Если dev-сервер не отвечает, грузится собранный бандл, а не пустая страница.
  • Конфиг админки выводится с JSON_HEX_TAG: `` в сообщении callback или в путях больше не закрывает тег скрипта.
  • Безопасность: возврат из редактора RealFaviconGenerator принимается только с одноразовым токеном, который процессор interactive кладёт в сессию и отправляет в custom_parameter вместе с id профиля. Раньше ссылку на callback с чужим результатом достаточно было подсунуть администратору: Extra скачивала архив с любого адреса и распаковывала его в каталог сайта. json_result из адресной строки больше не принимается, json_result_url и package_url — только https с realfavicongenerator.net.
  • Безопасность: из пакета на сайт попадают только файлы набора (png, ico, svg, webmanifest, xml, json) с простыми именами. Прочие типы, x.php.png и пути с .. отбрасываются и пишутся в журнал; каталог файлов с .. отклоняется целиком.
  • Безопасность: HTTP-клиент ходит только по http и https, в том числе по редиректам.
  • Безопасность: страница, пункт меню и все процессоры требуют системное право settings. Callback к тому же выполнялся ещё до проверки прав: MODX спрашивает checkPermissions() после initialize().
  • Безопасность: исходное изображение с диска читается только внутри корня сайта и вне core/, и только картинка (PNG, JPG, GIF, WebP, SVG, содержимое проверяется). Раньше через поле профиля можно было получить в браузере base64 любого файла, вплоть до core/config/config.inc.php. Ошибка больше не показывает абсолютный путь.
  • Архивы сборок профилей и миниатюры хранятся вне каталогов компонента: в core/packages/easyfavicon/ и assets/easyfavicon/thumbs/. Раньше они лежали в core/components/easyfavicon/ и assets/components/easyfavicon/, которые MODX при удалении пакета сносит целиком, — сохранённые сборки пропадали вместе с ним, а на стенде попадали в собранный транспортный пакет. Прежние файлы не переносятся.
  • Сборка: запущенный от root сборщик отдаёт архив и распакованный пакет в core/packages/ владельцу каталога — менеджер от www-data снова может удалить или переустановить пакет. Отсутствующий каталог _build/resolvers/ больше не роняет сборку.
  • Удалён _build/resolvers/_symlinks.php: сборщик его никогда не подключал, а при запуске он удалял каталоги исходников в Extras/easyfavicon/. Для нативного стека есть dev-link.ps1.
  • Дата сборки в списке профилей выводится в формате менеджера (manager_date_format и manager_time_format), а не жёстко как Y-m-d H:i.
  • Если файла бандла на диске не видно, метка в его URL — версия Extra, а не пустая строка: без метки браузер после обновления держал бы старые css и js из кеша.
  • Список профилей показывает ответ последнего запроса: при быстром вводе в поиск медленный ответ по «a» приходил позже ответа по «ab» и затирал его выдачу, то же случалось при быстром листании.
  • «Просмотр» при отказе сервера показывает ошибку, а не открывает пустую панель разметки.
  • Разметка копируется и в менеджере, открытом по http: Clipboard API там нет, и кнопка «Скопировать» отвечала только ошибкой. Теперь текст копируется через выделение.
  • Кнопки и поля сверены с менеджером. Кнопки — 36px, как .x-btn (в строке таблицы 28px, в панели модалки 42px и 44px в MODX 2, пейджер остался на своих замеренных 32px), рамка при наведении #ccc, а в MODX 2 обычная кнопка при наведении и фокусе заливается синим #3697cd (при нажатии #2d86b7), как .x-btn-over и .x-btn-click; заблокированная кнопка, в том числе градиентная основная в MODX 2, больше не отзывается на наведение и нажатие. Поля и выпадающие списки — общим классом, как .x-form-text: рамка #e4e4e4, при наведении #ccc, при фокусе #999 (в MODX 2 #2d86b7 на фоне #fbfbfb), своя стрелка у списка.
  • Кнопка «Системные настройки» справа от «Новый профиль» и ссылка в предупреждении об отсутствующем API-ключе ведут в системные настройки сразу с фильтром по EasyFavicon (?a=system/settings&ns=easyfavicon&area=easyfavicon_main). Фильтр понимают таблицы MODX 2 и 3 и EasySettings, api_key в разделе первый.
  • Кольцо клавиатурного фокуса больше не перекрывается чёрным системным: в MODX 3 его рисует правило менеджера .ext-webkit :focus-visible с !important.
  • Заголовок страницы — как у менеджера: в MODX 3 20px #53595f, в MODX 2 25px #555. Подзаголовки в модалках — 550 в MODX 3 и bold в MODX 2.
  • Поиск и «Новый профиль» стоят в контейнере действий, как #modx-action-buttons: у правого края окна, в MODX 3 — у его верха, в MODX 2 — на полупрозрачной подложке, свисающей от верха панели. У поиска иконка и кнопка очистки, Escape очищает поле, / и Ctrl+K ставят в него фокус в любой раскладке.
  • Удаление и сборка подтверждаются не нативным confirm(), а штатным окном менеджера Ext.Msg.confirm — тем же вызовом, что делает MODx.msg.confirm в MODX 2 и 3: заголовок — строка ядра warning, кнопки «Да» и «Нет» менеджер подписывает сам. Имя профиля и каталог в тексте экранируются. Окно закрывается сразу после «Да»: ход операции видно на кнопке в строке таблицы, итог и ошибки — в штатных уведомлениях менеджера. Пока окно открыто, / и Ctrl+K не срабатывают.
  • Модалки выглядят как окна менеджера (.x-window MODX 3 и 2): белая маска в 50%, скругление 3px и тень, полоса заголовка 35px с жирным 13px по центру и круглым крестиком Font Awesome справа, белое тело с отступами 15px, панель кнопок 42px (в MODX 2 — 44px) с кнопками справа. В MODX 2 заголовок и панель кнопок на #f0f0f0 с линией #dcdcdc. Окно появляется, как у менеджера, — вырастает из 0.7 за 0,25 с; при prefers-reduced-motion — без анимации.
  • Модалки — диалоги для скринридеров (role="dialog", aria-modal, подписаны заголовком). При открытии фокус уходит в окно, при закрытии возвращается туда, откуда его открыли. Escape не закрывает модалку, пока открыто окно или выпадающий список ExtJS.
  • Уведомления — штатные менеджера MODX, а не свои всплывашки. Успех — плашка MODx.msg.status с одним текстом, как session_extended у ядра: короткая фраза держится 1,5 с, как у ядра, итог возврата из редактора RealFaviconGenerator с именем профиля — дольше, по длине текста. Предупреждение и ошибка — окно Ext.Msg с кнопкой «ОК», заголовком ядра warning или error и иконкой, которую менеджер красит сам: жёлтый треугольник или красный крестик. В плашку статуса они не годятся: в MODX 3 это зелёный блок с галочкой в четверть экрана, и длинное предупреждение сжималось в нём в узкий столбик, неотличимое от успеха. Текст экранируется: имя профиля, пути и ответ сервера не становятся разметкой. Сообщение, пришедшее, пока открыт вопрос или другое сообщение, ждёт своей очереди, а не подменяет окно. Возврат из редактора с оговоркой показывает только её — она и так начинается с «Набор собран». Пока окно открыто, / и Ctrl+K не срабатывают, после «ОК» фокус возвращается туда, где был.
  • Если список не загрузился, вместо таблицы видны причина и кнопка «Повторить». Раньше ошибка мелькала только во всплывающем уведомлении, а таблица уверяла «Профилей пока нет» и предлагала создать первый.
  • Пока грузится следующая страница или выдача поиска, прежние строки остаются на месте и приглушаются, если ожидание затянулось.
  • Подписи полей формы связаны с полями, подсказка и ошибка — через aria-describedby. Ошибки полей от сервера показываются под самим полем, а мастер возвращается к шагу с картинкой, если ошибка в ней.
  • Таблица профилей на узком экране прокручивается вбок, а не обрезается.
  • Палитра MODX 2 сверена с index.css менеджера 2.8.6: текст обычных кнопок #555555 (был #556c88 — это цвет дерева), ссылки при наведении #297aa7.
  • Ошибки базовых процессоров профиля — «не указан», «не найден», «не сохранён», «не удалён» — показываются текстом, а не ключом easyfavicon.profile_err_*: ядро собирает его из objectType с точкой, а в лексиконе таких ключей не было. Удалены строки лексикона, которые больше нигде не используются: подписи и действия старого грида (easyfavicon_profile_*), easyfavicon_intro_msg, easyfavicon_ui_active_badge, easyfavicon_ui_activate, easyfavicon_ui_superseded.
  • Ошибки полей формы профиля снова видны под полями: коннектор MODX присылает их в data, а интерфейс искал в errors. Из-за этого, например, повтор названия давал общее окно «Запрос не выполнен» вместо «Профиль с таким названием уже существует» под полем.

1.0.0-beta2

  • Интерактивная сборка: кнопка «Собрать на RFG» уводит в редактор RealFaviconGenerator и принимает результат обратно через callback.
  • Плагин EasyFavicon на OnWebPagePrerender сам вставляет разметку в ``; сниппет остаётся для ручного управления местом вставки.
  • Поле «Исходное изображение» открывает медиа-хранилище MODX.
  • Новое поле профиля non_interactive_request под снимок настроек из редактора (сервис версии 0.2.0 его не возвращает — поле заводится на вырост).
  • Новые системные настройки: interactive_url, auto_inject, auto_inject_profile.
  • Интерфейс перерисован под палитру менеджера MODX; в строке профиля видна сама фавиконка, редкие действия убраны в меню строки.
  • Все тексты интерфейса переехали в лексиконы easyfavicon_ui_* (EN/RU).
  • Утилиты Tailwind получили префикс #easyfavicon-app, а локальный reset вышел из @layer — иначе нелейерный CSS менеджера перебивал наши стили.
  • Создание профиля стало мастером из двух шагов: картинка → название и каталог. Описание и JSON-редакторы убраны в раскрывающийся блок «Дополнительные настройки», а из мастера можно сразу уйти в редактор кнопкой «Создать и собрать».
  • Переключатель активности прямо в строке списка, рядом с кнопками.
  • Исправлено: сборка неактивного профиля подменяла живую фавиконку — файлы распаковывались в общий каталог независимо от того, какой профиль активен. Теперь набор выкладывается на сайт, только если профиль активен либо пишет в свой каталог; в остальных случаях он сохраняется и ждёт включения.
  • Тексты берутся штатной глобальной _() менеджера MODX — она же подставляет [[+name]]. Слой доступа к лексикону сократился со 147 строк до 22: дублировать английские строки в коде больше не нужно.
  • Исправлено: при смене активного профиля браузер продолжал показывать прежнюю фавиконку. RealFaviconGenerator даёт всем профилям одинаковые имена файлов, поэтому в разметку добавляется версия профиля (?v=generated_on).
  • Переключение на профиль без сохранённого набора больше не проходит молча: в тосте и в подсказке свитча сказано, что на сайте останутся чужие файлы.
  • Исправлено: если каталог для архивов недоступен на запись, сборка тихо проходила без сохранения копии — теперь об этом сообщается в интерфейсе.
  • Каждая сборка сохраняется целиком: архив профиля лежит в core/components/easyfavicon/packages/, миниатюра — в assets/components/easyfavicon/thumbs/. При смене активного профиля его набор разворачивается обратно в каталог сайта, иначе на сайте оставалась фавиконка соседнего профиля с тем же каталогом.
  • site.webmanifest дописывается данными сайта после распаковки: сервис отдавал его с заглушками MyWebSite/MySite и без start_url. Заполняются только пустые поля и заглушки — вписанное в редакторе RFG сохраняется. Переопределяется настройками easyfavicon.manifest_name и easyfavicon.manifest_short_name.
  • Имя сайта и стартовый адрес уходят в манифест и при пересборке без редактора (android_chrome.manifest.name, start_url).
  • Исправлено: файловый менеджер MODX открывался только один раз за загрузку страницы — MODx.Browser выставляет глобальный MODx.browserOpen и не сбрасывает его; обходим так же, как штатный MODx.combo.Browser.
  • Исправлено: индикатор загрузки появлялся на кнопке «Собрать фавиконку» при любом действии со строкой — признак занятости теперь привязан к конкретному действию.
  • Исправлено: дата сборки показывалась как 1970-01-01 (phptype поля был timestamp, и toArray() отдавал строку вместо метки времени).

1.0.0-beta1

  • Первый релиз.
  • Интеграция с RealFaviconGenerator API v1.
  • CMP на Svelte 5 + Vite: профили генерации, редактор favicon_design, панель результата.
  • Сниппет EasyFavicon и чанк tpl.EasyFavicon.
  • Поддержка MODX 2.8+ и MODX 3.x из одной кодовой базы (compat.inc.php).
  • Docker-окружение: MODX 3.2.4/PHP 8.3 и MODX 2.8.6/PHP 7.4 с автоустановкой.

Последние обсуждения в сообществе MODX.pro