由于客户要求需要在Social Engine 4上进行开发,所以自己研究了一些开发方法。
Social Engine 4是一个付费的SNS系统,如果需要开发一个SNS项目,可以考虑使用SE4。虽然我并不觉得SE4很好用,如果刚好有人跟我一样不幸需要用到SE4的话,可能本文会有所帮助。并且如果很熟悉Zend Framework的话,SE4也是可以接受的。
优点
- 基于Zend Framework,有很好的代码风格
- 可以添加custom page,每个costom page都可以使用不同的layout,使用多种可选widget
- 可以使用plugin进行扩展,后台也可以直接生成plugin的初始代码,不用手动初始化安装包
- 安装好或者开发好的plugin可以重新打包并导出为单一的文件,便于plugin的迁移
- Log默认写在文件里,不显示在页面上。访客不会看到不解的跟踪信息
缺点
- widget(相当于drupal的block)代码抛出异常会直接被忽略,为widget开发增加了调试难度
- plugin并不丰富,很多都需要收费,就算有免费的也需要有官方account才能下载。并且plugin下载点很多,各需要不同的account,要下载个plugin很麻烦
- 效率有点低,并且在WINDOWS的PHP环境下有时会出现进程被关闭的情况,所以在WINDOWS下进行测试很困难
- 配置依赖于数据库,并且把CLASS名都放在数据库中。进行深度开发时需要手工在数据表中添加记录。
- 官方的文档只有简单的后台操作教程,并没有开发文档,开发plugin完全需要自己摸索
- 虽然可以添加custom page,能自由地调整layout,但每个page都需要编辑,要添加大量的页面内容时就很麻烦。
- 没有一个完整的CMS功能,甚至连菜单高亮都没有,收费的CMS plugin是有,但也很难使用
新建package
SE的后台可以直接生成package安装包并下载,之后把安装包装上,就能有一个初始化package的代码。并可以重新对package打包。
content.php
settings/content.php,用于声明widget。widget可以在layout里添加。
Module API
Module可以借助API来向其它Module提供程序帮助,API的程序将会默认放到Api/core.php中,提取方法如下:
Engine_Api::_()->$module()->$method();
例如:
Engine_Api::_()->user()->getViewer();
将会读取: modules/user/Api/core.php: getViewer()
得到engine4_core_settings表存储的参数
Engine_Api::_()->getApi('settings', 'core')->getSetting('poke.conn.setting');
sign up 流程修改
流程被存于engine4_user_signup中,包括顺序与加载的plugin类名。
CODE生成一个页面
一个页面最基本需要有controller与view,如有一module命为user,我需要加一个页面叫showall,需要添加以下文件:
Controller: application/modules/user/controllers/ShowallController.php
View: application/modules/user/views/scripts/index.tpl
每个module都会有router设置,user的router设置文件:
application/modules/User/settings/manifest.php
'routes' => array(
// User - General
'user_extended' => array(
'route' => 'members/:controller/:action/*', // 以上例子的URL为members/showall/
'defaults' => array(
'module' => 'user',
'controller' => 'index',
'action' => 'index'
),
),
'user_general' => array(
'route' => 'members/:action/*',
'defaults' => array(
'module' => 'user',
'controller' => 'index',
'action' => 'browse'
),
),
// User - Specific 可以指定某个页面拥有独特的地址
'user_login' => array(
'route' => '/login/*',
'defaults' => array(
'module' => 'user',
'controller' => 'auth',
'action' => 'login'
)
),
manifest.php可以动态添加router,即时生效。
也可以用数据库指定URL,如添加以下记录:
$db->insert('engine4_core_pages', array(
'name' => 'user_showall_index',
'displayname' => 'Show All Page',
'url' => 'user/showall'
'title' => 'Show All',
'description' => '',
'custom' => 0,
));
CODE建一个页面,并让后台可以像其它pages一样调整layout
有些widget只能放到特定的页面,代码里好像用subject来识别。例如profile widget只能放到subject=user的页面,页后台新建的页面不能设置subject,所以不能把profile widget放到定制页面,这时就需要用代码建立页面,支承 后台管理它。
例如我要建一个friends的页面,需要修改user module的代码:
- 修改ProfileController,把indexAction复制为friendsAction
- 修改manifest.php,添加friends的router,指向新建的friendsAction
- 在后台add page,取名为Friends
- 用phpmyadmin查询engine4_core_pages表,找到Friends页面,set name='user_profile_friends',custom=0,url=NULL
然后在后台把profile widget加到friends页面中,访问friends页面就可以看到friends list。
Create a widget
建立一个widget非常简单,一般需要以下几步:
- 在module下的widget放入一个目录及controller与template,如文件controller.php, index.tpl
- 在module/settings/content.php中添加widget声明
- 此时在后台的Layout Editor已经可以看到新加的widget,把它拖到页面上即可
常见的载入文件问题
由于SE基于Zend,Zend最大特点是自动载入,一个类为User_Model_User的类,它必须放在User/Model/的文件夹下,只要调用该类,就会自动加载特定的文件夹。虽然这很方便,不过它是大小写敏感的。如果错用了大小写,在WINDOWS下没有问题,但迁移到LINUX下就出现问题了。所以一定要注意大小写。
有时候自定义的page在页面下总是not found,那很可能是由于SE找不到controller文件,如果在WINDOWS下无异常,则大多是大小写的问题。
Module Plugin
Plugin是Module的一部分,可以对其它Module进行注入式扩展。要使用plugin,必须扩展目标module有HOOK,这个可以在manifest.php中声明。一般情况下,plugin扩展代码会在module的plugin目录下,数据库定义使用什么plugin。
以menu为例,menu不都是固定的URL,有些menu需要根据用户来输出不同的URL,如profile/%id
这种物殊的menu不能在后台添加,只可以在数据库中engine4_core_menuitems表添加新记录
name: core_main_profile, module: user, plugin: User_Plugin_Menus
plugin决定hook,name与module定义plugin的类名,如果类不存在,系统会报出提示