문제

나는 나의 메인 네이비를 만들기 위해 도우미를 썼다. 이 헬퍼의 일부는 사용자가보기에 할당되었는지 확인하여 로그인 한 사용자가 있는지 확인합니다.

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

그러나 레이아웃 스크립트 에서이 헬퍼를 호출 할 때 $ this-> view-> user에 액세스 할 수 없습니다. 널 값이 있습니다 (var_dump ($ this-> view 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;
    }
}
도움이 되었습니까?

해결책 5

마침내 문제의 근원에 도달했습니다

내 application.ini 파일에는 줄이있었습니다

resources.view[] =

온라인 튜토리얼에서 복사 한 오래된 버전의 Zend의 유산이라고 생각합니다.

해당 라인을 삭제하면 문제가 해결되었습니다.

다른 팁

기본적인 예를 만들었습니다.

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

헬퍼 클래스에서 setView 메소드를 작성하면 Zend_view가 헬퍼에 자체적으로 주입됩니다.

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;
    }

나는 당신이 어딘가에 논리 오류가 있다고 생각하는 경향이 있습니다. 이 시도:

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

당신은 무엇을 얻었습니까?

헬퍼를 처음으로 호출하면보기가 현재보기로 설정됩니다.

나중에 뷰를 변경하면 올바른 뷰를 가리킬 수 없습니다.

$this->_helper->layout->assign('vars', $val);
$this->view->layout()->vars;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top