重写 block 不生效问题

问题咨询 · unliu · 于 3年前 发布 · 1230 次阅读

如题,参照文档:http://www.fecmall.com/doc/fecshop-guide/develop/cn-2.0/guide-fecmall-rewrite-func.html#8rewritemapblock-model

尝试重写 Cms\block\home\Index 不生效。

修改的配置文件:/appfront/config/fecshop_local.php

$fecRewriteMap = [
    // 下面是一个重写的格式例子
    // '\fecshop\app\appfront\modules\Cms\block\home\Index'  => '\fectfurnilife\appfront\modules\Cms\block\home\Index',
    '\fecshop\app\appfront\modules\Cms\block\home\Index' => '\appfront\local\local_modules\Cms\block\home\Index',
];

Block 文件:/appfront/local/local_modules/Cms/block/home/Index.php

    public function getLastData()
    {
        return [
            'test_var' => 'hello world'
        ];
    }

实际在模板中并不能输出 $test_var(如果在 addons 里对应 block 文件则能够输出)。

另外我发现如果修改addons/fecyo/config.php,把 fecRewriteMap 对应部分注释掉,如下:

                // 重写model和block
                'fecRewriteMap' => [
                    '\fecshop\app\appfront\modules\Catalog\block\category\Index'  => '\fecyo\app\appfront\modules\Catalog\block\category\Index',
                    // '\fecshop\app\appfront\modules\Cms\block\home\Index'  => '\fecyo\app\appfront\modules\Cms\block\home\Index',

是不影响 addons 里面 block 文件使用的。说明似乎这一行 fecRewriteMap 并没有实际起作用(但其它行如 block\category\Price 的 rewrite 测试是起作用的)。

版本:fecmall 2.8.1 fecyo 1.8.8

解决问题过程中基本上遍历了论坛上所有跟 block 重写相关的帖子,但仍未搞定。求助作者,希望可以提供解决思路,感谢!

共收到 3 条回复
unliu#13年前 0 个赞

看了下,似乎是因为 fecyo\app\appfront\modules\Cms\controllers\HomeController.php 里把 $blockNamespace 写死了。除了直接修改这个文件,还有什么办法么?

Fecmall#23年前 0 个赞

重写\fecyo\app\appfront\modules\Cms\block\home\Index,有2种方法:

1.直接重写block,如下:

'fecRewriteMap' => [
	'\fecyo\app\appfront\modules\Cms\block\home\Index'  => '\appfront\local\local_models\Cms\block\home\Index',
]                   

新建 @appfront\local\local_models\Cms\block\home\Index.php 让这个php类继承 \fecyo\app\appfront\modules\Cms\block\home\Index 类即可

对于你说的那个重写配置,的确是没用了,因为fecyo里面的Homecontroller将$blockNamespace的值改了,因此,如果想通过fecRewriteMap重写block,重写的block文件是\fecyo\app\appfront\modules\Cms\block\home\Index

2.新建本地controller,重写controller,然后将public $blockNamespace = 'fecyo\app\appfront\modules\Cms\block';改成您自己的block路径,这种方式需要将这个controller下面的所有的block都要重写,适合重写整个controller的时候(不过,HomeController.php这个只有一个action方法,因此也是可以的)

unliu#33年前 0 个赞

收到,感谢!

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics