CF5是一款强大的LAMP CMS框架(http://www.concrete5.org/),核心采用了一部分ZEND FRAMEWORK框架,架构比较独特不同于传统的DEDECMS, PHPCMS等,利用内部已有的Add-ons 可以快速建立一个企业网站,
一,体会:
1,根目录下的concrete目录下是核心文件,不允许随便去修改,如果想覆盖默认的系统模板布局等,可以在根目录下的文件夹中去覆盖系统默认提供的add-ons布局
2,使用CF5时,必须抛弃掉传统PHP CMS框架的思想,CF5是以多个模块组件搭建起来的一款应用,可以在前台页面进入编辑模式后,对前台页面内容(包括布局)直接进行编辑,对一些动态数据,例如新闻,可以通过设置数据源来加载,支持是否显示分页等;
3,多语言实现,CF5默认支持主流的几十种语言,可以去社区下载免费的国际化 ADD-ON并安装后,在仪表牌会出现安装的这个功能,可进入做详细的设置,并可指定网站默认加载的语言项(例如像做一个繁体中文,简体中文,英文网站,我选择了繁体对应地区为中国香港,但这里有个BUG,繁体会有问题,但繁体选择地区为中国台湾后,则正常了)
4,其他一些有用免费ADD-ON,我网站向添加一个轮播图片效果,社区有提供免费的nivo-slider(http://www.concrete5.org/marketplace/addons/nivo-slider/),其他好用的ADD-ON还在搜索中
5,关于模板的设计: 当我们想将自己美工设计的网页,用CF5来创建应用时,这时可以按官方文档的要求,在themes目录中建立模板的大体布局(尤其是做多语言网站时,得考虑一套模板要供多种语言共用,所以模板大体布局不能包含有语言方面的元素),个性化元素在安装完模板后,在进入页面的编辑模式后动态添加;
6,CF6一个页面的元素有3类:
1)布局:
$a = new Area('Main1');
$a->display($c);
2)strack:
多个block的集合
3) block:
可以理解为组件,例如nav-bar, internal form, image,等已经安装好的ADD-ON
二,所有通过仪表盘创建pages, block, strack等,都可以通过code来实现
1,创建block
在 /block/目录下创建block文件夹,如果命名有下划线,在控制器命名时需要使用驼峰表达,如果建立一个block
/block/hello_word
controller.php 控制器 HelloWorldBlockController extends BlockController
db.xml 存储的表及字段信息
add.php 增加时用
edit.php 修改时用
view.php 前台展现时用
view.css 前台展现用CSS
然后到后台仪表盘进行block的安装
一些父控制器会默认执行的回调函数及执行顺序
A: on_start()
B: view() / add() / edit() / save / delete()
C: on_before_render()
D: on_page_view()
更详细过程可查看源码:/concrete/core/libraries/block_controller.php
三,二次开发一个 image gallery 体会(不一定完全正确,只是自己的一些体会而已)
/block: 如果想修改内置的一些block的布局或功能,可以在这里面重写相应的页面,因为CF5加载的顺序是先找自定义目录,然后没有再加载系统核心目录;或做一些独立的功能(有有DB.XML,控制器,VIEW.PHP ADD.PHP等文件),不想package可能会设计比较多的功能; 二次开发完成后,需要到后台进行安装
/package: 如果要自己写一个block功能,比如 cookbook gallery(图片相册),可以在这里做
/package下的目录结构:
package 的控制器格式:
class CookbookGalleryPackage extends Package {
protected $pkgHandle = 'cookbook_gallery';
protected $appVersionRequired = '5.6.0';
protected $pkgVersion = '0.9.0';
public function getPackageName(){
return t("xxx");
}
public function getPackageDescription(){
return t("sssss");
}
public function install(){
$pkg = parent::install();
BlockType::installBlockTypeFromPackage('cookbook_gallery', $pkg);
}
}
DB.XML
后天仪表盘进行package 安装
block控制器增加add/edit方法,那么在前台使用这BLOCK去执行add.php/edit.php时,会先调用block控制器的add/edit方法
添加view方法,前台显示是使用
view.php
建立gallery显示图片的来源(把来源定位为唯一标识,并制定包含的图片,这样在现实相册是就可以得到来源的图片了),这里的Name会在block列表中显示,为什么block列表中不直接显示 cookbook gallery呢,我理解从目录层次结构来看,一个cookbook gallery的package下面可以做不同的block功能,所以blocks用的复数,也大概表达了下面可以建立多个不同的block
前台进入编辑模式后,增加block,选择自己二次开发的Photo Gallery
这里实际就是add.php/eidt.php的布局
这里是view.php的布局
页面会自动加载各种block的控制器,而加载到gallery控制器时,会自动加载DB.XML中定义好的表的字段数据,并作为控制器的属性(在view中直接以字段名为变量名来获取字段数据)
block控制器的的add() / edit() / view() 是CF5提供的hook方法,方便二次开发用
一个模板可以定义为多种page type ;一种page type可以是多个page
(备注:截图来自 [Packt Publishing] concrete5 Cookbook.pdf)