[PC]PHPCMS二次开发指南(上)

news/2024/7/1 20:39:29

-------------------------------------------------------------------------------------

PHPCMS本身功能已经很完善,自带的模块可用可不用,松耦合特性使其非常适合企业的二次开发。

PC的默认路由在 phpcms/caches/configs/route.php 中定义,为content模块下index控制器的init方法

 

一. PC所有模块都在module目录下,与数据表名字相同;

  module目录中文件就是控制器,控制器名与文件名相同;

  前台控制器如index.php无须继承任何类,用于前台操作;

  后台控制器一般需要继承admin模块的admin类,一旦继承admin就需要权限验证(也可以不继承)。

 

二. 总结开发后台模块的步骤:

  1. 后台访问扩展的模块:

    扩展 - 菜单管理 - 添加菜单 - 上级:作为一级菜单(模块名,文件名,方法名)

            添加子菜单 - 上级:某个一级菜单(填不存在的模块名,填不存在的文件名,填不存在的方法名)

    扩展模块后,需要在v9_module中注册模块,插入此数据!(也即安装)

  

  2. 创建数据表:

create table v9_link(
    .........
)engine=myisam default charset='utf8';

  

  3. 建立后台的数据模型

<?php
defined('IN_PHPCMS') or exit('No permiss resources.'); pc_base::load_sys_class('model', '', 0); class link_model extends model { function __construct() { $this->db_config = pc_base::load_config('database'); $htis->db_setting = 'default'; $this->table_name = 'link'; parent::__construct(); } } /** * 几点注意: * 1. PC的数据模型基本是鸡肋,只是指定了数据库设置和对应的表名,非彻底的MVC,直接复制一份修改即可。 * 2. 此模型一般在控制器构造方法调用。
* 3. load_sys_class第三个参数为是否初始化,0表示只引入系统类,返回真假;1表示返回指定系统类的实例对象
* <Farwish.com>
*/

 

  4. 建立后台控制器: 

