织梦if判断有无图片显示不同样式

列表页与首页区块常需要"有图文章显示图文卡片、无图文章显示纯文字列表"的差异化排版,避免无图时出现空白占位或默认碎图。本文给出织梦判断 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 字段:无图的统一置空,远程图统一下载本地,前端判断逻辑会简化很多。