Вывод картинок в анонсах статьях
Здравствуйте, подскажите пожалуйста лучшее решение.
Суть вопроса: используя Tickets с добавленными фото в ресурсах (тиккетах), как лучше вывести одно фото в анонсе статьи.
На данный момент я вывожу их таким образом:
1. сниппет img-search
Т.е. для вывода анонсов с фото использую pdoPage в вызываемом шаблоне tpl-link-img для нахождения картинки в тиккете (ресурсе) вызываю сниппет img-search и посылаю ему поле [[+content]] для поиска картинки, после чего вывожу ссылку на первую картинку.
Все работает, но получается что вызываю сниппет в шаблоне другого сниппета, отдаю ему поле [[+content]] и так для вывода каждого ресурса (тиккета), что то мне подсказывает, что это не самый простой и оптимальный выход. После того как страница попадет в кэш наверное уже все равно, но до этого…
Если знаете, подскажите пожалуйста лучшее решение.
Суть вопроса: используя 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]] и так для вывода каждого ресурса (тиккета), что то мне подсказывает, что это не самый простой и оптимальный выход. После того как страница попадет в кэш наверное уже все равно, но до этого…
Если знаете, подскажите пожалуйста лучшее решение.
Комментарии: 9
Не уверен, что оптимальный вариант. Использую ТВ-шки привязанные к Ресурсам + плагин. Ищет картинку если не задана в ТВ-шке вручную, если в тексте нет картинки выводится дефолтная. Из минусов, не разобрался как грамотно прикрутить 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);
}
Большое спасибо, ваше решение однозначно лучше. Единственное, добавил правило OnDocFormSave, иначе не срабатывало (тиккеты уже опубликованы, открывал и пересохранял их чтобы сработал плагин).
Здравствуйте, нашелся маленький недочет. Если добавлять ресурс с фронта. То путь до картинки подтягивает к 0 папке (ресурсу).
Картинкам в Tickets уже после отправки прописывается реальный id, а сначала он 0. Если знаете, подскажите пожалуйста как исправить.
Сейчас приходится заходить в админку, удалять путь к картинке и заново сохранять, чтобы опять сработал плагин и прописался нормальный путь.
Картинкам в Tickets уже после отправки прописывается реальный id, а сначала он 0. Если знаете, подскажите пожалуйста как исправить.
Сейчас приходится заходить в админку, удалять путь к картинке и заново сохранять, чтобы опять сработал плагин и прописался нормальный путь.
На ум приходит проверка контекста пользователя и еще одно условие для media_source.
Спасибо за быстрый ответ.
А что даст проверка на контекст и новое условие media_source?
Как я понимаю, при отправке с фронта, tickets назначает реальную папку (id ресурсу) только после отправки и сохранения ресурса, плагин срабатывает раньше, а в это время пути к картинкам ведут еще на нулевой ресурс assets/images/tickets/0/имяфайла.png
По вашей подсказке сделал срабатывание плагина только для авторизованных в mgr, что в моем случае частично решает проблему (обычные пользователи, отправляют статьи на проверку (плагин не срабатывает и не прописывает «кривые пути»), а уже менеджер заходит в админку проверяет, публикует и сохраняет (срабатывает плагин и прописывает корректный путь))
Есть ли возможность запустить плагин после срабатывания tickets ( когда пути уже ведут на реальный, а не на нулевой ресурс)
А что даст проверка на контекст и новое условие 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 ( когда пути уже ведут на реальный, а не на нулевой ресурс)
Немного переделал, теперь и при публикации с фронта с помощью 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);
}
}
Век живи, век учись. Мой вариант выше с косяком в регулярке ($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);
}
}
Извиняюсь, а можно полностью описать конечное решение? почитал комментарии и в конец запутался, где какие чанки, плагины и сниппеты создавать… Если это решение актуально конечно ещё, может другие способы есть, более удобные?
Уже не актуально!
Вот правильное решение: https://modx.pro/components/4518-tickets-1-5-0-beta-with-the-generation-of-multiple-preview/
Вот правильное решение: https://modx.pro/components/4518-tickets-1-5-0-beta-with-the-generation-of-multiple-preview/
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.