【问题标题】:Creating a Zend_Navigation using a table of database使用数据库表创建 Zend_Navigation
【发布时间】:2010-11-23 07:14:26
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: php zend-framework zend-navigation


    【解决方案1】:

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

    然后使用Zend_Db_* 中的任何一个来获取该表中的所有数据。结果将是导航中所有页面的平面数组。您可以将其用作container 并将其提供给Zend_Navigation。但是,如果您有嵌套导航,则该数组将无法使用,因为该数组将是平面的。 Traverse the array to make it nested according to the parent_id relations。然后将其提供给Zend_Navigation

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

    【讨论】:

    • 感谢您的回复,我在 bootstrap 文件中创建了 zend_navigation,现在我可以按照您的方式在 bootstrap 中创建导航吗?
    • @user 您可以将此代码放入 FrontController 插件中以推迟构建导航。在预调度之前你不会需要它。
    • @user1400 你能用你想出的最终结果来编辑你的问题吗?我正在尝试使用 ZF 1.12 构建它,但我得到的只是 Array()。我有 $items = $itemsModel->listAllItems();直接使用 Zedn_Db_Table_Abstract,所以我猜 $inArray 是我通过选择表获得的数组。到目前为止,我只是在 Model 中调用 select,尝试在通常的数组 (outArray) 中递归它并在我的视图中 print_r 它。提前致谢
    【解决方案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'],
                ))
            );
        }
    

    现在请小心,这种“设计”不允许您拥有子菜单项,因此您需要尝试使用它,但希望它能让您更轻松地开始。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        你可以做一些这样的功能:)

        /**
         * 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-08-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-15
          • 1970-01-01
          • 2016-08-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多