-1

シンプルなセレクトボックスがあります。正常に印刷されていますが、サブキャットをインデントしたいので、レイアウトは次のようになります。

Hardware
 - CPU
 - Motherboards
  -- MSI
  -- ASUS
Screens
 - Dell
  -- 27"
Acer

私のデータベースでは、テーブルは次のように定義されています。

ID - Label - Parent

私の現在のコードは次のとおりです。

<select label="users" id="cat" onchange="showUser(this.value)" style="width:100%;padding:3px;cursor:pointer;">
<option value="">-- Choose category -- </option>
<?php 
$categories = $mysqli->query("SELECT * FROM medialib_cats");
while($row = $categories->fetch_assoc()){?>
    <option value="<?php echo $row['id']; ?>">
    <?php echo $row['label']; ?>
    </option>

<?php } ?>
</select>

結果を group by でグループ化しようとしましたが、うまくいきませんでした。php/mysqli で自動的にインデントするにはどうすればよいですか? 私は再帰を使うべきだと思いますか?行を -- でインデントしたいだけで、optgroup を使用しないでください :)

4

3 に答える 3

1

オプションは optgroups を使用することができます:

<select label="users" id="cat" onchange="showUser(this.value)" style="width:100%;padding:3px;cursor:pointer;">
<option value="">-- Choose category -- </option>
<?php 
$categories = $mysqli->query("SELECT * FROM medialib_cats");
while($row = $categories->fetch_assoc()){
    if ($lastgrp != $row['parent']) {
        if ($lastgrp!="") echo "</optgroup>";
        $lastgrp = $row['parent'];
        echo "<optgroup>".$lastgrp;
    }
    echo "<option value="+ $row['id'] + ">"+  $row['label'] + "</option>";

} ?></optgroup>
</select>
于 2013-10-07T10:31:09.187 に答える
1

を使用する<optgroup>のは、選択したオプションをグループ化する標準的な方法です。

$options    = array();
$categories = $mysqli->query("
  SELECT 
    id, label, p.label as parent_label 
  FROM 
    medialib_cats AS child
  INNER JOIN
    medialib_cats AS p ON p.id = child.parent
");
foreach($categories as $category) {
  $parent = $category['parent_label'];
  if (! isset($options[$parent])) $options[$parent] = array();
  $options[$parent][$category['id']] = $category['label'];
}
echo "<select>";
foreach($options as $group => $option) {
  printf('<optgroup label="%s">', $group);
  foreach ($option as $id => $label) {
    printf('<option value="%s">%s</option>', $id, $label);
  }
  printf('</optgroup>');
}
echo "</select>";

CodePadの例を作成し(db の結果を配列としてモックした)、正しく動作するようにしました。

于 2013-10-07T10:33:13.927 に答える
0

うーん... optgroup を使わないようにしようと思います。いくつかの問題を引き起こしているようです。選択ボックスで親0を選択できないこともoptgroupでわかりましたか? -- でインデントを追加するだけではどうですか?

于 2013-10-07T11:06:18.067 に答える