2012-02-09 13 views
9

Soy nuevo en el framework Zend, y tengo una pregunta básica.

Supongamos que estoy trabajando con el layout.phtml o con el index.phtml de cualquier script.

Cuando estoy usando "$ this->" ¿a qué instancia me refiero?

Leo en un libro lo siguiente: "$ esto está disponible dentro del archivo de plantilla, y es la puerta de entrada a la funcionalidad de Zend_View".

¿Significa que puedo acceder a cualquier método, de cualquier clase que se encuentre en cualquier archivo dentro del directorio de biblioteca/Zend/View/Helpers?

Disculpe si esta pregunta es una tonta y/o bastante simple.

Gracias

Respuesta

15

$this-> En una plantilla de vista es una referencia a los Zend_View objeto que cree en su controlador.

Pruebe var_dump($this) o print_r($this) (echo un <pre> antes del print_r para un mejor formato) en la plantilla. Var dump puede ayudarte a descubrir qué está pasando un poco mejor.

2

Normalmente se asignará algún bit de datos al objeto vista interior de una acción del controlador usando algo como:

$form = My_Form; 
//assign My_Form to the view object 
$this->view->form = $form; 

en su script de vista que normalmente acceder a esos datos usando algo como:

//this bit of code would display your whole form in the view script 
//along with any layout information contained in your layout file 
<?php echo $this->form ?> 

también se pueden asignar elementos al objeto de vista desde el programa de arranque y estos elementos estarán disponibles para el diseño o ver los guiones. Aquí está un ejemplo:

protected function _initView() { 
     //Initialize view 
     $view = new Zend_View(); 
     //get doctype from application.ini 
     $view->doctype(Zend_Registry::get('config')->resources->view->doctype); 
     $view->headTitle('Our Home'); 
     //get content-type from application.ini 
     $view->headMeta()->appendHttpEquiv('Content-Type', 
       Zend_Registry::get('config')->resources->view->contentType); 
     //add css files 
     $view->headLink()->setStylesheet('/css/blueprint/screen.css'); 
     $view->headLink()->appendStylesheet('/css/blueprint/print.css', 'print'); 
     $view->headLink()->appendStylesheet('/css/master.css'); 
     $view->headLink()->appendStylesheet('/css/main.css'); 
     $view->headLink()->appendStylesheet('/css/nav.css'); 

     //add it to the view renderer 
     $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
         'ViewRenderer'); 
     $viewRenderer->setView($view); 
     //Return it, so that it can be stored by the bootstrap 
     return $view; 

ahora estos datos es el acceso al interior de un layout.phtml de esta manera:

<?php echo $this->doctype() . "\n"; ?> 
<html> 
    <head> 
     <?php echo $this->headMeta() . "\n" ?> 
     <?php echo $this->headLink() . "\n" ?> 
     <!--[if lt IE 8]> 
      <link rel="stylesheet" href="/css/blueprint/ie.css" type="text/css" media="screen, projection" /> 
     <![endif] --> 
    </head> 

ahora está completo aquí es la versión manual de PHP de $ esto:

Dentro de los métodos de clase, las propiedades, las constantes y los métodos pueden ser a los que se accede utilizando el formulario $ this-> property (donde la propiedad es el nombre de la propiedad) a menos que el acceso sea a una propiedad estática dentro del contexto de un método de clase estática, en cuyo caso se accede usando el formulario self :: $ property. Vea Palabra clave estática para más información.

La pseudovariable $ está disponible dentro de cualquier método de clase cuando se llama a desde un contexto de objeto. $ esta es una referencia al objeto que llama (generalmente el objeto al que pertenece el método , pero posiblemente otro objeto, si el método se llama estáticamente desde el contexto de un objeto secundario).

Esto no es una explicación completa, pero espero que lo haya comenzado.

+0

Excelente respuesta, pero en realidad no se refiere a la pregunta del OP. Usted ha explicado cómo usar $ this pseudovariable en lugar de a qué objeto se refiere. – vascowhite

+0

@vascowhite estás en lo cierto. Hice referencia al objeto de vista varias veces, pero nunca expliqué cuál era el objeto de vista. Aunque creo que entre los dos obtuvimos un curso acelerado sobre qué es y cómo usarlo. :) Incluso dinero, respondí la pregunta que quería hacer. ;) – RockyFord

4

Cuando usa $this desde un archivo .phtml, se refiere a una instancia de Zend_View. Este objeto está configurado para usted por su objeto controlador que es una instancia de Zend_Controller_Action.

Zend_Controller_action asegura que su objeto de vista tenga acceso a cualquier asistente de visualización que necesite. Entonces, sí, usted tiene acceso a cualquier ayuda en el directorio library/Zend/View/Helpers a través de la variable $this.

También tiene acceso a los ayudantes que usted mismo escribe y los coloca en el directorio application/views/helpers a través del $this. Consulte el manual sobre writing your own view helpers. Una vez que comiences, los usarás todo el tiempo, ya que es un método muy simple y poderoso para mantener tu code DRY.

Por cierto, también tiene acceso directo de la misma forma que cualquier filters que coloque en el directorio application/views/filters como puede ver en docblock para initView() en Zend/Controller/Action.php.

/** 
* Initialize View object 
* 
* Initializes $view if not otherwise a Zend_View_Interface. 
* 
* If $view is not otherwise set, instantiates a new Zend_View 
* object, using the 'views' subdirectory at the same level as the 
* controller directory for the current module as the base directory. 
* It uses this to set the following: 
* - script path = views/scripts/ 
* - helper path = views/helpers/ 
* - filter path = views/filters/ 
* 
* @return Zend_View_Interface 
* @throws Zend_Controller_Exception if base view directory does not exist 
*/ 
public function initView() 

Todo el proceso de solicitud a respuesta en Zend Framework es bastante complicado. Hay algunos diagramas disponibles here y here si usted está interesado.

Zend Framework es muy potente y fácil de usar una vez que ha superado la curva de aprendizaje que es bastante empinada. Sin embargo, vale la pena perseverar cuando finalmente lo "obtengas" y produzcas un mejor código más rápido como resultado. Luché con documentation y API, pero encontré que la mejor documentación es el código. Ahora tengo el código para cualquier componente de ZF que estoy usando abierto en una ventana separada de netbeans para facilitar la referencia.

Buena suerte con ZF.

0

Como dijo $this en vista es una instancia de Zend_View.

Por favor, vea el método render en clase Zend_View

public function render($name) 
    { 
     // find the script file name using the parent private method 
     $this->_file = $this->_script($name); 
     unset($name); // remove $name from local scope 

     ob_start(); 
     $this->_run($this->_file); 

     return $this->_filter(ob_get_clean()); // filter output 
    } 

Básicamente ZF ayudante de acciones (ViewRnderer) crea una instancia de Zend_View y llama al método render pasando el nombre de archivo de vista (index.phtml)

$ view = new Zend_View(); $ view-> render ('index.phtml');

Como puedes ver, se utiliza el almacenamiento en búfer de salida ob_start en el método de renderizado. Que carga el archivo index.phtml en el contexto de la clase Zend_View, por lo tanto, $ this se puede usar dentro de index.phtml ya que su código es parte de la clase.

0

Además de las otras respuestas, $this le ayudará a utilizar los ayudantes que defina en el directorio application/view/helper de su proyecto. Puede usar todos estos ayudantes en cualquier lugar del .phtml o los archivos de vista en su proyecto simplemente vinculándolos con zend_helper en el inicializador.