2

navigation.xml ファイルによって提供されるデータを使用して Zend_Navigation を実行しています。最初のレベル (0) が Frontend と Backend の 2 つのページで構成されているとします。フロントエンドはゲスト ロールでアクセスでき、バックエンドは管理者ロールでのみアクセスできます。

私がする場合

<?php echo $this->navigation()->menu()->setMaxDepth(0); ?>

ログインしていない場合は「フロントエンド」リンクが正しく表示され、管理者としてログインしている場合は「フロントエンド」リンクと「バックエンド」リンクの両方が正しく表示されます。

ただし、「フロントエンド」リンクを表示することは、ゲストにとってあまり意味がありません。とにかく、そのレベルでナビゲートするページが他にないからです。そのため、ゲストにはそのナビゲーションをまったく表示したくありません。

私は私ができることを知っています

<?php
if ('guest' !== $this->view->role) {
    echo $this->navigation()->menu();
}
?>

しかし、私はこれを行うためのより良い方法を望んでいます。

私が探しているのは次のようなものです

<?php
if (count($this->navigation()->getPagesForRole($this->view->role)) > 1) {
    echo $this->navigation()->menu();
}
?>

Zend_Navigation が提供する API でこれを実現する方法がわかりません... getPages() メソッドがあるようですが、すべてのページが「フィルタリングされていない」状態で返されます。

これには簡単な解決策があると思いますが、過去 2 時間にわたってこれを理解しようとしてきましたが、何も見つからなかったので、間違った方向を見ていると思います。

御時間ありがとうございます。

編集:

ナビゲーションはすでに ACL を使用して権限を制御しており、正常に動作していることを忘れていました。私の唯一の問題は、ゲストのフロントエンド/バックエンド ナビゲーションを表示したくないということです。リンク アイテムが 1 つだけのナビゲーションはほとんど役に立たないからです。混乱して申し訳ありません。

4

3 に答える 3

5

Zend Navigation では、それを実現するために Zend_Acl インスタンスが必要です。リソース/特権情報を含めるようにナビゲーション構成を調整する必要があります。

$navArray = array(
…, 
    array(
       'module' => 'admin',
       'label' => 'Administration',
       'resource' => 'admin',
       'privilege' => 'index',
       'pages' => array( 
    …
);

http://framework.zend.com/manual/en/zend.navigation.containers.htmlを参照してください。

次に、それらのリソースと特権に対するアクセス制限を定義する ACL を設定する必要があります。

  $acl = new Zend_Acl();
  $acl->addRole(new Zend_Acl_Role('user'))
      ->addRole(new Zend_Acl_Role('admin'));

  …

http://framework.zend.com/manual/en/zend.acl.introduction.htmlを参照してください。

現在のユーザーの役割とともに、ACL をナビゲーション ヘルパーに設定する必要があります。

$this->getHelper('Navigation')
    ->setAcl($acl)
    ->setRole('user');

その後、ヘルパー API へのすべての呼び出しで ACL を認識する必要があります。上記の例では、ACL でユーザーが管理メニューへのアクセスを許可されていない場合、管理メニューは表示されません。

その他のリソース:

于 2011-02-24T10:34:23.757 に答える