ZF2 - 为供应商控制器操作设置模板

时间:2014-04-29 21:27:38

标签: zend-framework2

我使用的是ZfcUser,需要设置自定义登录/注册页面模板。最初我如何实现这一点非常简单。

我在Application / Module.config.php文件中设置了登录模板:

'login/layout'            => __DIR__ . '/../view/login/login.phtml',

然后在实际的供应商控制器中添加了以下内容:

$this->layout('login/layout');

这很有效。

但问题是供应商目录由作曲家管理,任何更改都会覆盖我的修改。

在ZfTalk上,我建议我可以“覆盖”ZfcUser的一些服务。说实话,我不知道覆盖服务意味着什么,或者如何去做。

我在想的是在Application模块的构造函数中编写一个简单的检查,它只是查看正在调用的模块/操作并相应地提供布局。

这样的事情:

//get page string
//if string parts = user / login set template to login template

有关更好的实施方式的想法吗?

3 个答案:

答案 0 :(得分:3)

试图理解塞尔吉奥提供的建议,这就是我现在所理解的"过度骑行"模块设置:

由于设置存储在数组中,因此我们只需将新设置包含在供应商模块之后调用的模块中(在config / application.config.php文件中)并使用与供应商设置相同的密钥。

我的目标是为登录页面使用不同的模板并扩展ZfcUser功能。为了做到这一点,我需要创建一个新模块(Zftoolbox),这将允许我超越某些ZfcUSer设置。

以下不是100%工作:

 'modules' => array(
    'ZfcBase',             //Basic apps for ZfcUser and BjyAuthorize found in .vendors
    'ZfcUser',             //User login, logout, sessions, authentication etc. found in 
    'Application',         //The applications main functions run from this module
    'Zftoolbox',           //Applications override settings are stored here
),

我的Zftoolbox文件结构如下:

enter image description here module.php文件如下:

<?php
namespace Zftoolbox;
use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\ModuleManager\Feature\ConfigProviderInterface;

class Module implements AutoloaderProviderInterface, ConfigProviderInterface
{
    public function getAutoloaderConfig()
    {
    return array(
        'Zend\Loader\ClassMapAutoloader' => array(
            __DIR__ . '/autoload_classmap.php',
        ),
        'Zend\Loader\StandardAutoloader' => array(
            'namespaces' => array(
                __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
            ),
        ),
    );
}

    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }

}

NewUserController.php文件

<?php
namespace Zftoolbox\Controller;

use ZfcUser\Controller\UserController;

class NewUserController extends UserController
{

    public function newindexAction()
    {
        $this->layout('login/layout');
        $this->indexAction();
    }

    public function newloginAction()
    {
        $this->layout('login/layout');
        $this->loginAction();
    }
}

和Module.config.php

<?php
return array(

'controllers' => array(
    'invokables' => array(
        'zfcuser2' => 'Zftoolbox/Controller/NewUserController',
    ),
),

'router' => array(
    'routes' => array(
        'zfcuser' => array(
            'type' => 'Literal',

            'child_routes' => array(
                'login' => array(
                    'type' => 'Literal',
                    'options' => array(
                        'route' => '/login',
                        'defaults' => array(
                            'controller' => 'zfcuser2',
                            'action'     => 'newlogin',
                        ),
                    ),
                ),

                'register' => array(
                    'type' => 'Literal',
                    'options' => array(
                        'route' => '/register',
                        'defaults' => array(
                            'controller' => 'zfcuser2',
                            'action'     => 'newregister',
                        ),
                    ),
                ),



            ),
        ),
    ),
),
);

因此,原则上的想法是创建一个到我的NewUserController的新路由,在那里我设置模板,然后调用原始的loginAction。

然而,此当前设置调用以下路由错误:

Fatal error: Class 'Zftoolbox/Controller/NewUserController' not found in
/trunk/vendor/zendframework/zendframework/library/
Zend/ServiceManager/AbstractPluginManager.php on line 170

答案 1 :(得分:0)

您应该从不编辑供应商目录中的任何内容。

无论如何,我刚刚在几分钟之前回答了一个非常类似的问题here

干杯

答案 2 :(得分:0)

如Sergio所说,不要修改供应商文件夹中的文件,这是错的!

解决您的问题: 在您拥有的Module.php中(用于覆盖原始ZfcUser模块),您需要将一个函数附加到事件EVENT_ROUTE,然后检查匹配的路由并覆盖ViewModel模板以获取您希望布局更改的路径。这是代码:

    $e->getApplication()->getEventManager()->attach(MvcEvent::EVENT_ROUTE, function(MvcEvent $e) {
        $routeMatch = $e->getRouteMatch();
        if($routeMatch->getParam('action') == 'login' || $routeMatch->getParam('action') == 'register') {
            $e->getViewModel()->setTemplate('layout/login');
        }
    });

我不确定这是最好的解决方案,但它确实有效。