Обработка изображений в tynyMCE

 

 

Что делает плагин:

  1. Транслитерация файлов при загрузке
  2. Уменьшает загружаемое изображение до 1200px по ширине
  3. Из поля content достает все img, вырезает у них атрибуты width и height, вместо них подставляет класс img-thumbnail

Под катом — код с комментариями.

Установка


Создаем плагин с любым именем и даем ему 3 события:

  1. OnFileManagerBeforeUpload
  2. OnFileManagerUpload
  3. 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

Радуемся!
Всем спасибо за внимание :)

Могу дополнить пост, в закромах лежал плагин транслитерации папок.

Работает как с translit, как с yTranslit, так с и любым другим компонентом транслитерации.

<?php
switch($modx->event->name) { case 'OnFileManagerDirCreate': case 'OnFileManagerDirRename': $basePath = $source->getBasePath(); $dirName = basename($directory); $name = array_pop(array_filter(explode(DIRECTORY_SEPARATOR, $directory))); $tmpDoc = $modx->newObject('modResource'); $newName = $tmpDoc->cleanAlias($name); if(strcmp($name, $newName) === 0) { return; } $oldPath = str_replace(realpath($basePath), '', $directory); $bases = $source->getBases($oldPath); $oldPath = $bases['pathAbsolute'].$oldPath; $oldDirectory = $source->fileHandler->make($oldPath); if (!($oldDirectory instanceof modDirectory)) { return false; } if (!$oldDirectory->isReadable() || !$oldDirectory->isWritable()) { return false; } $newPath = $source->fileHandler->sanitizePath($newName); $newPath = $source->fileHandler->postfixSlash($newPath); $newPath = dirname($oldPath).'/'.$newPath; /* Транслитерация папки */ if (!$oldDirectory->rename($newPath)) { $modx->log(modX::LOG_LEVEL_ERROR, 'Ошибка транслитерации папки!'); return false; } break; }

оригинал