все просто

07 февраля 2022, 11:54

MasterDen

Это было просто скопированная инструкция по созданию…

Замена вызова картинок в content MODX

Замена и оборачивание необходимых картинок в поле Содержимое (content) перед выводом на фронте. 
Идея позамствована на просторах интернета, адаптирована и настроена под свои нужды.

Происходит замена картинки на миниатюру и оборачивание в тег a, создания галерии для fancybox

 

<?php
switch ($modx->event->name) {
  
    //Работа с контентом
    case 'OnLoadWebDocument':
        $content = $modx->resource->content;
        $content = mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'); //исправляем ошибки кодировки
        libxml_use_internal_errors(true);
        $saveHtml = false;
        $dom = new DOMDocument;
        if ($dom->loadHTML($content,  LIBXML_HTML_NODEFDTD)){  //LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD
            $imgs = $dom->getElementsByTagName('img'); //ищем все изображения
            $wm = $modx->getOption('imageWM');
            $wo = $modx->getOption('imageOpacity');
            $wp = $modx->getOption('imagePosition');
            foreach ($imgs as $img) {
                if ($img->parentNode->nodeName <> 'a'){ //берем изображения не обернутые тегом А
                  if ($img->getAttribute('class') == 'fullscreen'){ //поиск и замена изображений нужного класса
                      //$modx->log(4,print_r($img->parentNode->nodeName."\n"));
                      $width=$img->getAttribute('width');  //получение нужных атрибутов изображения
                      $src=$img->getAttribute('src');
                      $alt=$img->getAttribute('alt');
                      $title=$img->getAttribute('title');
                      $class=$img->getAttribute('class');
                      $style=$img->getAttribute('style');
                      $a=$dom->createElement('a'); //создание обертки картинки
                      $a->setAttribute('data-fancybox', 'content');
                      $a->setAttribute('title', $title);
                      $a->setAttribute('alt', $alt);
//вызываем сниппет phpthumpon с параметрами, часть которых хранится в конфигурации к сайту и создаем большую картинку сводяным знаком
                      $h = $modx->runSnippet('phpthumbon', array('input' => $src, 'options' => 'h=800&zc=0&fltr[]=wmi|'.$wm.'|'.$wp.'|'.$wo.'|||0'));
                      $a->setAttribute('href', $h);
                      $a->setAttribute('style', $style);
                      $m=$dom->createElement('img'); //переделываем картинку
                      $m->setAttribute('title', $title);
                      $m->setAttribute('alt', $alt);
                      if (preg_match('/%$/', $width)){
                           $m->setAttribute('src', $src);
                           $m->setAttribute('width', $width);
                      }else{
                          $s = $modx->runSnippet('phpthumbon', array('input' => $src, 'options' => 'w='.(int)$width.'&zc=0'));
                          $m->setAttribute('src', $s);
                      }
                      $a->appendChild($m);
                      $img->parentNode->replaceChild($a, $img);
                  }else{
                      $img->setAttribute('class','nocopyimg');
                  }
                  $saveHtml =true;
                }
            }
            
            if ($saveHtml){
                //компилируем html и устанавливаем
                $html = $dom->saveHTML($dom->documentElement); // что бы не было сущностей в коде
                $str = strtr($html, array('<body>'=>'','<html>'=>'','</body>'=>'','</html>'=>'')); // без этих элементов ломало верстку, поэтому после окончания работ их просто удаляем
                $modx->resource->set('content', $str);
            }
        }
        break;
        
}

Комментарии ()