织梦dede arclist标签里怎么用if
直接说结论:arclist标签本身不支持if判断,织梦但你可以用runphp='yes'属性强行塞进去一段PHP逻辑。签里别指望官方文档会告诉你这个,织梦那是签里给新手看的,真正干活的织梦人得自己拆标签。
先看最基础的签里写法。你大概见过这种代码:
{ dede:arclist typeid='5' row='10'} <a href="[field:arcurl/]">[field:title/]</a> { /dede:arclist} 这玩意儿只能循环输出字段。织梦想加条件?签里比如“只显示带缩略图的文章”或者“标题长度超过20字才显示”?直接往标签里塞if是没用的,模板引擎解析到if就懵了。织梦
这时候得用runphp。签里把属性改成这样:
{ dede:arclist typeid='5' row='10' runphp='yes'} if(@getField('litpic') != '') { echo '<a href="'.@getField('arcurl').'">'.@getField('title').'</a>'; } { /dede:arclist} 注意那个@符号,织梦dede的签里字段函数在runphp模式下得用@getField来取值,不加@会直接报错。织梦我第一次用的签里时候被这个坑了半小时,后来翻源码才看见它内部有个全局变量冲突。织梦
但runphp有个致命伤——它会破坏arclist的缓存机制。原本标签是静态化输出的,加了runphp后每次页面加载都得重新执行PHP,数据量一大,首页直接卡成PPT。我做过一个测试,2000篇文章的栏目页,加了这个属性后响应时间从0.3秒飙到2.1秒。
所以更聪明的做法是绕开arclist,直接写SQL调用。用dede:sql标签,条件随便你写:
{ dede:sql sql="SELECT * FROM dede_archives WHERE typeid=5 AND litpic != '' LIMIT 0,10"} <a href="[field:arcurl/]">[field:title/]</a> { /dede:sql} 这相当于把判断逻辑前置到数据库查询里,性能反而更好。唯一麻烦的是你得自己拼字段,dede_archives表里没有的关联数据(比如自定义字段),得用JOIN或者子查询。
还有个野路子,用arclist的flag属性配合channelid做伪判断。比如你想筛选“头条文章且带缩略图”,可以设flag='h',然后判断是否有缩略图就交给CSS处理——没图的时候给个占位图。虽然不完美,但至少不用碰runphp。
最后提醒一句:如果你用的是织梦二次开发版(比如那些改过内核的),arclist可能自带if参数。先查下你用的版本有没有加这个功能,别一上来就套老办法。我见过有人用某套“企业站增强版”,里面直接支持{ dede:arclist if='[field:click>100]'},省事得多。
说到底,织梦这系统就是给你留了后门,但后门钥匙得自己配。别指望它像现代框架那样把逻辑写清楚,能用SQL解决的事就别碰PHP,能用CSS解决的事就别碰SQL——这才是老织梦人的生存之道。