src/EventSubscriber/Content/ContentInTextImagesSubscriber.php line 52

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\Content;
  3. use App\Entity\Connection\ContentImageConnection;
  4. use App\Entity\Content\Text;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use App\Event\Content\ContentDisplayEvent;
  7. use Avt\Graphics\Image\Resizer\ResizerInterface;
  8. use Avt\Graphics\Image\Storage\StorageDriverInterface;
  9. use Avt\Graphics\Image\Model\Path;
  10. use Avt\Graphics\Image\Model\Context;
  11. /**
  12.  * @author Przemysław Chrupek <przemyslaw.chrupek@avt.pl>
  13.  */
  14. class ContentInTextImagesSubscriber implements EventSubscriberInterface
  15. {
  16.     const IMG_POPUP_SIZE 1600;
  17.     const IMG_MAX_SIZE 970;
  18.     
  19.     /**
  20.      * @var ResizerInterface
  21.      */
  22.     private $resizer;
  23.     /**
  24.      * @var StorageDriverInterface
  25.      */
  26.     private $sd;
  27.     /**
  28.      * @var Content
  29.      */
  30.     private $content;
  31.     public function __construct(ResizerInterface $resizerStorageDriverInterface $storageDriver)
  32.     {
  33.         $this->resizer $resizer;
  34.         $this->sd $storageDriver;
  35.     }
  36.     public static function getSubscribedEvents()
  37.     {
  38.         return [
  39.             ContentDisplayEvent::NAME => [
  40.                 ['preContentDisplay'101],
  41.             ]
  42.         ];
  43.     }
  44.     public function preContentDisplay(ContentDisplayEvent $event)
  45.     {
  46.         $this->content $event->getContent();
  47.         $text $this->content->getText();
  48.         if (!$text instanceof Text) {
  49.             return;
  50.         }
  51.         $patternImg '/<img([^\>]*src=\"([\/]{0,1}i\/\d\d\d\d\/\d\d\/\d\d\/(\d+)-[^\"]*)\"[^\>\/]*)\/{0,1}>/msi';
  52.         $text->setValue(preg_replace_callback($patternImg, [$this'replaceImg'], $text->getValue()));
  53.     }
  54.     /**
  55.      * @param array $matches
  56.      */
  57.     private function replaceImg($matches)
  58.     {
  59.         $img '';
  60.         $html '';
  61.         foreach ($this->content->getImagesByType(ContentImageConnection::TYPE_TEXT) as $im) {
  62.             if ($im->getImage()->getId() == $matches[3]) {
  63.                 $img $im;
  64.             }
  65.         }
  66.         if (empty($img)) {
  67.             return false;
  68.         }
  69.         $title = (!empty($img->getAlt())) ? sprintf(' title="%s"'strip_tags((str_replace('"'''$img->getAlt())))) : '';
  70.         if ($img->getPopup()) {
  71.             $html .= sprintf('<a class="imagesInContent" href="%s"%s>'$this->getImage($img), $title);
  72.         }
  73.         $html .= $this->getPicture($img);
  74.         
  75.         if ($img->getPopup()) {
  76.             $html .= '</a>';
  77.         }
  78.         
  79.         return $html;
  80.     }
  81.     /**
  82.      * @param ContentImageConnection $img
  83.      */
  84.     private function getPicture($img)
  85.     {
  86.         $alt = (!empty($img->getAlt())) ? strip_tags((str_replace('"'''$img->getAlt()))) : '';
  87.         $imgOriginalWidth $img->getImage()->getWidth();
  88.         $imgRequestedWidth $img->getMaxWidth() ?? self::IMG_MAX_SIZE;
  89.         $lastImgWidth = (self::IMG_MAX_SIZE $imgRequestedWidth) ? $imgRequestedWidth self::IMG_MAX_SIZE;
  90.         $path $this->sd->analyzePath(Context::ORIGIN$img->getImage()->getPath() . '/' $img->getImage()->getBasename());
  91.         /**
  92.          * key - window size
  93.          * value - img width
  94.          */
  95.         $imgSizes = [
  96.             380 => 350,
  97.             480 => 460,
  98.             576 => 550,
  99.             768 => 680,
  100.             1024 => 650,
  101.             1199 => 750
  102.         ];
  103.         $pictureElement $this->resizer->setInput($path)
  104.             ->build()
  105.                 ->defPictureElement();
  106.         foreach ($imgSizes as $screen => $imgWidth) {
  107.             if ($imgWidth $imgOriginalWidth) { // if requested img is bigger than original - skip
  108.                 continue;
  109.             }
  110.             $pictureElement
  111.                 ->sourceNode()
  112.                     ->mediaMaxWidth($screen)
  113.                     ->resizeNode()
  114.                         ->width($imgWidth)
  115.                     ->endNode()
  116.                 ->endNode();
  117.         }
  118.         $pictureElement
  119.             ->imgNode()
  120.                 ->alt($alt)
  121.                 ->resizeNode()
  122.                     ->width($lastImgWidth)
  123.                 ->endNode()
  124.             ->endNode();
  125.         $pictureElement->end()->process();
  126.         return $this->resizer->render([]);
  127.     }
  128.     /**
  129.      * @param ContentImageConnection $img
  130.      */
  131.     private function getImage($img)
  132.     {
  133.         $path $this->sd->analyzePath(Context::ORIGIN$img->getImage()->getPath() . '/' $img->getImage()->getBasename());
  134.         $width $img->getImage()->getWidth() < self::IMG_POPUP_SIZE $img->getImage()->getWidth() : self::IMG_POPUP_SIZE;
  135.         $this->resizer->setInput($path)
  136.             ->build()
  137.             ->defResize()
  138.                 ->width($width)
  139.             ->end()
  140.             ->process();
  141.         return $this->resizer->getResizedImages()->offsetGet(0)->getSrc();
  142.     }
  143. }