3

値を変数に格納するパーサーがあります (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->slug は、$item[2] に一致させたい値を含むものです。そのため、$term->slug は $format->slug に対応します。

$format->name は、メニュー自体に出力するための選択オプションのタイトルです。同様に、$term->name は $format->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->slug と $item[2] は常に一致するとは限りません。$item[2] が「wall」の場合、「facebook」もデフォルトで選択されます。(上記の私のコードを参照してください)。

問題は、printTerm() 関数を select コードと組み合わせるにはどうすればよいかということです。

4

1 に答える 1

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>

これで、出力に対してテキスト マッチングを実行できます。以下の関数は、「wall」を渡すと「wall」を選択します。「壁」が存在しない場合は、「facebook」が選択されます。それも存在しない場合は、何も選択されません。facebook が存在しない限り、配列を反転して「wall」が選択されるようにすることができます。テキストの完全一致: 「facebook-form」は無視されます。「facebook-form」と「facebook」を一致させたい場合は、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;
 }
于 2013-01-12T15:56:25.830 に答える