我有这个类别的MySql表:
id , name , parent
现在使用此function
i列出selectbox
和optgroup
html
个标签中的类别:
$options = array();
$categories = DataAccess::fetch("
SELECT
* , p.name AS parent
FROM
cats AS child
INNER JOIN
cats AS p ON p.id = child.parent
");
foreach($categories as $category){
$parent = $category['parent'];
if (! isset($options[$parent])) $options[$parent] = array();
$options[$parent][$category['id']] = $category['name'];
}
echo '<select>';
$selid = 13;
foreach($options as $group => $option) {
printf('<optgroup label="%s">', $group);
foreach ($option as $id => $label) {
$selcat = ($selid == $id) ? 'selected' : '';
printf('<option %s value="%s">%s</option>',$selcat, $id, $label);
}
printf('</optgroup>');
}
echo "</select>";
此函数ouhput适用于One child
父类别和输出:
<select class="selectpicker" >
<optgroup label="News">
<option selected value="13">War</option>
</optgroup>
<optgroup label="article">
<option selected value="14">tech</option>
</optgroup>
</select>
现在,我有三个问题:
1-如果我创建了多个孩子这个功能不起作用,只打印One Child
。我需要喜欢这个:
News
--Sport
--War
--tech
Article
--tech
--php
--linux
2 - 需要使用Multilevel
打印optgroup
类别,如下所示:
News
--Sport
----Sky
----Football
------Football-1
--War
----War1
--tech
Article
--tech
----tech2
------tech3
--php
--linux
3 - 如果parent = 0(root),则不打印类别,此打印仅包含子父级的类别。
如何修复/打印此内容?
答案 0 :(得分:1)
你做不到。 select
和optgroup
不支持多个级别although standard says they should。您必须根据自己的级别,使用
手动填充您的选项。普通空间不起作用。
您似乎尚未实现此多级树。我首先阅读question上的答案。
然后我会编写一个简单的递归函数:
function walkTree($nodes, $level = 0) {
foreach($nodes as $node) {
echo '<option>' . str_repeat(' ', $level) . $node->label . '</option>';
if($node->children) {
walkTree($node->children, $level + 1);
}
}
}
walkTree($root->children);
这假设您有一个对象层次结构,但这不是必需的。您可以使用现有数据库并编写一个返回另一个节点的所有子节点的函数:
function getChildren($id) {
$categories = DataAccess::fetch("
SELECT
*
FROM
cats
WHERE
cats.parent = $id
");
return $categories;
}
然后你需要得到根节点的初始列表(WHERE cats.parent IS NULL
可能吗?)
并将其传递给walkTree
,其中$node->children
替换为getChildren($node->id)
。
显然这意味着很多查询。您需要切换到嵌套集层次结构或类似的东西,或者可能缓存生成的HTML。