我使用的是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
有关更好的实施方式的想法吗?
答案 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文件结构如下:
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)
答案 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');
}
});
我不确定这是最好的解决方案,但它确实有效。