0

我正在创建一个 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; ?>

非常感谢任何帮助。

4

1 回答 1

0

看起来您实际上并没有选择随机图像。我正在查看的代码是本节:

        $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某些东西来进行随机化或获取所有匹配项,因此您可能可以将其删除。)我会shuffle在 $files 上添加一个随机文件列表,然后在之后中断循环你得到你的第一个匹配,以避免不必要地处理整个列表:

        $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;
                    }
                }
            }
        }
于 2013-04-10T21:01:21.297 回答