Вывод случайного изображения из папки

Материал из Umicms
Перейти к:навигация, поиск

Задача:

Вывести случайное изображение из указанной папки.

Решение:

Для решения задачи будем использовать кастомный макрос. Назовём его, например - "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 = 'custom'][@method = 'getRandomImage']">
  <xsl:variable name="img" select="filename" />
  <img src="{$img}" alt="random image" border="0" />
</xsl:template>