2010-11-23 2 views
0

я использовать файл XML для создания навигации ZendСоздание Zend_Navigation с помощью таблицы базы данных

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

Теперь мой вопрос, мог ли я использовать таблицу базы данных вместо XML-файла для создания zend_navgation

если это возможно, пожалуйста, дайте мне какой-нибудь пример о том, как я делаю Zend_Navigation с таблицей базы данных?

ответ

3

Создать таблицу со столбцами, равную объединенным свойствам, возможным для MVC and URI pages с двумя исключениями: добавить столбец 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; 

трейлерах эти значения:

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

Carefull Теперь Каус этот "дизайн" whont позволит вам чтобы иметь подменю, поэтому вам нужно будет поиграть с ним, но, надеюсь, вам станет легче.

0

Я рекомендовал бы одно из следующих решений:

  1. сериализации XML и сохранить его в базе данных
  2. Использование Xml_Writer формы Zend библиотека и работать непосредственно на файл написан на диске.
    Сложная конфигурация XML лучше всего, на мой взгляд. Операции записи не так распространены и не требуют быстрой молниеносно, и вы, вероятно, будете кэшировать вывод HTML, поэтому чтение будет минимальным). Легко реализовать с использованием итераторов, когда вы предполагаете, что у каждого элемента есть уникальный идентификатор.
  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; 
}