0

我使用 xml 文件来创建 Zend 导航

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

现在我的问题是,我可以使用数据库表而不是 xml 文件来创建 zend_navgation

如果可能的话,请给我任何关于如何使用数据库表制作 Zend_Navigation 的示例?

4

4 回答 4

3

创建一个表,其列等于MVC 和 URI 页面可能的组合属性,但有两个例外:添加一个id列,而不是添加一个 pages 列,而是添加一个 column parent_id。子页面应在此处包含其父页面的 id。

然后使用 anyZend_Db_*来获取该表中的所有数据。结果将是导航中所有页面的平面数组。您可以将其用作容器并将其喂给Zend_Navigation. 但是,如果您有嵌套导航,则该数组将无法使用,因为该数组将是平面的。根据 parent_id 关系遍历数组使其嵌套。然后喂给Zend_Navigation.

之后,您只需使用其中一个导航助手来呈现导航。由于您的导航可能不会经常更改,因此您应该缓存从数据库中获取的内容。每次显示页面时,无需对数据库进行昂贵的往返。

于 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

我推荐以下解决方案之一:

  1. 序列化 XML 并将其存储在数据库中
  2. 使用 Zend 库中的 Xml_Writer,直接对写入磁盘的文件进行操作。
    在我看来,可写 XML 配置是最好的。写入操作并不常见,也不需要闪电般的速度,而且您可能会缓存 HTML 输出,因此读取操作很少)。当您假设每个项目都有其唯一 ID 时,使用迭代器很容易实现。
  3. 使用嵌套集结构将容器保存到数据库中。
于 2010-11-23T14:55:25.603 回答
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 回答