Zend Framework "$ это" - PullRequest
       3

Zend Framework "$ это"

10 голосов
/ 10 февраля 2012

Я новичок в среде Zend, и у меня есть основной вопрос.

Предположим, я работаю с layout.phtml или index.phtml любого скрипта.

Когда я использую «$ this->», на какой экземпляр я ссылаюсь?

Я прочитал в книге следующее: msgstr "$ this доступно в файле шаблона и является воротами к функциональности Zend_View".

Означает ли это, что я могу получить доступ к любому методу любого класса, который находится в любом файле в каталоге library / Zend / View / Helpers?

Извините, если этот вопрос глуп и / или достаточно прост.

Спасибо

Ответы [ 5 ]

15 голосов
/ 10 февраля 2012

$this-> В шаблоне представления есть ссылка на объект Zend_view, который вы создаете в своем контроллере.

Попробуйте var_dump($this) или print_r($this) (выведите <pre> перед print_r для лучшего форматирования) в шаблоне. Var dump может помочь вам понять, что происходит немного лучше.

4 голосов
/ 10 февраля 2012

Когда вы используете $this из файла .phtml, вы ссылаетесь на экземпляр Zend_View . Этот объект настраивается для вас вашим объектом контроллера, который является экземпляром Zend_Controller_Action .

Zend_Controller_action гарантирует, что ваш объект просмотра имеет доступ ко всем нужным помощникам представления. Итак, да, у вас есть доступ к любым помощникам в каталоге library / Zend / View / Helpers через переменную $this.

У вас также есть доступ к любым помощникам, которые вы пишете сами и помещаете в каталог application / views / helpers через $this. См. Руководство о написании собственных помощников вида . Как только вы начнете, вы будете использовать их все время, так как это очень простой и мощный способ сохранить ваш код DRY .

Кстати, у вас также есть прямой доступ таким же образом к любым фильтрам , которые вы помещаете в каталог application / views / filters, как вы можете видеть из docblock для initView () в 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()

Весь процесс от запроса к ответу в Zend Framework довольно сложен. Есть несколько доступных диаграмм здесь и здесь , если вы заинтересованы.

Zend Framework является очень мощным и простым в использовании, когда вы преодолели довольно крутую кривую обучения. Однако стоит упорствовать, поскольку в конечном итоге вы «получаете» и в результате создаете лучший код быстрее. Я боролся с документацией и API , но обнаружил, что лучшей документацией является код. Теперь у меня есть код для любого компонента ZF, который я использую open в отдельном окне netbeans для простоты использования.

Удачи с ZF.

2 голосов
/ 10 февраля 2012

Обычно вы присваиваете некоторый бит данных объекту вида внутри действия контроллера, используя что-то вроде:

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

в вашем скрипте вида вы обычно обращаетесь к этим данным, используя что-то вроде:

//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 ?>

также элементы могут быть назначены объекту просмотра из начальной загрузки, и эти элементы будут доступны для макетов или сценариев просмотра. Вот пример:

 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;

теперь эти данные доступны внутри layout.phtml следующим образом:

<?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>

Теперь для полноты приведем справочную версию $ this для PHP:

Внутри методов класса свойства, константы и методы могут быть доступ осуществляется с помощью формы $ this-> property (где свойство - это имя собственности), если доступ не является статическим свойством внутри контекст статического метода класса, и в этом случае доступ к нему осуществляется с помощью форма self :: $ property . Посмотрите Статическое Ключевое слово для получения дополнительной информации.

Псевдопеременная $ доступна в любом методе класса, когда этот метод вызывается из контекста объекта. $ это ссылка на вызывающий объект (обычно объект, к которому относится метод принадлежит, но, возможно, другой объект, если метод вызывается статически из контекста вторичного объекта).

Это не полное объяснение, но я надеюсь, что вы начали.

0 голосов
/ 30 ноября 2014

В дополнение к другим ответам $this поможет вам использовать помощники, которые вы определили в каталоге application/view/helper вашего проекта. Вы можете использовать все эти помощники в любом месте .phtml или просмотреть файлы в вашем проекте, просто связав их с zend_helper в инициализаторе.

0 голосов
/ 09 июня 2014

Как уже говорилось, $this представляет собой экземпляр Zend_View.

Пожалуйста, ознакомьтесь с методом render в классе 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
    }

В основном, помощник действий ZF (ViewRnderer) создает экземпляр Zend_Viewи вызывает метод рендеринга, передавая имя файла представления (index.phtml)

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

Как видите, в методе рендеринга используется ob_start .Который загружает файл index.phtml в контексте класса Zend_View, следовательно, $ this можно использовать внутри index.phtml, так как его код является частью класса.

...