织梦Dedecms中万能标签loop不能输入URL的解决方法,7自定义图片字段调用方法
分类:微服架构

需要进行两个操作

本文实例讲述了织梦Dedecms中万能标签loop不能输入URL的解决方法。分享给大家供大家参考。具体分析如下:

步骤 1

正常情况下,在列表页(也就是 {dede:list}标签)调用附加的图片类型字段则会出现Fatal error: Call to a member function GetInnerText() on a non-object in /include/taglib/channel/img.lib.php”此类错误,解决方案如下:

第一步,修改include/extend.func.php文件,最下面插入函数,查询的是文章附加表,如需查询图片集什么的,改表名即可

万能标签loop是可以随意的在dedecms中调用任意表的数据标签了,所以叫万能标签但今天在使用loop时发现我们常用的arcurl为空了,意思就是url没有那就等于这个标签没有了,下面我就来给大家解决此问题吧.

includeextend.func.php 在最下面添加

打开/include/taglib/channel/img.lib.php文件并找到

function GetFirstImg($arcid){
global $dsql;
$query= "SELECT body FROM `dede_addonarticle` where aid='$arcid'";
$row = $dsql->GetOne($query);
$preg = "/<img.*?src=['"](.+?)['"].*?>/i";
preg_match_all($preg, $row['body'], $match);
//print_r($match);
return $match[1][0];
}

先看官方对于loop标签说明

/**

$innerTmp = $arcTag->GetInnerText();

第二部修改 调用标签include/taglib/arclist.lib.php

标签名称:loop

 *  自定义图片字段调用图片地址

将其修改为

织梦调用文章内容的时候需用用到litpic字段,需要重新构造此字段,找到 function lib_arclistDone()函数里面的 $row[litpic],增加 //调用文章第一张图片,非缩略图,如果为空,则调用缩略图。

功能说明:调用任意表的数据标签

 *

$innerTmp = ($arcTag=="") ? trim($arcTag) : trim($arcTag->GetInnerText());

if(GetFirstImg($row['id'])!="")
{
$row['litpic']=GetFirstImg($row['id']);
}

适用范围:全局标记

 * @access    public

这 样一来,附加的图片字段就可以正常调用了,不过调出来的并非纯粹的图片路径,而是包含li标签的一大段代码,这是因为调用附加图片字段时解析了系统模板里 面的channel_article_image.htm造成的,打开/templets/system /channel_article_image.htm可以看到如下内容:

写判断了是为了再调用文章无图的时候仍可以选择缩略图显示。 织梦v57 sp1大概在475行,$row[]数组的下面加入即可。

基本语法,代码如下:

 * @param     string  $fieldname   字段名

<li> <a href='[field:linkurl/]' target='_blank'><img src='[field:imgsrc/]' [field:imgwidth /] border='0'/></a> <br /> <a href='[field:linkurl/]' target='_blank'>[field:text /]</a> </li>

这样亦可以用原来的标签字段调用图片。文章有第一张图片即显示第一个图片,如无则调用文章缩略图

复制代码代码如下:{dede:loop table='dede_archives' sort='' row='4' if=''}
[field:title/]
{/dede:loop}
标签属性:

 * @param     string  $ftype    输出样式

将其修改为

table:查询表名

 * @return    string

[field:imgsrc/] 或者是在文章页调用的时候直接调用底层模板

{dede:field.字段名}       <a class="" href='[field:linkurl/]' target='_blank'><img src='[field:imgsrc/]' [field:imgwidth /] border='0'/></a> {/dede:field.字段名}

 

sort:用于排序的字段

 */

即可调用到纯粹的图片路径了。

row:返回结果的条数

if(!function_exists('GetImgUrl'))

另外要注意的是,如果{dede:list}里面无法取出附加字段,一般是因为dede_channeltype表中listfields字段中未添加附加字段名称造成的。

if:查询的条件

{

如果图片为空时,调用会显示“无图片信息!”,我们让他显示暂无图片,可以修改include/taglib/channel下面的img.lib.php

按照这样我写了一个简单的例子,代码如下:

function GetImgUrl($fieldname, $ftype = 1)

找到以下这句代码

复制代码代码如下:{dede:loop table='dede_archives' sort='' row='4' if=''}
[field:title/]
{/dede:loop}

{

return "无图片信息!";

//输出结果

if($fieldname != '')

替换成

你好dedecms
大家会注意到了href=''空了就没有url地址呀,这个标签所以对于我讲没用了,百度找到一个解决办法.

{

return "<a href='javascript:()'><img width='503' height='411' src='ultpic.gif'></a>";

1.打开Include/common.func.php,找到54行,再这里添加一个函数代码如下:

$dtp = new DedeTagParse();

当无图片时候就调用出来了暂无图片。

复制代码代码如下:function IDReturnURL($ID)
{
//lonely
global $dsql;
$query = "Select arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,
tp.defaultname,tp.namerule,tp.moresite,tp.siteurl,tp.sitepath
from dede_archives arc left join dede_arctype tp on arc.typeid=tp.id where arc.id = ".$ID;
$row = $dsql->GetOne($query);
$ReturnURL = GetFileUrl($row['id'],$row['typeid'],$row['senddate'],$row['title'],$row['ismake'],
$row['arcrank'],$row['namerule'],$row['typedir'],$row['money'],$row['filename'],$row['moresite'],$row['siteurl'],$row['sitepath']);
return $ReturnURL;
}

$dtp->LoadSource($fieldname);

** **

2.而在模板中我们的调用方式的写法也有所改变,代码如下:

if(is_array($dtp->CTags))

AiteCms,企业模板快速建站专家,点击了解更多

复制代码代码如下:{dede:loop table='dede_archives' sort='' row='4' if=''}

{

转载自织梦模板教程(www.dede58.com)

·[field:title function=cn_substrR(@me,44)/]/%5D)

foreach($dtp->CTags as $ctag)

{/dede:loop}
问题已经完美解决了,同样的当你要用自定义sql 标签的时候,也是一样的.

{

其实,就是用[field:id function=IDReturnURL(@me)/]代替了[field:arcurl/]标签,我解决此问题的核心就是[field:id function=IDReturnURL(@me)/]和IDReturnURL.

if($ctag->GetName() == 'img')

后来自己想想于是再接着找发现了一个arclist标签了,代码如下:

{

复制代码代码如下:{dede:arclist flag='h' typeid='' row='' col='' titlelen='' infolen='' imgwidth='' imgheight='' listtype='' orderby='' keyword='' limit='0,1'}
[field:title/]
{/dede:arclist}
这样我们可以直接使用如下代码:

$width = $ctag->GetAtt('width');

复制代码代码如下:{dede:arclist row='10' titlelen='24' orderby='pubdate' idlist='' col='2'}
•[field:textlink/]([field:pubdate function=MyDate('m-d',@me)/])

$height = $ctag->GetAtt('height');

{/dede:arclist}
即可解决了.

$imgurl = trim($ctag->GetInnerText());

希望本文所述对大家的dedecms建站有所帮助。

$img = '';

if($imgurl != '')

{

if($ftype == 1)

{

$img .= $imgurl;

}

else

{

$img .= '';

}

}

}

}

}

$dtp->Clear();

return $img;

}

}

}

