Файл: contao-3.5.8/system/modules/core/elements/ContentDownloads.php
Строк: 184
<?php
/**
* Contao Open Source CMS
*
* Copyright (c) 2005-2016 Leo Feyer
*
* @license LGPL-3.0+
*/
namespace Contao;
/**
* Front end content element "downloads".
*
* @author Leo Feyer <https://github.com/leofeyer>
*/
class ContentDownloads extends ContentElement
{
/**
* Files object
* @var ModelCollection|FilesModel
*/
protected $objFiles;
/**
* Template
* @var string
*/
protected $strTemplate = 'ce_downloads';
/**
* 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 '';
}
$file = Input::get('file', true);
// Send the file to the browser and do not send a 404 header (see #4632)
if ($file != '' && !preg_match('/^meta(_[a-z]{2})?.txt$/', basename($file)))
{
while ($this->objFiles->next())
{
if ($file == $this->objFiles->path || dirname($file) == $this->objFiles->path)
{
Controller::sendFileToBrowser($file);
}
}
$this->objFiles->reset();
}
return parent::generate();
}
/**
* Generate the content element
*/
protected function compile()
{
/** @var PageModel $objPage */
global $objPage;
$files = array();
$auxDate = array();
$objFiles = $this->objFiles;
$allowedDownload = trimsplit(',', strtolower(Config::get('allowedDownload')));
// Get all files
while ($objFiles->next())
{
// Continue if the files has been processed or does not exist
if (isset($files[$objFiles->path]) || !file_exists(TL_ROOT . '/' . $objFiles->path))
{
continue;
}
// Single files
if ($objFiles->type == 'file')
{
$objFile = new File($objFiles->path, true);
if (!in_array($objFile->extension, $allowedDownload) || preg_match('/^meta(_[a-z]{2})?.txt$/', $objFile->basename))
{
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);
}
$strHref = Environment::get('request');
// Remove an existing file parameter (see #5683)
if (preg_match('/(&(amp;)?|?)file=/', $strHref))
{
$strHref = preg_replace('/(&(amp;)?|?)file=[^&]+/', '', $strHref);
}
$strHref .= ((Config::get('disableAlias') || strpos($strHref, '?') !== false) ? '&' : '?') . 'file=' . System::urlEncode($objFiles->path);
// Add the image
$files[$objFiles->path] = array
(
'id' => $objFiles->id,
'uuid' => $objFiles->uuid,
'name' => $objFile->basename,
'title' => specialchars(sprintf($GLOBALS['TL_LANG']['MSC']['download'], $objFile->basename)),
'link' => $arrMeta['title'],
'caption' => $arrMeta['caption'],
'href' => $strHref,
'filesize' => $this->getReadableSize($objFile->filesize, 1),
'icon' => TL_ASSETS_URL . 'assets/contao/images/' . $objFile->icon,
'mime' => $objFile->mime,
'meta' => $arrMeta,
'extension' => $objFile->extension,
'path' => $objFile->dirname
);
$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 (!in_array($objFile->extension, $allowedDownload) || preg_match('/^meta(_[a-z]{2})?.txt$/', $objFile->basename))
{
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);
}
$strHref = Environment::get('request');
// Remove an existing file parameter (see #5683)
if (preg_match('/(&(amp;)?|?)file=/', $strHref))
{
$strHref = preg_replace('/(&(amp;)?|?)file=[^&]+/', '', $strHref);
}
$strHref .= ((Config::get('disableAlias') || strpos($strHref, '?') !== false) ? '&' : '?') . 'file=' . System::urlEncode($objSubfiles->path);
// Add the image
$files[$objSubfiles->path] = array
(
'id' => $objSubfiles->id,
'uuid' => $objSubfiles->uuid,
'name' => $objFile->basename,
'title' => specialchars(sprintf($GLOBALS['TL_LANG']['MSC']['download'], $objFile->basename)),
'link' => $arrMeta['title'],
'caption' => $arrMeta['caption'],
'href' => $strHref,
'filesize' => $this->getReadableSize($objFile->filesize, 1),
'icon' => TL_ASSETS_URL . 'assets/contao/images/' . $objFile->icon,
'mime' => $objFile->mime,
'meta' => $arrMeta,
'extension' => $objFile->extension,
'path' => $objFile->dirname
);
$auxDate[] = $objFile->mtime;
}
}
}
// Sort array
switch ($this->sortBy)
{
default:
case 'name_asc':
uksort($files, 'basename_natcasecmp');
break;
case 'name_desc':
uksort($files, 'basename_natcasercmp');
break;
case 'date_asc':
array_multisort($files, SORT_NUMERIC, $auxDate, SORT_ASC);
break;
case 'date_desc':
array_multisort($files, 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 ($files as $k=>$v)
{
if (array_key_exists($v['uuid'], $arrOrder))
{
$arrOrder[$v['uuid']] = $v;
unset($files[$k]);
}
}
// Append the left-over files at the end
if (!empty($files))
{
$arrOrder = array_merge($arrOrder, array_values($files));
}
// Remove empty (unreplaced) entries
$files = array_values(array_filter($arrOrder));
unset($arrOrder);
}
}
break;
case 'random':
shuffle($files);
break;
}
$this->Template->files = array_values($files);
}
}