【问题标题】:How do I create a series of JS/PHP drop-down menus that automatically populate based on a SQL tree?如何创建一系列基于 SQL 树自动填充的 JS/PHP 下拉菜单?
【发布时间】:2011-10-16 00:20:17
【问题描述】:

我在 SQL 数据库中有一个树形结构;树有四个级别,因此树中的每个节点都位于级别 1、2 或 3,当然还有一个位于级别 0 的根节点。每个数据库条目都有字段 titleparentnamelevel(0、1、2 或 3)。

我想在 HTML 表单中创建一系列最多三个下拉框。一开始,页面应该只显示一个下拉框,仅填充级别 1 上的树节点。选择其中一个应该生成第二个下拉框,填充所有选定节点的子节点(所有1 级节点有子节点)。如果需要第三个下拉菜单(大约一半的 2 级节点有子节点),那么选择其中一个应该做同样的事情。

我将如何去做。我是否必须使用 PHP 来生成有关更改事件的所有 javascript?

【问题讨论】:

  • 您想或明确不想使用 AJAX?
  • Ajax 很好,没有明确的要求

标签: php javascript sql drop-down-menu tree


【解决方案1】:

尝试测试这个确切的脚本以确保它有效,然后您可以对其进行调整。 我不确定您是否需要它向后工作。即在选择第 4 级后更改第 1 级。

index.php

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script>
<script>
// get a dropdown based on the parentname and level
function getDropdown(parentname, level) {
    var fields = {parentname: parentname, level: level}
    var levelspan = $('span[level='+level+']');
    // show it as loading first
    levelspan.html('Loading...');

    // use ajax to grab the next dropdown
    // based on the parentname and level
    $.get('ajax.php',fields,function(data){
        // populare the appropriate span
        // with the dropdown
        levelspan.html(data);
    });
}

// bind dropdowns on change
$('.selectDrop').live('change',function(){
    var t = $(this);

    // get the new parent and level
    var newparent = $("option:selected",this).attr('name');
    var level = t.attr('level');

    getDropdown(newparent,level);
});

$(function(){
    // load the first dropdown
    getDropdown('initialparent',0);
});

</script>

<span level='0'></span>
<span level='1'></span>
<span level='2'></span>
<span level='3'></span>

ajax.php

<?php
// here you would have SQL query that 
// grabs all the rows on $_GET['level']
// and where parentname is $_GET['parentname']
// then put them in an array called $rows
// where the key is the parentname and 
// value is the title
// i'm using a static array for testing -
$rows = array('parent1'=>'asdf','parent2'=>'awegwe','parent3'=>'3ggwg');

// get the next level
$nextLevel = $_GET['level'] + 1;

echo "<select ";
// dont bind the 4th dropdown
if ($_GET['level'] < 3) {
    echo "class='selectDrop' ";
}
echo "parentname='".$_GET['parentname']."' level='".$nextLevel."'>";
echo "<option name=''>- Level ".$nextLevel." -</option>";
foreach ($rows as $parentname => $title) {
    echo "<option name='".$parentname."'>".$title."</option>";
}
echo "</select>";
?>

【讨论】:

  • Thilo,非常感谢您的代码,它工作得很好!我不需要它像您描述的那样向后工作,但我无法弄清楚如何在更改后明确一个高级级别。例如,如果选择了 Level 1 和 2,生成了 Level 3 选项,然后更改了 Level 1,则 Level 3 选项应该消失;基本上,更改应该调用方法来更新所有选择,而不仅仅是下一个级别。
  • 这将在 POST 表单中使用。我刚刚将这些下拉列表集成到我的表单中,但我无法访问这些下拉列表,因为它们位于 SPAN 标记中。有没有办法解决这个问题??
  • 数据应该可以通过 POST 获得,只要它们在
    标签之间。用你的代码将我链接到一个 jsfiddle,这样我就可以更清楚地看到问题。
  • 抱歉代码乱七八糟,这是第一个文件 index.php。我使用了&lt;div 而不是&lt;spanpastebin.com/hD6Vbkq4dropdownajax.php:pastebin.com/5UtknpSZ 问题是选择的三个下拉字段(optone、opttwo 和 optthree)由于某种原因没有发布。这可能只是我的一个转储 PHP/HTML 错误,但它让我发疯了。
  • 这可能会让事情更清楚。 Opttwo 是 POSTed,而 Optone 不是:pastebin.com/vrRE2btT pastebin.com/ygW5YyFz
猜你喜欢
  • 2021-08-05
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 2017-12-07
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多