【问题标题】:Zend Framework 2 display a view within a viewZend Framework 2 在视图中显示视图
【发布时间】:2012-10-05 09:54:04
【问题描述】:

我有两个模块 Admin 和 Login。

我想在管理视图“index.html”中显示登录视图“login.phtml”

我在管理模块 indexAction 控制器中有以下内容

public function indexAction()
{    
    $login = new LoginController();

    $view = new ViewModel(array(
        'theloginform' => $login->loginAction(),
    ));

    return $view;
}

在 Login 控制器的 LoginAction 方法中,我返回“login.phtml”文件的 ViewModel。

public function LoginAction() {
       $view = new ViewModel();
       return $view;
}

indexAction 引发错误,因为变量 'theloginform' 是一个对象。

Catchable fatal error: Object of class Zend\View\Model\ViewModel could not be converted to string in...

如果我添加以下内容:

$authentication->loginAction()->captureTo('test')

“index.phtml”显示字符串“内容”。

我已经读到我可能需要在将 ViewModel 分配给视图变量“theloginform”之前渲染它,但我似乎无法让它工作,我尝试了以下方法但没有运气。

public function LoginAction() {

    $view = new ViewModel();

    $renderer = new PhpRenderer();
    $resolver = new Resolver\AggregateResolver();
    $map = new Resolver\TemplateMapResolver(array(
            'login'      => __DIR__ . '/../view/login.phtml'

    ));
    $resolver->attach($map);
    $view->setTemplate("login");
    return $renderer->render($view);
}

如果出现以下错误:

Zend\View\Renderer\PhpRenderer::render: Unable to render template "login"; resolver could not resolve to a file

我什至尝试将 DI 添加到 autoload_classmap.php 文件中,但仍然出现相同的错误,我仔细检查了 login.phtml 文件的路径是否正确:

'/Login/view/login/login/login.phtml' 我什至把它复制到了'/Login/src/Login/view/login.phtml'

非常困惑已经阅读然后重新阅读 Zend 文档,我只是想将一个视图传递给另一个视图......

【问题讨论】:

标签: php zend-framework2


【解决方案1】:

如果您需要共享一些视图内容,您可以使用部分内容:

$this->partial('partial/login.pthml', array()); //add this to your index view

你可以阅读他们here

您还可以找到一些有用的信息:How does Zend Framework 2 render partials inside a module?

【讨论】:

  • 谢谢您,您将如何使用 'Login/view/login/login/login.phtml' 文件作为 'Admin/view/admin/admin/index.phtml' 中的部分视图?您是否必须在某处将 login.phtml 文件注册为部分帮助程序?
  • 您的应用程序设计错误,在大多数情况下,视图文件应该由特定的控制器调用:动作。如果您发现网站的某些部分想要重用,请为此创建部分部分。就像在这种情况下,它可能是登录表单。然后它可以提交给一些控制器动作,然后在控制器上你决定如何处理结果,重定向到某个地方或显示一些结果。
【解决方案2】:

根据this zf2 文档页面

在登录动作中写下这个:

    public function loginAction()
    {
        return new ViewModel();
    }

在 indexAction 中:

    $view = new ViewModel(
                  array(
                    //here any thig you want to assign to index view
                  )
                );
    $loginView = new ViewModel(
                  array(
                        //here any thig you want to assign to login view
                    )
                );


    $loginView->setTemplate('moduleName/controllerName/login'); 

    $view->addChild($loginView, 'login');
    return $view

在 index.phtml 中,你可以在任何你想显示 loginView 的地方回显登录 <? echo $this->login ?>

【讨论】:

  • 如果我在控制器中有这样的东西怎么办:" $viewModel->addChild($formViewModel, $studEvalId);" ?在不知道控制器中用于 addChild() 的 captureTo 的情况下,如何在 .phtml 文件中回显子 viewModel?
【解决方案3】:

在 ZF 1.x 中,我可能会建议您构建一个引用视图占位符或控制器插件的动作助手,该插件会回调 loginAction 以获取表单逻辑。

在 Zf2 中,动作助手似乎已被controller plugins 取代,并且似乎是通过event manager 触发的,并且可能需要注意"managers" 中的一个或多个。但是placeholder view helper 仍然存在,甚至看起来有些熟悉。

我建议您考虑为您的登录表单显示构建/调整一个控制器插件,然后可以将其附加到占位符视图助手。如果幸运的话,您可能只需要一个视图助手即可获得所需的功能。

我希望我能提供更多帮助,但我自己还在涉水这个烂摊子。

祝你好运。

【讨论】:

  • 感谢我目前正在构建控制器插件的指针,尝试了部分帮助程序,但它不适用于表单对象。目前我自己正在与 zend 框架作战,卡在 httpRequest 对象上,特别是如何获取当前请求,可能会打开另一张票 :)
  • 刚刚阅读了关于 httpRequest 的 serviceManager....对框架的完全误解 Zend 框架是什么野兽!
【解决方案4】:

在您的管理视图中,您必须使用渲染视图助手并回显渲染的脚本,因此您可以执行 echo $this->render($this->theloginform);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多