<?php
    /**
     * 后台友情链接,完整CURD
     */
    defined('IN_PHPCMS') or exit('No permission resources.');

    pc_base::load_app_class('admin', 'admin', 0);

    class link extends admin {
        private $db, $admin_db;
        public $siteid;
        function __construct() {
            parent::__construct();
            $this->M = new_html_special_chars(getcache('link', 'commons'));
            $this->db = pc_base::load_model('link_model');
            $this->db2 = pc_base::load_model('type_model');
        }

        /**
         * 友情链接列表
         */
        public function init() {
            if($_GET['typeid'] != '') {
                $where = array('typeid'=>intval($_GET['typeid']), 'siteid'=>$this->get_siteid());
            } else {
                $where = array('siteid'=>$this->get_siteid());
            }
            $page = (isset($_GET['page']) && intval($_GET['page'])) ? intval($_GET['page']) : 1;
            $infos = $this->db->listinfo($where, $order = 'listorder DESC, linkid DESC', $page, $page = '9');
            $pages = $this->db->pages;
            $types = $this->db2->listinfo(array('module'=>ROUTE_M, 'siteid'=>$this->get_siteid()), $order = 'typeid DESC');
            $types = new_html_special_chars($types);
            $type_arr = array();
            foreach($types as $typeid=>$type) {
                $type_arr[$type['typeid']] = $type['name'];
            }
            $big_menu = array('javascript:window.top.art.dialog({id:\'add\',iframe:\'?m=link&c=link&a=add\', title:\''.L('link_add').'\', width:\'700\', height:\'450\'}, function(){var d = window.top.art.dialog({id:\'add\'}).data.iframe;var form = d.document.getElementById(\'dosubmit\');form.click();return false;}, function(){window.top.art.dialog({id:\'add\'}).close()});void(0);', L('link_add'));

            include $this->admin_tpl('link_list');
        }

        /* 判断标题重复和验证 */
           
        /* 添加分类时,验证分类名是否已存在 */

        /**
         * 添加友情链接
         */
        public function add() {
            if(isset($_POST['dosubmit'])) {
                $_POST['link']['addtime'] = SYS_TIME;
                $_POST['link']['siteid'] = $this->get_siteid();
                if(empty($_POST['link']['name'])) {
                    showmessage(L('sitename_noempey'), HTTP_REFERER);
                } else {
                    $_POST['link']['name'] = safe_replace($_POST['link']['name']);
                }
                if($_POST['link']['logo']) {
                    $_POST['link']['logo'] = safe_replace($_POST['link']['logo']);
                }
                $data = new_addslashes($_POST['link']);
                $linkid = $this->db->insert($data, true);
                if( ! $linked) {
                    return false;
                }
                $siteid = $this->get_siteid();
                //更新附件状态
                if(pc_base::load_config('system', 'attachment_stat') & $_POST['link']['logo']) {
                    $this->attachment_db = pc_base::load_model('attachment_model');
                    $this->attachment_db->api_update($_POST['link']['logo'], 'link-' . $linkid, 1);
                }
                showmessage(L('operation_success'), HTTP_REFERER, '', 'add');
            } else {
                $show_validator = $show_scroll = $show_header = true;
                pc_base::load_sys_class('form', '', 0);
                $siteid = $this->get_siteid();
                $types = $this->db2->get_types($siteid);
                include $this->admin_tpl('link_add');
            }    
        }

         /* 异步更新排序 */

         /* 手动更新排序 */

         /* 添加友情链接分类 */

         /* 删除分类 */

         /* 分类管理 */

         /**
          * 修改友情链接分类
          */
        public function edit_type() {
            if(isset($_POST['dosubmit'])) {
                $typeid = intval($_GET['typeid']);
                if($typeid < 1) return false;
                if( ! is_array($_POST['type']) || empty($_POST['type'])) return false;
                if((!$_POST['type']['name']) || empty($_POST['type']['name'])) return false;
                $this->db2->update($_POST['type'], array('typeid'=>$typeid));
                showmessage(L('operation_success'),'?m=link&c=link&a=list_type','', 'edit');
            } else {
                $show_validator = $show_scroll = $show_header = true;
                //查询分类内容
                $info = $this->db2->get_one(array('typeid'=>$_GET['typeid']));
                if( ! $info) {
                    showmessage(L('linktype_exit'));
                    extract($info);
                    include $this->admin_tpl('link_type_edit');
                }
            }
        }

         /**
          * 删除友情链接
          */
        public function delete() {
            if( ! isset($_GET['linkid']) || (empty($_GET['linkid']) && ! isset($_POST['linkid'])) || empty($_POST['linkid'])) {
                showmessage(L('illegal_parameters'), HTTP_REFERER);
            } else {
                if(is_array($_POST['linkid'])) {
                    foreach($_POST['linkid'] as $linkid_arr) {
                        //批量删除友情链接
                        $this->db->delete(array('linkid'=>$linkid_arr));
                        //更新附件状态
                        if(pc_base::load_config('system', 'attachment_stat')) {
                            $this->attachment_db = pc_base::load_model('attachment_model');
                            $this->attachment_db->api_delete('link - '. $linkid_arr);
                        }
                    }
                    showmessage(L('operation_success', '?m=link&c=link'));
                } else {
                    $linkid = intval($_GET['linkid']);
                 if($linkid < 1) {
                        return false;
                    }
            //删除友情链接
            $result = $this->db->delete(array('linkid'=>$linkid));
            //更新附件状态if(pc_base::load_config('system','attachment_stat')) {
            $this->attachment_db = pc_base::load_model('attachment_model');
            $this->attachment_db->api_delete('link-'.$linkid);
            }
            if($result){
            showmessage(L('operation_success'),'?m=link&c=link');
            }else {
            showmessage(L("operation_failure"),'?m=link&c=link');
            }
                }
                showmessage(L('operation_success'), HTTP_REFERER);
            }
        }

    }

/**
 * 几点注意:
 * 1. 作为一款产品,你可以感受到它程序的严谨性,照着做。
 * 2. 操作数据类和其它系统类均在 libs/classes/ 中,数据模型基类model.class.php通过数据库工厂类作为抽象层调用操作数据库的方法。
 * 3. 查询所有为listinfo, 单条信息为get_one, 增加为insert, 修改为update。
 * 4. 提示消息为系统公共函数showmessage(),在 libs/functions/global.func.php 中。
 * 5. L()方法为语言处理函数,将读入语言包,根据后台配置显示英文/中文, 同样是系统公共函数,
* 6. 加载后台模板 include $this->admin_tpl(""); 这是admin模块下admin.class.php类的方法
* <Farwish.com>
*/

 

  5. 建立后台模板文件

  后台模板文件都在 modules/link/templates 下,文件名统一以“ .tpl.php”结尾

/**
 * 后台模板局部
 */

<?php
defined('IN_ADMIN') or exit('No Permission resources.');
$show_dialog = 1;
include $this->admin_tpl('header', 'admin');
?>
<table width="100%" cellspacing="0" class="search-form">
    <tbody>
        <tr>
        <td><div class="explain-col"> 
        <?php echo L('all_linktype')?>: &nbsp;&nbsp; <a href="?m=link&c=link"><?php echo L('all')?></a> &nbsp;&nbsp;
        <a href="?m=link&c=link&typeid=0">默认分类</a>&nbsp;
        <?php
    if(is_array($type_arr)){
    foreach($type_arr as $typeid => $type){
        ?><a href="?m=link&c=link&typeid=<?php echo $typeid;?>"><?php echo $type;?></a>&nbsp;
        <?php }}?>
        </div>
        </td>
        </tr>
    </tbody>
