Skip to content

事件钩子开发

GetPosterType 海报类型事件钩子

使用场景:定义海报类型,用于添加海报时选择海报类型,以及后续业务处理。插件可以添加自定义的海报类型。

在事件配置中注册

在插件的 app/event.php 文件中注册事件监听器: 关键代码:

php
return [
    // ...
    'GetPosterType' => ['addon\shop\app\listener\poster\ShopPosterType'],
    // ...
];

实现事件监听器

创建事件监听器类: 关键代码:

php
<?php
declare ( strict_types = 1 );

namespace addon\shop\app\listener\poster;

class ShopPosterType
{
    /**
     * 海报
     * @param array $data
     * @return array
     */
    public function handle($data = [])
    {
        return [
            [
                'type' => 'shop_goods', // 海报类型关键字
                'addon' => 'shop', // 所属插件key标识
                'name' => '商品海报', // 海报类型名称
                'desc' => '推广商品,分享后进入商品详情页', // 海报类型描述
                'icon' => 'addon/shop/poster/type_shop_goods.png' // 海报预览图
            ],
            [
                'type' => 'shop_point_goods',
                'addon' => 'shop',
                'name' => '积分商品海报',
                'desc' => '推广积分商品,分享后进入积分商品详情页',
                'icon' => 'addon/shop/poster/type_shop_goods.png'
            ]
        ];
    }
}

GetPosterData 海报数据事件钩子

使用场景:根据不同的海报类型,提供海报数据,自行编写业务逻辑相关代码。

在事件配置中注册

在插件的 app/event.php 文件中注册事件监听器: 关键代码:

php
return [
    // ...
    'GetPosterData' => ['addon\shop\app\listener\poster\ShopPoster'],
    // ...
];

实现事件监听器

创建事件监听器类: 关键代码:

php
<?php
declare ( strict_types = 1 );

namespace addon\shop\app\listener\poster;

use app\service\core\sys\CoreSysConfigService;

/**
 * 商品海报数据
 */
class ShopPoster
{
    /**
     * 商品海报
     * @param $data
     * @return array
     */
    public function handle($data)
    {
        $type = $data[ 'type' ];
        if ($type == 'shop_goods') {
            // 商品 海报模板数据
            $site_id = $data[ 'site_id' ];
            $param = $data[ 'param' ];
            $sku_id = $param[ 'sku_id' ] ?? 0;
            $mode = $param[ 'mode' ] ?? '';
            $url_data = [];

            if ($mode == 'preview') {
                // 预览模式
                $url_data = [
                    [ 'key' => 'sku_id', 'value' => $sku_id ]
                ];
                $return_data = [
                    'nickname' => '会员昵称',
                    'headimg' => 'static/resource/images/default_headimg.png',
                    'goods_name' => '商品名称',
                    'goods_price' => '¥369.00',
                    'goods_img' => 'addon/shop/goods_template.png',
                    'url' => [
                        'url' => ( new CoreSysConfigService() )->getSceneDomain($site_id)[ 'wap_url' ],
                        'page' => 'addon/shop/pages/goods/detail',
                        'data' => $url_data,
                    ],
                ];
                return $return_data;
            }

            $return_data = [
                'goods_name' => '商品名称',
                'goods_price' => '¥100.00',
                'goods_img' => 'addon/shop/goods_template.png',
                'url' => [
                    'url' => ( new CoreSysConfigService() )->getSceneDomain($site_id)[ 'wap_url' ],
                    'page' => 'addon/shop/pages/goods/detail',
                    'data' => $url_data,
                ],
            ];
            if (!empty($member_info)) {
                $return_data[ 'nickname' ] = mb_strlen($member_info[ 'nickname' ]) > 10 ? mb_substr($member_info[ 'nickname' ], 0, 7, 'utf-8') . '...' : $member_info[ 'nickname' ];
                $return_data[ 'headimg' ] = $member_info[ 'headimg' ];
            }
            return $return_data;
        } elseif ($type == 'shop_point_goods') {
            // 积分商品 海报模板数据
        }
    }
}

框架已封装获取海报的方法,代码位置如下: niucloud\app\service\core\poster\CorePosterService.php

基于 MIT 协议发布