Вывод случайного изображения из папки
Материал из Umicms
Версия от 10:48, 31 октября 2019; Vitaliks (обсуждение | вклад)
Актуально для версии 20
Содержание
Задача
Вывести случайное изображение из указанной папки.
Решение
Для решения задачи будем использовать кастомный макрос. Назовём его, например - "getRandomImage". Код макроса нужно поместить в файл "/classes/components/custom.php".
	public function getRandomImage($folder, $template = 'default') {
		if (!file_exists($folder)) {
			return;
		}
		$exts = ['gif', 'jpg', 'jpeg', 'png'];
		$images = [];
		$dh = opendir($folder);
		while (($file = readdir($dh)) == true) {
			$fileExt = pathinfo($file, PATHINFO_EXTENSION);
			if (in_array($fileExt, $exts)) {
				$images[] = $file;
			}
		}
		
		closedir($dh);
		
		$fileName = null;
		$imagesCount = count($images);
		if ($imagesCount > 0) {
			$imageNumber = time() % $imagesCount;
			$fileName = $folder.$images[$imageNumber];
		}
		
		if (!$template) {
			$template = 'default';
		}
		
		list($image) = def_module::loadTemplates('random/'.$template, 'image');
		
		$blockArr = [];
		$blockArr['filename'] = $fileName;
		
		return def_module::parseTemplate($image, $blockArr);
	}
Макрос принимает два параметра: папку с изображениями и шаблон вывода. В XSLT шаблон вывода не используется.
Если же Вы используете TPL, то необходимо создать файл "tpls/random/default.tpl" (это будет шаблон вывода по умолчанию, если не будет указан другой) со следующим содержанием:
<?php
 
$FORMS = Array();
 
$FORMS['image'] = <<<END
 
<img src="%filename%" alt="random image" border="0" />
 
END;
 
?>
Использование макроса в TPL
%custom getRandomImage('/images/')%
Использование макроса в XSLT
<xsl:apply-templates select="document('udata://custom/getRandomImage/(./images/cms)/')/udata" />
<xsl:template match="udata[@module = 'custom'][@method = 'getRandomImage']">
	<xsl:variable name="img" select="filename" />
	<img src="{$img}" alt="random image" border="0" />
</xsl:template>
Использование макроса в PHP
<?php 
	$imageData = $this->macros('custom', 'getRandomImage', ['./images/']);
?>
<img src="{$imageData['filename']}" alt="random image" border="0">