在循环期间无法选择表单选项

时间:2013-01-11 03:08:32

标签: php html mysql forms select

我有一个将值存储到变量(duh)中的解析器。这里讨论的变量是:

$item[2]   <- contains the string 'facebook'

我有一个包含选择菜单的html表单。根据数据库中存储的内容动态填充菜单。这就是我的菜单构建方式:

<?php
$formats = $wpdb->get_results($wpdb->prepare("
        SELECT * FROM table
        WHERE taxonomy = 'format'
        "));
?>

<div id="format" class="form">
    Format: <?php echo $item[2]; ?>  <!-- echoes the variable to know it works -->
    <?php
        $terms = array();              
        foreach($formats as $key => $term){
            $terms[$term->parent][$term->term_id] = $term;
        }
    ?>    
    <select name="formats">
        <option value="empty"></option>
        <?php printTerms($terms, $item); ?> <!--- THIS DOESN'T APPEAR TO PASS $item INTO THE FUNCTION -->
    </select>
</div>

<?php
function printTerms($terms, $item, $parent = 0, $deep = 0){ // HOW DO I USE $item ???
    if(count($terms[$parent]) > 0){
        $indent = "";
        for($i = 0; $i < $deep; $i++){
            $indent .= "&nbsp;&nbsp;&nbsp;";
        }

        foreach($terms[$parent] as $key => $term){
            if(count($terms[$term->term_id]) > 0){
                if($deep == 0){
                    echo "<option class='toplevel' value='".$term->name."' ".$selected.">".$term->name."</option>";   //     <- Outputs top level parents
                } else {
                    echo "<option class='child".$deep."' value='".$term->name."' ".$selected.">".$indent.$term->name."</option>";  // <- Outputs children that are also parents
                }

                printTerms($terms, $term->term_id, ($deep+1));

            } else {
                echo "<option class='solo' value='".$term->name."' ".$selected.">".$indent.$term->name."</option>";   // <- outputs bottom level children and solos.
            }
        }
    }
}
?>

到目前为止这一切都有效,但这是我的问题。

我想这样做,如果items [2]包含字符串'Facebook'(它确实如此),则默认选择相应的菜单选项。

我确实让它在一个简单的静态选择菜单中工作:

foreach ($formats as $format) {
    $selected = '';
            if ($item[2] == 'facebook' || $item[2] == 'wall' && $format->slug == 'facebook'){ 
        $selected = 'selected';
    }
    echo "<option value='".$format->name."' ".$selected.">".$format->name."</option>";
}

$ format-&gt; slug包含我想要与$ item [2]匹配的值。 因此,$ term-&gt; slug对应于$ format-&gt; slug。

$ format-&gt; name是用于输出到菜单本身的select选项的标题。 同样,$ term-&gt; name对应于$ format-&gt; name。

$ formats访问此MySQL表:

term_id       name           slug                 taxonomy     parent
1             Entry Form     entry-form           format       0
2             Page           page                 format       3
3             Facebook       facebook             format       0
4             Entry Form     facebook-entry-form  format       3
5             Twitter        twitter              format       0
6             Single        single                format       2

您会注意到我已经将$ selected变量插入到我的函数中。我的问题是我无法让我的代码在printTerms函数的上下文中工作。

出于我的问题的目的,假设任何变量都没有任何空格(我检查过)。

要记住一些规则:

$ term-&gt; slug和$ item [2]并不总是匹配。如果$ item [2]是'wall',这也应该导致'facebook'的默认选择。 (见上面的代码)。

所以问题是,我如何将printTerms()函数与我的select代码组合在一起?

1 个答案:

答案 0 :(得分:1)

我稍微修改了你的代码,无需数据库即可进行测试。真正的“变化”是我将count()修改为使用isset()代替。

琐碎的变化是选项现在换行分离,函数不输出任何内容,而是返回输出。

这样生成的HTML会在我的Firefox浏览器中默认显示“Facebook”。

(缩进,并删除了</option>以获取易读性)

<html><body><select>
<option class='solo'     value='Entry Form'>Entry Form
<option class='toplevel' value='Facebook' selected="selected">Facebook
<option class='child1'   value='Page'      >   Page
<option class='solo'     value='Single'    >      Single
<option class='solo'     value='Entry Form'>   Entry Form
<option class='solo'     value='Twitter'   >Twitter
</select></body></html>

PHP测试用例如下:

<?php
        $formats = array(
                array('term_id' => 1, 'name' => 'Entry Form', 'slug' => 'entry-form', 'taxonomy' => 'format', 'parent' => 0),
                array('term_id' => 2, 'name' => 'Page', 'slug' => 'page', 'taxonomy' => 'format', 'parent' => 3),
                array('term_id' => 3, 'name' => 'Facebook', 'slug' => 'facebook', 'taxonomy' => 'format', 'parent' => 0),
                array('term_id' => 4, 'name' => 'Entry Form', 'slug' => 'facebook-entry-form', 'taxonomy' => 'format', 'parent' => 3),
                array('term_id' => 5, 'name' => 'Twitter', 'slug' => 'twitter', 'taxonomy' => 'format', 'parent' => 0),
                array('term_id' => 6, 'name' => 'Single', 'slug' => 'single', 'taxonomy' => 'format', 'parent' => 2),
        );

        $terms = array();
        foreach($formats as $term){
                $a = $term['parent'];
                $b = $term['term_id'];
            $terms[$a][$b] = $term;
        }

        function printTerms($terms, $parent = 0, $deep = 0, $item){
        $output = '';
    if(count($terms[$parent]) > 0){
        $indent = "";
        for($i = 0; $i < $deep; $i++){
            $indent .= "   ";
        }

        foreach($terms[$parent] as $key => $term)
        {
            $selected = ($item == $term['slug']) ? ' selected="selected"' : '';
            if(isset($terms[$term['term_id']]))
            {
                if($deep == 0){
                    $output .= "<option class='toplevel' value='".$term['name']."'".$selected.">".$term['name']."</option>";   //     <- Out
puts top level parents
                } else {
                    $output .= "<option class='child".$deep."' value='".$term['name']."'".$selected.">".$indent.$term['name']."</option>";
// <- Outputs children that are also parents
                }
                $output .= "\n";
                $output .= printTerms($terms, $term['term_id'], ($deep+1), $item);

            } else {
                $output .= "<option class='solo' value='".$term['name']."'".$selected.">".$indent.$term['name']."</option>";   // <- outputs
 bottom level children and solos.
                $output .= "\n";
            }
        }
    }
        return $output;
}

        print "<html><body><select>";
        print printTerms($terms, 0, 0, 'facebook');
        print "</select></body></html>";

?>

更新:我们可以在之前的printTerms函数的基础上进行更灵活的匹配。

首先,我们将printTerms()重命名为printTermsBase(),然后从中删除对选项选择的所有引用。然后输出将是一堆形式

的行
 <option class='something' value='somethingelse'>text</option>

现在我们可以在输出上运行文本匹配。通过“墙”时,下面的功能将选择“墙”;如果没有“墙”,则选择“脸书”;如果它也不存在,它将不会选择任何东西。您可以反转数组,以便选择“墙”,除非 facebook存在。文本匹配是准确的:“facebook-form”将被忽略。如果您希望将“facebook”与“facebook-form”匹配,则需要使用preg*函数。

 function printTerms($terms, $item)
 {
     $items = array($item, 'facebook');
     $options = printTermsBase($terms, 0, 0);
     foreach($items as $raw)
     {
         // We could use preg_match here for even greater flexibility
         $search="value='$raw'";
         if (false === strpos($options, $search))
             continue;
         // One of the option matches.
         // We just replace    value='something'
         // with               value='something' selected='selected'
         return str_replace($search, $search.' selected="selected"', $options);
     }
     // No match. Return options unchanged.
     return $options;
 }