protected function compile()
	{
		/** @var PageModel $objPage */
		global $objPage;

		$files = array();
		$auxDate = array();

		$objFiles = $this->objFiles;
		$allowedDownload = StringUtil::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(System::getContainer()->getParameter('kernel.project_dir') . '/' . $objFiles->path))
			{
				continue;
			}

			// Single files
			if ($objFiles->type == 'file')
			{
				$objFile = new File($objFiles->path);

				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'] = StringUtil::specialchars($objFile->basename);
				}

				$strHref = Environment::get('request');

				// Remove an existing file parameter (see #5683)
				if (isset($_GET['file']))
				{
					$strHref = preg_replace('/(&(amp;)?|\?)file=[^&]+/', '', $strHref);
				}

				if (isset($_GET['cid']))
				{
					$strHref = preg_replace('/(&(amp;)?|\?)cid=\d+/', '', $strHref);
				}

				$strHref .= (strpos($strHref, '?') !== false ? '&amp;' : '?') . 'file=' . System::urlEncode($objFiles->path) . '&amp;cid=' . $this->id;

				// Add the image
				$files[$objFiles->path] = array
				(
					'id'        => $objFiles->id,
					'uuid'      => $objFiles->uuid,
					'name'      => $objFile->basename,
					'title'     => StringUtil::specialchars(sprintf($GLOBALS['TL_LANG']['MSC']['download'], $objFile->basename)),
					'link'      => $arrMeta['title'],
					'caption'   => $arrMeta['caption'],
					'href'      => $strHref,
					'filesize'  => $this->getReadableSize($objFile->filesize, 1),
					'icon'      => Image::getPath($objFile->icon),
					'mime'      => $objFile->mime,
					'meta'      => $arrMeta,
					'extension' => $objFile->extension,
					'path'      => $objFile->dirname
				);

				$auxDate[] = $objFile->mtime;
			}

			// Folders
			else
			{
				$objSubfiles = FilesModel::findByPid($objFiles->uuid, array('order' => 'name'));

				if ($objSubfiles === null)
				{
					continue;
				}

				while ($objSubfiles->next())
				{
					// Skip subfolders
					if ($objSubfiles->type == 'folder')
					{
						continue;
					}

					$objFile = new File($objSubfiles->path);

					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'] = StringUtil::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 .= (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'     => StringUtil::specialchars(sprintf($GLOBALS['TL_LANG']['MSC']['download'], $objFile->basename)),
						'link'      => $arrMeta['title'],
						'caption'   => $arrMeta['caption'],
						'href'      => $strHref,
						'filesize'  => $this->getReadableSize($objFile->filesize, 1),
						'icon'      => Image::getPath($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;

			// Deprecated since Contao 4.0, to be removed in Contao 5.0
			case 'meta':
				@trigger_error('The "meta" key in ContentDownloads::compile() has been deprecated and will no longer work in Contao 5.0.', E_USER_DEPRECATED);
				// no break;

			case 'custom':
				if ($this->orderSRC != '')
				{
					$tmp = StringUtil::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);
	}
protected function compile()
	{
		
		global $objPage;

		$files = array();
		$auxDate = array();

		$objFiles = $this->objFiles;
		$allowedDownload = StringUtil::trimsplit(',', strtolower(Config::get('allowedDownload')));

		
		while ($objFiles->next())
		{
			
			if (isset($files[$objFiles->path]) || !file_exists(System::getContainer()->getParameter('kernel.project_dir') . '/' . $objFiles->path))
			{
				continue;
			}

			
			if ($objFiles->type == 'file')
			{
				$objFile = new File($objFiles->path);

				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);
					}
				}

				
				if ($arrMeta['title'] == '')
				{
					$arrMeta['title'] = StringUtil::specialchars($objFile->basename);
				}

				$strHref = Environment::get('request');

				
				if (isset($_GET['file']))
				{
					$strHref = preg_replace('/(&(amp;)?|\?)file=[^&]+/', '', $strHref);
				}

				if (isset($_GET['cid']))
				{
					$strHref = preg_replace('/(&(amp;)?|\?)cid=\d+/', '', $strHref);
				}

				$strHref .= (strpos($strHref, '?') !== false ? '&amp;' : '?') . 'file=' . System::urlEncode($objFiles->path) . '&amp;cid=' . $this->id;

				
				$files[$objFiles->path] = array
				(
					'id'        => $objFiles->id,
					'uuid'      => $objFiles->uuid,
					'name'      => $objFile->basename,
					'title'     => StringUtil::specialchars(sprintf($GLOBALS['TL_LANG']['MSC']['download'], $objFile->basename)),
					'link'      => $arrMeta['title'],
					'caption'   => $arrMeta['caption'],
					'href'      => $strHref,
					'filesize'  => $this->getReadableSize($objFile->filesize, 1),
					'icon'      => Image::getPath($objFile->icon),
					'mime'      => $objFile->mime,
					'meta'      => $arrMeta,
					'extension' => $objFile->extension,
					'path'      => $objFile->dirname
				);

				$auxDate[] = $objFile->mtime;
			}

			
			else
			{
				$objSubfiles = FilesModel::findByPid($objFiles->uuid, array('order' => 'name'));

				if ($objSubfiles === null)
				{
					continue;
				}

				while ($objSubfiles->next())
				{
					
					if ($objSubfiles->type == 'folder')
					{
						continue;
					}

					$objFile = new File($objSubfiles->path);

					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);
						}
					}

					
					if ($arrMeta['title'] == '')
					{
						$arrMeta['title'] = StringUtil::specialchars($objFile->basename);
					}

					$strHref = Environment::get('request');

					
					if (preg_match('/(&(amp;)?|\?)file=/', $strHref))
					{
						$strHref = preg_replace('/(&(amp;)?|\?)file=[^&]+/', '', $strHref);
					}

					$strHref .= (strpos($strHref, '?') !== false ? '&amp;' : '?') . 'file=' . System::urlEncode($objSubfiles->path);

					
					$files[$objSubfiles->path] = array
					(
						'id'        => $objSubfiles->id,
						'uuid'      => $objSubfiles->uuid,
						'name'      => $objFile->basename,
						'title'     => StringUtil::specialchars(sprintf($GLOBALS['TL_LANG']['MSC']['download'], $objFile->basename)),
						'link'      => $arrMeta['title'],
						'caption'   => $arrMeta['caption'],
						'href'      => $strHref,
						'filesize'  => $this->getReadableSize($objFile->filesize, 1),
						'icon'      => Image::getPath($objFile->icon),
						'mime'      => $objFile->mime,
						'meta'      => $arrMeta,
						'extension' => $objFile->extension,
						'path'      => $objFile->dirname
					);

					$auxDate[] = $objFile->mtime;
				}
			}
		}

		
		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':
				@trigger_error('The "meta" key in ContentDownloads::compile() has been deprecated and will no longer work in Contao 5.0.', E_USER_DEPRECATED);
				

			case 'custom':
				if ($this->orderSRC != '')
				{
					$tmp = StringUtil::deserialize($this->orderSRC);

					if (!empty($tmp) && \is_array($tmp))
					{
						
						$arrOrder = array_map(function () {}, array_flip($tmp));

						
						foreach ($files as $k=>$v)
						{
							if (\array_key_exists($v['uuid'], $arrOrder))
							{
								$arrOrder[$v['uuid']] = $v;
								unset($files[$k]);
							}
						}

						
						if (!empty($files))
						{
							$arrOrder = array_merge($arrOrder, array_values($files));
						}

						
						$files = array_values(array_filter($arrOrder));
						unset($arrOrder);
					}
				}
				break;

			case 'random':
				shuffle($files);
				break;
		}

		$this->Template->files = array_values($files);
	}
