cms的使用場景(CMS文章籤收功能開發示例)
2023-04-20 04:21:00
CMS文章籤收功能開發示例功能需求說明:
1、 後臺添加文章時增加一個選項
文章籤收: 如需籤收時,選擇中相關用戶即可。
2、 前臺用戶登錄後,在文章頁面顯示
實現方案說明
文章籤收簡而言之就是給文章建一個籤收記錄表,這種功能點可以使用《模塊表單插件》來完成,籤收記錄相當於文章的子集內容。
開發步驟說明
第一步、後臺欄位創建和模塊表單的創建
1、安裝《模塊表單插件》
2、為文章news模塊,創建《籤收》的表單
3、為籤收表單,設置欄位,不需要的禁用掉
一般情況下自帶的title不需要了,開發者也可以根據實際情況來定。
4、進入文章news模塊管理 ,模塊內容自帶,創建欄位
籤收狀態欄位:根據需求創建籤收狀態欄位,來控制這個文章的狀態
籤收用戶欄位:需要指定哪些用戶來籤收這篇文字
籤收開關:控制這篇文章收費啟用籤收功能
本欄位啟用一下【條件聯動關聯】,然後不需要狀態時,隱藏下方欄位
需要狀態時,不勾選:
未選擇時,隱藏下方欄位
創建好的欄位如下:
5、切換到發布文章界面可以看到效果
第二步、程序設計部分
1、打開籤收表單的前端控制器文件:dayrui/App/News/Controllers/Qianshou.php
以下是開發好了的代碼,用於籤收動作的程序入庫記錄
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}立即籤收{/if} 編號 用戶組 籤收人 籤收時間 IP {php $i=1;} {loop $qianshou_data $q} {$i} {php $i ;$user=dr_member_info($q.id);} {loop $user.group $tt} 用戶組名稱:{$tt.group_name} {/loop} {$q.username} {if $q.qianshou} {dr_date($q.qianshou.inputtime)} {else} 未籤收 {/if} {if $q.qianshou} {$q.qianshou.inputip} {else} 未籤收 {/if} {/loop} {else}後臺沒用設置{/if}
2、例如在首頁寫一個籤收列表
標題 狀態 情況 籤收 {module module=news qianshou=2 cache=0} {php $uids=explode(',', $t.xqsyh);} {$t.title} {if $t.qszt} 完成 {else} 籤收中 {/if} 以籤收:{$t.qianshou_total} / 需籤收: {intval(substr_count($t.xqsyh, ',') 1)} {if $t.qszt} 無需籤收 {else} 立即籤收 {/if} {/loop} {$debug}