Файл: contao-3.5.8/system/modules/core/elements/ContentGallery.php
Строк: 186
<?php
/**
* Contao Open Source CMS
*
* Copyright (c) 2005-2016 Leo Feyer
*
* @license LGPL-3.0+
*/
namespace Contao;
/**
* Front end content element "gallery".
*
* @author Leo Feyer <https://github.com/leofeyer>
*/
class ContentGallery extends ContentElement
{
/**
* Files object
* @var ModelCollection|FilesModel
*/
protected $objFiles;
/**
* Template
* @var string
*/
protected $strTemplate = 'ce_gallery';
/**
* Return if there are no files
*
* @return string
*/
public function generate()
{
// Use the home directory of the current user as file source
if ($this->useHomeDir && FE_USER_LOGGED_IN)
{
$this->import('FrontendUser', 'User');
if ($this->User->assignDir && $this->User->homeDir)
{
$this->multiSRC = array($this->User->homeDir);
}
}
else
{
$this->multiSRC = deserialize($this->multiSRC);
}
// Return if there are no files
if (!is_array($this->multiSRC) || empty($this->multiSRC))
{
return '';
}
// Get the file entries from the database
$this->objFiles = FilesModel::findMultipleByUuids($this->multiSRC);
if ($this->objFiles === null)
{
if (!Validator::isUuid($this->multiSRC[0]))
{
return '<p class="error">'.$GLOBALS['TL_LANG']['ERR']['version2format'].'</p>';
}
return '';
}
return parent::generate();
}
/**
* Generate the content element
*/
protected function compile()
{
/** @var PageModel $objPage */
global $objPage;
$images = array();
$auxDate = array();
$objFiles = $this->objFiles;
// Get all images
while ($objFiles->next())
{
// Continue if the files has been processed or does not exist
if (isset($images[$objFiles->path]) || !file_exists(TL_ROOT . '/' . $objFiles->path))
{
continue;
}
// Single files
if ($objFiles->type == 'file')
{
$objFile = new File($objFiles->path, true);
if (!$objFile->isImage)
{
continue;
}
$arrMeta = $this->getMetaData($objFiles->meta, $objPage->language);
if (empty($arrMeta))
{
if ($this->metaIgnore)
{
continue;
}
elseif ($objPage->rootFallbackLanguage !== null)
{
$arrMeta = $this->getMetaData($objFiles->meta, $objPage->rootFallbackLanguage);
}
}
// Use the file name as title if none is given
if ($arrMeta['title'] == '')
{
$arrMeta['title'] = specialchars($objFile->basename);
}
// Add the image
$images[$objFiles->path] = array
(
'id' => $objFiles->id,
'uuid' => $objFiles->uuid,
'name' => $objFile->basename,
'singleSRC' => $objFiles->path,
'alt' => $arrMeta['title'],
'imageUrl' => $arrMeta['link'],
'caption' => $arrMeta['caption']
);
$auxDate[] = $objFile->mtime;
}
// Folders
else
{
$objSubfiles = FilesModel::findByPid($objFiles->uuid);
if ($objSubfiles === null)
{
continue;
}
while ($objSubfiles->next())
{
// Skip subfolders
if ($objSubfiles->type == 'folder')
{
continue;
}
$objFile = new File($objSubfiles->path, true);
if (!$objFile->isImage)
{
continue;
}
$arrMeta = $this->getMetaData($objSubfiles->meta, $objPage->language);
if (empty($arrMeta))
{
if ($this->metaIgnore)
{
continue;
}
elseif ($objPage->rootFallbackLanguage !== null)
{
$arrMeta = $this->getMetaData($objSubfiles->meta, $objPage->rootFallbackLanguage);
}
}
// Use the file name as title if none is given
if ($arrMeta['title'] == '')
{
$arrMeta['title'] = specialchars($objFile->basename);
}
// Add the image
$images[$objSubfiles->path] = array
(
'id' => $objSubfiles->id,
'uuid' => $objSubfiles->uuid,
'name' => $objFile->basename,
'singleSRC' => $objSubfiles->path,
'alt' => $arrMeta['title'],
'imageUrl' => $arrMeta['link'],
'caption' => $arrMeta['caption']
);
$auxDate[] = $objFile->mtime;
}
}
}
// Sort array
switch ($this->sortBy)
{
default:
case 'name_asc':
uksort($images, 'basename_natcasecmp');
break;
case 'name_desc':
uksort($images, 'basename_natcasercmp');
break;
case 'date_asc':
array_multisort($images, SORT_NUMERIC, $auxDate, SORT_ASC);
break;
case 'date_desc':
array_multisort($images, SORT_NUMERIC, $auxDate, SORT_DESC);
break;
case 'meta': // Backwards compatibility
case 'custom':
if ($this->orderSRC != '')
{
$tmp = deserialize($this->orderSRC);
if (!empty($tmp) && is_array($tmp))
{
// Remove all values
$arrOrder = array_map(function(){}, array_flip($tmp));
// Move the matching elements to their position in $arrOrder
foreach ($images as $k=>$v)
{
if (array_key_exists($v['uuid'], $arrOrder))
{
$arrOrder[$v['uuid']] = $v;
unset($images[$k]);
}
}
// Append the left-over images at the end
if (!empty($images))
{
$arrOrder = array_merge($arrOrder, array_values($images));
}
// Remove empty (unreplaced) entries
$images = array_values(array_filter($arrOrder));
unset($arrOrder);
}
}
break;
case 'random':
shuffle($images);
break;
}
$images = array_values($images);
// Limit the total number of items (see #2652)
if ($this->numberOfItems > 0)
{
$images = array_slice($images, 0, $this->numberOfItems);
}
$offset = 0;
$total = count($images);
$limit = $total;
// Paginate the result of not randomly sorted (see #8033)
if ($this->perPage > 0 && $this->sortBy != 'random')
{
// Get the current page
$id = 'page_g' . $this->id;
$page = (Input::get($id) !== null) ? Input::get($id) : 1;
// Do not index or cache the page if the page number is outside the range
if ($page < 1 || $page > max(ceil($total/$this->perPage), 1))
{
/** @var PageError404 $objHandler */
$objHandler = new $GLOBALS['TL_PTY']['error_404']();
$objHandler->generate($objPage->id);
}
// Set limit and offset
$offset = ($page - 1) * $this->perPage;
$limit = min($this->perPage + $offset, $total);
$objPagination = new Pagination($total, $this->perPage, Config::get('maxPaginationLinks'), $id);
$this->Template->pagination = $objPagination->generate("n ");
}
$rowcount = 0;
$colwidth = floor(100/$this->perRow);
$intMaxWidth = (TL_MODE == 'BE') ? floor((640 / $this->perRow)) : floor((Config::get('maxImageWidth') / $this->perRow));
$strLightboxId = 'lightbox[lb' . $this->id . ']';
$body = array();
// Rows
for ($i=$offset; $i<$limit; $i=($i+$this->perRow))
{
$class_tr = '';
if ($rowcount == 0)
{
$class_tr .= ' row_first';
}
if (($i + $this->perRow) >= $limit)
{
$class_tr .= ' row_last';
}
$class_eo = (($rowcount % 2) == 0) ? ' even' : ' odd';
// Columns
for ($j=0; $j<$this->perRow; $j++)
{
$class_td = '';
if ($j == 0)
{
$class_td .= ' col_first';
}
if ($j == ($this->perRow - 1))
{
$class_td .= ' col_last';
}
$objCell = new stdClass();
$key = 'row_' . $rowcount . $class_tr . $class_eo;
// Empty cell
if (!is_array($images[($i+$j)]) || ($j+$i) >= $limit)
{
$objCell->colWidth = $colwidth . '%';
$objCell->class = 'col_'.$j . $class_td;
}
else
{
// Add size and margin
$images[($i+$j)]['size'] = $this->size;
$images[($i+$j)]['imagemargin'] = $this->imagemargin;
$images[($i+$j)]['fullsize'] = $this->fullsize;
$this->addImageToTemplate($objCell, $images[($i+$j)], $intMaxWidth, $strLightboxId);
// Add column width and class
$objCell->colWidth = $colwidth . '%';
$objCell->class = 'col_'.$j . $class_td;
}
$body[$key][$j] = $objCell;
}
++$rowcount;
}
$strTemplate = 'gallery_default';
// Use a custom template
if (TL_MODE == 'FE' && $this->galleryTpl != '')
{
$strTemplate = $this->galleryTpl;
}
/** @var FrontendTemplate|object $objTemplate */
$objTemplate = new FrontendTemplate($strTemplate);
$objTemplate->setData($this->arrData);
$objTemplate->body = $body;
$objTemplate->headline = $this->headline; // see #1603
$this->Template->images = $objTemplate->parse();
}
}