[ms2Gallery] Версия 1.3.0 - сниппет ms2GalleryResources

Как и обещал, представляю вашему вниманию новую версию ms2Gallery со сниппетом для вывода ресурсов с прикреплёнными изображениями.

Честно говоря, это вопрос №1 в поддержке магазина по ms2Gallery — «как вывести документы из контейнера такого-то с присоединением превью такого-то?». И мне очень надоело объяснять, как работает вот эта портянка:
[[!pdoPage?
	&element=`pdoResources`
	&loadModels=`ms2gallery`
	&parents=`0`
	&tpl=`myRowTpl`
	&leftJoin=`{
		"120x90": {"class":"msResourceFile","alias":"120x90", "on": "120x90.resource_id = modResource.id AND 120x90.path LIKE '%/120x90/' AND 120x90.rank=0"}
		,"360x270": {"class":"msResourceFile","alias":"360x270", "on": "360x270.resource_id = modResource.id AND 360x270.path LIKE '%/360x270/' AND 360x270.rank=0"}
	}`
	&select=`{
		"modResource":"*"
		,"120x90":"120x90.url as 120x90"
		,"360x270":"360x270.url as 360x270"
	}`
]]
[[!+page.nav]]

Поэтому с версии 1.3.0 вы можете вызывать отдельный сниппет:
[[!pdoPage?
	&element=`ms2GalleryResources`
	&parents=`0`
	&tpl=`@INLINE
	<p>
		<a href="[[+uri]]">[[+pagetitle]]</a>
		<a href="[[+120x90.original]]"><img src="[[+120x90]]" title="[[+120x90.name]]" /></a>
	</p>
	`
	&typeOfJoin=`inner`
	&includeThumbs=`120x90,360x270`
	&includeOriginal=`1`
]]
[[!+page.nav]]
Как видите, теперь всё стало гораздо проще.

Сниппет называется ms2GalleryResources, потому что внутри у него старый добрый pdoResources. По большому счету, новый сниппет — это просто обёртка, которая готовит параметры и передаёт их в родительский сниппет.

Соответственно, вы можете использовать любые параметры pdoResources, плюс 3 новых:
  • typeOfJoin — Тип присоединения картинок ресурса. Left — это Left Join, то есть, ресурсы будут выбираться, даже если у них нет картинок. И inner — это Inner Join, будут выбираться только ресурсы с картинками.
  • includeThumbs — Список разрешенных превью через запятую. Например «120x90,360x270».
  • includeOriginal — Добавление в выборку дополнительного join со ссылкой на оригинальное изображение. Будет доступно в массиве ресурса как «разрешение.original», например «120x90.original».
Чтобы увидеть все доступные свойства ресурса и изображений — просто не указывайте &tpl и вы получите распечатанный массив данных.

Этот сниппет заменяет собой ms2GalleryFirstImages, который вышел не очень удачным решением.

Понятное дело, что работа напрямую через pdoResources возможна, как и прежде. Новый сниппет просто избавляет вас от необходимости вручную прописывать присоединения таблицы и выборку полей.

Обновляемся, пишем отзывы.

В следующей версии планирую добавить возможность отключения вкладки галереи для некоторых шаблонов и настройку для оформления вывода плейсхолдеров с картинками на странице.
Василий Наумкин
21 октября 2014, 04:26
modx.pro
7
6 471
+7

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