步骤 2

打开templetssystemchannel_article_image.htm 清空所有东西,只留下

[field:imgsrc/]

步骤3

前台调用方法

[field:自定义字段名 /]  

以上方法有问题,亲测下面的方法有效。

做站过程中碰到这样一个问题,找到解决办法收藏分享:为什么在首页用自定义列表调用出来的图片字段不是正确的图片地址,而是类似于:

{dede:img text='' width='270' height='129'} /uploads/101017/1-10101H21F54P.gif {/dede:img} 这样的格式!

非常明显,这样是不能正确显示的,这是织梦自定义图片字段的处理方式造成的。要解决这个问题,我们必须得创建一个自定义函数,其实现方式为:

一、实现方法

1)创建自定义函数

打开 /include/extend.func.php 文件(注:这个文件就是系统预留的自定义函数接口文件,主要用于二次开发用的。如果你是老版本,默认没有这个文件,自己创建一个PHP文件即可),在最下面的?>上一行加入以下函数代码:

[html] view plain copy

function GetOneImgUrl($img,$ftype=1){     

if($img<> ''){     

$dtp = new DedeTagParse();     

$dtp->LoadSource($img);     

if(is_array($dtp->CTags)){     

foreach($dtp->CTags as $ctag){     

if($ctag->GetName()=='img'){     

$width = $ctag->GetAtt('width');     

$height = $ctag->GetAtt('height');     

$imgurl = trim($ctag->GetInnerText());     

$img = '';     

                    if($imgurl != ''){     

if($ftype==1){     

$img.= $imgurl;     

                        }     

                        else{     

$img.= '';     

                        }     

                    }     

                }     

            }     

        }     

$dtp->Clear();     

        return $img;         

    }     

}    

保存后关闭即可。

2)函数调用方法

问:我们创建好函数以后,那么这个函数要如何来调用呢?

答:本函数的调用方法为:

[field:自定义图片字段名 function="GetOneImgUrl(@me,显示类型)"/]

比如:我们的自定义图片字段名为 imgurl ,那么调用方式有以下两种:

[field:imgurl function='GetOneImgUrl(@me,0)'/] 标签)-->

[field:imgurl function='GetOneImgUrl(@me,1)'/] 

二、示例演示

1)模型字段添加

进入网站后台,点击[核心]——[内容模型管理],点击“普通文章”的“更改”按钮,进入编辑界面,切换到“字段管理”选项,点击“添加新字段”,如图:

图片 1

创建好字段以后,我们在增加或编辑文档时候,那么就会有这个字段了,如图:

图片 2

上传好你要显示的图片以后,保存即可。

2)前台调用

原本我们前台调用这个字段的方法,就是通过arclist标签的 channelid 与 addfields 两个参数来配合调用(点击查看arclist的标签详解),这里不再重复的一一熬述。但大体的自定义字段的方法是这样的:

{dede:arclist row='2' channeld='1' addfields='自定义字段1,自定义字段2'}  

 底层模板 insertext  

{/dede:arclist}  

运用到我们刚才的这个函数,调用方法为:

{dede:arclist row='5' orderby='id' channelid='1' addfields='imgurl'}      

[field:title/][field:imgurl function='GetOneImgUrl(@me,0)'/]

{/dede:arclist}   

或者使用sql语句查询:

{dede:arclist  typeid='~id~' flag = 'p'}  

[field:idrunphp="yes"]   

$row = $GLOBALS['dsql']->GetOne("Select img From `dede_addonimages` where aid=@me");   

@me = $row['img'];  

@me=GetOneImgUrl(@me,1);  

    [/field:id]  

{/dede:arclist}   

重要:

图片 3

本文由10bet手机官网发布于微服架构,转载请注明出处:织梦Dedecms中万能标签loop不能输入URL的解决方法,7自定义图片字段调用方法

上一篇:php实现微信公众号无限群发 下一篇:phpcms网站搬家教程与经验,所有档案列表为空的解决方法
猜你喜欢
热门排行
精彩图文