typecho实现文章增加表单,具体操作

最近也在接触一两个工作量巨大的typecho二次开发,虽然这导致我的时间越来越紧,人也越来越累,但是却也发现了很多原来没试过的玩法,一方面也是感受到了typecho的简单与它极强的扩展性。总之,typecho的模式是真的太给力了,而且我认为有些东西还是得整理一下,以后肯定会有巨大的参考价值。
timg (1).jpg
教程开始

1.前期准备,想好自己要添加怎样的字段和表单类型,比如我想添加一个select表单,额外显示文章的状态,字段名称state,字段类型为int。
那么,打开phpmyadmin,首先在数据中新建名为state的字段,类型为int,允许为空,默认值为0
Snap.jpg

然后,准备好html代码,按照typecho原有的格式,

<section class="typecho-post-option">
    <label for="token-input-tags" class="typecho-label"><?php _e('审核状态'); ?></label>
    <p>
    <select id="state" name="state">
        <option value="0" >审核中</option>
        <option value="1" >不通过</option>
        <option value="2" >审核通过?></option>
        <option value="3" >已结算</option>
    </select>
    </p>
</section>

2.接下来,就要开始修改Widget文件。
首先是要让表单的提交接收一个新的参数,具体的文件在/var/Widget/Contents/Post/Edit.php
找到大概719行的位置,将如下代码:

$contents = $this->request->from('password', 'allowComment',
            'allowPing', 'allowFeed', 'slug', 'tags', 'text', 'visibility');

修改为

$contents = $this->request->from('password', 'allowComment',
            'allowPing', 'allowFeed', 'slug', 'tags', 'text', 'visibility', 'state');

控制文章增删改查的文件是/var/Widget/Abstract/Contents.php
大概257行,将原本的代码

return $this->db->select('table.contents.cid', 'table.contents.title', 'table.contents.slug', 'table.contents.created', 'table.contents.authorId',
        'table.contents.modified', 'table.contents.type', 'table.contents.status', 'table.contents.text', 'table.contents.commentsNum', 'table.contents.order',
        'table.contents.template', 'table.contents.password', 'table.contents.allowComment', 'table.contents.allowPing', 'table.contents.allowFeed',
        'table.contents.parent')->from('table.contents');

修改为

return $this->db->select('table.contents.cid', 'table.contents.title', 'table.contents.slug', 'table.contents.created', 'table.contents.authorId',
        'table.contents.modified', 'table.contents.type', 'table.contents.status', 'table.contents.text', 'table.contents.commentsNum', 'table.contents.order',
        'table.contents.template', 'table.contents.password', 'table.contents.allowComment', 'table.contents.allowPing', 'table.contents.allowFeed',
        'table.contents.parent','table.contents.state')->from('table.contents');

大概288行,插入内容字段定义的地方,增加如下代码(记得给前面的加上逗号,防止代码报错)

'state'        =>  empty($content['state']) ? 0 : intval($content['state'])

大概333行,更新内容字段定义的地方,增加如下代码

'state'        =>  empty($content['state']) ? 0 : intval($content['state'])

3.完成字段定义后,就可以将html放进文章的发布文件了。

不过在这之前要修改一下,比如改为如下:

<section class="typecho-post-option">
    <label for="token-input-tags" class="typecho-label"><?php _e('审核状态'); ?></label>
    <p>
    <select id="state" name="state">
        <option value="0" <?php if ($post->state == 0): ?> selected<?php endif; ?>><?php _e('审核中'); ?></option>
        <option value="1" <?php if ($post->state == 1): ?> selected<?php endif; ?>><?php _e('不通过'); ?></option>
        <option value="2" <?php if ($post->state == 2): ?> selected<?php endif; ?>><?php _e('审核通过'); ?></option>
        <option value="3" <?php if ($post->state == 3): ?> selected<?php endif; ?>><?php _e('已结算'); ?></option>
    </select>
    </p>
</section>

因为我要的是select表单,所以要根据$post->state的值来判断是否选择,那么其实如果要在其它地方将值调用出来,或者就是子级要用其它表单来调用值,用以下代码就好了

<?php $post->state(); ?>

保存之后,测试发布以下,确认没有报错,并且可以调出选中的select,就代表增加成了。
Snap1.jpg

这个实现在二次开发中有很大的好处,比如让文章拥有更多类型,新增更多定义,让扩展性更强。

规则之树版权所有,转载请注明来源,标明作者及原文链接

发表评论
加载中...

相关文章