我正在创建一个joomla模块,它可以提取文章,然后从文件夹中分配图像(没有特定的顺序)。
但它不断返回相同的图像:/ ...其他所有工作都很完美我只需要从每个文章的文件夹中抓取一个不同的图像。
这是mod_slider.php(仅包括要点):
$a = explode(",", $params->get('id'));
foreach ($a as $k => $val) {
$args = $val;
$item[] = ModArticleSlider::getArticles($args,$params);
}
和helper.php(包括整个类):
class ModArticleSlider {
public static function getArticles($args,$params){
$db = JFactory::getDBO();
$id = $args;
if($id > 0){
$query = "select * ";
$query .= "FROM #__content WHERE id =".$id." AND state=1 " ;
//echo $query;
$db->setQuery($query);
$item = $db->loadObject();
}
$folder = $params->get('folder');
if(JString::strpos($folder, JURI::base()) === 0)
{
$folder = str_replace(JURI::base(), '', $folder);
}
if(JString::strpos($folder, JPATH_SITE) === 0)
{
$folder = str_replace(JPATH_BASE, '', $folder);
}
$folder = str_replace('\\', '/', $folder);
$dir = JPATH_BASE.'/'.$folder;
$files = array();
if(is_dir($dir))
{
if($handle = opendir($dir))
{
while(($file = readdir($handle)) !== false)
{
if($file != '.' AND $file != '..' AND $file != 'index.html')
{
$files[] = $file;
}
}
}
closedir($handle);
$types = array_map('trim', explode(',', $params->get('type')));
$images = array();
foreach($files as $img){
if(!is_dir($dir.'/'.$img))
{
foreach($types as $type)
{
$muster = '@'.$type.'$@i';
if(preg_match($muster, $img))
{
$item->name = $img;
$item->folder = str_replace('\\', '/', $folder);
}
}
}
}
}
return $item;
}
}
然后是index.php(仅包括要点):
<?php foreach ($item as $items):?>
<img src="<?php echo $items->folder.'/'.$items->name ?>" />
<?php endforeach; ?>
任何帮助都非常赞赏。
答案 0 :(得分:1)
看起来你实际上并没有选择随机图像。我正在看的代码是这一部分:
$types = array_map('trim', explode(',', $params->get('type')));
$images = array();
foreach($files as $img){
if(!is_dir($dir.'/'.$img))
{
foreach($types as $type)
{
$muster = '@'.$type.'$@i';
if(preg_match($muster, $img))
{
$item->name = $img;
$item->folder = str_replace('\\', '/', $folder);
}
}
}
}
循环遍历所有文件,但如果匹配,则只是将它们分配给彼此。每次都会覆盖$item->name
和$item->folder
。我也没有看到你实际上随机化文件列表的位置,所以你不能真正期待随机图像。 (我假设你可能会使用$images
来实现随机化或获得所有匹配,所以你可能会删除它。)我会在$ files上添加shuffle
来随机化文件列表,然后在第一次匹配后中断循环,以避免不必要地处理整个列表:
$types = array_map('trim', explode(',', $params->get('type')));
shuffle($files);
foreach($files as $img){
if(!is_dir($dir.'/'.$img))
{
foreach($types as $type)
{
$muster = '@'.$type.'$@i';
if(preg_match($muster, $img))
{
$item->name = $img;
$item->folder = str_replace('\\', '/', $folder);
break 2;
}
}
}
}