Отображение превьюшек для svg-картинок в ТВ типа "Изображение"
Сегодня обнаружил, что из коробки тв-шки с картинками не умеют показывать превью после выбора картинки. Всё дело в том, что по-умолчанию все картинки скармливаются phpThumb чтоб сгенерить превью нужного размера. Это логично, но не учитывается вариант с svg — картинка векторная, и пхпТумб не может сгенерить превью.
То, что я сделал — не панацея, и я отдаю себе отчёт почему я это сделал и что это не универсальное решение, но, тем не менее, вероятно кому-то в его ситуации это тоже подойдёт.
Итак, вот что надо сделать:
Ну и надо понимать, что при обновлении системы это дело слетит, так что надо держать это в уме при обновлении. Повторюсь — это костыльное решение, но свою задачу оно выполняет, так что используйте осознанно.
То, что я сделал — не панацея, и я отдаю себе отчёт почему я это сделал и что это не универсальное решение, но, тем не менее, вероятно кому-то в его ситуации это тоже подойдёт.
Итак, вот что надо сделать:
- Открыть шаблон по адресу manager/templates/default/element/tv/renders/input/image.tpl
- В нём есть 2 места, где выводится изображение — первое в самом начале — это когда мы просто загружаем форму с уже добавленной картинкой, и второе ближе к концу внутри яваскрипта — это когда пользователь выбрал изображение в файловом менеджере только что и надо обновить превьюшку. Не смотря на схожесть с феном, шаблонизатор в этих шаблонах используется другой — смарти, он похож по синтаксису, но намного более скудный по возможностям, но решение есть.
- Вначале файла надо сделать вот такую замену:
Тут всё просто — если в содержимое TV заканчивается на .svg то мы выводим просто тег имг с фиксированными значениями ширины и высоты. Тут надо оговориться, у меня кастомный медиаисточник, поэтому я написал /img/ вначале, если у вас свой источник, или источник по умолчанию, то и урл должен быть соответствующий, например для дефолтного надо просто слеш вначале поставить.... <div id="tv-image-preview-{$tv->id}" class="modx-tv-image-preview"> {if $tv->value} {if $tv->value|substr:-4:4 == '.svg'} <img src="/img/{$tv->value}" alt="" width=300 height=200 /> {else} <img src="{$_config.connectors_url}system/phpthumb.php?w=400&h=400&aoe=0&far=0&src={$tv->value}&source={$source}" alt="" /> {/if} ...
Ну а если это не свг, то оставляем оригинальный вывод через пхпТумб.
- Во вотором месте делаем следующее:
Tоже понятно — теперь у нас в руках есть вся мощь яваскрипта, так что проверяем наличие подстроки '.svg' и, в зависимости от результата, делаем или свой вывод или дефолтный... if (Ext.isEmpty(data.url)) { //тут пока без изменений d.update(''); } else { //а вот тут надо вклинить нашу проверку на свг, на этот раз уже на яваскрипте: if (data.url.includes('.svg')) { d.update('<img src="/img/'+data.url+'" alt="" width="300" height="200" />'); } else { //тут остаётся без изменений. {/literal} d.update('<img src="{$_config.connectors_url}system/phpthumb.php?w=400&h=400&aoe=0&far=0&src='+data.url+'&wctx={$ctx}&source={$source}" alt="" />'); {literal} } // не забудь закрыть скобочку! }
- Готово! Теперь в формах ресурсов, или мигх будут отображаться превьюшки для .svg
Ну и надо понимать, что при обновлении системы это дело слетит, так что надо держать это в уме при обновлении. Повторюсь — это костыльное решение, но свою задачу оно выполняет, так что используйте осознанно.
Поблагодарить автора
Отправить деньги
Комментарии: 11
Ну и надо понимать, что при обновлении системы это дело слетит, так что надо держать это в уме при обновлении.Я думаю проблему можно решить создав кастомное ТВ-поле:
Custom Template Variables
Ну если так делать, то это под свгшки отдельное поле, или полностью писать свой тв для картинок. Выглядит, как оверкилл.
Ну почему, сделать похожее тв один в один, только с изменениями нужными. Зато в будущем не натыкаться на эти грабли.
Уже частично сделано планирую через 2 недели доработать iconTV
P.S. плохо делать правки в ядре.
github.com/CrazyBoy49z/iconTV/issues/7
P.S. плохо делать правки в ядре.
github.com/CrazyBoy49z/iconTV/issues/7
Решение оно конечно решение, но мэдскилз лютый.
Как выше заметили — править ядро недопустимо
Как выше заметили — править ядро недопустимо
Именно поэтому я дисклаймер и написал, что я понимаю, что я делаю.
Странно, у меня нормально генерятся:
Путь:
Путь:
site.ru/connectors/system/phpthumb.php?w=400&h=400&aoe=0&far=0&f=png&src=icons/tg.svg&wctx=web&source=2
Хм, интересно. Последняя версия модх?
Вопрос не версии MODX, а в хостинге
Типа разные либы для пережатия картинок?
Да, верно. Проверил на локалке — не работает, на хостинге все ОК.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.