Вывод картинок в анонсах статьях

Здравствуйте, подскажите пожалуйста лучшее решение.
Суть вопроса: используя Tickets с добавленными фото в ресурсах (тиккетах), как лучше вывести одно фото в анонсе статьи.
На данный момент я вывожу их таким образом:

1. сниппет img-search

$html = $input;
$res = preg_match_all('/<\s*img[^>]*src=[\"|\'](.*?)[\"|\'][^>]*\/*>/i',$html, $result);
echo $result[1][0];
2. сниппет вывода анонсов

[[!pdoPage? &element=`getTickets` &includeContent=`1` &includeTVs=`avtor,model` &limit=`10` &tpl=`tpl-link-img` &hideContainers=`1` &tplPageWrapper=`@INLINE</p>
<div class="pagination">
<ul class="pagination">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul>
</div>
<p>` ]]
3. шаблон tpl-link-img — часть отвечающая за вывод фото
<img  src="[[phpthumbon? &phpthumbon.cache_dir=`images/prev` &options=`h=100&q=90&far=1&bg=FFFFFF`  &input=`[[img-search? &input=`[[+content]]`]]` ]]" alt="[[+longtitle]]" />


Т.е. для вывода анонсов с фото использую pdoPage в вызываемом шаблоне tpl-link-img для нахождения картинки в тиккете (ресурсе) вызываю сниппет img-search и посылаю ему поле [[+content]] для поиска картинки, после чего вывожу ссылку на первую картинку.

Все работает, но получается что вызываю сниппет в шаблоне другого сниппета, отдаю ему поле [[+content]] и так для вывода каждого ресурса (тиккета), что то мне подсказывает, что это не самый простой и оптимальный выход. После того как страница попадет в кэш наверное уже все равно, но до этого…

Если знаете, подскажите пожалуйста лучшее решение.
Борис И
02 ноября 2014, 18:05
modx.pro
4
3 102
+1

Комментарии: 9

Abu
Abu
03 ноября 2014, 11:06
+1
Не уверен, что оптимальный вариант. Использую ТВ-шки привязанные к Ресурсам + плагин. Ищет картинку если не задана в ТВ-шке вручную, если в тексте нет картинки выводится дефолтная. Из минусов, не разобрался как грамотно прикрутить media_source.

<?php
//OnBeforeDocFormSave

$tv = $modx->getOption('TV',$scriptProperties,'firstImage');
$img = $resource->GetTVValue($tv);

