ZF 1.8のリリースは、いくつかの新しい(そして最も重要なことには非常に有用な)コンポーネントを喜んでくれました。 この記事では、Zend_Navigationを使用してサイトメニュー、サイトマップ、ブレッドクラムを作成する方法について説明します。 Zend_Aclと組み合わせたZend_Navigationの使用には特に注意を払います。
これは私のブログの記事の翻訳です。 複数のサイトで公開されているため、最も完全なバージョンは常に
オリジナル (ウクライナ語)になります。
はじめに、
Zend_Toolを使用してプロジェクトワイヤフレームを作成し
ましょう 。
$ zf create project。 /
1.メニューZend_Viewを設定するには、次のコードを「application / configs / application.ini」に追加します。
; 視聴回数
resources.view.encoding = "UTF-8"
resources.view.basePath = APPLICATION_PATH "/ views"
resources.view.helperPath.Application_View_Helper = APPLICATION_PATH "/ビュー/ヘルパー"
さらにファイル「application / Bootstrap.php」で、新しいメソッド_initNavigation()を作成します(コードのコメントを読んでください):
クラス Bootstrap は Zend_Application_Bootstrap_Bootstrapを拡張します
{
/ *
*ナビゲーターオブジェクトを初期化し、それをビューに渡します
*
* @return Zend_Navigation
* /
パブリック 関数 _initNavigation ( )
{
//ブートストラップビュー
$ this- > bootstrapView ( ) ;
$ view = $ this- > getResource ( 'view' ) ;
//シンプルなメニュー構造(XMLでレンダリング可能)
$ページ = 配列 (
配列 (
'controller' => 'インデックス' 、
'label' => _ ( 'Home' ) 、
) 、
配列 (
'controller' => 'users' 、
'アクション' => 'インデックス' 、
// gettextパーサーでストレッチできるように、テキストを_()でラップします
'label' => _ ( 'ユーザー' ) 、
'ページ' => 配列 (
配列 (
'controller' => 'users' 、
'action' => 'new' 、
'label' => _ ( 'ユーザーの追加' ) 、
) 、
)
) 、
配列 (
'controller' => 'users' 、
'アクション' => '登録' 、
'label' => _ ( '登録' ) 、
) 、
配列 (
'controller' => 'users' 、
'アクション' => 'ログイン' 、
'label' => _ ( '承認' ) 、
) 、
配列 (
'controller' => 'users' 、
'アクション' => 'ログアウト' 、
'label' => _ ( 'Exit' ) 、
)
) ;
//構造に基づいて新しいコンテナを作成します
$ container = new Zend_Navigation ( $ページ ) ;
//コンテナをビューに渡します
$ view- > menu = $ container ;
$コンテナを 返し ます。
}
}
健全な論理に従えば、サイトのすべてのページ(またはほとんど)にメニューが表示されます。 Zend_Layoutはこれに最適です。
$ mkdirアプリケーション/レイアウト
$ mkdirアプリケーション/レイアウト/スクリプト
$ touchアプリケーション/レイアウト/スクリプト/default.phtml
メニューとページコンテンツの出力を「application / layouts / scripts / default.phtml」テンプレートに追加します。
<div id = "menu">
<h3>
<?php echo $ this- > translate ( 'Menu' ) ; ?> :
</ h3>
<?php echo $ this- > navigation ( ) -> menu ( $ this- > menu ) ; ?>
</ div>
<div id = "content">
<?php echo $ this- > layout ( ) -> content ; ?>
</ div>
そして、「application / configs / application.ini」で、Zend_Layoutを初期化するレイアウトリソースの設定を行います。
; レイアウト
resources.layout.layout = "デフォルト"
resources.layout.layoutPath = APPLICATION_PATH "/レイアウト/スクリプト"
そして、私は起動しています(私はウクライナ語で元の記事を書き、正直に怠speakingを話すスクリーンショットをやり直しました:)):
出来上がり:)。 完成したポップなメニューが表示されます! アクティブなアイテムは、class = "active"としてマークされます。
2.パンくずリストOK、メニューの準備ができました。 今、私はユーザーがサイトを使用するとき、常に彼の現在の場所を見たいと思っています。 これを行うには、「パン粉」を使用できます。
アプリケーションが必要なコントローラーまたはビューの欠如を誓わないように、Zend_Toolを使用してUsersコントローラーを作成し、必要なアクションを追加します。 すべてが非常に簡単です:
$ zfコントローラーユーザーの作成
$ zf create action new --controller -name users
$ zf create action registration --controller -name users
$ zf create action login --controller -name users
$ zf create action logout --controller -name users
レイアウトのテンプレート(メニューとコンテンツの間)に新しいコードを追加します。
<div id = "breadcrumbs">
<h3>
<?php echo $ this- > translate ( 'Breadcrumbs' ) ; ?> :
</ h3>
<?php echo $ this- > navigation ( ) -> breadcrumbs ( $ this- > menu ) -> setLinkLast ( true ) ; ?>
</ div>
私は何が起こったのか見てください:
クール:)?
setLinkLast(true)メソッドは、最後のパン粉をリンクとして表示する必要があることを意味します。 区切り文字と最小の深さも指定できます-APIを参照してください
3.サイトマップサイトマップを使用すると、すべてが簡単になります。 すべては類推によって行われます。 ここに
マニュアルがあり、最小のコードがあります:
<?php echo $ this- > navigation ( ) -> sitemap ( $ this- > menu ) ; ?>
4. Zend_Navigation && Zend_Acl次に、Zend_Navigationで最も気に入った点、つまりZend_Aclと組み合わせて使用できることについて説明します。
Zend_Aclの初期化と同様に、ページにアクセスするためにBootstrapにロールと特権を追加します(コードのコメントを読んでください!):
<?php
クラス Bootstrap は Zend_Application_Bootstrap_Bootstrapを拡張します
{
/ **
* ACLを初期化します。
*ロールとリソースを作成します。 アクセス権を付与します
*
* @return Zend_Acl
* /
保護された関数 _initAcl ( )
{
$ auth = Zend_Auth :: getInstance ( ) ;
//ユーザーロールを定義します。
//承認されていない場合-「ゲスト」を意味します
$ role = ( $ auth- > hasIdentity ( ) && ! empty ( $ auth- > getIdentity ( ) -> role ) )
? $ auth- > getIdentity ( ) -> role : 'guest' ;
$ acl = new Zend_Acl ( ) ;
//ロールを作成します
$ acl- > addRole ( new Zend_Acl_Role ( 'guest' ) )
-> addRole ( new Zend_Acl_Role ( 'member' ) 、 'guest' )
-> addRole ( new Zend_Acl_Role ( 'administrator' ) 、 'member' ) ;
//リソースを作成します
//プレフィックスを使用してリソースに名前を付けます
// "mvc:"-ページ用
$ acl- > add ( new Zend_Acl_Resource ( 'mvc:index' ) )
-> 追加 ( new Zend_Acl_Resource ( 'mvc:error' ) )
-> add ( new Zend_Acl_Resource ( 'mvc:users' ) ) ;
//ゲストを「顔」とエラーページに配置します
$ acl- > allow ( 'guest' 、 array ( 'mvc:error' 、 'mvc:index' ) ) ;
//また、承認および登録ページでも
$ acl- > allow ( 'guest' 、 'mvc:users' 、 array ( 'login' 、 'registration' ) ) ;
//そして、メンバーはすでに壊れています:)
$ acl- > deny ( 'member' 、 'mvc:users' 、 array ( 'login' 、 'registration' ) ) ;
//まあ、など
$ acl- > allow ( 'member' 、 'mvc:users' 、 array ( 'index' 、 'logout' ) ) ;
$ acl- > allow ( 'administrator' 、 'mvc:users' 、 array ( 'new' ) ) ;
// ACLをZend_Navigationにしがみつきます
Zend_View_Helper_Navigation_HelperAbstract :: setDefaultAcl ( $ acl ) ;
Zend_View_Helper_Navigation_HelperAbstract :: setDefaultRole ( $ role ) ;
$ aclを 返し ます。
}
/ *
*ナビゲーターオブジェクトを初期化し、それをビューに渡します
*
* @return Zend_Navigation
* /
パブリック 関数 _initNavigation ( )
{
$ this- > bootstrapView ( ) ;
$ view = $ this- > getResource ( 'view' ) ;
$ページ = 配列 (
配列 (
'controller' => 'インデックス' 、
'label' => _ ( 'Home' ) 、
) 、
配列 (
'controller' => 'users' 、
'アクション' => 'インデックス' 、
//アクセス権を確認するためのリソース
'resource' => 'mvc:users' 、
//そして特権
'privilege' => 'index' 、
'label' => _ ( 'ユーザー' ) 、
'ページ' => 配列 (
配列 (
'controller' => 'users' 、
'action' => 'new' 、
'resource' => 'mvc:users' 、
'privilege' => 'new' 、
'label' => _ ( 'ユーザーの追加' ) 、
) 、
)
) 、
配列 (
'controller' => 'users' 、
'アクション' => '登録' 、
'resource' => 'mvc:users' 、
'privilege' => '登録' 、
'label' => _ ( '登録' ) 、
) 、
配列 (
'controller' => 'users' 、
'アクション' => 'ログイン' 、
'resource' => 'mvc:users' 、
'privilege' => 'login' 、
'label' => _ ( '承認' ) 、
) 、
配列 (
'controller' => 'users' 、
'アクション' => 'ログアウト' 、
'resource' => 'mvc:users' 、
'特権' => 'ログアウト' 、
'label' => _ ( 'Exit' ) 、
)
) ;
$ container = new Zend_Navigation ( $ページ ) ;
$ view- > menu = $ container ;
$コンテナを 返し ます。
}
}
?>
私は走る:
さて、ゲスト用のメニューがあります。 ただし、最小深度をゼロに設定する必要があるため、パンくずリストはありません。
まとめ一般に、Zend_Navigationは非常に便利で柔軟なコンポーネントです。 また、標準のビューヘルパーがZend_Translateをサポートしていることを忘れていました。これは多言語サイトを作成するときに非常に便利です。
すべてがそうです。 この記事がお役に立てば幸いです。 そして、フォーラム
zendframework.ruにアクセスしてください(サイト自体にも便利で興味深いものがたくさんあります)。
UPD。 ここ(より正確には既に:))
sanはこれを行うことを提案します
$ view- > menu = $ container ;
コントローラーでこの変数を誤って上書きする可能性があるため、あまり便利ではありません。
サイトにメニューが1つしかない場合は、簡単に実行できます。
$ view- > navigation ( $ container ) ;
そして、このようにビューに表示します:
<?php echo $ this- > ナビゲーション ( ) -> メニュー ( ) ; ?>
<?php echo $ this- > navigation ( ) -> breadcrumbs ( ) ; ?>
UPD2。jarool
ユーザーは賢明な発言をしました。
ほとんどのアプリケーションでは、1つのナビゲーションオブジェクトと1つのACLが構築されます。 そのため、メニューをZend_Registry :: set( 'Zend_Navigation'、$ AppNavigation)に配置できます。ヘルパーは自分自身を見つけるので、ヘルパーを呼び出すときにレイアウトを押し込んで指示する必要はありません。