Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework2 ZF2-为供应商控制器操作设置模板_Zend Framework2 - Fatal编程技术网

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

Zend framework2 ZF2-为供应商控制器操作设置模板,zend-framework2,Zend Framework2,我正在使用ZfcUser,需要设置自定义登录/注册页面模板。最初我是如何做到这一点的很简单 我在Application/Module.config.php文件中设置了登录模板: 'login/layout' => __DIR__ . '/../view/login/login.phtml', 然后在实际的供应商控制器中,我添加了以下内容: $this->layout('login/layout'); 这很好用 但问题是,供应商目录由composer管理,任何

我正在使用ZfcUser,需要设置自定义登录/注册页面模板。最初我是如何做到这一点的很简单

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

'login/layout'            => __DIR__ . '/../view/login/login.phtml',
然后在实际的供应商控制器中,我添加了以下内容:

$this->layout('login/layout');
这很好用

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

在ZfTalk上,有人建议我可以“覆盖”ZfcUser的一些服务。老实说,我不知道覆盖服务意味着什么,也不知道如何覆盖服务

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

大概是这样的:

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

有什么更好的实施方法吗?

您应该永远不要编辑供应商目录中的任何内容

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


干杯

试着理解塞尔吉奥提供的建议这就是我现在理解“超车”模块设置的方式:

由于设置存储在数组中,我们有机会只需将新设置包含在一个模块中(在config/application.config.php文件中)并使用与供应商设置相同的键,就可以重写供应商设置

我的目标是为我的登录页面使用不同的模板,并扩展ZfcUser功能。为了做到这一点,我需要创建一个新模块(ZFCoolbox),它将允许我超越某些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文件结构如下:

<?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';
    }

}
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';
    }

}

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

要解决您的问题: 在您拥有的Module.php(用于覆盖原始ZfcUser模块)中,您需要将一个函数附加到事件路径,然后检查匹配的路径,并覆盖要更改布局的路径的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');
        }
    });

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

请查看我添加的问题的答案。我读了你的帖子,大约90%都在那里。。。我只是在努力找到正确的路线。谢谢我真的试图让其他方法发挥作用,但它们太复杂了。这种方法最简单。谢谢
Fatal error: Class 'Zftoolbox/Controller/NewUserController' not found in
/trunk/vendor/zendframework/zendframework/library/
Zend/ServiceManager/AbstractPluginManager.php on line 170
    $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');
        }
    });