创建使用数据库
问题描述:
的表我使用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的示例?
答
创建一个表格,该表格的列等于可能的组合属性,但有两个例外:添加一个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来呈现导航。由于您的导航可能不会经常更改,因此您应该缓存数据库中的抓取。每次显示页面时都不需要进行昂贵的往返数据库。
答
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。
答
我推荐了以下解决方案之一:
- 序列化XML并将其存储在数据库
- 使用Xml_Writer形式Zend库并直接在写在磁盘上的文件进行操作。
在我看来,可写XML配置是最好的。写操作并不常见,不需要闪电般快速,而且您可能会缓存HTML输出,因此读取操作很少)。当你假定每个项目都有唯一的ID时,使用迭代器很容易实现。 - 使用嵌套集结构将容器保存到数据库。
答
你可以做一些这样的功能:)
/**
* 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;
}
感谢您的回复,我在我的引导文件中创建zend_navigation,现在用你的方式可能我引导创建导航? – user1400 2010-11-23 08:27:21