11

我应该如何将自定义样式应用于供应商模块的表单或将其嵌入到我自己的视图脚本中?更具体地说,我想使用 EdpUser 模块 (https://github.com/EvanDotPro/EdpUser) 提供的表单。

最简单的方法似乎是直接修改供应商的脚本。但显然这会与供应商未来的更新相冲突。

另一种方法似乎是将供应商的控制器复制到我自己的模块中,然后提供我自己的视图。但是,这会遇到与供应商未来更新不同步的类似问题。而且我必须小心命名空间。

也许我应该扩展供应商的控制器而不是复制它。这应该适用于命名空间,并且我应该能够很容易地访问我的控制器中的表单。在使用我自己的视图脚本时。这是正确的方法还是有更好的方法?

谢谢

4

1 回答 1

36

不推荐修改模块目录中的任何内容/vendor/,尤其是那些放在. 这也是必须将配置模板复制到您自己的/config/autoload/目录的原因。

一个模块必须提供足够的扩展点以使其足够灵活以供您使用。这些可能性包括以下选项:

更改路线

ZfcUser 模块在 /user url 下注册自己。例如,如果您想将其更改为 /account,您可以简单地将其添加到您的配置中:

<?php
return array(
    'di' => array(
        'instance' => array(
            'Zend\Mvc\Router\RouteStack' => array(
                'parameters' => array(
                    'routes' => array(
                        'zfcuser' => array(
                            'options' => array(
                                'route' => '/account',
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
);

更换控制器

如果您不满意ZfcUser\Controller\UserController使用该控制器并且想要覆盖此控制器中的某些操作,您可以创建一个自定义控制器,例如MyUser\Controller\UserController. 如果您扩展ZfcUser\Controller\UserController并提供此配置,您就可以开始了:

<?php
return array(
    'di' => array(
        'instance' => array(
            'Zend\Mvc\Router\RouteStack' => array(
                'parameters' => array(
                    'routes' => array(
                        'zfcuser' => array(
                            'options' => array(
                                'defaults' => array(
                                    'controller' => 'MyUser\Controller\UserController'
                                ),
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
);

您还可以使用 DI 别名来覆盖zfcuserDI 配置中的别名:

<?php
return array(
    'di' => array(
        'instance' => array(
            'alias' => array(
                'zfcuser' => 'MyUser\Controller\UserController'
            ),
        ),
    ),
);

修改表单实例

例如,ZfcUser 模块触发几个事件来帮助其他模块挂钩到表单创建过程。两个ZfcUser\Form\Loginas在设置所有表单元素后都会ZfcUser\Form\Register触发一个事件。init这使您有机会添加或删除元素。

use Zend\EventManager\StaticEventManager;

$events = StaticEventManager::getInstance();
$events->attach('ZfcUser\Form\Login', 'init', function ($e) {
  $form = $e->getTarget();
  $form->addElement('text', 'something-new');
});

在这里我需要说两句:

  1. 每个模块都必须提供自己的触发器。这个 ZfcUserinit在两种形式上都有,但这并不是每个模块都给定的。您必须查看文档或源代码才能了解这一点。
  2. 目前Zend\EventManager正在重构中,StaticEventManager用一个SharedEventManager可以通过Zend\Di定位器实例化的实例来替换单例。您可以在此 Pull Request中查看此重构的进度。

更改视图或表单呈现

根据此 RFCZend\Form组件可能会更改。特别是对于渲染,装饰器将被删除,“只是”普通视图助手将渲染表单。有了这个,加上覆盖视图的可能性,只需使用另一个只有一些视图脚本的模块就可以很容易地更改动作的呈现。

如果您创建自己的模块并提供此配置,则会将新位置添加到模板路径堆栈:

<?php
return array(
    'di' => array(
        'instance' => array(
            'Zend\View\Resolver\TemplatePathStack' => array(
                'parameters' => array(
                    'paths' => array(
                        'myuser' => __DIR__ . '/../view',
                    ),
                ),
            ),
        ),
    ),
);

现在您可以在模块view目录中创建视图脚本。如果您的模块名为“MyUser”并且位于下面/modules/MyUser,并且您想从 ZfcUser 覆盖登录视图脚本(位于 中/vendor/ZfcUser/view/zfcuser/login.phtml,请在/modules/MyUser/view/zfcuser/login.phtml.

于 2012-03-21T09:59:10.573 回答