if(empty($img)) {
    $def_img ='template/default.png';
    $media_source = '/assets/uploads/';
    $text = $resource->content;
    
    if (preg_match_all( '|<img.*?src=[\'"](.*?)[\'"].*?>|i',$text , $matches )!=0)	{$img = $matches[1][0];}
    else {$img = $def_img;}
    
    $img = str_replace($media_source, '', $img);
    $resource->setTVValue($tv,$img);
}
    Борис И
    04 ноября 2014, 15:38
    0
    Большое спасибо, ваше решение однозначно лучше. Единственное, добавил правило OnDocFormSave, иначе не срабатывало (тиккеты уже опубликованы, открывал и пересохранял их чтобы сработал плагин).
      Борис И
      23 ноября 2014, 12:50
      0
      Здравствуйте, нашелся маленький недочет. Если добавлять ресурс с фронта. То путь до картинки подтягивает к 0 папке (ресурсу).
      Картинкам в Tickets уже после отправки прописывается реальный id, а сначала он 0. Если знаете, подскажите пожалуйста как исправить.
      Сейчас приходится заходить в админку, удалять путь к картинке и заново сохранять, чтобы опять сработал плагин и прописался нормальный путь.
        Abu
        Abu
        23 ноября 2014, 13:50
        0
        На ум приходит проверка контекста пользователя и еще одно условие для media_source.
          Борис И
          23 ноября 2014, 20:49
          0
          Спасибо за быстрый ответ.
          А что даст проверка на контекст и новое условие media_source?
          Как я понимаю, при отправке с фронта, tickets назначает реальную папку (id ресурсу) только после отправки и сохранения ресурса, плагин срабатывает раньше, а в это время пути к картинкам ведут еще на нулевой ресурс assets/images/tickets/0/имяфайла.png

          По вашей подсказке сделал срабатывание плагина только для авторизованных в mgr, что в моем случае частично решает проблему (обычные пользователи, отправляют статьи на проверку (плагин не срабатывает и не прописывает «кривые пути»), а уже менеджер заходит в админку проверяет, публикует и сохраняет (срабатывает плагин и прописывает корректный путь))

          if($modx->context->get('key') == 'mgr') {
              $tv = $modx->getOption('TV',$scriptProperties,'firstImage');
              $img = $resource->GetTVValue($tv);
          
              if(empty($img)) {
                   $def_img ='template/default.png';
                   $media_source = '/assets/images/tickets/';
                   $text = $resource->content;
              
                   if (preg_match_all( '|<img.*?src=[\'"](.*?)[\'"].*?>|i',$text , $matches )!=0)	{$img = $matches[1][0];}
                   else {$img = $def_img;}
              
                   $img = str_replace($media_source, '', $img);
                   $resource->setTVValue($tv,$img);
              }
          }
          Решение получается не универсальное, куда копать дальше?
          Есть ли возможность запустить плагин после срабатывания tickets ( когда пути уже ведут на реальный, а не на нулевой ресурс)
      Борис И
      07 декабря 2014, 12:16
      +1
      Немного переделал, теперь и при публикации с фронта с помощью Tickets пути прописываются верно.

      if($modx->context->get('key') == 'mgr') {
          $tv = $modx->getOption('TV',$scriptProperties,'firstImage');
          $img = $resource->GetTVValue($tv);
      
          if(empty($img)) {
               $def_img ='/assets/tplobzor/img/noimgdef.jpg';
               $media_source = '/assets/images/tickets/';
               $text = $resource->content;
          
               if (preg_match_all( '|<img.*?src=[\'"](.*?)[\'"].*?>|i',$text , $matches )!=0)	{$img = $matches[1][0];}
               else {$img = $def_img;}
          
               $img = str_replace($media_source, '', $img);
               $resource->setTVValue($tv,$img);
          }
      }
      else {
          
          $tv = $modx->getOption('TV',$scriptProperties,'firstImage');
          $img = $resource->GetTVValue($tv);
      
          if(empty($img)) {
               $def_img ='/assets/tplobzor/img/noimgdef.jpg';
               $media_source = '/assets/images/tickets/';
               $text = $resource->content;
          
               if (preg_match_all( '|<img.*?src=[\'"](.*?)[\'"].*?>|i',$text , $matches )!=0)	{$img = $matches[1][0];}
               else {$img = $def_img;}
               $id=$modx->resource->get('id');
               $img=preg_replace('/0{1}/',$id."/",$img);
               $img = str_replace($media_source, '', $img);
               $resource->setTVValue($tv,$img);
          }
          
          
      }
        Борис И
        16 декабря 2014, 16:23
        1
        0
        Век живи, век учись. Мой вариант выше с косяком в регулярке ($img=preg_replace('/0{1}/',$id."/",$img);). Вот новый вариант
        <?php
        if($modx->context->get('key') == 'mgr') {
            $tv = $modx->getOption('TV',$scriptProperties,'firstImage');
            $img = $resource->GetTVValue($tv);
        
            if(empty($img)) {
                 $def_img ='/assets/tplobzor/img/noimgdef.jpg';
                 $media_source = '/assets/images/tickets/';
                 $text = $resource->content;
            
                 if (preg_match_all( '|<img.*?src=[\'"](.*?)[\'"].*?>|i',$text , $matches )!=0)	{$img = $matches[1][0];}
                 else {$img = $def_img;}
            
                 $img = str_replace($media_source, '', $img);
                 $resource->setTVValue($tv,$img);
            }
        }
        else {
            
            $tv = $modx->getOption('TV',$scriptProperties,'firstImage');
            $img = $resource->GetTVValue($tv);
        
            if(empty($img)) {
                 $def_img ='/assets/tplobzor/img/noimgdef.jpg';
                 $media_source = '/assets/images/tickets/';
                 $text = $resource->content;
            
                 if (preg_match_all( '|<img.*?src=[\'"](.*?)[\'"].*?>|i',$text , $matches )!=0)	{$img = $matches[1][0];}
                 else {$img = $def_img;}
                 $id=$modx->resource->get('id');
                 $img=preg_replace('/\/[0]{1}\//',"/".$id."/",$img);
                 $img = str_replace($media_source, '', $img);
                 $resource->setTVValue($tv,$img);
            }
            
            
        }
        Александр
        07 мая 2015, 08:26
        0
        Извиняюсь, а можно полностью описать конечное решение? почитал комментарии и в конец запутался, где какие чанки, плагины и сниппеты создавать… Если это решение актуально конечно ещё, может другие способы есть, более удобные?
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        9