2017-08-09 2 views

Répondre

2

Veillez à utiliser setTemplate()

MycontrollerControllerFactory.php

<?php 

namespace Application\Controller\Service; 

use Application\Controller\MycontrollerController; 
use Interop\Container\ContainerInterface; 
use Zend\ServiceManager\Factory\FactoryInterface; 

class MycontrollerControllerFactory implements FactoryInterface 
{ 
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
    { 
     $controller = new MycontrollerController(); 
     $controller->setRenderer($container->get('Zend\View\Renderer\PhpRenderer')); 
     return $controller; 
    } 
} 

MycontrollerController.php

<?php 

namespace Application\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

class MycontrollerController extends AbstractActionController 
{ 
    /** 
    * @var \Zend\View\Renderer\PhpRenderer 
    */ 
    protected $renderer; 

    /** 
    * @return \Zend\View\Renderer\PhpRenderer 
    */ 
    public function getRenderer() 
    { 
     return $this->renderer; 
    } 

    /** 
    * @param \Zend\View\Renderer\PhpRenderer $renderer 
    * @return self 
    */ 
    public function setRenderer($renderer) 
    { 
     $this->renderer = $renderer; 
     return $this; 
    } 

    public function firstAction() 
    { 
     if ($this->yourMethod()) { 
      $secondView = $this->secondAction(); 
      $html = $this->getRenderer()->render($secondView); 
     } 

     $view = new ViewModel(); 
     $view->setTemplate('namespace/my-controller/first'); 
     return $view; 
    } 

    public function secondAction() 
    { 
     $view = new ViewModel(); 
     $view->setTemplate('namespace/my-controller/second'); 
     return $view; 
    } 
} 
+0

Cela a été utile, mais j'ai encore besoin de plus d'aide. Disons que j'ai fait ceci '$ otherViewModel = $ this-> secondAction();', maintenant je veux obtenir le html rendu de ce modèle de vue, quelque chose comme '$ html = $ otherViewModel-> some_render_function()', comment faire cette? – evilReiko

+0

J'ai modifié ma réponse ;-) –

+0

OMG c'est parfait! : D – evilReiko

1

Alors, je propose de créer un nouveau plugin 'htmlRender':

module.config.php

'controller_plugins' => [ 
    'factories' => [ 
     'htmlRender' => Application\Mvc\Controller\Plugin\Service\HtmlRenderFactory::class, 
    ], 
], 

HtmlRenderFactory.php

<?php 
namespace Application\Mvc\Controller\Plugin\Service; 

use Application\Mvc\Controller\Plugin\HtmlRender; 
use Interop\Container\ContainerInterface; 
use Zend\ServiceManager\Factory\FactoryInterface; 
use Zend\View\Renderer\PhpRenderer; 

class HtmlRenderFactory implements FactoryInterface 
{ 
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
    { 
     $plugin = new HtmlRender(); 
     $plugin->setRenderer($container->get(PhpRenderer::class)); 
     return $plugin; 
    } 
} 

HtmlRender.php

<?php 
namespace Application\Mvc\Controller\Plugin; 

use Zend\Mvc\Controller\Plugin\AbstractPlugin; 
use Zend\View\Renderer\RendererInterface; 

class HtmlRender extends AbstractPlugin 
{ 
    /** 
    * @var \Zend\View\Renderer\PhpRenderer 
    */ 
    protected $renderer; 

    /** 
    * @param string|\Zend\View\Model\ModelInterface $nameOrModel 
    * @param null|array|\Traversable $values 
    * @param string|bool|\Zend\View\Model\ModelInterface $layout 
    * @return string 
    */ 
    public function __invoke($nameOrModel, $values = null, $layout = false) 
    { 
     $content = $this->getRenderer()->render($nameOrModel, $values); 
     if (!$layout) { 
      return $content; 
     } 

     if (true === $layout) { 
      $layout = 'layout/layout'; 
     } 
     return $this->getRenderer()->render($layout, [ 
      'content' => $content, 
     ]); 
    } 

    /** 
    * @return \Zend\View\Renderer\PhpRenderer 
    */ 
    public function getRenderer() 
    { 
     return $this->renderer; 
    } 

    /** 
    * @param \Zend\View\Renderer\PhpRenderer|RendererInterface $renderer 
    * @return self 
    */ 
    public function setRenderer(RendererInterface $renderer) 
    { 
     $this->renderer = $renderer; 
     return $this; 
    } 
} 

Utilisation dans Mycontrolle rController.php

<?php 
class MycontrollerController extends AbstractActionController 
{ 
    public function firstAction() 
    { 
     if ($this->yourMethod()) { 
      // Option 1 without layout 
      $html = $this->htmlRender($secondView); 
      // Option 2 without layout 
      $html = $this->htmlRender('namespace/my-controller/second', $yourVariables)); 

      // Option 1 with layout 
      $html = $this->htmlRender($secondView, null, true); 
      //$html = $this->htmlRender($secondView, null, 'layout/my-custom-layout'); 
      // Option 2 with layout 
      $html = $this->htmlRender('namespace/my-controller/second', $yourVariables, true)); 
      //$html = $this->htmlRender('namespace/my-controller/second', $yourVariables, 'layout/my-custom-layout'); 
     } 

     $view = new ViewModel(); 
     $view->setTemplate('namespace/my-controller/first'); 
     return $view; 
    } 

    public function secondAction() 
    { 
     $view = new ViewModel(); 
     $view->setTemplate('namespace/my-controller/second'); 
     return $view; 
    } 
} 
+0

Très bien, votre réponse contient en fait plusieurs réponses que je me suis demandé! L'utilisation du plugin personnalisé pourrait être une bonne idée, mais dans mon cas, tout ce que je voulais savoir (que je viens de publier) est comment utiliser le phpRenderer. Merci beaucoup. Je vais garder votre première réponse comme réponse correcte car elle répond à la question initiale – evilReiko