</table>

/**
 * 几点注意:
 * 1. 后台模板是混编风格,由于在后台控制器中总是最后调用模板,所以系统库和函数以及变量总是可用的。
 * 2. 模板底部可以写一些自己的JS操作函数。
* 3. pc的安全性体现url参数中的pc_hash值验证,我们在做一些修改显示页面时也必须在链接上带上这个加密的session值。
* <Farwish.com>
*/

PHPCMS的模块化设计非常人性化,更多有趣的地方等待大伙儿去发现,等待:[PC]PHPCMS二次开发指南(下)

 

Link:http://www.cnblogs.com/farwish/p/4249318.html


http://www.niftyadmin.cn/n/4085537.html

相关文章

基于单片机的智能手表系统设计_【毕设狗】【单片机毕业设计】基于单片机的室内空气质量检测系统的设计...

前一段时间&#xff0c;做了一个关于基于单片机的室内空气质量检测系统的设计资料下载地址&#xff1a;基于单片机的室内空气质量检测系统的设计-毕设狗​www.bsdog.cn软件安装&#xff1a;① Keil&#xff1a;Keil uvision5 MDK RM v5.29​www.bsdog.cn② Proteus8.8&#xff…

dex是什么的缩写_游戏中的STR CON、 INT、DEX是什么意思?

展开全部1、STR(力量、物理攻击)在游戏中&#xff0c;物理攻击是以拿着钝器、锐器类的器攻击&#xff0c;一切都以为量为主。它是不同于魔法636f70793231313335323631343130323136353331333431353863攻击的一种攻击手段。物理攻击是指由力改变物体的运动状态从而使被攻击物体发…

大学物理上册详细笔记_复旦学霸们是如何做笔记的?清晰严谨的构图,可爱有趣的手绘...再看看你的......

别人家的笔记字迹优美、布局整齐、配图用心赏心悦目、堪比教科书我的笔记...只有自己看得懂复旦大学学生会组织了一场网课笔记大赛收集了几十份复旦学霸们的笔记让我们一起来欣赏下&#xff01;局部解剖学笔记记笔记的“李书琪”同学说&#xff1a;局部解剖学本来就很难了&…

python类的定义与使用_Python每日一题:类的定义和装饰器@classmethod与@staticmethod...

python中的定义类方法有三种形式普通方法类方法(classmethod)静态方法(staticmethod)1、普通方法的使用class A(): def __init__(self, name, age): self.name name self.age age def get_name(self): print(my name is, self.name) def get_age(self): print(fi am {self.ag…

linux windows文件 编码_Linux 下查看文件字符编码和转换编码

Linux 下查看文件字符编码和转换编码 如果你需要在 Linux 中操作 windows 下的文件&#xff0c;那么你可能会经常遇 到 文 件 编 码 转 换 的 问 题 。 Windows 中 默 认 的 文 件 格 式 是 GBK(gb2312)&#xff0c;而 Linux 一般都是 UTF-8。下面介绍一下&#xff0c;在 Lin…

软件工程学习要点

背景&#xff1a;学习了软件工程&#xff0c;但不知道要具体学习到一个什么样的程度&#xff0c;后来请教了高人&#xff0c;得到了一些基本的掌握内容&#xff0c;写出来与大家交流&#xff0c;更方便自己之后的复习。 知识掌握类&#xff1a; 软件工程三问&#xff1a;软件工…

少儿编程软件python_一款儿童编程入门的理想工具——PythonTurtle

今天偶然发现了一款Python入门的理想工具PythonTurtle。非常容易上手&#xff0c;强烈推荐一下。PythonTurtle的灵感来源于早期编程语言Logo&#xff0c;也是通过控制小海龟来完成Python语言的入门学习。它致力于降级该编程语言的学习难度&#xff0c;专门为初学者和孩子们设计…

肺结节目标检测_一文讲清楚肺部结节:肺结节诊治中国专家共识(2018年版)...

中华医学会呼吸病学分会学组中国防治联盟专家组中华结核和呼吸杂志,2018,41(10):763-771.DOI:10.3760/cma.j.issn.1001-0939.2018.10.0042015年首部"肺部结节诊治中国专家共识"[1]发表以后&#xff0c;各个国家与地区相继对肺结节诊治指南进行了更新&#xff0c;这些…