Вывод случайного изображения из папки
Материал из Umicms
Актуально для версии 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">