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

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

Актуально для версии 20

Задача

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

Решение

Для решения задачи будем использовать кастомный макрос. Назовём его, например - "getRandomImage". Код макроса нужно поместить в файл "/classes/modules/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">