我正在创建一个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; ?>
看起来您实际上并没有选择一个随机图像。我要看的代码是这一部分:
$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;
}
}
}
}