从 Typecho 自定义字段的调用代码看去

千呼万唤,Typecho 的“自定义字段”功能终于在 0.9 中出来了。然而,多数人还蒙在这样一个鼓里——该怎么在模板调用已经设置好的自定义字段呢?

让我们从这里开始说下去。

Typecho 文档真残缺

在这里我必须吐槽 Typecho 文档的残缺。

当我想得到在模板中调用自定义字段的代码时,我在文档中搜索“自定义字段”,果然得到了一个页面——“自定义字段使用”!然而当我点击去时,什么也没有,源代码里也看不到什么东西。这是让我们自己从 Typecho 程序源代码里查看调用方式的节奏么?

看起来我们不应该把 Typecho 的文档看得那么重要。

代码是多么简洁

还好,除了上面一个方法外,我还可以从一些已经用到这功能的模板中寻找相关代码。等等,为什么不在论坛里搜搜看呢?即便那论坛的搜索也很烂!最终,我成功得到了以下内容(在这儿——

首先,你得在写文章的时候输入创建一个自定义字段,然后在模板里像以下这样输出该字段。
<?php if (isset($this->fields->fieldName)): ?><?php $this->fields->fieldName(); ?><?php endif; ?>

让我们抛弃刚刚的情绪,看看这如诗的代码吧。

一个对 PHP 有点基础、会揣摩的人都会读得懂这是什么意思:当某个自定义字段被定义好时,就输出它!但我们能不能更深入地去了解一下这行代码呢?当然能!

首先我们看到,这里在条件语句中运用了一个 isset 函数。没错,这增加了代码的容错性,使其更严谨。但是你若是对这个函数有进一步的思考的话,你会发现 isset() 是用于且只能用于变量的,而变量就是用那个括号括起来的;由此我们可以得到结论,$this-&gt;fields-&gt;fieldName 是可以看作变量的,也就是说它可以用来赋值给别的变量的。而后面接着带括弧的那个 $this->fields->fieldName(); 则用来直接输出自定义字段的值,相当于 echo $this->fields->fieldName;。

那整行代码真的没什么能挑剔的地方,还显得优美。唯一的不足可能是,有同学不知道该在哪儿对应上自定义字段的名称;但是英语好或者大胆的同学用字段名替换 fieldName 试试后,就会享受到成功的喜悦了。

带括弧与不带括弧!

有没有发现一个问题?像 $this-&gt;fields-&gt;fieldName() 这样一行直接输出内容的“函数”,去掉括弧后,就成了一个“变量”!我们可以假设其他具有相同形式的代码也遵循这个结论。当我们用 $this->options->title()、$this->author->permalink() 等代码测试后,发现结果和我们的假设符合得很好。

于是我们得到 Typecho 模板制作中的一个新技巧了!

结束语

正文内容就这样结束啦。

这篇文章主要面向的是初学者,我希望能借以促进他们探索精神、观察能力和举一反三思维的培养(虽然我不一定也具有);所以高手们勿喷啦。

若无特别说明,本文系原创,遵循 署名-非商业性使用 3.0 (CC BY-NC 3.0) 协议,转载文章请注明来自【闪星空间】,或链接上原文地址:http://shansing.com/read/331/

14 条评论

  1. 这不是Method吗 - -

    1. 其实类的方法同函数差不多啦,有很多联系之处的——好吧,没看到我在文章中打了引号么?

  2. 学习一下!

  3. 还是不懂。能举个具体的例子吗?

    1. ……不懂没关系、

    2. 这篇文章是记录了我的一些新收获。主要就是 $this->fields->fieldName();$this->fields->fieldName 的区别和联系,其中 $this->fields->fieldName(); 可以看作 echo $this->fields->fieldName;;再以此类推过去,有些其他的类似形式的东西也存在这种关系。

      如果只是要调出自定义字段就按照文中这行代码写就行了:

      <?php if (isset($this->fields->fieldName)): ?><?php $this->fields->fieldName(); ?><?php endif; ?>
      

      把“fieldName”改为字段的名称。

  4. Era Era

    请问大神,typecho 有没有现成的入库函数?

    1. 我不是大神……比如我就不知道这个问题的答案……

      1. Era Era

        呵呵,看你都是用tp,主题也很酷,应该很熟悉。

        1. 不知道你说的“入库函数”是什么哦……或许可以看源代码去写……

  5. idken idken

    文章写得非常适合我这种小白用户哈,感谢.

    PS:可否请教一下,我想通过自定义字段 调用 某两个 分类目录,需要怎么写啊. 搞了几天上手不能啊.求大神支招.

    1. 哈?调用目录?具体些?

  6. [...]原文地址:http://shansing.com/read/331/[...]

  7. 原来这样啊,明天我试试看!!

发表评论»

NO SPAMS! 不要发垃圾评论哦!

表情