Zend: "¡¿donde está mi helper?! ¡¿cómo lo llamo?!"

Estuve un rato teniendo problemas con un helper que había creado y que lo colocaba en el -supuesto- lugar que debía estar y la vista que lo usaba no lo encontraba.

Nota: aviso, "todo", está en el manual, lamentablemente (así que hay que leerlo ;-) )

En la sección sobre "Zend_View", en particular el punto "42.1.4. Utility Accessors", fue bastante revelador, ya que nos da las herramientas para comprender cómo el sistema registra los nombres y las ubicaciones de los helpers y poder revisar si estamos cometiendo algún error de sintaxis o de conceptos.

Aquí algunos métodos que podemos usar desde una vista:

  • getScriptPath($script): nos retorna el camino a partir del nombre de un scripts

  • getScriptPaths(): nos retorna todos los caminos de los scripts registrados.

  • getHelperPath($helper): el camino de un helper dado a partir del nombre de la clase

  • getHelperPaths(): todas las rutas registradas para los helpers


Estos métodos nos permiten hacer un "debug" de nuestro sistema y ver donde nuestro MVC encuentra o debería encontrar los helpers, muy útil para controlar que estemos haciendo las cosas bien.

Estando dentro de la vista podemos hacer

1  
<?php 
2  
3  var_dump
(  $this->getHelperPaths() );
4  
5  
?> 
6  



Y nos tira la lista de rutas que tiene definido para buscar los helpers

1  
<?php 
2  
3  
array(4) {
4    [
0]=>
5    array(
2) {
6      [
"prefix"]=>
7      
string(7"Helper_"
8      
["dir"]=>
9  
10      
string(32".\library\Zsurforce\View\Helper\"
11    }
12    [1]=>
13    array(2) {
14      ["
prefix"]=>
15      string(8) "
_Helper_"
16      ["
dir"]=>
17      string(15) "
.htmlhelpers"
18  
19    }
20    [2]=>
21    array(2) {
22      ["
prefix"]=>
23      string(25) "
Estadisticas_View_Helper_"
24      ["
dir"]=>
25      string(41) "
.application\estadisticas\views\helpers"
26  
27    }
28    [3]=>
29    array(2) {
30      ["
prefix"]=>
31      string(17) "
Zend_View_Helper_"
32      ["
dir"]=>
33      string(57) "
C:\xampp\htdocs\admin\library\Zend\View\Helper"
34  
35    }
36  }
37  
38  ?> 



Varias deducciones interesantes:

  • Que está por defecto buscando en "html\helpers" (algo que no sabía)

  • Que no hace falta decirle dentro de la vista correspondiente donde buscar sus helpers, ya que lo hace solo: \application\estadisticas\views\helpers\ (yo estoy probando dentro de la vista del módulo estadísticas)

  • No veo la ruta hacia los helpers de surforce-library

Tomando en cuenta esto último, agregué en el init del controller genérico de surforce-library:

1  
<?php
2  $this
->view->addHelperPath('./library/Zsurforce/View/Helper/'
'Helper');
3  
?>



Si volvemos a ejecutar la vista, ahora nos dice:

1  
<?php 
2  
3  
array(4) {
4    [
0]=>
5    array(
2) {
6      [
"prefix"]=>
7      
string(7"Helper_"
8      
["dir"]=>
9  
10      
string(32".\library\Zsurforce\View\Helper\"
11    }
12    [1]=>
13    array(2) {
14      ["
prefix"]=>
15      string(8) "
_Helper_"
16      ["
dir"]=>
17      string(15) "
.htmlhelpers"
18  
19    }
20    [2]=>
21    array(2) {
22      ["
prefix"]=>
23      string(25) "
Estadisticas_View_Helper_"
24      ["
dir"]=>
25      string(41) "
.application\estadisticas\views\helpers"
26  
27    }
28    [3]=>
29    array(2) {
30      ["
prefix"]=>
31      string(17) "
Zend_View_Helper_"
32      ["
dir"]=>
33      string(57) "
C:\xampp\htdocs\admin\library\Zend\View\Helper"
34  
35    }
36  }
37  ?> 




Ya aparece la ruta hacia los helpers de surforce-library.

Otra cosa interesante, que ya me permitió corregir varios problemas al definir los helpers fue el nombre de los mismos con la ruta para encontrarlos. En algunos casos había creado una clase Helper con solo el nombre de la clase y en otra con el nombre con la ruta completa para ubicarlos, pero en varios estaban mal. Si vemos el array, uno de los elementos es "prefix" y justamente, es el nombre "prefijo" que debería tener la clase de nuestro helper ;-)

Por ejemplo, si nuestro helper está en el módulo estadísticas, debemos llamarlo:

class Estadisticas_View_Helper_GoogleChart

Pero si está en surforce library solo "Helper"

class Helper_GoogleChart

¿Interesante dato, no?

Nota: al final cambié el nombre del prefijo de solo "Helper" al que debería corresponder de acuerdo a la ubicación dentro de la estructura de directorios de Zend, así que la clase pasaría a llamarse Zsurforce_View_Helper_GoogleChart.

Esta es la línea que lo define en el init() del controller:

1  
<?php 
2  
3  $this
->view->addHelperPath('./library/Zsurforce/View/Helper/'
'Zsurforce_View_Helper');
4  
5  
?> 



Por último, estaba probando el método "getHelperPath" que nos dice donde está ubicado el helper que consultamos, y en todos los casos anteriores no daba información, pero cuando arreglé las rutas, ya devolvía la información correcta.

1  
<?php
2  
echo $this->getHelperPath('googleChart');
3  
?> 



Creo que con esta explicación ahora queda un poco más claro cómo encontrarlos. ;-)

2 comentarios:

Acido 69 dijo...

Muy bueno el tutorial este para debugear; aún no he encontrado la necesidad de utilizarlo.
Este tema es uno de esos puntos que no ves hasta tener la necesidad.

Fede? dijo...

menos mal que no tengo que estar pendiente del blog, para obtener esos conocimientos!

Entradas populares