列表页与首页区块常需要"有图文章显示图文卡片、无图文章显示纯文字列表"的差异化排版,避免无图时出现空白占位或默认碎图。本文给出织梦判断 litpic 字段有无图片并输出不同样式的几种写法。
一、litpic 字段的几种状态
状态 1:有缩略图 /uploads/allimg/2024/01/xxx.jpg 状态 2:无图 (空字符串) 状态 3:默认占位图 /images/defaultpic.gif
判断时需要同时处理"空"和"默认占位图"两种无图情况,否则会显示织梦默认碎图。
二、写法一:runphp 判断 litpic 字段
[field:array runphp='yes']
if(@me['litpic']=='' || @me['litpic']=='/images/defaultpic.gif'){
// 无图样式
@me='<div class="item-text">
<h3><a href="'.@me['arcurl'].'">'.@me['title'].'</a></h3>
<p>'.@me['description'].'</p>
</div>';
} else {
// 有图样式
@me='<div class="item-pic">
<a href="'.@me['arcurl'].'">
<img src="'.@me['litpic'].'" alt="'.@me['title'].'">
</a>
<h3><a href="'.@me['arcurl'].'">'.@me['title'].'</a></h3>
<p>'.@me['description'].'</p>
</div>';
}
[/field:array]
用 array 而非单字段:因为要同时用到 litpic、arcurl、title、description 多个字段,必须用 [field:array] 一次性访问。单字段 runphp 无法跨字段取值。
三、写法二:function 判断
[field:litpic runphp='yes']
if(@me=='' || @me=='/images/defaultpic.gif'){
@me=''; // 无图输出空
} else {
@me='<img src="'.@me.'" alt="图片">';
}
[/field:litpic]
这种写法只控制 img 标签输出,外层结构保持一致,靠 CSS 控制有无图时的布局差异。
四、写法三:自定义函数(推荐)
把判断逻辑封装到 /include/extend.func.php:
function GetFirstPic($litpic, $title=''){
if($litpic=='' || $litpic=='/images/defaultpic.gif'){
return '<div class="no-pic">无图</div>';
} else {
return '<img src="'.$litpic.'" alt="'.$title.'">';
}
}
模板中调用:
[field:litpic function="GetFirstPic(@me,'[field:title/]')"/]
注意引号嵌套:模板里调用 function 时,参数里的 [field:title/] 会被替换为标题文本,如果标题含单引号会导致语法错误。建议标题先用 function="HtmlReplace(@me)" 过滤特殊字符。
五、写法四:CSS 隐藏法(最简单)
无图时 litpic 输出空 src,用 CSS 隐藏空 img:
<img src="[field:litpic/]" onerror="this.style.display='none'">
或用 CSS 判断(img[src=''] 会匹配空 src):
img[src=''], img[src='/images/defaultpic.gif']{
display:none;
}
优缺点:CSS 隐藏法最简单,但 HTML 结构不变,无法实现"无图时换成纯文字大版式"。需要布局变化时仍需用 runphp。
六、完整列表页示例
<div class="article-list">
{dede:list pagesize='10'}
[field:array runphp='yes']
$hasPic=(@me['litpic']!='' && @me['litpic']!='/images/defaultpic.gif');
if($hasPic){
@me='<article class="item has-pic">
<a href="'.@me['arcurl'].'" class="thumb">
<img src="'.@me['litpic'].'" alt="'.@me['title'].'">
</a>
<div class="info">
<h2><a href="'.@me['arcurl'].'">'.@me['title'].'</a></h2>
<p>'.cn_substr(Html2Text(@me['description']),120).'</p>
<span>'.MyDate('Y-m-d',@me['pubdate']).'</span>
</div>
</article>';
} else {
@me='<article class="item text-only">
<h2><a href="'.@me['arcurl'].'">'.@me['title'].'</a></h2>
<p>'.cn_substr(Html2Text(@me['description']),160).'</p>
<span>'.MyDate('Y-m-d',@me['pubdate']).'</span>
</article>';
}
[/field:array]
{/dede:list}
</div>
配套 CSS
.item{display:flex;gap:15px;padding:15px 0;border-bottom:1px solid #eee}
.item.has-pic .thumb{flex:0 0 200px}
.item.has-pic .info{flex:1}
.item.text-only{flex-direction:column}
.item.text-only h2{font-size:18px}
七、注意事项
defaultpic.gif 也要判断:仅判断空字符串不够,织梦在没图时会自动填入 /images/defaultpic.gif,必须把这个路径一并视为"无图",否则会显示一张系统默认碎图。
远程图片判断:litpic 可能是远程 URL(采集文章)。判断远程图是否存在需用 get_headers(),但每次请求都检测会拖慢页面,建议采集时统一下载到本地。
HTML 转义注意:用 array 拼接 HTML 时,title、description 里的引号、尖括号会破坏字符串。建议输出前用 htmlspecialchars() 或织梦自带的 HtmlReplace() 过滤。
多图字段判断:如果是图片集模型(imgurls 字段),判断逻辑不同,需用 {dede:field name='imgurls'} 解析后判断数量。
八、应用建议
"有图显图、无图显文"是列表页体验的基础优化,建议把判断逻辑封装为自定义函数 GetItemHtml($row),传入整行数据返回完整 HTML,模板里只写 [field:array function="GetItemHtml(@me)"/],既清晰又便于复用。CSS 层面把 .has-pic 与 .text-only 两套布局写好,PHP 只输出 class 名,结构清晰。对于采集站,建议在入库阶段就清洗 litpic 字段:无图的统一置空,远程图统一下载本地,前端判断逻辑会简化很多。