Создание Zend_Navigation с использованием таблицы базы данных - PullRequest
0 голосов
/ 23 ноября 2010

я использую XML-файл для создания навигации Zend

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

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

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

Ответы [ 4 ]

3 голосов
/ 23 ноября 2010

Создайте таблицу со столбцами, равными объединенным свойствам, возможным для страниц MVC и URI с двумя исключениями: добавьте столбец id и вместо столбца страниц добавьте столбец parent_id,Подстраницы должны содержать идентификатор их родительской страницы здесь.

Затем используйте любой из Zend_Db_*, чтобы получить все данные в этой таблице.Результатом будет плоский массив всех страниц в вашей навигации.Вы можете использовать это как контейнер и передать его на Zend_Navigation.Однако, если у вас есть вложенная навигация, этот массив не подойдет, потому что массив будет плоским. Пройдите массив, чтобы сделать его вложенным в соответствии с отношениями parent_id .Затем введите его в Zend_Navigation.

После этого вам просто нужно использовать один из Помощников навигации для визуализации навигации.Поскольку ваша навигация, вероятно, меняется не так часто, вам следует кэшировать выборку из базы данных.Нет необходимости совершать дорогостоящие поездки в базу данных каждый раз, когда отображается страница.

2 голосов
/ 23 ноября 2010

Если у вас есть эта таблица:

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

Осторожно теперь можно использовать этот «дизайн», который позволяет вам иметь элементы подменю, поэтому вам нужно будет поэкспериментировать с ним, но, надеюсь, вам будет легче начать.

0 голосов
/ 18 мая 2012

Вы можете сделать некоторые функции, как это:)

/**
 * 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;
}
0 голосов
/ 23 ноября 2010

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

  1. Сериализация XML и сохранение его в базе данных
  2. Используйте Xml_Writer из библиотеки Zend и работайте непосредственно с файлом, записанным на диске.
    Конфигурация с возможностью записи XML является лучшей, на мой взгляд. Операции записи не так распространены и не должны быть молниеносными, и вы, вероятно, кэшируете вывод HTML, поэтому чтение минимально Легко реализовать с помощью итераторов, когда вы предполагаете, что каждый элемент имеет свой уникальный идентификатор.
  3. Используйте структуру Nested Set для сохранения контейнера в базе данных.
...