protected function compile ( ) { /** @var PageModel $objPage */ global $ objPage ; $ files = array ( ) ; $ auxDate = array ( ) ; $ objFiles = $ this -> objFiles ; $ allowedDownload = StringUtil :: 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 ( System :: getContainer ( ) -> getParameter ( 'kernel.project_dir' ) . '/' . $ objFiles -> path ) ) { continue ; } // Single files if ( $ objFiles -> type == 'file' ) { $ objFile = new File ( $ objFiles -> path ) ; 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' ] = StringUtil :: specialchars ( $ objFile -> basename ) ; } $ strHref = Environment :: get ( 'request' ) ; // Remove an existing file parameter (see #5683) if ( isset ( $ _GET [ 'file' ] ) ) { $ strHref = preg_replace ( '/(&(amp;)?|\?)file=[^&]+/' , '' , $ strHref ) ; } if ( isset ( $ _GET [ 'cid' ] ) ) { $ strHref = preg_replace ( '/(&(amp;)?|\?)cid=\d+/' , '' , $ strHref ) ; } $ strHref .= ( strpos ( $ strHref , '?' ) !== false ? '&amp;' : '?' ) . 'file=' . System :: urlEncode ( $ objFiles -> path ) . '&amp;cid=' . $ this -> id ; // Add the image $ files [ $ objFiles -> path ] = array ( 'id' => $ objFiles -> id , 'uuid' => $ objFiles -> uuid , 'name' => $ objFile -> basename , 'title' => StringUtil :: specialchars ( sprintf ( $ GLOBALS [ 'TL_LANG' ] [ 'MSC' ] [ 'download' ] , $ objFile -> basename ) ) , 'link' => $ arrMeta [ 'title' ] , 'caption' => $ arrMeta [ 'caption' ] , 'href' => $ strHref , 'filesize' => $ this -> getReadableSize ( $ objFile -> filesize , 1 ) , 'icon' => Image :: getPath ( $ objFile -> icon ) , 'mime' => $ objFile -> mime , 'meta' => $ arrMeta , 'extension' => $ objFile -> extension , 'path' => $ objFile -> dirname ) ; $ auxDate [ ] = $ objFile -> mtime ; } // Folders else { $ objSubfiles = FilesModel :: findByPid ( $ objFiles -> uuid , array ( 'order' => 'name' ) ) ; if ( $ objSubfiles === null ) { continue ; } while ( $ objSubfiles -> next ( ) ) { // Skip subfolders if ( $ objSubfiles -> type == 'folder' ) { continue ; } $ objFile = new File ( $ objSubfiles -> path ) ; 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' ] = StringUtil :: 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 .= ( 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' => StringUtil :: specialchars ( sprintf ( $ GLOBALS [ 'TL_LANG' ] [ 'MSC' ] [ 'download' ] , $ objFile -> basename ) ) , 'link' => $ arrMeta [ 'title' ] , 'caption' => $ arrMeta [ 'caption' ] , 'href' => $ strHref , 'filesize' => $ this -> getReadableSize ( $ objFile -> filesize , 1 ) , 'icon' => Image :: getPath ( $ 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 ; // Deprecated since Contao 4.0, to be removed in Contao 5.0 case 'meta' : @ trigger_error ( 'The "meta" key in ContentDownloads::compile() has been deprecated and will no longer work in Contao 5.0.' , E_USER_DEPRECATED ) ; // no break; case 'custom' : if ( $ this -> orderSRC != '' ) { $ tmp = StringUtil :: 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 ) ; }
Generate the content element
Generate the content element