我有一个将值存储到变量(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 .= " ";
}
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代码组合在一起?
答案 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;
}