litpic字段对应的值就是我们在后台添加文章时添加的,如下图所示:
为什么用@me['arcurl']能够调用出织梦主表dede_archvies里面对应的字段litpic的字段值,即缩略图呢?织梦是如何实现的?
从这里面可以看出@me就像一个数组,在这个数组里面包含了主表dede_archives里面的字段值,类似 array('litpic'=>'/dedecms/uploads/170411/1-1F41111394Q57.png','id'=>"92",'typeid'=>2,.....),真的是这样吗?
如果@me真的如上面所分析的应当是一个包含主表中字段的数组的话,如果真是这样的话,那我要调用id为28的文章对对应的栏目typeid的值,是不是只需要这样调用@me['typeid']就可以获取到值为2了,如果真这样的话,那太历害了,主表中的字段我就可以完全自由调用。
这非常类似php里面的一个数组的调用,例如,$arr = array('a' => 1,'b'=>3,'c'=>4 ),我想调用数组中的b的值,只需要这样调用 $arr['b'] 即可获取到键b对应的值为3。
真的如上面所分析的@me就是一个包含主表中字面的数组吗? 请看下面的分析。
我们知道织梦生成html代码是通过织梦的模板引擎来实现的,也就是由/include/dedetag.class.php静态模板引擎来实现的。
那上面这段代码:
[field:array runphp='yes']@me = (empty(@me['litpic']) ? "" : "<a href='{@me['arcurl']}' class='preview'><img src='{@me['litpic']}'/></a>"); [/field:array]
复制代码
也是由文件dedetag.class.php来处理的,在这个文件里面找到这样一个函数:RunPHP(&$refObj, $i)
函数RunPHP(&$refObj, $i)的作用就是解释上面的这段代码。
function RunPHP(&$refObj, $i)
{
$DedeMeValue = $phpcode = '';
if($refObj->GetAtt('source')=='value')
{
$phpcode = $this->CTags[$i]->TagValue;
}
else
{
$DedeMeValue = $this->CTags[$i]->TagValue;
$phpcode = $refObj->GetInnerText();
}
$phpcode = preg_replace("/'@me'|"@me"|@me/i", '$DedeMeValue', $phpcode);
.......
$this->CTags[$i]->TagValue = $DedeMeValue;
$this->CTags[$i]->IsReplace = TRUE;
}
在这个函数里面一般都是执行else里面的代码,即:
$DedeMeValue = $this->CTags[$i]->TagValue;
$phpcode = $refObj->GetInnerText();
复制代码
我们来分析一下这两行是做什么的。
$this->CTags[$i]->TagValue:这行代码表示获取当前id(假设以文章id值为28作为例子)为28的文章对应主表里面的字段键值对,也就是一个如下所示的数组$DedeMeValue:
array (
'id' => string '92' (length=2)
'typeid' => string '2' (length=1)
'typeid2' => string '0' (length=1)
'sortrank' => string '1491881978' (length=10)
'flag' => string 'p' (length=1)
'ismake' => string '0' (length=1)
'channel' => string '1' (length=1)
'arcrank' => string '0' (length=1)
'click' => string '170' (length=3)
'money' => string '0' (length=1)
'title' => string 'DedeCMS V5.6 开发日志及新建议提交贴' (length=46)
'shorttitle' => string '' (length=0)
'color' => string '' (length=0)
'writer' => string '织梦官方' (length=12)
'source' => string '织梦官方' (length=12)
<font color="Red"><b>'litpic' => string '/dedecms/uploads/170411/1-1F41111394Q57.png'</b></font>
'pubdate' => string '1491881978' (length=10)
'senddate' => string '1270623040' (length=10)
'mid' => string '1' (length=1)
'keywords' => string '建议,提交,贴,新,日志,V5.6,开发,DedeCMS,' (length=49)
'lastpost' => string '0' (length=1)
'scores' => string '0' (length=1)
'goodpost' => string '0' (length=1)
'badpost' => string '0' (length=1)
'voteid' => string '0' (length=1)
'notpost' => string '0' (length=1)
'description' => string '说明: ■为已经升级或修正的功能 □表示需多处同时处理的复杂功能或待验证功能 [新增] ■ 1.搜索关键词批量管理功能; □ 2.会员中心更换全新UI界面,让用户中心更亲切方便; ■ 2.1 会员中心增' (length=255)
'filename' => string '/dedecms/a/webbase/html/2010/0407/92.html' (length=41)
'dutyadmin' => string '1' (length=1)
'tackid' => string '0' (length=1)
'mtype' => string '0' (length=1)
'weight' => string '90' (length=2)
'typedir' => string '{cmspath}/a/webbase/html' (length=24)
'typename' => string 'HTML' (length=4)
'corank' => string '0' (length=1)
'isdefault' => string '1' (length=1)
'defaultname' => string 'index.html' (length=10)
'namerule' => string '{typedir}/{Y}/{M}{D}/{aid}.html' (length=31)
'namerule2' => string '{typedir}/list_{tid}_{page}.html' (length=32)
'ispart' => string '0' (length=1)
'moresite' => string '0' (length=1)
'siteurl' => string '' (length=0)
'sitepath' => string '{cmspath}/a/webbase' (length=19)
'infos' => string '说明: ■为已经升级或修正的功能 □表示需多处同时处理的复杂功能或待验证功能 [新增] ■ 1.搜索关键词批量管理功能; □ 2.会员中心更换全新UI界面,让用户中心更亲切方便; ■ 2.1 会员中心增' (length=255)
'arcurl' => string '/dedecms/a/webbase/html/2010/0407/92.html' (length=41)
'typeurl' => string '/dedecms/a/webbase/html/' (length=24)
'picname' => string '/dedecms/uploads/170411/1-1F41111394Q57.png' (length=43)
'stime' => string '2017-04-11' (length=10)
'typelink' => string '<a href='/dedecms/a/webbase/html/'>HTML</a>' (length=43)
'image' => string '<img src='/dedecms/uploads/170411/1-1F41111394Q57.png' border='0' width='120' height='120' alt='DedeCMS V5.6 开发日志及新建议提交贴'>' (length=144)
'imglink' => string '<a href='/dedecms/a/webbase/html/2010/0407/92.html'><img src='/dedecms/uploads/170411/1-1F41111394Q57.png' border='0' width='120' height='120' alt='DedeCMS V5.6 开发日志及新建议提交贴'></a>' (length=200)
'fulltitle' => string 'DedeCMS V5.6 开发日志及新建议提交贴' (length=46)
'textlink' => string '<a href='/dedecms/a/webbase/html/2010/0407/92.html'>DedeCMS V5.6 开发日志及新建议提交贴</a>' (length=102)
'phpurl' => string '/dedecms/plus' (length=13)
'plusurl' => string '/dedecms/plus' (length=13)
'memberurl' => string '/dedecms/member' (length=15)
'templeturl' => string '/dedecms/templets' (length=17)
)
复制代码
$refObj->GetInnerText():表示获取底层模板[field:array runphp='yes']和[/field:array]之间的内容,
也就是获取的内容是:@me = (empty(@me['litpic']) ? "" : "<a href='{@me['arcurl']}' class='preview'><img src='{@me['litpic']}'/></a>");
把这行内容赋给$phpcode。
通过替换函数str_replace,即preg_replace("/'@me'|"@me"|@me/i", '$DedeMeValue', $phpcode)进行替换。
因为,$DedeMeValue是上面列出id为28的数组,通过上面的替换函数,把@me全部替换为$DedeMeValue。
替换后的结果:
$DedeMeValue = (empty($DedeMeValue['litpic']) ? "" : "<a href='{$DedeMeValue['arcurl']}' class='preview'><img src='{$DedeMeValue['litpic']}'/></a>");
复制代码
$DedeMeValue['litpic']结果是什么,这不正是后台添加到主表中的缩略图,即主表中litpic对应的值:/dedecms/uploads/170411/1-1F41111394Q57.png
所以底层模板中empty(@me['litpic'])意思是判断一下缩略图是否为空,若不为空则调出一个缩略图来。
通过上面的分析可以知道,那如果我想调用id=28对应的栏目id只需要使用 @me['typeid']即可,不防测试一下。