Вывод случайного изображения из папки — различия между версиями
Материал из Umicms
Kalexey (обсуждение | вклад) |
Kalexey (обсуждение | вклад) |
||
Строка 10: | Строка 10: | ||
</p> | </p> | ||
<p> | <p> | ||
− | Для решения задачи будем использовать кастомный макрос. Назовём его, например - "getRandomImage". Код макроса нужно поместить в файл "/classes/modules/custom.php". | + | Для решения задачи будем использовать кастомный макрос. Назовём его, например - "getRandomImage". Код макроса нужно поместить в файл "/classes/modules/custom.php" после строки "//TODO: Write here your own macroses". |
</p> | </p> | ||
<p style="text-align: right;"> | <p style="text-align: right;"> | ||
Строка 89: | Строка 89: | ||
</p> | </p> | ||
<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 = 'photoalbum'][@method = 'getRandomImage']"> | <xsl:template match="udata[@module = 'photoalbum'][@method = 'getRandomImage']"> |
Версия 13:08, 1 июля 2012
Задача:
Вывести случайное изображение из указанной папки.
Решение:
Для решения задачи будем использовать кастомный макрос. Назовём его, например - "getRandomImage". Код макроса нужно поместить в файл "/classes/modules/custom.php" после строки "//TODO: Write here your own macroses".
Листинг 1. Код макроса
/*
@param String
$folder - папка поиска изображений
@param String
$template - шаблон вывода изображения в TPL
*/
public function getRandomImage($folder, $template = 'default') {
if(!file_exists($folder))
return;
$exts = array('gif', 'jpg', 'jpeg', 'png');
$images = array();
$dh = opendir($folder);
while(($file = readdir($dh)) == true) {
$fileInfo = pathinfo($file);
$fileExt = $fileInfo['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 = array();
$blockArr['filename'] = $fileName;
return def_module::parseTemplate($image, $blockArr);
}
Макрос принимает два параметра: папку с изображениями и шаблон вывода. В XSLT шаблон вывода не используется. Если же Вы используете TPL, то необходимо создать файл "tpls/random/default.tpl" (это будет шаблон вывода по умолчанию, если не будет указан другой) со следующим содержанием:
Листинг 2. Шаблон вывода
<?php
$FORMS = Array();
$FORMS['image'] = <<<END
<img src="%filename%" alt="random image" border="0" />
END;
?>
Примеры использования макроса:
Листинг 3. Использование макроса в TPL
%custom getRandomImage('/images/')%
Листинг 4. Использование макроса в XSLT
<xsl:apply-templates select="document('udata://custom/getRandomImage/(./images/cms)/')/udata" />
<xsl:template match="udata[@module = 'photoalbum'][@method = 'getRandomImage']">
<xsl:variable name="img" select="filename" />
<img src="{$img}" alt="random image" border="0" />
</xsl:template>