2012-04-22 4 views
1


私は、コントローラの特定のアクションに基づいてユーザに表示されるナビゲーションメニューを持っています。ここに私がやっていることがあります。Zend Frameworkのアクションベースのナビゲーション

//in each controller-action where i want "action navigation menu" 
public function indexAction() 
{ 
    $this->_helper->navigation()->renderActionNavigation(); 
} 
public function newAction() 
{ 
    $this->_helper->navigation()->renderActionNavigation(); 
} 

ナビゲーションメニューが表示されます。ここに私のnavigation.xmlファイルがあります。

<?xml version="1.0" encoding="UTF-8"?> 
<configdata> 
    <item-index> 
     <new-item> 
      <label>New Item</label> 
      <route>admin-item-new</route> 
     </new-item> 
     <delete-item> 
      <label>Delete Item</label> 
      <uri>#</uri> 
     </delete-item> 
    </item-index> 
    <item-new> 
     <publish-unpublish-item> 
      <label>Save &amp; Close</label> 
      <uri>#</uri> 
     </publish-unpublish-item> 
     <delete-item> 
      <label>Save &amp; New</label> 
      <uri>#</uri> 
     </delete-item> 
    </item-new> 
</configdata> 

各ナビゲーションメニューの親要素は、上記navigation.xmlファイル内の命名規則を表し、例えばここに

`<item-index>` represents item{controller}index{action} 
`<item-new>` represents item{controller}new{action} 
//and so on 

はアクションヘルパーです。 Navigation.php私は

/application 
    /layouts 
    admin.phtml 
    default.phtml  
    /modules 
    /admin 
     /controllers 
     /helpers 
      /Navigation.php 
     IndexController.php 
     /views 
     /helpers 
     /scripts 
      /partials 
      _action-navigation.pthml 
      sidebar.phtml 
      /index 
      /item 

私が経験しています奇妙な行動があるが、次のように私のディレクトリ構造がある

class Zend_Controller_Action_Helper_Navigation extends Zend_Controller_Action_Helper_Abstract 
{ 
    private $_view = null; 

    public function direct() 
    { 
     $this->_view = Zend_Layout::getMvcInstance()->getView(); 
     $this->_view->placeholder('action-navigation'); 
     return $this; 
    } 

    public function renderActionNavigation() 
    { 
     $config = new Zend_Config_Xml(
      APPLICATION_PATH.'/configs/navigation.xml', strtolower(
       $this->getRequest()->getControllerName().'-'. 
       $this->getRequest()->getActionName() 
      ) 
     ); 
     $container = new Zend_Navigation($config); 
     $this->_view->partial('partials/_action-navigation.phtml', array('container' => $container)); 
    } 
} 

し、最終的に_action-navigation.phtml

<?php $this->placeholder('action-navigation')->captureStart(); ?> 
<div class="statsRow"> 
    <div class="wrapper" > 
     <?php foreach($this->container as $page): ?> 
      <a href="<?php echo $page->getHref(); ?>" class="<?php echo $page->class; ?>" id="<?php echo $page->id; ?>"></a> 
     <?php endforeach; ?> 
    </div> 
</div> 
<?php $this->placeholder('action-navigation')->captureEnd(); ?> 

を使用しています。私のBootstrap.phpファイルに空の_initView()メソッドがあります。このメソッドが存在する場合、私のアプリケーションは正常に動作します。このメソッドは空であることに注意してください。しかし、それを削除すると、それは私に次のエラーを与える。

Application error 

Exception information: 

Message: script 'partials/_action-navigation.phtml' not found in path (./views/scripts/) 

Zend Frameworkではこの動作を理解できません。ブートストラップで_initViewメソッドに関連するアクションナビゲーションコードはどうですか?何が起こっているのか、これに対する修正や、コードの改善のための提案?

更新: 問題は、あなたが2番目の引数としてadminモジュールの名前を追加するのを忘れコード

$this->_view->partial('partials/_action-navigation.phtml', array('container' => $container)); 
+0

あなたのコードを '_initView()'に入れるのは興味深いことです。私の推測では、あなたのブートストラップメソッドで '$ return'を返さないということです。 – Liyali

+0

あなたに会えてうれしい:)、問題は私のアプリがバックエンドとフロントエンドと1つのブートストラップファイルで構成されていることです。だから私はそれをすべてのコードを追加しないでよりきれいに保つために努めています。私は共有されるだけのリソースを維持しようとしています。バックエンドとフロントエンドの両方で –

+0

'_action-navigation.pthml'はあなたのモジュール間で共有されていますか、' '/ admin''モジュールでのみ使用されていますか? – Liyali

答えて

1

のこの行である:

$this->_view->partial('partials/_action-navigation.phtml', 'admin', array('container' => $container)); 
0

私はあなたがこれを使用する提案クリーンで軽量な方法で、実際のモジュールに通知し、viewStartとEndを使わずにビュースクリプトをきれいにする依存関係を取り除く(ob_start ...キャプチャ開始時に使用する)

$navigation = $this->view->navigation()->menu()->renderPartial($container, 'partials/_action-navigation.phtml'); 
// U can use placeholders `append` and `prepend` methods too, if u need more control in your placeholder content 
$this->view->placeholder('action-navigation')->set($navigation);