Phpcms二次开发学习及实践

二次开发技巧

如果要对已存在的控制器进行二次开发,为了方便升级不建议直接对内核文件直接修改该,您可以通过“MY_*.php”的形式进行二次开发。

例如您要对改phpcms/mood/index.php进行二次开发。您可以在与index.php同级的目录下建立”MY_index.php”

<?php

class MY_index extends index{

function __construct() {

parent::__construct();

}

??your code

}

这样当您通过url访问index控制器的时候,系统会默认指向MY_index.php 并且原文件的方法将被继承,可以直接使用。

系统配置文件

文件路径:根目录/caches/configs

database.php 数据库配置文件

system.php 系统配置文件

route.php 路由配置文件

调用方法

如调用系统配置中的web_path:

pc_base::load_config('system', web_path ');

CMS入口文件:

PHPCMS是采用MVC设计模式开发,基于模块和操作的方式进行访问,采用单一入口模式进行项目部署和访问,无论访问任何一个模块或者功能,只有一个统一的入口。

入口程序是在前期处理用户请求的引导程序。它是唯一一个可以被最终用户可以直接请求运行的。

文件路径:根目录/index.php

<?php

define('PHPCMS_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);

include PHPCMS_PATH.'/phpcms/base.php';

pc_base::creat_app();

?>

这段代码首先加载了 phpcms 框架的引导文件 base.php,然后它根据指定的配置文件建立了一个 Web 应用实例并运行。

PHPCMS框架入口文件:

文件路径:根目录/phpcms/base.php

代码片段如下:

<?php

define('IN_PHPCMS', true);

define('PC_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);

if(!defined('PHPCMS_PATH')) define('PHPCMS_PATH',

PC_PATH.'..'.DIRECTORY_SEPARATOR);

define('CACHE_PATH', PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR);

? ? ? ?

? ? ? ?

?>

该文件为框架入口文件,包含实例化系统/模块类方法,调用系统/模块方法,系统常用常量等。如:

pc_base::load_model(‘*_model’) 加载数据库模型

pc_base::load_sys_class(‘classname’) 实例化系统类

pc_base::load_app_class(‘classname’,’admin’) 实例化模块类

pc_base::load_sys_func (‘funcfile’) 调用系统函数库

全局函数文件:

文件路径:根目录/phpcms/libs/functions/global.func.php

代码片段如下:

<?php

function new_addslashes($string){

if(!is_array($string)) return addslashes($string);

foreach($string as $key => $val) $string[$key] = new_addslashes($val); return $string;

}

? ? ? ?

? ? ? ?

?>

该文件中的函数,为全系统基础函数,可以在系统中直接调用。

二次开发技巧:

如果需要增加自己的全局函数,可根据需要增加到

/phpcms/libs/functions/global.func.php/extention.func.php中

不会影响升级

数据模型基类:

文件路径:根目录/phpcms/libs/classes/model.class.php

代码片段如下:

<?php

pc_base::load_sys_class('db_factory', '', 0);

class model {

//数据库配置

protected $db_config = '';

//数据库连接

protected $db = '';

//调用数据库的配置项

protected $db_setting = 'default';

//数据表名

protected $table_name = '';

//表前缀

public $db_tablepre = '';

? ? ? ?

? ? ? ?

?>

加载数据模型后,可以的数据库该类中方法进行数据库操作。

表单调用类:

文件路径:根目录/phpcms/libs/classes/form.class.php。

代码片段如下:

<?php

class form {

//编辑器调用

public static function editor($textareaid = 'content', $toolbar = 'basic', $module = '', $catid = '', $color = '', $allowupload = 0, $allowbrowser = 1,$alowuploadexts = '',$height = 200,$disabled_page = 0) {

}

//图片上传调用

public static function images($name, $id = '', $value = '', $moudle='', $catid='', $size = 50, $class = '', $ext = '', $alowexts = '',$thumb_setting = array(),$watermark_setting = 0 ) {

}

? ? ? ?

? ? ? ?

?>

通过实例化该类可以,调用在程序中调用编辑器、表单上传、日期选择、栏目结构等表单。 实例化方法:pc_base::load_sys_class('form', '', 0);

模板解析缓存类:

文件路径:根目录/phpcms/libs/classes/template_cache.class.php 。

代码片段如下:

<?php

final class template_cache {

public function template_compile($module, $template, $style = ‘default’) {

$tplfile = $_tpl =

PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html'; ? ? ? ?

? ? ? ?

?>

该类作用为解析模板,解析模板及更新模板缓存

二次开发命名规范 类文件需要以.class.php为后缀(这里是指的phpcms的系统类库文件和模块中的

类库文件,第三方引入的不做要求),例如http.class.php。

函数文件需要以.func.php为后缀(第三方引入的不做要求),例如mail.func.php。

类名和文件名一致,例如 phpcmsapp类的文件命名是phpcmsapp.class.php。

数据模型需要以“数据表名称_model.class.php”为形式,类名称与文件名必须相

同。

创建数据库模型类

数据库模型位于:phpcms/model/目录下。

数据模型文件的命名规则建议为数据表名称+'_model.class.php'

如果在我们的创建的模块中我要使用一个数据库“test”,首先需要建立一个数据库模型文件,文件名称为'test_model.class.php'

<?php

defined('IN_PHPCMS') or exit('No permission resources.');

pc_base::load_sys_class('model', '', 0);

class test_model extends model {

public function __construct() {

$this->db_config = pc_base::load_config('database');

$this->db_setting = ‘default';

$this->table_name = 'test';

parent::__construct();

}

}

?> 数据库模型类名称必须与文件名称相同;

$this->db_setting = 'default'为数据库配置文件中配置数据库链接池名称,默认为default,一般情况下不需要修改。

$this->table_name = ‘test’为数据表名称

创建模块

如果要创建一个模块,只要在 phpcms/modules 目录下创建文件夹并放入你的控制器类就可以了。

例如要开发一个叫做test的模块,那么首先在phpcms/modules 目录下创建文件夹,并将其命名为test。模块的标准结构通常是这样的。

如果您的模板有单独的前台模板,你需要在phpcms/templates/default下创建一个您的模块目录来放置前台模板,”default”为你的风格包名称,我们默认适用default

创建模块控制器类

为test模块增加一个名为myest的控制器

文件路径:根目录/phpcms/modules/test/mytest.php。

代码片段如下:

<?php

defined('IN_PHPCMS') or exit('No permission resources.');

class mytest {

function __construct() {

}

public function init() {

$var = 'hello world!';

echo $myvar;

}

public function mylist() {

$var = 'hello world!this is a example!';

echo $myvar;

}

}

?>

Phpcms v9常用操作列表:

1.调用数据库模型

$this->db = pc_base::load_model('test_model');

其中$this->db中所支持的方法请参照phpcms/libs/classes/model.class.php中方法

2.加载系统类

$http = pc_base::load_sys_class('http'); //实例化http类

pc_base::load_sys_class('format', '', 0); //调用form类,不进行实例化操作

3.加载系统函数库

pc_base::load_sys_func('mail'); 调用mail函数包

4. 加载模块类

$test = pc_base::load_sys_class(‘classname‘,’test’); //实例化test模块下 classname类

5.加载模块函数库

pc_base::load_sys_func(‘global‘,’test’); 调用test模块的global函数包

6.加载前台模板

include template('test', 'mytest', 'default');

7.加载后台模板

include $this->admin_tpl('mytest_admin_list');

8.权限控制

后台控制控制器需要加载admin模块下的admin类,并继承该类

<?php

defined('IN_PHPCMS') or exit('No permission resources.'); pc_base::load_app_class('admin','admin',0);

class mytest_admin extends admin {

//这个控制器需要登录后台才可以访问

}

?>

 

第二篇:phpcms二次开发常用标签

23个phpcms v9模板制作及二次开发常用代码案例

时间:2012-04-26 16:04 来源:PHPCMS中国 作者:PHPCMS中国 点击:

633 次 【字号:大 中 小】

23个phpcms v9模板制作及二次开发常用代码案例

0:调用最新文章,带所在版块

{pc:get sql="SELECT a.title, a.catid, b.catid, b.catname, a.url as turl ,b.url as curl,

a.id FROM `v9_news` a, `v9_category` b WHERE a.catid = b.catid ORDER BY `a`.`id` DESC " num="15" cache="300"} {loop $data $r}

<h6><font class="cate"><a href="{$r[curl]}">[{$r[catname]}]</a></font><a

class="gray" href="{$r[turl]}" title="{$r[title]}"> {str_cut($r['title'],26)}</a></h6> {/loop} {/pc}

====<font class="cate"><a href="{$r[curl]}">[{$r[catname]}]</a></font>所在版块的调用

1.截取调用标题长度

{str_cut($v[title],36,'')}

{str_cut($v['title'],34)} 超出用 ... 代替

{str_cut($v['title'],34, '???')}超出用 ???代替

{str_cut($v['title'],34,'')}超出不用任何字符代替

2.格式化时间

调用格式化时间 2011-05-06 11:22:33 {date('Y-m-d H:i:s',$r[inputtime])}

<span class="rt">{date('m-d',$v['inputtime'])}</span>

3.多栏目调用&多推荐位调用

调用需求:文章范围为59 60 61三个栏目,并且推送到了27 和28两个推荐位; 从第三条开始,连续调用7篇文章。

{pc:get sql="SELECT * FROM v9_news WHERE id IN (SELECT id FROM v9_position_data WHERE posid

in(27,28) and catid in(59,60,61)) order by listorder DESC" cache="3600" start="3" num="7" return="data" } {loop $data $n $r}

<li>·<a target="_blank" href='{$r[url]}' title="{$r[title]}" style="color:Black;">{str_cut ($r[title],22,'')}</a></li> {/loop} {/pc}

4.显示栏目名称(只是名称,不带链接)

{$catname}

显示栏目名称和链接(可以点击)

<a href="{$CATEGORYS[$r[catid]][url]}">{$CATEGORYS[$r['catid']]['catname']}</A>

5.获取父栏目id/获取父栏目名称

{$CATEGORY[$catid][parentid]}

父栏目名称:{$CATEGORYS[$CAT[parentid]][catname]}

6.外部数据源调用

dedecmsdb 在后台数据源处添加

{pc:get sql="SELECT * FROM cq_member where mtype='企业' " cache="3600" dbsource="dedecmsdb"

num="7" return="data"} {loop $data $r}

<a href="/member/index.php?uid={$r[userid]}" title="{$r[uname]}" target="_blank">{str_cut ($r[uname],28,'')}</a>

{/loop} {/pc}

7.调用子栏目(在栏目首页模板需要用到)

{pc:content action="category" catid="$catid" num="25" siteid="$siteid" order="listorder ASC"} {loop $data $r}

<a href="{$r[url]}">{$r[catname]}</a> | {/loop} {/pc}

8.显示指定id的栏目名称 (例子这里catid=22)

{$CATEGORYS[22]['catname']}

9.在文章面前显示文章类别

{pc:content action="lists" catid="79" order="listorder DESC" num="14" } <?php $TYPE = getcache('type_content','commons');?> {loop $data $n $r}

<li>{if $TYPE[$r[typeid]][name]}<span style="color:#CC6600">[ {$TYPE[$r[typeid]][name]}] </span>{/if}<a href="{$r['url']}"{title_style($r[style])}title="{$r['title']}"

target="_blank">{str_cut($r[title],33,'')}</a></li> {/loop}

{/pc}

10.指定变量循环增长(幻灯片经常用到)

{pc:content action="lists" catid="66" order="listorder DESC" thumb="1" num="5" }

{php $num = 0}

{loop $data $r}

linkarr[{$num}] = "{$r[url]}"; picarr[{$num}] = "{$r[thumb]}";

textarr[{$num}] = "{str_cut($r[title],36,'')}"; {php $num++} {/loop} {/pc}

11.文章调用使用limit

{pc:content action="position" posid="36" num="1" order="listorder DESC limit 1,1--" } 其他都是跟以前一样使用

{pc:content action="position" posid="31" order="listorder DESC" limit='1,8--'} {loop $data $r} <li><a href="{$r[url]}" title="{$r[title]}" target=_blank>{str_cut($r[title],36,'')} </a></li> {/loop} {/pc}

12.文章从指定位置开始调用

起始位置为5,调用3条。相当于limit功能。

{pc:content action="position" posid="27" order="listorder DESC" num="3" start="5"} {loop $data $r}

<a href='{$r[url]}'>{str_cut($r[description],115)}... </a> {/loop} {/pc}

13.文章列表页调用关键字,或者首页调用关键字

注意:explode(',',$r[keywords]);是将文章关键词通过英文逗号分离,也就是说每一篇文章都要以逗号

间隔关键字,否则调用出来会 是全部作为一个关键字。如果是空格间隔关键字,将explode(',',$r

[keywords]);改成explode(' ',$r[keywords]);

{pc:content action="lists" catid="$catid" num="10" order="id DESC" page="$page"} {loop $data $r}

<a href="{$r[url]}">{$r[title]}</a>

{php $keywords = explode(',',$r[keywords]);} <b>文章标签:</b>

{loop $keywords $keyword}

<a href="{APP_PATH}index.php?m=content&c=tag&catid={$catid}&tag={urlencode($keyword)}"

class="blue"> {$keyword}</a> {/loop} {/loop} {/pc}

14.每当列表几行的时候出现一次某些符号(比如首页里面的文章推荐,一行显示两条,在这两条中间想加一条竖线 | 就用到这个代码了)

数量大的话就容易出错,因为模运算嘛~~呵呵 不过一般也就4个标题以下

{pc:content action="position" posid="8" order="listorder DESC" num="2"}

{loop $data $r}

<a style="color:#040605" title="{$r[title]}" href="{$r[url]}" target=_blank>{str_cut($r

[title],26,'')}</a>{if $n%2==1} |{/if}

{/loop}

{/pc}

15.v9 列表页完美支持自定义段调用

{pc:content action="lists" catid="$catid" num="25" order="id DESC" page="$page

moreinfo="1"}

{loop $data $r}

<a href="{$r[url]}">[{$r['字段名']}]> {$r[title]}</a>

{/loop}

<div class="pagebar">{$pages}</div>

{/pc}

16.当前栏目调用父级及以下栏目信息方法

其他代码 该咋地还是要咋地 。这是要素

{php $arrchildid = $CATEGORYS[$CAT[parentid]][arrchildid]}

{pc:get sql="SELECT * FROM v9_news where catid in($arrchildid) cache="3600" page="$page"

num="12" return="data"}

17.V9表单功能 提交之后如何返回当前页面,而不是默认的首页文件地址

找到 phpcms\modules\formguide\index.php文件第73行

showmessage(L('thanks'), APP_PATH);

修改成 如下代码即可实现自动返回前一页

showmessage(L('thanks'), HTTP_REFERER);

18.v9 首页或分页自定义字段调用

和15差不多

第一普通列表或栏目调用自定义字段

在{pc:content action="lists" 后加上副表moreinfo=1 (等于1时显示,0时不显示)

例子:

{pc:content action="lists" moreinfo=1 catid="2" order="id DESC" num="4"}

<ul>

{loop $data $key $val}

<li><a href="{$val['url']}">{$val['title']}</a>

<br>价格:{str_cut($v['自定义段'],100)} //100 是字数

</li>

{/loop}

</ul>

{/pc}

第二种推荐位调用自定义字段

在模型里加好自定义字段后,必须把“在推荐位标签中调用”点击“是“

然后用同一样的方法去调节数据就OK了,记住,如果你加了文章,必须去更新文章才会显示,自定义段在

推荐中只显示你选择后,选择前加的加文章不显示,更新一下文章就显示了

例子:

{pc:content action="position" posid="推荐位id" num="30" thumb="1" moreinfo="1"

order="listorder DESC"}

{loop $data $key $val}

<LI><a href="{$val['url']}" target="_blank"><img src="{$val['自定义段']}" alt="{$val

['title']}" height=36 width=98 /></a>

<a href="{$val['url']}" target="_blank">{str_cut($val['title'],20)}</a></LI>

{/loop}

{/pc}

20.编辑器上传图片自动使用标题作为alt参数

一: 修改 statics/js/ckeditor/plugins/image/dialogs/image.js

找到

accessKey:'T','default':''

替换成

accessKey:'T','default':$('#title').val()

二: 清除浏览器缓存

21.增加文章的随机点击数

找到100行的$views = $r['views'] +1

修改为:

$rand_nums=rand(79,186);

$views = $r['views'] + $rand_nums;

表示点击一次,增加79到186次不等

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

tips:某些版本出错民间解决方法

1.缩略图以及图集无法上传

\phpcms\libs\classes\attachment.class.php

请把24行的(也有可能是23行)

$this->upload_func = 'copy';

改成

$this->upload_func = 'move_uploaded_file';

2.碎片模块搜索文章看不到栏目

phpcms\modules\block\templates\search_content.tpl.php

13行改成

<td><?php

if(isset($_GET['dosubmit'])){?><div class="rt"><a

href="javascript:void(0)" onclick="$('#search').toggle()"><?php

echo L('folded_up_in_search_of')?></a></div><?php }

echo form::select_category('', $catid, 'name="catid" id="catid"', '',

'', '0', 1)?> </td>

22、PHPCMS V9的get标签调用

1、调用本系统单条数据,示例(调用ID为1的信息,标题长度不超过25个汉字,显示更新日期):

{get sql="select * from phpcms_content where contentid=1" /}

标题:{str_cut($r[title], 50)} URL:{$r[url]} 更新日期:{date('Y-m-d', $r[updatetime])}

2、调用本系统多条数据,示例(调用栏目ID为1通过审核的

10条信息,标题长度不超过25个汉字,显示更

新日期):

{get sql="select * from phpcms_content where catid=1 and status=99 order by updatetime desc"

rows="10"}

标题:{str_cut($r[title], 50)} URL:{$r[url]} 更新日期:{date('Y-m-d', $r[updatetime])}

{/get}

3、带分页,示例(调用栏目ID为1通过审核的10条信息,标题长度不超过25个汉字,显示更新日期,带分

页):

{get sql="select * from phpcms_content where catid=1 and status=99 order by updatetime desc"

rows="10" page="$page"}

标题:{str_cut($r[title], 50)} URL:{$r[url]} 更新日期:{date('Y-m-d', $r[updatetime])}

{/get}

分页:{$pages}

4、自定义返回变量,示例(调用栏目ID为1通过审核的10条信息,标题长度不超过25个汉字,显示更新日

期,返回变量为 $v):

{get sql="select * from phpcms_content where catid=1 and status=99 order by updatetime desc"

rows="10" return="v"}

标题:{str_cut($v[title], 50)} URL:{$v[url]} 更新日期:{date('Y-m-d', $v[updatetime])}

{/get}

5、调用同一帐号下的其他数据库,示例(调用数据库为bbs,分类ID为1的10个最新主题,主题长度不超

过25个汉字,显示更新日期):

{get dbname="bbs" sql="select * from cdb_threads where fid=1 order by dateline desc"

rows="10"}

主题:{str_cut($r[subject], 50)} URL:/viewthread.php?tid={$r[tid]}

更新日期:{date('Y-m-d', $r[dateline])}

{/get}

6、调用外部数据,示例(调用数据源为bbs,分类ID为1的10个最新主题,主题长度不超过25个汉字,显

示更新日期):

{get dbsource="bbs" sql="select * from cdb_threads where fid=1 order by dateline desc"

rows="10"}

主题:{str_cut($r[subject], 50)} URL:/viewthread.php?tid={$r[tid]}

更新日期:{date('Y-m-d', $r[dateline])}

{/get}

不知道有没有朋友在使用中遇到这几种方法不能满足需求的时候呢?

例如:取出评论数最多的第3条到第10条记录,有人说我是多此一举,一般取最多评论没理由不取第一和

第二条,因为PHPCMS的缩略图对4:3这样的尺寸比较好,对长条形(如3:4)的图片缩略效果不好,为了

自己手动更新评论最多的第一和第二条记录,故此不想自动更新读取前两条。

<ul>

<!--{get sql="select

A. contentid,A.catid,A.title,A.thumb,A.description,A.url,A.status,A.updatetime,B.contentid,B.

hits,B.comments from `phpcms_content` as A INNER JOIN `phpcms_content_count` as B ON

B.

C.

D. A.contentid=B.contentid and A.status=99 and LENGTH(A.thumb)>0 order by B.comments d

esc LIMIT

E.

F.

G. 3,7"}-->

H.

I.

J. <li><span class="xxnse_fen2">{$r[comments]}人参与评论</span>·<a href="{$r[url]}" K.

L.

M. title="{$r[title]}">{str_cut($r[title], 28)}</a></li>

N.

O.

P. <!--{/get}-->

Q.

R.

S.

T.

U.

V. </ul> 关键点就在 order by B.comments desc LIMIT 3,7 (表示从第3条记录开始,向下读取7

条数据)这个在

W.

X.

Y. MYSQL是经常用,我抱着试试看的想法,结果是可以的。

Z.

AA.

BB. 希望做PHPCMS开发的朋友共同学习和分享

CC.

DD.

EE. phpcms V9 保留了2008的get标签的使用方法

FF.

GG.

HH. 它包括了2种方式一种是内部数据,另一种是外部数据

II.

JJ.

KK. 我们先分析下内部数据的使用方法

LL.

MM.

NN. 1、内部数据的调用

{pc:get sql="SELECT * FROM `XX` WHERE fid =$ltid AND digest =2 AND ifupload =1

ORDER BY tid DESC" num="2" cache= "3600" return="data" }

{loop $data $r}

。。。。。

{/loop}{/pc}

由此可以看出 get 语句支持num的用法但是不支持 limit 5,5.这样的用法

实在是很遗憾

num是调用的条数

2、外部数据的调用

{ pc : get sql = "SELECT * FROM phpcms_member" cache = "3600" page = "$page" dbsource =

"discuz" return = "data" }

<ul>

{ loop $data $key $val }

{ $val [ username ]}< br />

{ /loop}

</ ul >

{ $pages }

{/ pc }

一个是数据源,一个是产生的pages翻页效果。

更多PHPCMS教程资料,尽在

PHPCMS中国 (

相关推荐