Илья
10 апр. 2013 г., 20:32

Галерея в стиле Вконтакте или Яндекс.Картинок

В ходе работы над проектом сайта Салон красоты «Чудо» потребовалось вывести логотипы партнеров. Сами партнеры — это отдельные страницы сайта, чтобы партнеров можно было добавлять, удалять, писать описания, менять логотипы и прочее.
Можно было просто взять сниппет getResources и выводить картинки из TV с помощью него. Но тут возникает проблема — обрезать логотипы, как обычно это делается с картинками при ресайзе, нельзя — логотипы должны быть целыми.
?
И тут я вспомнил, что в новостях Вконтакте картинки выравниваются очень аккуратно:
? ?
И решил, что логотипы можно выравнивать так же. Написал сниппет и мимоходом решил адаптировать его еще и для галереи. Вот, что получается, если его использовать:
?
Код сниппета можно взять на github. Если будете использовать вместе с Gallery, то надо создать еще и чанк tpl.AlignImage:
"[[+id]]":"[[+[[+tvPrefix]][[+processImage]]]]",
Сниппет AlignImage является сниппетом-оберткой и работает с любым сниппетом, который понимает offset и limit, например, getResources.
Сниппет Gallery не понимает ни offset, ни limit, но это один из самых популярных пакетов, поэтому для него в AlignImage есть свои строчки. Сниппет ресайзит изображения с помощью Imagick, поэтому у вас на сервере он должен быть (на modxcloud есть).
Вызов сниппета в паре с Gallery:
<div style="width: 400px; text-align: justify; line-height: 0;"> [[AlignImage? &snippet=`Gallery` <!-- любой сниппет, который понимает offset и limit --> &lineLimit=`3` <!-- сколько фоток в строке --> &limit=`6` <!-- сколько всего выводить --> &lineWidth=`390` <!-- какой должна получиться ширина строки - чуть меньше ширины контейнера - чтобы между фотками были расстояния --> &processImage=`image_absolute` <!-- имя плейсхолдера, в который сниппет - в данном случае Gallery - помещает картинку. Для getResources здесь пишем нужный TV --> &tpl=`tpl.galAlignImage` <!-- шаблон вывода: <a href="[[~8? &galItem=`[[+id]]` &galAlbum=`[[+album]]`]]"> <img src="[[+image_absolute]]" style="margin-bottom: 8px;"> </a> --> &crop=`1` <!-- обрезать ли лишний фон у картинок, например, если это логотипы --> &album=`Фото салона` <!-- остальное идет --> &tvPrefix=`` <!-- в Gallery или getResources --> ]] <img src="/img/s.png" style="width: 100%; height: 1px; opacity: 0;"> <!-- Картинка нужна для выравнивания последней строки --> </div>
Вызов совместно с getResources:
[[AlignImage? &snippet=`getResources` &parents=`59` &sortby=`{"menuindex":"ASC"}` &lineLimit=`2` &lineWidth=`245` &processImage=`LOGO` &tpl=`tpl.partners` &crop=`1` ]]
Теперь в блоке партнеров логотипы можно менять местами просто перетаскивая ресурсы в дереве элементов — картинки сами отресайзятся под нужный размер.
Думаю, новичкам будут интересны подробности алгоритма и комментарии кода. G+
Илья, отличное решение! Зачет!:-)
На гитхабе сниппет AlignImages, а здесь в примере AlignImage ;)

Добавить комментарий