注册 登录
  • 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!

B2B2C开发总结 – bbc商派TP认证考核关键点总结(一)

ECStore 开心洋葱 3199次浏览 已收录 1个评论 手机上查看
文章索引目录
[隐藏]

B2B2C开发总结 – bbc商派TP认证考核关键点总结(一)

B2B2C开发总结 – bbc商派TP认证考核关键点总结(二)

1.二开经验

开启二开目录
增加production目录,增加二开compatible.php 增加define(‘CUSTOM_CORE_DIR’, ROOT_DIR.’/custom’);

自定义路由:
Bootstrap增加custom_routes.php

二开控制器
重写APP对应类

二开视图
重写APP对应custum的视图文件

2.Widget

版块挂件分为两种
系统级挂件 (目录app/widgets(不随着模板的更换而更换)
模板级挂件 (目录/themes/widgets(随着模板的更换而更换)

版块的路径是ecos安装目录/themes/widgets,每个目录对应一个特定功能的版块,目录下有这样几个文件 :

_config.html 配置页是在可视化编辑时用到的配置表单
widgets.php 用于描述挂件基本信息,挂件模板文件、名称对应关系
preview.html, 版块在后台可视化编辑时的预览
default.html, 版块默认的模板,一个版块可以有多个模板
widget
<挂件包名>.php, 版块的执行程序 (系统级挂件)
themewidget<挂件包名>.php, 板块的执行程序(模板级挂件)

注:挂件主拦截器的文件名一定要与其内function名相同,挂件创建好后,用通过维护,才能在添加挂件的时候在挂件中心看到此挂件(维护需要安装开发者工具这个app)

3.Template

为什么要用,好处是什么?
模板将页面抽象成为不同的区块,有实现核心流程的业务区,也有实现展示和其他功能的版块。使得内容和表现更加分离,便于升级维护。模板的大部分操作都在后台可视化进行,用户甚至可以通过拖放配置不同的版块,来创建属于自己的独一无二的模板。

object 参数列表
return_url //选填 此参数和callback配合使用返回值处理链接(控制器 )
callback //选填 此参数和return_url配合使用返回值处理 js函数
breakpoint //选填 当数据少于此值时 显示下拉框
limitmax //选填 选择数据的最大数量
view //选填 扩展内容的页面
extendvalue //当有扩展页面并且有输入值时,必填 当编辑时,扩展里面需要赋值时通过此参数传值
data[‘init’] //选填 js函数
textcol //选填 当select为checkbox时必填 选择那些字段显示
name //必填 名称
value //选填 当编辑是必填 选中的值
emptytext //选填 为空时显示的内容

  • type="object" //必填
  • object="表名" //必填 格式为 mdl名或者[email protected]
  • select="radio or checkbox" //选填 默认为radio
    multiple="true" //当select为checkbox时,必填
    filter=array() or string //表的查询条件 选填
    app="appname" //选填 不填时 object的写法有变,如:[email protected]
    <{input type="Object" name="testobject" object="specification" multiple="true" select="checkbox" value=$value}>

4.Model

每个APP的model文件夹里,类名以APP名称_mdl_模型路经

获取本APP的model
$model = $this->app->model(‘$model’);
获取其他app的model
$model = app::get(‘b2c’)->model($model);
通用方法 kernel::single();
$model = kernel::single(‘b2cmdl$model’);

在model中获取数据库操作对象
$result = $this->db->select($sql); //注意model要继承base_db_model或则dbeav_model

通过kernel::database()直接获取数据库操作对象
$result = kernel::database()->select($sql);

常用方法:
. count 通过过滤器,取得对应表的数据行数

. getList 获取model对应表的单/多行数据, 可根据需要重载

. dump 获取model 对应表单行数据

. insert 插入单行数据, 会根据dbschema的type做转义处理

. save 保存数据,如果数据存在则做更新处理

. update 根据更新数据

. delete 根据条件删除数据

. beginTransaction, commit ,rollBack 事物处理

5.Route

应用中的大多数路都会定义在 bootstrap/routes.php 文件中。

基本 GET 路由

route::get('/', function()
{
    return 'Hello World';
});

基本 POST 路由

route::post('foo/bar', function()
{
    return 'Hello World';
});

注册一个可以响应任何HTTP动作的路由

route::any('foo', function()
{
    return 'Hello World';
});

仅支持HTTPS的路由

route::get('foo', array('https', function()
{
    return 'Must be over HTTPS';
}));

实际开发中经常需要根据路由生成 URL,URL::to方法就可以满足此需求:

$url = url::to(‘foo’);

路由参数

route::get('user/{id}', function($id)
{
    return 'User '.$id;
});

可选路由参数

route::get('user/{name?}', function($name = null)
{
    return $name;
});

带有默认值的可选路由参数

route::get('user/{name?}', function($name = 'John')
{
    return $name;
});

用正则表达式限定的路由参数

route::get('user/{name}', function($name)
{
    //
})
->where('name', '[A-Za-z]+');

route::get('user/{id}', function($id)
{
    //
})
->where('id', '[0-9]+');

传递参数限定的数组

当然,必要的时候你还可以传递一个包含参数限定的数组作为参数:

route::get('user/{id}/{name}', function($id, $name)
{
    //
})
->where(array('id' => '[0-9]+', 'name' => '[a-z]+'))

定义全局模式

如果希望在全局范围用指定正则表达式限定路由参数,可以使用 pattern 方法:

route::pattern('id', '[0-9]+');

route::get('user/{id}', function($id)
{
    // Only called if {id} is numeric.
});

命名路由

重定向和生成URL时,使用命名路由会更方便。你可以为路由指定一个名字,如下所示:

route::get('user/profile', array('as' => 'profile', function()
{   
 }));

还可以为 controller action指定路由名称:

route::get(‘user/profile’, array(‘as’ => ‘profile’, ‘uses’ => ‘[email protected]’));
现在,你可以使用路由名称来创建URL和重定向:

$url = url::route(‘profile’);

$redirect = redirect::route(‘profile’);
可以使用currentRouteName方法来获取当前运行的路由名称:

$name = route::currentRouteName();
同样可以使用路由器的controller action来创建URL和重定向:

$url = url::action(‘[email protected]’);

$redirect = redirect::action(‘[email protected]’);
可以使用route::current()->getActionName()方法来获取当前运行的路由名称:

route::current()->getActionName();注意: 在3.0.34及以后的版本变更为 route::currentAction

路由组

有时你可能需要为一组路由应用过滤器。使用路由组就可以避免单独为每个路由指定过滤器了:

route::group(array('before' => 'auth'), function()
{
    route::get('/', function()
    {
        // Has Auth Filter
    });

    route::get('user/profile', function()
    {
        // Has Auth Filter
    });
});

子域名路由

注册子域名路由

route::group(array('domain' => '{account}.myapp.com'), function()
{

    route::get('user/{id}', function($account, $id)
    {
        //
    });

});

路由前缀

可以通过prefix属性为组路由设置前缀:

为路由组设置前缀

route::group(array('prefix' => 'admin'), function()
{

    route::get('user', function()
    {
        //
    });

});

视图中URL生成

我们将用个例子进行说明:

route::get(‘user/profile’, array(‘as’ => ‘profile’, ‘uses’ => ‘[email protected]’));
根据action创建URL <{url [email protected]}>

根据路由创建URL <{url to=user/profile}>

根据路由名称来创建URL <{url route=profile}>

6.Middleware

WEB访问请求之前要处理的一些逻辑,一般做action前的验证、信息过滤处理功能。

中间件类存放位置$APP/middleware/里

在路由上增加访问中间件类
route::group(array(‘middleware’ => ‘topc_middleware_authenticate’), function() {

写法:

class topc_middleware_authenticate
{

    public function __construct()
    {

    }

    public function handle($request, Clousure $next)
    {
//这里处理请求的逻辑代码处理

        return $next($request);//下一个逻辑的的处理
    }
}

7.Event

介绍
在完成某个事件的时候,对事件监听的任务进行触发。 事件监听提供两个方式,动态监听和配置默认的事件监听。 并且对配置的事件监听任务提供同步和异步的快速转换,对于异步任务提供指定执行队列的配置。

1、应用程序中订阅事件,其中闭包的方式只支持同步模式。
event::listen(‘user.login’, function ($user) {
$user->loginTime = time();
$user->loginLog();
});

event::listen(‘user.login’, ‘pam_events_listeners_loginLog’, ‘sync’, 5);

async: 异步模式
sync: 同步模式

2、配置文件中订阅事件config/events.php,支持同步和异步两种模式。

<?php
/**
 * 返回注册的事件
 */
return [

    /*
    |--------------------------------------------------------------------------
    | 定义事件触发后需要执行的任务
    |--------------------------------------------------------------------------
    |
    */
    'listen' => [
        //触发事件后执行被监听的任务
        //第一个参数为执行任务的执行类和方法 执行方法未指定则默认为handle
        //第二个参数设置该任务为同步执行还是异步执行
        //第三个参数为执行任务的优先级,数值越大则越先执行,相同等级则按照顺序执行 默认为0
        //指定参数 queue 对应为该任务异步执行的队列 默认为system_tasks_events
        'test' => [
            ['system_events_listeners_testSync', 'sync'],
            ['[email protected]', 'async'],
        ],

        //前台商城用户登录成功触发的事件
        'user.login' => [
            //登录成功后设置购物车的数量到cookie
            ['[email protected]', 'sync'],
        ],

        //前台商城用户登出成功触发的事件
        'user.logout' => [
            //登出成功后清除cookie中购物车的数量
            ['[email protected]', 'sync'],
        ],

        //创建订单触发的事件任务
        'trade.create' => [
            //创建订单成功后清除购物车
            ['systrade_events_listeners_clearCart', 'sync'],

            //异步
            //创建订单后生成订单日志
            ['[email protected]', 'async'],
            ['[email protected]', 'async'],
            //更新活动商品销量
            ['systrade_events_listeners_upActivitySalesCount', 'sync'],
            //消息通知到prism
            ['[email protected]', 'async','queue'=>'system_tasks_notifyPrism'],
        ],

3、触发事件
$response = event::fire(‘user.login’, array([‘key1’=>’value1′,’key2’=>’value2’]) );
程序中可根据触发事件执行后返回的响应数组($respons)做后续操作。

订阅可同步异步相互转化的事件

您可以在订阅事件的时候指定监听任务的同步模式和异步模式,只有具体执行事件任务类implements base_events_interface_queue接口类才可以对该监听任务由同步模式转为异步模式, 否则执行的还是同步模式。

//订单支付完成触发的事件任务
'trade.pay' => [
  //订单付款成功记录日志
  ['systrade_events_listeners_payTradeLog', 'async'],
],

其中付款完成记录日志的监听任务

class systrade_events_listeners_payTradeLog implements base_events_interface_queue {
}

订阅有优先顺序的事件

您也可以在订阅事件的时候指定一个优先顺序。 有较高优先权的监听者会先被执行,当监听者有一样的优先权时将会依照订阅的顺序执行. 如果在订阅的时候没有指定优先级那么默认为0。

告诉我们优先权高的先执行,没设置默认为0;

1、应用程序中订阅

event::listen('user.login', '[email protected]', 'sync', 10);
event::listen('user.login', 'pam_events_listeners_loginLog', 'sync', 5);

2、config/events.php中配置注册订阅

'listen' => [
'user.login' => [
  ['system_events_listeners_testSync', 'sync', 2 ],
  ['[email protected]', 'async', 4 ],
],
],

订阅指定异步监听任务队列的事件

您可以在订阅事件的时候指定执行异步监听任务的队列。新增一个queue的参数。 默认使用system_tasks_events对应执行异步监听任务。

1、应用程序中订阅

event::listen('user.login', 'system_events_listeners_testaSync', 'async', 10, 'system_tasks_notifyPrism');

2、config/events.php中配置注册订阅

'listen' => [
'user.login' => [
  ['system_events_listeners_testSync', 'async', 2, 'queue'=>'system_tasks_notifyPrism'],
],
],

停止继续传递事件

您有时候会希望停止继续传递事件到其他监听者。 您可以通过从监听者回传 false 来做到这件事:

event::listen('user.login', function($user)
{
    // Handle the event...

    return false;
});

测试用例

在框架中本身提供了触发事件的测试用例

执行测试用例命令,执行测试用例文件app/base/testcase/testEvent.php

./cmd dev:test do base testEvent.php

触发订阅的事件,测试用例文件中的订阅和配置注册的订阅

8.config/events.php

'listen' => [
'test' => [
  ['system_events_listeners_testSync', 'sync'],
  ['[email protected]', 'async'],
],
],

配置方式注册的订阅执行类在app/system/lib/events/listeners目录中。


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明B2B2C开发总结 – bbc商派TP认证考核关键点总结(一)
喜欢 (0)
[开心洋葱]
分享 (0)
关于作者:
开心洋葱,开心洋葱头,水墨

您必须 登录 才能发表评论!

(1)个小伙伴在吐槽
加载中……