2010-11-23 134 views
0

的表我使用xml文件來創建一個Zend導航創建使用數據庫

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

現在我的問題Zend_Navigation,可我使用數據庫,而不是XML文件的一個表,用於創建zend_navgation

如果可能的話,請給我任何關於如何使用數據庫表進行Zend_Navigation的示例?

回答

3

創建一個表格,該表格的列等於​​可能的組合屬性,但有兩個例外:添加一個id列,而不是有頁列,而是添加一列parent_id。子頁面應在此包含其父頁面的標識。

然後使用Zend_Db_*中的任意一個來獲取該表中的所有數據。結果將是導航中所有頁面的平面陣列。您可以將其用作container並將其輸入到Zend_Navigation。但是,如果您有嵌套導航,那麼數組將不會這樣做,因爲數組將保持平坦。 Traverse the array to make it nested according to the parent_id relations。然後餵它到Zend_Navigation

之後,您只需使用其中一個Navigation Helpers來呈現導航。由於您的導航可能不會經常更改,因此您應該緩存數據庫中的抓取。每次顯示頁面時都不需要進行昂貴的往返數據庫。

+0

感謝您的回覆,我在我的引導文件中創建zend_navigation,現在用你的方式可能我引導創建導航? – user1400 2010-11-23 08:27:21

2

Asuming你有這樣的表:

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; 

Wtih這些值:

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'], 
      )) 
     ); 
    } 

小心現在淡然這種 「設計」 whont讓你有子菜單項,所以你需要玩它,但希望它會讓你開始easyer。

0

我推薦了以下解決方案之一:

  1. 序列化XML並將其存儲在數據庫
  2. 使用Xml_Writer形式Zend庫並直接在寫在磁盤上的文件進行操作。
    在我看來,可寫XML配置是最好的。寫操作並不常見,不需要閃電般快速,而且您可能會緩存HTML輸出,因此讀取操作很少)。當你假定每個項目都有唯一的ID時,使用迭代器很容易實現。
  3. 使用嵌套集結構將容器保存到數據庫。
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; 
}