1

ユーザーが表示するカテゴリを選択できるウィジェットを作成しようとしています。以下は私が作成したコードですが、チェックボックスの状態の変更は保存できません。値は、タイトルと選択したカテゴリのリストの 2 つだけです。

function form($instance) {
    $instance = (array)$instance;
    if( empty($instance['title']) ) $instance['title'] = 'Category';
    $selected_categories = (array)$instance['category'];
    var_dump($selected_categories); 
    ....
    $categories = get_categories( array('exclude'=> 1) );
    foreach($categories as $category) : ?>
    <div>
        <input type="checkbox" name="<?php echo $this->get_field_name('category'); ?>"
            value="<?php echo $category->cat_ID; ?>"
            <?php echo $category->cat_name; ?>
    </div>
    <?php endforeach; ?>
}

function update($new_instance, $old_instance) {
    $instance = $old_instance;
    $instance['title'] = strip_tags($new_instance['title']);
    $instance['category'] = $new_instance['category'];

    return $instance;
}

var_dump($selected_categories) で変更を観察します。チェックしたチェックボックスの数を無視して、値は常に配列(サイズ= 0)です。

$instance 変数に配列を渡す方法がわかりません。

前もって感謝します。

4

3 に答える 3

0

これは、チェックボックスの配列を使用する 2 番目のソリューションです。最近更新されたウィジェットの新しいバージョン 1.8 のチェックボックス配列でこの問題を解決しました。foreach の 2 番目の形式を使用します

foreach (array_expression as $key => $value).

$keyを使用すると、各チェックボックスの一意の IDを取得できます。ここで $id は、foreach 自体によってインクリメントされる数値です。

function form($instance) {
$term_taxonomy_id = (isset($instance['term_taxonomy_id']) ? array_map('absint', $instance['term_taxonomy_id']) : array("0"));
<?php       
    $categ = get_categories();
    foreach($categ as $id => $item) :  
?>
<br/>
<input  type="checkbox"
    id="<?php echo $this->get_field_id('term_taxonomy_id') . $id; ?>" 
    name="<?php echo $this->get_field_name('term_taxonomy_id'); ?>[]" 
    <?php   if (isset($item->term_taxonomy_id)) {
                if (in_array($item->term_taxonomy_id,$term_taxonomy_id)) 
                    echo 'checked'; 
                };      
            ?>  
    value="<?php echo $item->term_taxonomy_id; ?>" />
<label for="<?php echo $this->get_field_id('term_taxonomy_id') . $id; ?>" >
<?php echo $item->name ?>
</label>
    <?php endforeach; ?>

プラグイン用に cat_ID の代わりに term_taxonomy_id を保存しましたが、 cat_ID をほとんど保存できます同様機能します。

配列データは、php 関数 array_map () によってサニタイズされます。更新関数は次のとおりです。

 function update($new_instance, $old_instance) {
// Par défaut, aucune catégorie n'est exclue
    $instance['term_taxonomy_id'] =  (isset($new_instance['term_taxonomy_id']) ? array_map( 'absint', $new_instance['term_taxonomy_id']) : array('0'));

MySQL クエリで使用するために、値のセットに分解します。

// écriture de la liste des objects sélectionnées en langage MySQL
    if (isset($instance['term_taxonomy_id'])) 
        $selected_object = "('".implode(array_map( 'absint',$instance['term_taxonomy_id']),"','")."')"; 
    else $selected_object = "('0')";
于 2015-10-25T10:07:57.960 に答える
0

値が設定されていない場合に配列内の値を埋める検証関数はありますか? それがウィジェットの »update« メソッドです。おそらく、次を追加する必要があります。

'<input name="..." value="..." id="'.$this->get_field_id( 'category' ).'" />';

入力要素に。

于 2013-02-21T07:38:25.233 に答える