CMS文章签收功能开发示例

功能需求说明:

1、 后台添加文章时增加一个选项

cms的使用场景(CMS文章签收功能开发示例)(1)

文章签收: 如需签收时,选择中相关用户即可。

2、 前台用户登录后,在文章页面显示

cms的使用场景(CMS文章签收功能开发示例)(2)

实现方案说明

文章签收简而言之就是给文章建一个签收记录表,这种功能点可以使用《模块表单插件》来完成,签收记录相当于文章的子集内容。

开发步骤说明


第一步、后台字段创建和模块表单的创建

1、安装《模块表单插件》

cms的使用场景(CMS文章签收功能开发示例)(3)

2、为文章news模块,创建《签收》的表单

cms的使用场景(CMS文章签收功能开发示例)(4)

3、为签收表单,设置字段,不需要的禁用掉

cms的使用场景(CMS文章签收功能开发示例)(5)

一般情况下自带的title不需要了,开发者也可以根据实际情况来定。

4、进入文章news模块管理 ,模块内容自带,创建字段

cms的使用场景(CMS文章签收功能开发示例)(6)

签收状态字段:根据需求创建签收状态字段,来控制这个文章的状态

cms的使用场景(CMS文章签收功能开发示例)(7)

签收用户字段:需要指定哪些用户来签收这篇文字

cms的使用场景(CMS文章签收功能开发示例)(8)

签收开关:控制这篇文章收费启用签收功能

cms的使用场景(CMS文章签收功能开发示例)(9)

本字段启用一下【条件联动关联】,然后不需要状态时,隐藏下方字段

cms的使用场景(CMS文章签收功能开发示例)(10)

需要状态时,不勾选:

cms的使用场景(CMS文章签收功能开发示例)(11)

未选择时,隐藏下方字段

cms的使用场景(CMS文章签收功能开发示例)(12)

创建好的字段如下:

cms的使用场景(CMS文章签收功能开发示例)(13)

5、切换到发布文章界面可以看到效果

cms的使用场景(CMS文章签收功能开发示例)(14)

第二步、程序设计部分


1、打开签收表单的前端控制器文件:dayrui/App/News/Controllers/Qianshou.php

以下是开发好了的代码,用于签收动作的程序入库记录

<?php namespace Phpcmf\Controllers; /** * 二次开发时可以修改本文件,不影响升级覆盖 */ class Qianshou extends \Phpcmf\Home\Mform { public function index() { // 获取父级内容 $this->cid = intval(\Phpcmf\Service::L('input')->get('cid')); $this->index = $this->_Module_Row($this->cid); if (!$this->index) { exit($this->_msg(0, dr_lang('模块内容【id#%s】不存在', $this->cid))); } if (!$this->index['xqsyh']) { $this->_json(0, '没有设置签收人员'); } $uids = explode(',', $this->index['xqsyh']); if (!dr_in_array($this->uid, $uids)) { $this->_json(0, '你没有签收权限'); } $table = dr_module_table_prefix(APP_DIR).'_form_'.$this->form['table']; if (\Phpcmf\Service::M()->table($table)->where('cid', $this->index['id'])->where('uid', $this->uid)->counts()) { $this->_json(0, '你已经签收了'); } $data = []; $data['title'] = ''; $data['status'] = 1; $data['catid'] = $this->index['catid']; // 栏目id $data['cid'] = $this->index['id']; // 内容id $data['uid'] = (int)$this->member['uid']; $data['author'] = $this->member['username']; $data['inputip'] = \Phpcmf\Service::L('input')->ip_address(); $data['inputtime'] = SYS_TIME; $data['tableid'] = 0; $data['displayorder'] = 0; // 插入主表 $rt = \Phpcmf\Service::M()->table($table)->insert($data); if (!$rt['code']) { $this->_json(0, '系统故障签收失败'); } $total = \Phpcmf\Service::M()->table($table)->where('status', 1)->where('cid', $data['cid'])->counts(); \Phpcmf\Service::M()->table_site('news')->update($data['cid'], [ 'qianshou_total' => $total, 'qszt' => count($uids) == $total ? 1 : 0, ]); $this->_json(1, '签收成功'); } }

2、新建news模块内容模型文件:dayrui/App/News/Models/Content.php

用于在内容页输出哪些用户具有签收权限和是否被签收。

<?php namespace Phpcmf\Model\News; // 模块内容模型类 class Content extends \Phpcmf\Model\Content { // 格式化显示内容,用于前端内容详情页面的格式化 public function _call_show($data) { $rt = []; if ($data['qianshou'] == 2 && $data['xqsyh']) { $users = $this->table('member')->where_in('id', explode(',', $data['xqsyh']))->getAll(); if ($users) { foreach ($users as $r) { $r['uid'] = $r['id']; $r['qianshou'] = $this->table_site('news_form_qianshou')->where('uid', $r['id'])->where('cid', $data['id'])->getRow(); $rt[] = $r; } } } else { $data['qianshou'] = 0; } $data['qianshou_data'] = $rt; return $data; } }

第三步、模板显示部分


1、template/pc/default/home/news/show.html,加上签收代码

{if $qianshou} {if $member && $qianshou_data[$member.uid]['qianshou']} 已经签收 {else} <a href="javascript:dr_ajax_url('/index.php?s=news&c=qianshou&cid={$id}');">立即签收</a> {/if} <table border=1 width="100%"> <tr> <td>编号</td> <td>用户组</td> <td>签收人</td> <td>签收时间</td> <td>IP</td> </tr> {php $i=1;} {loop $qianshou_data $q} <tr> <td>{$i}</td> <td> {php $i ;$user=dr_member_info($q.id);} {loop $user.group $tt} 用户组名称:{$tt.group_name} {/loop} </td> <td>{$q.username}</td> <td>{if $q.qianshou} {dr_date($q.qianshou.inputtime)} {else} 未签收 {/if}</td> <td>{if $q.qianshou} {$q.qianshou.inputip} {else} 未签收 {/if}</td> </tr> {/loop} </table> {else} 后台没用设置 {/if}

cms的使用场景(CMS文章签收功能开发示例)(15)

2、例如在首页写一个签收列表

<table border=1 width="100%"> <tr> <td>标题</td> <td>状态</td> <td>情况</td> <td>签收</td> </tr> {module module=news qianshou=2 cache=0} {php $uids=explode(',', $t.xqsyh);} <tr> <td>{$t.title}</td> <td>{if $t.qszt} 完成 {else} 签收中 {/if}</td> <td>以签收:{$t.qianshou_total} / 需签收: {intval(substr_count($t.xqsyh, ',') 1)}</td> <td> {if $t.qszt} 无需签收 {else} <a href="javascript:dr_ajax_url('/index.php?s=news&c=qianshou&cid={$t.id}');">立即签收</a> {/if} </td> </tr> {/loop} {$debug} </table>

cms的使用场景(CMS文章签收功能开发示例)(16)

,