1 плагин - 3 лайвхака
Всем привет, порой работа менеджеров в админке modx — сущий ад. Сегодня поступил заказ с просьбой решить несколько проблем.
Проблема №1:
В tinyMCE все изображения которые вставляются имеют атрибуты width и height, и не имеют нужных классов
Проблема №2:
При загрузки файлов в каталог, где уже есть такое имя, файлы переписывают друг друга, необходимо было сделать добавление префикса для файлов с одинаковым именем
Проблема №3:
Иногда менеджеры грузят неприлично большие изображения, что непосредственно влияет и на скорость загрузки страницы и на общий размер файлов
Что делает плагин:
Создаем плагин с любым именем и даем ему 3 события:
Радуемся!
Всем спасибо за внимание :)
Проблема №1:
В tinyMCE все изображения которые вставляются имеют атрибуты width и height, и не имеют нужных классов
Проблема №2:
При загрузки файлов в каталог, где уже есть такое имя, файлы переписывают друг друга, необходимо было сделать добавление префикса для файлов с одинаковым именем
Проблема №3:
Иногда менеджеры грузят неприлично большие изображения, что непосредственно влияет и на скорость загрузки страницы и на общий размер файлов
Что делает плагин:
- Транслитерация файлов при загрузке, добавление префикса если файл дублируется
- Уменьшает загружаемое изображение до 1200px по ширине
- Из поля content достает все img, вырезает у них атрибуты width и height, вместо них подставляет класс img-thumbnail
Установка
Создаем плагин с любым именем и даем ему 3 события:
- OnFileManagerBeforeUpload
- OnFileManagerUpload
- OnLoadWebDocument
<?php
switch ($modx->event->name) {
//Работа с контентом
case 'OnLoadWebDocument':
$content = $modx->resource->content;
$content = mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'); //исправляем ошибки кодировки
$dom = new DOMDocument;
$dom->loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$imgs = $dom->getElementsByTagName('img'); //ищем все изображения
foreach ($imgs as $img) {
//убираем атрибуты width и height, добавляем класс
$img->removeAttribute('width');
$img->removeAttribute('height');
$img->setAttribute('class', 'img-thumbnail');
}
//компилируем html и устанавливаем
$html = $dom->saveHTML();
$modx->resource->set('content', $html);
break;
case 'OnFileManagerBeforeUpload':
setlocale(LC_ALL, 'ru_RU.utf8'); //фикс для неправильных серверов, иначе не будет работать patchinfo с кириллицей
$fullPath = $source->getBases()['pathAbsolute'].$directory; //получаем абсолютную дирректорию
$dir = scandir($fullPath);
foreach ($files as $key => $file) {
$info = pathinfo($file['name']);
$name = $info['filename'];
$name = modResource::filterPathSegment($modx, $name); //транслитерация
$extension = $info['extension'];
$fullname = $name.'.'.$extension;
//ищем файлы с таким же названием в этой директории
if (!in_array($fullname, $dir)) {
$newFullName = $fullname;
} else {
$newFullName = $name.'_'.rand(1,999999).'.'.$extension;
}
$file['name'] = $newFullName;
$modx->event->params['file'] = $file; //отдаем изменненную переменную file
$files[$key] = $file;
}
$modx->event->params['files'] = $files; //отдаем изменненную переменную files
break;
case 'OnFileManagerUpload':
$fullPath = $source->getBases()['pathAbsolute'].$directory;
foreach ($files as $file) {
if(strripos($file['type'], 'image') === false) { //если не изображение, не запускаем phpThumb
return ;
}
$name = $file['name'];
$pathToImage = $fullPath.$name;
//Массив параметров для phpThumb
$params = array(
'w' => 1200 ,
);
$phpThumb = $modx->getService('modphpthumb','modPhpThumb', MODX_CORE_PATH . 'model/phpthumb/', array()); //Подключаем класс phpThumb
$phpThumb->setSourceFilename($pathToImage);
foreach ($params as $k => $v) {
$phpThumb->setParameter($k, $v);
}
if ($phpThumb->GenerateThumbnail()) {
if (!$phpThumb->renderToFile($pathToImage)) {
$modx->log(1, 'Ошибка сохранения изображения в ['.$pathToImage.']');
}
}
else {
$modx->log(1, print_r($phpThumb->debugmessages, 1));
}
}
break;
}gist.github.com/pavel-one/17db1b5cff8c2713f28976439e05f945Радуемся!
Всем спасибо за внимание :)
Комментарии: 26
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Работает как с translit, как с yTranslit, так с и любым другим компонентом транслитерации.
Вообще со стороны tinyMCE это делать конечно более рационально, т.к. не нужно каждый раз при генерации страницы тратить время на лишнюю обработку дома, но как показали тесты, времени это добавляет не много, да и для уже заполненных сайтов удобнее)
И еще вопрос. Как из одного изображения в тексте статьи нарезать несколько уменьшенных для использования с scrset?
Спасибо.
Тут все немного сложнее, необходимо понять на каком этапе вам нужно резать их, при сохранении ресурса/рендеринге страницы/etc. Но принцип один, вам нужно загнать все содержимое в PHPDomDocument пройтись по всем изображениям, забрать все пути, ну а дальше уже дело техники.
Код за вас я писать не буду, простите :)
Вот тут производится проверка расширения файла, идёте и смотрите документацию и увидите, что в событие приходит как раз directory в которой будет хранится путь.
Ваша задача к данной проверке добавить еще и свою логику.
С плагином
Я думаю ответ очевиден)
Транслитерацию папок тоже добавил
Код заменяет любой уже присвоенный class.
По логике, правильнее добавлять class, а не зарезать существующие…
Файл 27.include.cache.php
Что это может быть?
есть код в content
после использования loadHTML и saveHTML для обработки content, достаточно только загрузить данные и сохранить
получаю поломанную верстку.
Перемещается окончание заголовка h2 в самый конец. Вот вывод в логи переменной $html
если при загрузке content убрать ключ — LIBXML_HTML_NOIMPLIED, то все будет корректно, но добавятся теги
Подскажите, что нужно прописать, что бы не ломало верстку и лишние теги не добавлялись?
Поэтому нужно либо убирать LIBXML_HTML_NOIMPLIED, но после манипуляций вырезать теги head и body, либо передавать html как-нибудь так Но тогда придется вырезать этот див.
1) глючит Феном в ресурсах
2) ломает кару сайта
Если переправить на onDocFormSave — тогда сохранение ресурса происходит вечно
Вот сейчас вроде всё уже сделал и работает, но между всё равно «кракозябры» вместо кириллицы. Да, можно забить на это, но тем не менее.
Если и делать такую «обработку html», то только либо через сниппет, либо как тут через OnLoadWebDocumen, чтобы не потерять исходный html из контента ресурса.
Об этом и в доках на php.net написано.