Вход Регистрация
Файл: 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->pathtrue);

                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) ? '&amp;' '?') . '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->filesize1),
                    
'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->pathtrue);

                    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) ? '&amp;' '?') . '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->filesize1),
                        
'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($filesSORT_NUMERIC$auxDateSORT_ASC);
                break;

            case 
'date_desc':
                
array_multisort($filesSORT_NUMERIC$auxDateSORT_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($arrOrderarray_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);
    }
}
Онлайн: 1
Реклама