0

Zend ナビゲーションを作成するために xml ファイルを使用します

$navContainerConfig = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
 $navContainer = new Zend_Navigation($navContainerConfig);

zend_navgation を作成するために、xml ファイルの代わりにデータベースのテーブルを使用できますか?

可能であれば、データベースのテーブルを使用して Zend_Navigation を作成する方法の例を教えてください。

4

4 に答える 4

3

2 つの例外を除いて、 MVC ページと URI ページで可能なプロパティを組み合わせたものと等しい列を持つテーブルを作成しidますparent_id。サブページには、ここに親ページの ID が含まれている必要があります。

次に、 any of を使用Zend_Db_*して、そのテーブル内のすべてのデータをフェッチします。結果は、ナビゲーション内のすべてのページのフラットな配列になります。これをコンテナとして使用し、 にフィードできますZend_Navigation。ただし、ネストされたナビゲーションがある場合、配列はフラットになるため、その配列は機能しません。配列をトラバースして、parent_id の関係に従って入れ子にします。次に、 にフィードしZend_Navigationます。

その後、ナビゲーション ヘルパーの 1 つを使用してナビゲーションをレンダリングするだけです。ナビゲーションはそれほど頻繁には変更されない可能性が高いため、データベースからのフェッチをキャッシュする必要があります。ページが表示されるたびに、コストのかかるデータベースへのラウンドトリップを行う必要はありません。

于 2010-11-23T08:02:30.037 に答える
2

このテーブルがあると仮定します:

CREATE TABLE IF NOT EXISTS `menu` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `label` varchar(50) NOT NULL,
  `url` varchar(50) NOT NULL,
  `name` varchar(50) NOT NULL,
  `title` varchar(50) NOT NULL,
  `class` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3;

これらの値で:

INSERT INTO `menu` (`id`, `label`, `url`, `name`, `title`, `class`) VALUES
(1, 'Home', 'index/home', 'home', 'Home title', 'someClass'),
(2, 'About Us', 'index/about', 'about', 'About title', 'aboutClass');

あなたはこれを行うことができます :

    $dbAdapter = Zend_Db_Table::getDefaultAdapter();
    $dbAdapter->setFetchMode(Zend_Db::FETCH_ASSOC);
    $menuArray = $dbAdapter->fetchAll("SELECT * FROM menu");
    $navContainer = new Zend_Navigation();

    foreach ( $menuArray as $value )
    {
        $navContainer->addPage(
            Zend_Navigation_Page::factory(array(
                'uri' => $value['url'],
                'label' => $value['label'],
                'title' => $value['title'],
                'class' => $value['class'],
            ))
        );
    }

この「デザイン」ではサブメニュー項目を使用できないため、いろいろ試してみる必要がありますが、より簡単に始められるようになることを願っています。

于 2010-11-23T08:22:18.680 に答える
0

このような機能を実行できます:)

/**
 * Gets assoc array (fetched from db) and transforms it to Zend_Navigation object
 * @param assoc array $array
 * @param string $idField
 * @param string $parentField
 * @return \Zend_Navigation 
 */
private function getNavigationFromAssocArray($array, $idField = 'menu_item_id', $parentField = 'parent_menu_item_id') {
    $navigation = new Zend_Navigation();

    foreach ($array as $key => $item) {
        $item['uri'] = $item['url'];

        if(empty($parentField) ) {    
            $navigation->addPage(
                Zend_Navigation_Page::factory( $item )
            );
        } else {
            $page = $navigation->findBy($idField, $parentField );
            $page->addPage(Zend_Navigation_Page::factory( $item ));
        }
    }
    return $navigation;
}
于 2012-05-18T07:11:58.487 に答える
0

次のいずれかの解決策をお勧めします。

  1. XML をシリアライズしてデータベースに保存する
  2. Xml_Writer フォーム Zend ライブラリを使用し、ディスクに書き込まれたファイルを直接操作します。
    私の意見では、書き込み可能な XML 構成が最適です。書き込み操作はそれほど一般的ではなく、超高速である必要はありません。おそらく HTML 出力をキャッシュするので、読み取りは最小限です)。各アイテムに一意の ID があると仮定すると、イテレータを使用して簡単に実装できます。
  3. ネストされたセット構造を使用して、コンテナーをデータベースに保存します。
于 2010-11-23T14:55:25.603 に答える