Получение свойства представления Zend с помощью помощника, вызываемого в скрипте макета - PullRequest
3 голосов
/ 17 декабря 2009

Я написал помощника, чтобы сделать мой основной навигационный файл. Часть этого помощника проверяет, вошел ли пользователь в систему, проверив, назначен ли пользователь представлению

if($this->view->user)
{
//do stuff
}

Однако, когда я вызываю этого помощника в моем скрипте макета, он не может получить доступ к $ this-> view-> user; он имеет значение NULL (хотя var_dump ($ this-> view возвращает объект представления, но не со всеми назначенными ему свойствами). Он может получить доступ только к пользовательским данным, если в скрипте представления я назначу их макету т.е.

$this->layout()->user = $this->user;

А потом в помощнике сделать

if($this->view->layout()->user)
{
//do stuff
}

Что является болью, так как в каждом скрипте представления мне нужно добавить строку для передачи данных в макет.

Есть ли способ, позволяющий помощникам, вызываемым в скрипте макета, получать доступ к свойствам представления?

редактировать *

Вот источник:

    <?php

class Zend_View_Helper_MainNav extends Zend_View_Helper_Abstract {

        public function mainNav()
    {
        if ($this->view->layout()->navType == 'none'){
            $html = '<div id="nav"><a href="/" id="logo">Sum puzzles</a></div>';
        } else if($this->view->layout()->navType == 'small'){

                $html = '<div id="nav" class="small"><a href="/" id="logo">Sum puzzles</a><ul>' .
                                    '<li><a href="/puzzle/view" class="button">play a puzzle</a></li>' .
                                        '<li><a href="/sequence/play" class="button">puzzle sequences</a></li>' .
                                        '<li><a href="/puzzle/create" class="button">create a puzzle</a></li>';

                if(!$this->view->user)
                {
                    $html .=    '<li><a href="/teachers" class="button">teachers area</a></li>';
                }   
                $html .='</ul></div>'; 

        } else if($this->view->layout()->navType == 'large'){
                $html = '<div id="nav" class="large"><a href="/" id="logo">Sum puzzles</a><ul>' .
                                        '<li><a href="/sequence/play" class="playSequence">Play a sequence of puzzles</a></li>' .
                                        '<li><a href="/puzzle/create" class="createPuzzle">Create your own puzzles</a></li>';
                if(!$this->view->user)
                {
                    $html .= '<li><a href="/teachers" class="teachersArea">teachers area</a></li>';
                }
                    $html .=    '</ul></div>'; 
        }   
        return $html;
    }
}

Ответы [ 6 ]

1 голос
/ 12 января 2010

Я создал базовый пример, который должен помочь вам

////////////////////////////////////////////////
// application/controllers/IndexController.php
////////////////////////////////////////////////
<?php
class IndexController extends Zend_Controller_Action
{
    public function init() {
        Zend_Layout::startMvc() ;
        $this->view->test_h1 = "H1 test value" ;
    }
    public function indexAction()
    {
        $this->view->test_h2 = "H2 test value" ;
    }
}

////////////////////////////////////////////////
// application/views/helpers/Qwer.php
////////////////////////////////////////////////
<?php
class Zend_View_Helper_Qwer extends Zend_View_Helper_Abstract {
    public function qwer() {
        return "<h1>{$this->view->test_h1}</h1>"
            . "<h2>{$this->view->test_h2}</h2>" ;
    }
}

////////////////////////////////////////////////
// application/views/scripts/layout.phtml
////////////////////////////////////////////////
<?php echo $this->qwer() ?>

////////////////////////////////////////////////
// Output
////////////////////////////////////////////////
<h1>H1 test value</h1><h2>H2 test value</h2>
0 голосов
/ 11 октября 2013
$this->_helper->layout->assign('vars', $val);
$this->view->layout()->vars;
0 голосов
/ 23 сентября 2010

Наконец-то добрался до корня проблемы

В моем файле application.ini была строка

resources.view[] =

Который, я думаю, является наследием более старых версий Zend, скопированных из какого-то онлайн-учебника.

Удаление этой строки решило проблему.

0 голосов
/ 15 января 2010

Когда вы вызываете Помощника в первый раз, вид устанавливается на текущий вид.

Если вы позже измените вид, это не будет указывать на правильный вид.

0 голосов
/ 17 декабря 2009

Я склонен думать, что у вас где-то есть логическая ошибка.Попробуйте это:

// in your controller action
$this->view->test = 'testing 123';

// at the start of your helper method, called from your layout
echo $this->view->test;die;

Вы получили что-нибудь?

0 голосов
/ 17 декабря 2009

Zend_View внедрит себя в помощник, если вы создадите метод setView в своем классе помощника.

class Ldm_View_Helper_SubMenu
{
    public function subMenu($items)
    {
        // Build SubMenu
        $subMenu = '';

        $template = '
            <ul id="subnav">
                %s
            </ul>';

        $rowTemplate = '
                <li>
                    <a href="%s" %s>%s</a>
                </li>';

        $rows = '';

        foreach ($items as $key => $values)
        {
            $rows .= sprintf($rowTemplate, 
                             $values['url'],
                             (($this->view->action == $key) ? 'class="selected"' : ''),
                             $values['name']);
        }

        $subMenu = sprintf($template, $rows);

        return $subMenu;
    }

    public function setView(Zend_View_Interface $view)
    {
        $this->view = $view;
    }
...