0

主に 2 つのテーブルで構成されるデータベース駆動型のナビゲーションがあります。これmenusmenu_items、純粋に「静的」リンクではうまく機能しますが、動的リンク ( login/logout ) が必要です。

menu_itemsのテーブルは、管理者に手動で追加されたページへのリンクで構成されています。したがって、「動的」リンクを処理できるように、テーブルとモデルを調整する必要があります。

menu_items テーブルのスキーマは次のとおりです。

CREATE TABLE `menu_items` (
  `id` int(11) NOT NULL auto_increment,
  `menu_id` int(11) default NULL,
  `label` varchar(250) default NULL,
  `page_id` int(11) default NULL,
  `link` varchar(250) default NULL,
  `position` int(11) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8

メニュー ID は別のテーブルに対応するため、たとえば 1 はプライマリ ナビゲーション、2 はユーティリティ ナビゲーションになります。位置とは、メニュー項目が表示される各メニューに対する相対的な順序を指します。リンクは、「/user/login」などの単なるフィールドです。

各メニューをループしてナビゲーション コンテナを作成し、Zend Navigation を使用しています。

ログイン領域に使用しているロジックは次のとおりです。これを移動して、ダイナミック ナビゲーションに組み込む必要があります。

<?php if($this->identity == null) { ?>
    <p><a href='/user/login'>Login</a></p>
<?php }else{ ?>
    <p>Welcome back <?php echo $this->identity->first_name;?></p>
    <p>To log out <a href='/user/logout'>click here</a></p>
<?php } ?>

メニュー項目ごとにアクセス レベルの新しい列を追加し、Menu モデルを更新して、ユーザーがログインしているかどうかを説明し、メニュー項目の新しいアクセス列の値、またはそれらに沿った何かをクエリする必要があるようです。行。誰にも提案はありますか?

4

2 に答える 2

3

Gordon の ACL はその方法です (そして私は賛成しました)。私はパイプを入れて、私が何をしているのかを正確に説明したかっただけです.

ナビゲーション構成でsign inとページの両方を作成しました。sign out

    <user_signin>
      <label>Sign in</label>
      <other_stuff></other_stuff>
      <resource>mvc:user_signin</resource>
      <privilege>navigate</privilege>
    </user_signin>

    <user_signout>
      <label>Sign out</label>
      <other_stuff></other_stuff>
      <resource>mvc:user_signout</resource>
      <privilege>navigate</privilege>
    </user_signout>

次に、私の ACL で:

// 'mvc:home' is wide open, 'user' role inherits from 'guest'
$this->addResource(new Zend_Acl_Resource('mvc:user_signin'), 'mvc:home');
$this->deny('user', 'mvc:user_signin', 'navigate');

$this->addResource(new Zend_Acl_Resource('mvc:user_signout'), 'mvc:home');
$this->deny('guest', 'mvc:user_signout', 'navigate');
$this->allow('user', 'mvc:user_signout', 'navigate');

そうすれば、これはナビゲーションの別の部分にすぎず、残りの部分と同じように動作しますが、その背後に少しロジックがあります。

于 2009-12-28T17:01:39.287 に答える
2

Zend_Acl でこれを達成できると思います。すべての組み込みのナビゲーション ヘルパーは、ACL および変換との統合を追加します。

http://framework.zend.com/manual/en/zend.view.helpers.htmlから

{get|set}Acl(), {get|set}Role(), レンダリング時にページをフィルタリングするために使用される ACL (Zend_Acl) インスタンスとロール (文字列または Zend_Acl_Role_Interface) を取得/設定し、{get|set}UseAcl() は ACL を有効にするかどうかを制御します。メソッド hasAcl() および hasRole() は、ヘルパーに ACL インスタンスまたはロールが登録されているかどうかをチェックします。

ログインした訪問者が、ログインしていない訪問者とは異なる役割 (ユーザーとゲスト) を持っている場合、これは機能するはずです。私はこれまでそれを行う必要がなかったので、コード スニペットを提供することはできませんが、 http://www.youtube.com/watch?v=n31mQGZxtbE で両方を組み合わせる方法に関するビデオ チュートリアルを確認してください。

ただし、これをリファクタリングする理由はまだわかりません。移動するのは面倒なようで、別の View Helper でうまくいく可能性のあるものに不必要な複雑さが追加されるからです。だから、シンプルにしてみませんか:)

于 2009-12-28T12:21:20.160 に答える