这里是普通文章模块栏目内容页
织梦系统中 @me 实现原理及其使用详细分析
相信很多朋友都遇到过织梦系统dedecms里面的 @me 了吧。
 
例如,在织梦模板list_article.htm里面,有这样一段使用@me的标签:
 
[field:array runphp='yes']@me = (empty(@me['litpic']) ? "" : "<a href='{@me['arcurl']}' class='preview'><img src='{@me['litpic']}'/></a>"); [/field:array]
复制代码
 
  这段代码是用在底层模板是{dede:list}...{/dede:list}之间的。
 
  这段底层模板的作用是:判断一下我们在后台发布的内容是不是有缩略图,如果没有的话缩略图就不会显示,否则,在调用处显示缩略图。
 
  这里面就使用了@me的功能,很多人遇到过但是,真正的理解的人可能不多,一般人都知道@me表示当前值,但是,真正的使用时就不知道如何使用,或是完全不知道做什么用的,一方面是因为织梦官方没有提供教程,另一方面是因为这个用的不多,但是,这个@me用好了,可以做很多事,而且,其实,设计原理也非常好,特别对于做织梦二次开发的或是自己写系统的都很有借鉴意义,有必要详细讲解一下这个@me实现原理及其使用。
 
  要把@me这个弄明白实现的原理以及它的使用,就要把这个相关的代码研究透彻,源码才是真正理解一个功能的最重要的参考。
 
  上面这段代码表示使用织梦提供的php接口,从runphp='yes'就可以可以上面这段代码表示运行php接口,如果不理解的话,请接着向下看,不用管什么接口,什么使用php接口,把下面我分析的内容弄明白了就理解了。
 
@me调用缩略图的实现原理:
 
  @me['litpic']表示调用织梦dedecms系统主表dede_archvies里面的字段litpic的值,主表如下图所示:
我们就以文章id为28的记录作为例子,后面在分析代码时我们就以这条数据为例子,并且,请注意这个主表中的每个字段。
 
  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']即可,不防测试一下。

 

上一篇: 织梦{dede:field name='array' }判断标签的用法介绍

下一篇: dedecms不能下载远程图片和资源

栏目索引
相关内容

深圳SEO优化公司晋中推广网站价格重庆设计公司网站哪家好宣城百度网站优化排名哪家好阿坝如何制作网站报价黄山SEO按天扣费资阳建站推荐朝阳网站设计模板推荐和田关键词排名包年推广公司石家庄网站优化多少钱坂田百姓网标王推广铁岭百度网站优化排名报价临猗百度竞价包年推广价格伊犁推广网站哪家好漳州设计网站临沧阿里店铺托管报价衡阳网站开发价格鄂州网站优化按天收费价格梅州网站制作推荐天津SEO按效果付费推荐贵港建站报价阜新设计公司网站多少钱白银网络广告推广多少钱坪山建站推荐木棉湾阿里店铺运营公司钦州SEO按天计费报价拉萨seo优化推荐上海seo优化推荐呼和浩特企业网站改版多少钱临沧百度标王报价营销型网站建设报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化