• Social Engine 4二次开发心得


    由于客户要求需要在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的代码:
     
    1. 修改ProfileController,把indexAction复制为friendsAction
    2. 修改manifest.php,添加friends的router,指向新建的friendsAction
    3. 在后台add page,取名为Friends
    4. 用phpmyadmin查询engine4_core_pages表,找到Friends页面,set name='user_profile_friends',custom=0,url=NULL
     
    然后在后台把profile widget加到friends页面中,访问friends页面就可以看到friends list。

    Create a widget

    建立一个widget非常简单,一般需要以下几步:
    1. 在module下的widget放入一个目录及controller与template,如文件controller.php, index.tpl
    2. 在module/settings/content.php中添加widget声明
    3. 此时在后台的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的类名,如果类不存在,系统会报出提示
  • 相关阅读:
    Mac下mysql出现错误:ERROR 1055 (42000)
    单表查询
    外键的变种 三种关系
    Java8中Lambda表达式详解
    Java中的比较器Comparable、Comparator
    Java创建线程的方法
    java日期格式化
    Docker容器如何修改hosts
    使用postman可以正常访问,但是在应用中返回415状态码
    使用tcpdump进行抓包
  • 原文地址:https://www.cnblogs.com/catcat811/p/3120152.html
Copyright © 2020-2023  润新知