2012-02-02 15 views
25

Estoy aprendiendo ZF2.0 beta. En ZF1 podemos cambiar el diseño sobre la marcha en el controlador:Cambiar el diseño en el controlador de Zend Framework 2.0

Zend_Layout::getMvcInstance()->setLayout('layoutname'); 

Pero en ZF2.0 Zend \ clase de diseño no tiene método getMvcInstance(). Creo que se puede hacer mediante inyecciones de dependencia, pero no estoy seguro.

Respuesta

58

La ZF2 está muy desarrollada y no se puede garantizar la forma en que funciona ahora, será la forma en que funciona cuando ZF2 alcanza un estado estable.

Sin embargo, la nueva capa de vista de Zend \ MVC es fusionó recientemente por lo que debe ser capaz de hacer esto ahora (con el maestro actual):

public function somethingAction() 
{ 
    // Do some intelligent work 

    $this->layout('layout/different'); 
} 
+1

Estoy tratando de usar este enfoque, pero no obtengo el resultado. El diseño sigue siendo estándar ('diseño/diseño'). ¿Por qué no funciona? Puede leer más sobre mi problema [aquí] (http://stackoverflow.com/questions/23690184/how-to-change-layout-in-controller-in-zendframework2). –

3

También tendrá que establecer el diseño, ya sea en el arranque o al usar di. Di ejemplo:

'Zend\View\Resolver\TemplateMapResolver' => array(
     'parameters' => array(
      'map' => array(
      'layout/different' => __DIR__ . '/../view/layout/different.phtml', 
      ), 
     ), 
    ), 
8

La mejor manera que he encontrado para establecer las plantillas en las acciones es así

public function someAction() { 
    $viewModel = new ViewModel(); 
    $viewModel->setTemplate('layout/custom'); 

    return $viewModel; 
} 

En su module.config.php asegurarse de que haya definido su ruta adecuada template_map.

'view_manager' => array(
    'template_map' => array(
     'layout/custom' => __DIR__ . '/../view/layout/custom.phtml' 
    ), 
), 
+5

Esto configurará la vista, pero no el diseño, como solicitó el autor. –

3

He intentado con los consejos anteriores.

public function somethingAction() 
{ 
    // Do some intelligent work 

    $this->layout('layout/different'); 
} 

Obtuve el resultado correcto con este fragmento.

public function someAction() { 
    $viewModel = new ViewModel(); 
    $viewModel->setTemplate('layout/custom'); 

    return $viewModel; 
} 

Es inverosímil ambos diseños (por defecto & módulo actual).

+0

Encontré el mismo resultado. Creo que es importante que diferenciemos entre diseño y plantilla. Para cambiar el diseño, deberíamos usar $ this-> layout ('layout/different'); en lugar de la función setTemplate. –

+0

El código en su fragmento establecerá qué vista se representará, no el diseño. –

7
public function someAction() { 
    $layout = $this->layout(); 
    $layout->setTemplate('layout/custom'); 
    $viewModel = new ViewModel(); 
    return $viewModel; 
} 
+0

Solución perfecta para diseños múltiples al cambiar los diseños existentes –

+0

Parece que funciona, pero el ID no funciona para mí :([image] (http://i.gyazo.com/2082ae68e20ade4edee81858f6ae9b8f.png) que muestra mi código. I no sé por qué no funciona: '( –

Cuestiones relacionadas