您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
dedecms二次开发实战——调用下篇文章缩略图及自定义字段(模型的使用)
发布时间:2015-02-27 08:32:50编辑:雪饮阅读()
dedecms中的arclist是我们用的最多的一个调用文章列表的标签,但该标签能够满足绝大多数文章列表的调用需求,但在某些特殊需求下就无能为力了,如下所示:
这是一个文章列表,它的前台静态页面效果是一个轮播效果,文章列表从第一个轮播到最后一个然后又转到第一个文章,一直如此循环进行轮播,并且每条信息中所包含的调用为:当前文章缩略图、文章标题(专家姓名)、专家职称、在线咨询(固定的图片,固定的商务通链接)、下一篇文章的缩略图(若已经是最后一篇文章则调用第一篇文章的缩略图)
需求分析后,我们来看看如何实现,由于包含了个包含了下篇文章缩略图的调用和自定义字段的调用,所以不能直接用arclist标签进行调用,我们需要使用到模型(为了自定义字段)和原生php代码(为了进行判断调用下篇文章缩略图)
首先我们来建立模型
为了方便,我们就直接将默认栏目所在的内容模型复制:
复制模型并修改后信息如下:
基本设置:
字段管理:
模型建立之后我们还需要为模型制作模板
为了方便我们可以直接将默认栏目的模板代码分别给它们3个
然后回到所在栏目调用我们的模型
然后发布文章时就可以录入自定义字段的值了
好了,模型的建立就到此完结,下面我们来使用php原生代码实现具体功能,先将代码贴出来让大家看看,然后再参照代码为大家一一解惑:
图片式:
文本式
{dede:daxiangmu runphp='yes'}
$sql="select a.id as abid,a.litpic as ablitpic,a.title as abtitle,a.description as abdescription,b.zhuanjiazhicheng as bbzhuanjiazhicheng from dede_archives as a join
dede_addonarticlexueyin as b where a.id=b.aid and a.typeid=9 ORDER BY `a`.`id` ASC ";
$result=mysql_query($sql);
while($chouqu=mysql_fetch_array($result)){
$xiayigetupian="";
$idzuidazhi="";
$sql4="select max(id) as daid from dede_archives where typeid=9 ";
$result4=mysql_query($sql4);
while($chouqu4=mysql_fetch_array($result4)){
$idzuidazhi=$chouqu4[daid];
}
$idzuixiaozhi="";
$sql5="select min(id) as xiaoid from dede_archives where typeid=9";
$result5=mysql_query($sql5);
while($chouqu5=mysql_fetch_array($result5)){
$idzuixiaozhi=$chouqu5[xiaoid];
}
$diyigewenzhangtupian="";
$sql6="select * from dede_archives where typeid=9 and id={$idzuixiaozhi} ";
$result6=mysql_query($sql6);
while($chouqu6=mysql_fetch_array($result6)){
$diyigewenzhangtupian=$chouqu6[litpic];
}
$id=$chouqu[abid]+1;
$sfwk="";
for($xy=0;$xy<=$idzuidazhi;$xy++){
$sql3="select * from dede_archives where typeid=9 and id={$id}";
$result3=mysql_query($sql3);
while($chouqu3=mysql_fetch_array($result3)){$ceshi=$chouqu3[litpic];$sfwk=$chouqu3[litpic];}
if($sfwk!=""){$xiayigetupian=$sfwk;}
else if($id==$idzuidazhi+1){$xiayigetupian=$diyigewenzhangtupian;}
else{$id++;}
}
if($xiayigetupian!="")
{@me.='<li><div class="gzj_l"><img src="'.$chouqu[ablitpic].'" class="fl" width="69" height="90"><div class="fr"><h2>'.$chouqu[abtitle].'<span>'.$chouqu
[bbzhuanjiazhicheng].'</span></h2><p>'.substr($chouqu[abdescription],0,24).'...<a href"/uploads/plus/view.php?aid='.$chouqu[abid].'" target="_blank">【详细】</a></p><a
href="javascript:void(0)" onClick="openZoosUrl();return false;" class="zx_zx"><img src="/uploads/templets/default/shanghai/images/zxzx.png"></a></div></div><div
class="gzj_r"><img src="'.$xiayigetupian.'" width="69" height="90"></div></li>';
}
}
{/dede:daxiangmu}
现在我们来一一分析:
第一段代码:
{dede:daxiangmu runphp='yes'}
这是我们要使用php原代码的声明标签开始部分,有两个参数,第一个为标识名可自定义,第二个是一个布尔类型参数只有两个值yes代表我们要开启php原生代码的编写
$sql="select a.id as abid,a.litpic as ablitpic,a.title as abtitle,a.description as abdescription,b.zhuanjiazhicheng as bbzhuanjiazhicheng from dede_archives as a join dede_addonarticlexueyin as b where a.id=b.aid and a.typeid=9 ORDER BY `a`.`id` ASC ";
由于我们在模型中自定义的字段并没有和内容主表在一个数据表而是位于附加表中,所以我们需要用到mysql的多表联合查询,那么就可以将我们所需字段一起调用,当然下篇缩略图还得要靠其它方式。当我们需要调用下一篇文章的缩略图时只需要通过获取当前文章所在id然后通过id递增1就是下篇文章id,那么就可以调用出下篇文章的缩略图了。可是当某篇文章被删除后id并不能按照自然数从小往大排序,那么此逻辑便是空谈,所以该sql语句不仅要多表查询而且要按照id进行升序排序。
最后一句则是对上面sql执行
第二段代码:
我们将上一段代码中的sql执行后返回一个结果集,本段中将对结果集进行遍历输出,$xiayigetupian="";先声明一个空的变量(为了实现下一篇缩略图而声明)。下篇文章的缩略图进行调用时,若是最后一篇文章则没有下篇文章,那么就需要调用第一篇文章,那么如何才能够知道是否是最后一篇文章,接下来的语句实现了最后一篇文章所在id的获取
第三段:
上段中获取到了最后一篇文章所在id,当我们是最后一篇文章时要调用下篇文章缩略图就是第一篇文章的缩略图,那么如何获取第一篇文章缩略图,本段语句实现了第一篇文章所在id的获取
第四段:
上段中实现了第一篇文章id的获取,本段利用上段所获取的id来获取第一篇文章缩略图所在路径
第五段:
由于我们是使用id每次递增1的方法来实现对下篇缩略图的调用的,但有可能用户删除了某篇文章而数据库中的id并不能够自动整理id以自然数形式排序,那么我们获取的递增后的id很有可能在数据库中并没有其所对应的记录存在,那么下篇文章的缩略图肯定调用为空咯,既是如此,那么我们需要对其id递增后所得信息进行循环判断直到缩略图所在字段值不为空,我们就使用for循环进行判断。
第六段:
本段中实现了对上段中for循环里面的判断。当缩略图所在字段不为空才给之前我们第二段中的$xiayigetupian="";赋值。
终结段:
本段中就可以直接将我们之前所有段中处理后的数据进行调用了。
关键字词:二次开发,文章列表,调用,下篇文章缩略图