Modx Gallery with Pagination inc. Fancybox
1) Install GetPage Extra, Gallery Extra, all Fancybox files (if required)
2) Add extra Snippet for Pagination, name it: GalleryItemPagination
<?php // First instantiate the Gallery package $modx->addPackage('gallery',$modx->getOption('gallery.core_path',$config,$modx->getOption('core_path').'components/gallery/').'model/'); $curItem = $modx->getOption('curItem',$scriptProperties,1); if ($modx->getOption('checkForRequestVar',$scriptProperties,true)) { $getParam = $modx->getOption('getParam',$scriptProperties,'galItem'); if (!empty($_REQUEST[$getParam])) { $curItem = (int)$_REQUEST[$getParam]; } } if (empty($curItem)) return ''; $album = $modx->getOption('album',$scriptProperties,1); if ($modx->getOption('checkForRequestAlbumVar',$scriptProperties,true)) { $albumRequestVar = $modx->getOption('albumRequestVar',$scriptProperties,'galAlbum'); if (!empty($_REQUEST[$albumRequestVar])) $album = $_REQUEST[$albumRequestVar]; } // We pass the album name/ID to an &album property and find the gallery object if (!is_int($album)) { $gallery = $modx->getObject('galAlbum',array('name' => $album)); if ($gallery instanceof galAlbum) $album = $gallery->get('id'); } $c = $modx->newQuery('galAlbumItem'); $c->innerJoin('galItem','Item'); $c->where( array( 'album' => $album, ) ); $c->select( array( 'galAlbumItem.*', 'Item.*', ) ); $c->sortby('rank','asc'); $collection = $modx->getCollection('galAlbumItem',$c); $items = array(); foreach ($collection as $i) { $items[] = $i->toArray(); } $continue = true; $i = 0; $prev = array(); $cur = array(); $next = array(); while ($continue) { $prev = $cur; $cur = $items[$i]; if ($cur['id'] == $curItem) { $next = $items[$i+1]; $continue = false; } $i++; } $first = $items[0]; $last = $items[count($items)-1]; $phs['galitem.cur.'] = $cur; $phs['galitem.prev.'] = $prev; $phs['galitem.next.'] = $next; $phs['galitem.first.'] = $first; $phs['galitem.last.'] = $last; $modx->setPlaceholders($phs); return ''; ?>
3) Make chunk - getPageGallery
[[!getPage? &elementClass=`modChunk` &element=`galleryPage` &limit=`15` &pageVarKey=`page` &totalVar=`gallery.total`]] <div class="container gallery-pagi nopad"> <div class="row no-gutters"> <div class="col-md-12"> <ul>[[!+page.nav]]</ul> </div> </div> </div>
4) Make chunk - galleryPage
<div class="row gallery-albums nopad no-gutters"> [[!Gallery? &limit=`[[+limit]]` &start=`[[+offset]]` &album=`Name Of Album` &thumbHeight=`300` &thumbWidth=`381` &thumbTpl=`galleryPageThumbTpl` &imageWidth=`2000` &imageHeight=`2000` &imageQuality=`100` ]] </div>
5) Make chunk - galleryPageThumbTpl
(if not wanting fancybox integration, remove the relevant classes from the < a >)
<div class="gallery-thmb"> <a href="[[+image]]" data-fancybox="gallery" data-caption="[[+pagetitle]]"> <img src="[[+thumbnail]]" alt="[[+name]]"> <div class="icn-zm"><img src="images/icon_zoom.png"></div> </a> </div>
6) Add these Calls to the Gallery Page
[[!Gallery? &album=`Name of Album` &thumbTpl=`x` ]] [[$getPageGallery]]
7) A little CSS to get the Pagination Styles started (modify to suit)
.gallery-pagi ul {margin: 2em auto;text-align:center;list-style-type: none;padding: 0;} .gallery-pagi ul li {display: inline-block;margin: 0.8em 0;} .gallery-pagi ul li a{color:#000;text-decoration:none;background:#e4e4e4;padding:10px 20px;margin: 5px;border:solid 2px transparent;} .gallery-pagi ul li a:hover{color:#000000;text-decoration:none; background:#e4e4e4;border:solid 2px #207ec2;} .gallery-pagi ul li a.active{color:#fff;text-decoration:none; background:#3075ae;padding:10px 20px;margin:5px;border:solid 2px transparent;} .gallery-pagi #first,#last,#prev,#next {display:none;}/* To hide these buttons, need to modify the getPage template properties */ /*CSS FOR THE GALLERY - OPTIONAL */ .gallery-albums {display:-webkit-box;display:-ms-flexbox;display:flex;} .gallery-thmb {-webkit-box-flex:1;-ms-flex:1 1 20%;flex:1 1 20%;} .gallery-thmb > a {border: 1px solid #f3f3f3;/* border-radius: 3px; */display: block;overflow: hidden;position: relative;float: left;} .gallery-thmb a > img { -webkit-transition: -webkit-transform 0.15s ease 0s; transition: -webkit-transform 0.15s ease 0s; transition: transform 0.15s ease 0s; transition: transform 0.15s ease 0s, -webkit-transform 0.15s ease 0s; -webkit-transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1);} .gallery-thmb a:hover > img {-webkit-transform: scale3d(1.1, 1.1, 1.1); transform: scale3d(1.1, 1.1, 1.1);} .gallery-thmb a:hover .icn-zm > img { opacity: 1;} .gallery-thmb > a .icn-zm {background-color: rgba(0, 0, 0, 0.1);bottom: 0;left: 0;position: absolute;right: 0;top: 0;-webkit-transition: background-color 0.15s ease 0s;transition: background-color 0.15s ease 0s;} .gallery-thmb > a .icn-zm > img {left: 0;opacity: 0;position: absolute;top: 0;bottom:0px;right:0px;margin: auto;-webkit-transition: opacity 0.3s ease 0s;transition: opacity 0.3s ease 0s;background: #dc2032;padding: 5px;border-top-left-radius: 25px;}
Get In Touch
Have a question? or perhaps spotted a problem?
Maybe you have something you would like to add. Drop us a line anytime!