Максим Кузнецов
21 октября 2014, 09:01
0
Спасибо!
    Наумов Алексей
    21 октября 2014, 09:40
    0
    Спасибо!

    возможность отключения вкладки галереи для некоторых шаблонов
    о да, жду)!
      Борис
      21 октября 2014, 09:57
      0
      Мне интереснее как завернуть превьюшки самой галереи в pdoPage. Не пачку папок, а именно сами галереи.
      Для паджинации, у меня картинок может быть более 100 и выводить портянкой все на одной странице не логично.
        Наумов Алексей
        21 октября 2014, 10:16
        0
        А вообще пробовали? Должно работать как часы.
          Борис
          21 октября 2014, 10:21
          0
          А как же это:
          Василий Наумкин 04 октября 2014, 08:24 #
          Галерею ОДНОГО РЕСУРСА выводит сниппет ms2Gallery, без пагинации — её там нет.
            Наумов Алексей
            21 октября 2014, 10:24
            0
            Попробуй вызвать ms2Gallery, передав параметры: &page=`2` &limit=`5`, если сработает, то и pdoPage должен работать.
          Василий Наумкин
          21 октября 2014, 10:26
          0
          store.simpledream.ru/ms2gallery — последний пример.

          Если нужно только превьюшки, без больших картинок, то всё еще проще:
          [[!pdoPage?
          	&element=`pdoResources`
          	&loadModels=`ms2gallery`
          	&class=`msResourceFile`
          	&tpl=`@INLINE <img src="[[+url]]" />`
          	&where=`{"path:LIKE":"%/120x90/","active":1}`
          	&limit=`10`
          	&sortby=`id`
          	&sortdir=`ASC`
          ]]
          [[!+page.nav]]
          Можно еще добавить
          &groupby=`resource_id`
            Борис
            21 октября 2014, 11:02
            0
            Выводится все. Добавил
            &resources=`[[*id]]`  &groupby=`resource_id` &depth=`0`
            Но всеравно выводит все с подпапки, а не конкретный ресурс.
              Василий Наумкин
              21 октября 2014, 11:57
              0
              Не пачку папок, а именно сами галереи.
              Вот как я должен был понять, что речь идёт об одной галерее, а не нескольких?

              Укажи id ресурса, который тебе нужен:
              &where=`{"resource_id":15,"path:LIKE":"%/120x90/","active":1}`
                Борис
                21 октября 2014, 12:23
                0
                как раз надо выводить по клику большую миниатюру в colorbox.
                &tpl=`@INLINE <div class="col-md-2"><a href="[[+640x480]]" class="thumbnail gallery" rel="group"><img src="[[+url]]" alt="[[+name]]" width="180" height="180"></a></div>`
                	&includeThumbs=`180x180,640x480`
                	&includeOriginal=`1`
                В
                <a href>
                пусто. У меня размеры 180x180, 640x480
          Богдан
          21 октября 2014, 20:46
          0
          А с товарами miniShop2 сниппет ms2GalleryResources должен работать? Пробую вывести превьюшки всех товаров в категории — ничего не выводит…
            Василий Наумкин
            21 октября 2014, 21:16
            0
            И не выйдет — у товаров своя галерея и свой сниппет msProducts, у которого есть параметр &includeThumbs.
              Богдан
              21 октября 2014, 22:17
              0
              Василий, спасибо за ответ. Это понятно, но что делать если нужно получить все превью товара, а не только превью основного изображения? Конкретно, нужно для экспорта каталога в csv файл, вывести все пути ко всем изображениям каждого товара. Это можно сделать через msProducts?
                Василий Наумкин
                22 октября 2014, 07:52
                0
                Это можно сделать через pdoTools — работай с классом msProductFile.

                Пример для pdoResources чуть выше в комментариях, только учти, что вместе resource_id там product_id.
            Andrei Kulazhenko
            22 октября 2014, 10:56
            0
            Василий, а интегрировать новый интерфейс ms2gallery в галерею для товаров miniShop2 есть в ближайших планах?
            De Ribaskin
            14 ноября 2014, 10:32
            0
            Не выводятся иконки соответствующих типов файлов, которые складываем сюда assets/components/ms2gallery/img/mgr/extensions

            Ошибка в файле core/components/ms2gallery/processors/mgr/gallery/getlist.class.php
            if ($row['type'] != 'image') {
            				$row['thumbnail'] = (file_exists(MODX_ASSETS_PATH . 'components/ms2gallery/img/mgr/extensions/' . $row['type'] . '.png'))
            					? MODX_ASSETS_URL . 'components/minishop2/img/mgr/extensions/' . $row['type'] . '.png'
            					: MODX_ASSETS_URL . 'components/minishop2/img/mgr/extensions/other.png';
            			}
            Ошибка в путях components/ms2gallery/img/mgr/extensions/

            Вот так работает:
            if ($row['type'] != 'image') {
            				$row['thumbnail'] = (file_exists(MODX_ASSETS_PATH . 'components/ms2gallery/img/mgr/extensions/'.$row['type'].'.png'))
            					? MODX_ASSETS_URL . 'components/ms2gallery/img/mgr/extensions/'.$row['type'].'.png'
            					: MODX_ASSETS_URL . 'components/ms2gallery/img/mgr/extensions/other.png';
            			}
              Василий Наумкин
              14 ноября 2014, 10:37
              0
              Такие вещи лучше писать сразу на GitHub. Поправил.
                De Ribaskin
                14 ноября 2014, 10:49
                0
                В след раз обязательно. )
                Все никак руки не дойдут там зарегистрироваться и разобраться с функционалом…
              Максим
              19 ноября 2014, 17:03
              0
              Здравствуйте. Подскажите можно ли как то поменять сортировку фотографий в админке? нужно чтобы последние фото были вверху смещая старые в самый низ
                Василий Наумкин
                19 ноября 2014, 17:08
                0
                Сейчас разве что вот тут поменять ASC на DESC.

                А так, в источнике файлов есть настройка imageUploadDir, которая отвечает за то, куда добавлять картинку: в начало или в конец.
                  Максим
                  19 ноября 2014, 17:12
                  0
                  спасибо большое, буду пробовать
                Владимир
                24 ноября 2014, 11:55
                0
                А можно ли работать с первым, оригинальным изображением ресурса, через ms2GalleryResources, как с изображением загруженным в тивишку, что бы модификаторами пользоваться, ресайзить, например, и вообще, имея галерею ms2gallery? отказаться от других способов привязки изображений к ресурсам?
                  Василий Наумкин
                  24 ноября 2014, 12:00
                  0
                  Заметку не читай, вопросы сразу задавай!
                  includeOriginal — Добавление в выборку дополнительного join со ссылкой на оригинальное изображение. Будет доступно в массиве ресурса как «разрешение.original», например «120x90.original».
                    Владимир
                    24 ноября 2014, 12:10
                    0
                    Может я не врубаюсь… Если нет заранее сгенерированного размера, например 300х150, указанного в источнике файлов галереи, то «300х150.original» я вызвать не смогу. Ведь так?
                    Потому и вопрос, можно ли вызывать первое оригинальное изображение галереи ресурса и модифицировать его, например как тивишку модификатором phpthumbon и т.п.?
                      Василий Наумкин
                      24 ноября 2014, 13:28
                      0
                      Когда ты загружаешь любую картинку — ей делаются превьюшки, согласно настроек источника файлов. То есть, заранее сгенерированный размер всегда есть.

                      что бы модификаторами пользоваться, ресайзить, например
                      Это как бы противоречит самой идее ms2Gallery. Все изображения там ресайзятся во время загрузки файла, а не страницы.

                      Но оригинальный файл есть, запись о нём в БД и ссылки в ms2GalleryResources — тоже.
                        Владимир
                        24 ноября 2014, 14:21
                        0
                        как бы противоречит самой идее ms2Gallery
                        — дело в том, что удобство загрузки изображений и их привязка к ресурсу, настолько самодостаточное качество ms2Gallery, что генерация превьюшек, иногда кажется не первым из достоинств.
                        Вот если бы еще в любом чанке можно было бы вызвать любое первое оригинальное изображение, но максимально просто, типа ms2GalleryResources+id ресурса и вот оно))) да еще потом его заресайзить как надо…
                        А на все случаи жизни превьюшек не создашь, тем более что вертикальные и горизонтальные изображения нужно учитывать…
                        PS пойду куплю еще одну ms2Gallery )) Благо у меня уже 50% скидка.
                          Василий Наумкин
                          24 ноября 2014, 15:48
                          2
                          +1
                          А какое именно из всех изображений ресурса, первое? Вот тебе простейший сниппет:
                          <?php
                          $pdo = $modx->getService('pdoFetch');
                          $id = $modx->getOption('id', $scriptProperties, $modx->resource->id);
                          $rank = $modx->getOption('rank', $scriptProperties, 0);
                          
                          $res = $pdo->getObject('msResourceFile',
                          	array('resource_id' => $id, 'rank' => $rank),
                          	array('loadModels' => 'ms2gallery','select' => 'url')
                          );
                          return $res ? $res['url'] : '';

                          Вызывать как-то так:
                          [[ms2GalleryImage?id=`[[*id]]`]]
                            Владимир
                            24 ноября 2014, 15:49
                            0
                            О!… пошел пробовать) Спасибо!
                              Wassi Wassinen
                              28 ноября 2014, 06:05
                              0
                              Василий, а можешь немного дополнить, чтобы в этом сниппете можно было размер превью указать?

                              Заранее благодарен.
                                Максим Кузнецов
                                28 ноября 2014, 06:37
                                0
                                для этого сниппета размер превью указывается в «источниках файлов», в строке thumbnails.

                                Вот по такому принципу:
                                [{"w":240,"h":240,"q":90,"zc":"1","bg":"FFFFFF"},{"w":75,"h":75,"q":90,"zc":"1","bg":"FFFFFF"}]
                                Виктор Долгий
                                10 декабря 2014, 17:01
                                0
                                Может кто подскажет, как доработать данный сниппет, чтобы можно было выбирать размер превьюшек? Заранее, спасибо!
                                  Виктор Долгий
                                  10 декабря 2014, 18:35
                                  1
                                  +1
                                  Вот, собственно:
                                  <?php
                                  $pdo = $modx->getService('pdoFetch');
                                  $id = $modx->getOption('id', $scriptProperties, $modx->resource->id);
                                  $rank = $modx->getOption('rank', $scriptProperties, 0);
                                  $size = $modx->getOption('size', $scriptProperties, '360x270');
                                  
                                  $res = $pdo->getObject('msResourceFile',
                                  	array('resource_id' => $id, 'rank' => $rank, 'path:LIKE' => '%/'.$size.'/'),
                                  	array('loadModels' => 'ms2gallery','select' => 'url')
                                  );
                                  return $res ? $res['url'] : '';
                                  Параметр &size=`360x270` (например).
                      Владимир
                      24 ноября 2014, 15:36
                      0
                      Возник отдельный вопрос. Только что приобрел ms2Gallery для сайта, который базируется на компоненте Collections. В дочерних ресурсах вкладка ms2Gallery отсутствует. Кто то сталкивался? Может уже есть решение?
                        Владимир
                        24 ноября 2014, 16:42
                        0
                        Вопрос снят. (поспешил)
                        Алексей
                        04 декабря 2014, 14:56
                        +1
                        отличное дополнение! я думал тут речь о превью первой картинки для списка ресурсов — в итоге разобрался сам что нужно rightJoin (если нет в галерее картинок то пропустить) и image.rank=0 (чтобы только первая картинка отображалась, а не все сразу)
                          Нариман Рамазанов
                          07 декабря 2014, 02:24
                          0
                          Спасибо, что не забросили компонент! Обновился аж с 1.0.x, исправились все глюки и интерфейс стал значительно удобней.
                          ЗЫ/ Сниппет FirstImage действительно разрывал мозг ))
                          Aleksandr Kirjanov
                          10 декабря 2015, 13:25
                          0
                          а как скрестить этот сниппет с babel? что бы превьюшки он брал с оригинала

                          Если делать так
                          [[!pdoPage?
                          &element=`ms2GalleryResources`
                          &parents=`[[*id]]`
                          &depth=`0`

                          &tpl=`babelLanguageLinks`

                          &typeOfJoin=`left`
                          &includeThumbs=`1000x450`
                          &includeOriginal=`1`
                          &sortby=`menuindex`
                          &sortdir=`ASC`
                          ]]

                          то babelLanguageLinks дает только один одинаковый ID, игнорируя вложенные документы.

                            Александр Иванов
                            07 марта 2017, 16:48
                            0
                            Как вывести noimage если в галерее пусто?
                            <a href=""><img class="shk-image" src="[[+360x270]]" alt="[[+pagetitle]]"/></a>
                              Александр Иванов
                              07 марта 2017, 17:03
                              0
                              Решил проблему так, но это некрасиво. Может у кого получше есть варианты или всё таки предусмотрены варианты отсутствия картинки?
                              [[ms2GalleryImage?id=`[[*id]]`]]
                              <?php
                              $pdo = $modx->getService('pdoFetch');
                              $id = $modx->getOption('id', $scriptProperties, $modx->resource->id);
                              $rank = $modx->getOption('rank', $scriptProperties, 0);
                              
                              $res = $pdo->getObject('msResourceFile',
                              	array('resource_id' => $id, 'rank' => $rank),
                              	array('loadModels' => 'ms2gallery','select' => 'url')
                              );
                              
                              if(empty($res['url'])){
                                $res['url'] = '/assets/cache_image/noimage_400x400_166.jpg';
                              }
                              
                              return $res ? $res['url'] : '';
                                Viktor
                                08 марта 2017, 15:51
                                +1
                                <div id="msGallery">
                                    {if $files?}
                                        <div class="fotorama"
                                             data-nav="thumbs"
                                             data-thumbheight="45"
                                             data-allowfullscreen="true"
                                             data-swipe="true"
                                             data-autoplay="5000">
                                            {foreach $files as $file}
                                                <a href="{$file['url']}" target="_blank">
                                                    <img src="{$file['small']}" alt="" title="">
                                                </a>
                                            {/foreach}
                                        </div>
                                    {else}
                                        <img src="{('assets_url' | option) ~ 'components/minishop2/img/web/ms2_medium.png'}"
                                             srcset="{('assets_url' | option) ~ 'components/minishop2/img/web/ms2_medium@2x.png'} 2x"
                                             alt="" title=""/>
                                    {/if}
                                </div>
                              Вячеслав
                              03 июля 2017, 09:10
                              -1
                              Я прошу прощения, но где можно найти нормальную документацию по параметрам плагина, с описанием каждого параметра?
                              Галя
                              05 мая 2021, 15:23
                              0
                              Добрый день, достался по наследству сайт на Модекс, и там почему-то выводятся только 10 производителей. Не могу найти место, где стоит лимит на количество записей. Выводятся они так:
                              {extends 'file:elements/templates/base.tpl'}

                              {block 'page_class'}brand-page{/block}

                              {block 'main'}
                              {$_modx->resource.longtitle}

                              {$_modx->resource.content}

                              {'ms2GalleryResources' | snippet: [
                              'parents' => $_modx->resource.id,
                              'sortby' => 'menuindex',
                              'sortdir' => 'ASC',
                              'typeOfJoin' => 'inner',
                              'includeThumbs' => '400x400',
                              'tpl' => '@FILE elements/chunks/brands/brands_row.tpl'
                              ]}



                              {/block}
                                Александр Мельник
                                05 мая 2021, 15:45
                                +1
                                У большинства сниппетов (из pdoTools) по умолчанию если не задан лимит, то он равен 10.
                                Здесь
                                docs.modx.pro/komponentyi/ms2gallery/snippetyi/ms2galleryresources
                                написано, что ваш ms2GalleryResources наследует все параметры от pdoResources
                                значит у него таже история. Добавьте параметр limit и нужно вам количество.
                                  Галя
                                  05 мая 2021, 16:14
                                  0
                                  благодарю
                                Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                48