往typecho插入文章之自定义字段用法及扩展

- 前言
上一篇文章typecho二次开发之使用python爬取数据并入库typecho的心得已经解决了关于怎么往typecho插入附属数据的问题,但是留了一个问题,即怎么插入自定义字段的问题。继而解决第二个问题,即:typecho的数据格式无法满足自身网站的要求怎么办?

当你post一批数据过来的时候,未必就对应于typecho数据库设计,更多的情况可能比它自身提供的字段要多得多,这个时候就需要引入自定义字段,好在typecho的设计里面是提供的,那么代码中如何体现呢?其实熟悉的朋友很熟悉,直接上代码:

$request->setParams(
        array(
            'title'=>$title,
            'text'=>$content),
            'fieldNames'=>array('name1',"name2","name3"),//typecho自定义字段名称
            'fieldTypes'=>array('str',"str","str"),//自定义字段变量类型,一般写str即可
            'fieldValues'=>array($name1,$name2,$name3),//具体的赋值,和上面顺序一一对应
            'cid'=>'',
            'do'=>'publish',
            'markdown'=>'0',
            'date'=>empty($date)?"":$date,
            'category'=>empty($mid)?"":array($mid),
            'tags'=>join(",", array_unique($tags_ids)),
            //'visibility'=>'hidden',
            'visibility'=>'publish',
            'password'=>'',
            'allowComment'=>'1',
            'allowPing'=>'1',
            'allowFeed'=>'1',
            'trackback'=>'',
        )
    );

上面注释的三个地方就是自定义字段的入库方式,和后台编辑界面的键值对一一对应。这么填以后,前端取出的语法是:$this->fields->name1();这里的name1就是存入的变量名,只要当前是上下文环境是文章类型,那么通过$this句柄获取,或者别的文章类型的句柄。

通过以上方式,理论上无论多少个字段都可以插入,形成丰富的自定义字段,从而扩展typecho的定制能力。

- 扩展

上面的解决方案似乎已经满足了大部分的需求,但是如果自定义的字段过多势必难以管理,或者有的内容需要统一入库到typecho_contents 这个表里面,而且显然通过增加表的字段不符合typecho无缝扩展的设计理念。

那么有没有一种折中的办法呢?笔者想到的一种办法可能是其中一种不错的办法,即往typecho中的text字段存入json数据,json中包含各种各样的丰富字段。前端可以通过$this->text的办法获取全文数据,然后反序列化得到自己想要的字段然后呈现到页面上。

代码如下:

<?php        
      $str =($this->text);
      $this->array_temp = json_decode($str,true);
      echo $this->array_temp['node'];
 ?>

node既然入库时的节点,其实在php语言中,反序列化后得到的是一个树结构的数据类型(不过又有map特点),所以可以直接用node字段名来访问。

json是一种很轻量级的数据格式,所以不会对存储造成多大的影响。json格式的数据负责存储大量复杂的数据,结合fields方式来存储一些常用标识类型,从而达到了typecho自定义的最大化。也大大满足了各种数据类型的需求,扩展typecho的数据格式毫无压力,增大了存储元素的想象空间。

比如:存储一棵树结构的数据,还有诸如此类的非线性的数据结构都能够得到解决。

不过毕竟不是typecho原生支持的,使用起来需要技巧来避免一些坑,这些技巧将在下一篇文章中给出。

--------------------------天使漫步(一个typecho粉丝)


版权声明:未经书面授权禁止转载、摘编、复制或建立镜像。对既成事实本站将保留所有的权利。