Envío de variables al diseño en Zend Framework
zend-framework layout (8)
Bueno, supongo que puedes tener otra solución creando view helper ... crea un archivo en application / views / helper y abc.php
quieras abc.php
luego coloca el siguiente código allí.
class Zend_View_helper_abc {
static public function abc() {
$html = ''YOUR HTML'';
return $html;
}
}
Entonces puedes usar esta ayuda en el diseño como ...
<?= $this->abc() ?>
En mi proyecto, tengo una serie de elementos dinámicos que están consistentemente en cada página. Los he puesto en mi layout.phtml
Mi pregunta es: ¿cómo puedo enviar variables a mi diseño desde mis controladores?
Si quiero enviar cosas desde mi controlador, puedo usar:
$this->view->whatever = "foo";
Y recíbelo en la vista con
echo $this->whatever;
No puedo entender cómo hacer lo mismo con mi diseño. Tal vez hay una mejor manera de resolver el problema?
Como nota al margen, si envía json en algún momento de su aplicación, tenga cuidado de que las variables de vista global no se envíen con la respuesta.
El diseño es una vista, por lo que el método para asignar variables es el mismo. En su ejemplo, si hiciera eco de $ this-> lo que sea en su diseño, debería ver el mismo resultado.
Un problema común es cómo asignar las variables que utiliza en cada página a su diseño, ya que no desea tener que duplicar el código en cada acción del controlador. Una solución para esto es crear un complemento que asigne estos datos antes de que se represente el diseño. P.ej:
<?php
class My_Layout_Plugin extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$layout = Zend_Layout::getMvcInstance();
$view = $layout->getView();
$view->whatever = ''foo'';
}
}
luego registre este complemento con el controlador frontal, por ej.
Zend_Controller_Front::getInstance()->registerPlugin(new My_Layout_Plugin());
He implementado un controlador base que extienden todos los demás controladores.
Entonces tengo un controlador ...
<?php
class BaseController extends Zend_Controller_Action
{
public function init()
{
$this->view->foo = "bar";
}
}
y en el diseño y / o vista
<?= $this->foo ?>
Las variables de vista estándar están disponibles si usa el diseño dentro del MVC. En el archivo bootstrap, incluye esto:
Zend_Layout::startMvc();
Luego debe decirle a cada controlador (o incluso cada acción, si desea control granular sobre varios diseños diferentes) qué diseño usar. Puse el mío en el init () de cada controlador. Aquí hay un ejemplo, si su archivo de diseño se llama layout.phtml:
$this->_helper->layout->setLayout(''layout'');
Sin usar ayudantes o complementos, haga lo siguiente:
Zend_Layout::getMvcInstance()->assign(''whatever'', ''foo'');
Después de esto, puede usar lo siguiente en su diseño:
<?php echo $this->layout()->whatever; ?>
Esto imprimirá "foo".
Ver Ayudantes también es una buena idea. Tenía un sitio web de comercio electrónico, que tenía un layout.phtml con menús con categorías y subcategorías que tenía que traer de la base de datos.
Para esto, hice lo siguiente:
Bootstrap.php:
protected function _initHelperPath()
{
$view = $this->bootstrap(''view'')->getResource(''view'');
$view->setHelperPath(APPLICATION_PATH . ''/views/helpers'', ''View_Helper'');
}
application.ini:
resources.view[]=
En views / helpers, tenía un archivo llamado Menus:
class View_Helper_Menus extends Zend_View_Helper_Abstract {
public function categories(){
$categories = new Application_Model_DbTable_Categories();
return $categories->fetchAll();
}
public function subCategories(){
$subCategories = new Application_Model_DbTable_SubCategories();
return $subCategories->fetchAll();
}
}
En layout.phtml, solo tuve que llamar al helper específico y llamar a los métodos desde él:
$menu = $this->getHelper(''Menus'');
$categories = $menu->categories();
$subCategories = $menu->subCategories();
Espero que ayude a alguien que necesita traer datos de la base de datos para representar el diseño.
class IndexController extends Zend_Controller_Action
{
public function init()
{
$this->_layout = $this->_helper->layout->getLayoutInstance();
$this->_layout->whatever = $this->view->render(''test.phtml);
}
}
En el archivo de diseño puede llamar
<p><?php echo $this->layout()->whatever ?>
Si en algunas acciones, si no quieres esa sección, entonces:
public function viewAction()
{
$this->_layout->whatever = null;
}