Вывод случайного изображения из папки — различия между версиями
Материал из Umicms
Kalexey (обсуждение | вклад) |
Vitaliks (обсуждение | вклад) (→Использование макроса в PHP) |
||
(не показано 7 промежуточных версий 3 участников) | |||
Строка 1: | Строка 1: | ||
[[category:Написание кастомных макросов]] | [[category:Написание кастомных макросов]] | ||
− | + | [[category:Верстка в XSLT]] | |
− | ''' | + | [[category:Верстка в TPL]] |
− | + | '''Актуально для версии 20''' | |
− | + | ||
+ | == Задача == | ||
+ | |||
Вывести случайное изображение из указанной папки. | Вывести случайное изображение из указанной папки. | ||
− | + | ||
− | + | == Решение == | |
− | + | ||
− | + | Для решения задачи будем использовать кастомный макрос. Назовём его, например - "getRandomImage". Код макроса нужно поместить в файл "/classes/components/custom.php". | |
− | |||
− | Для решения задачи будем использовать кастомный макрос. Назовём его, например - "getRandomImage". Код макроса нужно поместить в файл "/classes/ | ||
− | |||
− | |||
− | |||
− | |||
<source lang="php"> | <source lang="php"> | ||
− | + | public function getRandomImage($folder, $template = 'default') { | |
− | + | if (!file_exists($folder)) { | |
− | + | return; | |
− | + | } | |
− | + | ||
− | + | $exts = ['gif', 'jpg', 'jpeg', 'png']; | |
− | public function getRandomImage($folder, $template = 'default') { | + | $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); | ||
+ | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</source> | </source> | ||
− | + | ||
− | Макрос принимает два параметра: папку с изображениями и шаблон вывода. В XSLT шаблон вывода не используется. Если же Вы используете TPL, то необходимо создать файл "tpls/random/default.tpl" (это будет шаблон вывода по умолчанию, если не будет указан другой) со следующим содержанием: | + | Макрос принимает два параметра: папку с изображениями и шаблон вывода. В XSLT шаблон вывода не используется. |
− | + | ||
− | + | Если же Вы используете TPL, то необходимо создать файл "tpls/random/default.tpl" (это будет шаблон вывода по умолчанию, если не будет указан другой) со следующим содержанием: | |
− | + | ||
− | |||
<source lang="php"> | <source lang="php"> | ||
<?php | <?php | ||
Строка 76: | Строка 67: | ||
?> | ?> | ||
</source> | </source> | ||
− | + | ||
− | + | === Использование макроса в TPL === | |
− | + | ||
− | |||
− | |||
− | |||
<source lang="php"> | <source lang="php"> | ||
%custom getRandomImage('/images/')% | %custom getRandomImage('/images/')% | ||
</source> | </source> | ||
− | + | ||
− | + | === Использование макроса в XSLT === | |
− | + | ||
<source lang="html4strict"> | <source lang="html4strict"> | ||
− | <xsl:apply-templates select="document('udata:// | + | <xsl:apply-templates select="document('udata://custom/getRandomImage/(./images/cms)/')/udata" /> |
− | <xsl:template match="udata[@module = ' | + | <xsl:template match="udata[@module = 'custom'][@method = 'getRandomImage']"> |
− | + | <xsl:variable name="img" select="filename" /> | |
− | + | <img src="{$img}" alt="random image" border="0" /> | |
</xsl:template> | </xsl:template> | ||
+ | </source> | ||
+ | |||
+ | === Использование макроса в PHP === | ||
+ | |||
+ | <source lang="php"> | ||
+ | <?php | ||
+ | $imageData = $this->macros('custom', 'getRandomImage', ['./images/']); | ||
+ | ?> | ||
+ | <img src="<?=$imageData['filename']?>" alt="random image" border="0"> | ||
</source> | </source> |
Текущая версия на 10:48, 31 октября 2019
Актуально для версии 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">