3

私は yii-bootstrap 拡張機能を使用しており、チェックボックス ボタン グループを使用したいと考えていました。レンダリングは問題なく機能していますが、どのボタンがチェックされ、どのボタンがチェックされていないかを読み取る方法がわかりません。各チェックボックスをモデルの属性にバインドする可能性はありますか?

これは私がこれまでに使用したものです (実際には yii-bootstrap ウェブサイトからの正確なコピーです):

<?php $this->widget('bootstrap.widgets.TbButtonGroup', array(
  'type' => 'primary',
  'toggle' => 'radio', // 'checkbox' or 'radio'
  'buttons' => array(
    array('label'=>'Left'),
    array('label'=>'Middle'),
    array('label'=>'Right'),
  ),
)); ?>
4

3 に答える 3

4

検索でのフィルタリングに使用する詳細を選択するには、このボタン グループが必要でした。そのため、モデルに $leftSearch、$middleSearch、$rightSearch という名前のヘルパー属性をいくつか用意しました (これらの例では命名規則に従います)。

ユーザーの選択に応じて、ボタンを押し込んだり押し込んだりしたままにしたかったのです (そうしないと、更新のたびにボタンが押されなくなり、ユーザーには表示されない非表示のフィールドに検索属性が保存されるため、混乱する可能性があります)。 )。私はそれを使用してそれを達成しました

'active' => ($model->leftSearch)?true:false,

もう 1 つの問題は、ユーザーがページを送信する前に選択した内容によって異なるデータ値でした。それは以下で行われました:

'data-value' => ($model->leftSearch)?0:1,

ビュー内の完全なコードは次のようになります。

$this->widget('bootstrap.widgets.TbButtonGroup', array(
        'type' => 'primary',
        'toggle' => 'checkbox',
        'buttons' => array(
            array('label'=>'Left', 
                'active' => ($model->leftSearch)?true:false,
                'htmlOptions'=>array(
                    'data-field' => 'Model_leftSearch',
                    'data-value' => ($model->leftSearch)?0:1,
            ),),
            array('label'=>'Middle', 
                'active' => ($model->middleSearch)?true:false,
                'htmlOptions'=>array(
                    'data-field' => 'Model_middleSearch',
                    'data-value' => ($model->middleSearch)?0:1,
            ),),
            array('label'=>'Right', 
                'active' => ($model->rightSearch)?true:false,
                'htmlOptions'=>array(
                    'data-field' => 'Model_rightSearch',
                    'data-value' => ($model->rightSearch)?0:1,
            ),),
        ),
    ));
echo CHtml::activeHiddenField($model, 'leftSearch');
echo CHtml::activeHiddenField($model, 'middleSearch');
echo CHtml::activeHiddenField($model, 'rightSearch');

javascript は、frostyterrier が投稿したものとまったく同じままです

Yii::app()->clientScript->registerScript('buttonGroup', "
  $(function(){
   $('.btn-group a').click(function(){
    var fieldId = $(this).data('field');
    var value = $(this).data('value');
    $('#' + fieldId).val(value); 
   });
  });
", CClientScript::POS_END);

JavaScript部分について私が理解していない唯一のことは、上記のようにビューに挿入すると機能するが、外部.jsファイルに含まれていると機能しないことです。POS_END と関係があると思いますが、私は JavaScript の専門家ではありません。

于 2013-04-03T15:46:41.550 に答える
2

TbButtonGroup のソースをチェックアウトしましたが、各チェックボックスを属性にバインドする方法がないようです。ただし、データ属性を使用して、各ボタンをモデル属性を表す隠しフィールドにリンクすることができます。これはおそらく次に近いものであり、必要なコード量もおそらく最も少ないでしょう。これを行う方法は次のとおりです。

PHP: $model という変数にモデルを格納する必要があります。form タグ内に配置します。jQuery がロードされていることを確認します。

$this->widget('bootstrap.widgets.TbButtonGroup', array(
  'type' => 'primary',
  'toggle' => 'radio', // 'checkbox' or 'radio'
  'buttons' => array(
    array('label'=>'Left', 'htmlOptions' => array(
        'data-field' => 'Model_left',
        'data-value' => 1,
    )),
    array('label'=>'Middle', 'htmlOptions' => array(
        'data-field' => 'Model_middle',
        'data-value' => 2,
    )),
    array('label'=>'Right', 'htmlOptions' => array(
        'data-field' => 'Model_right',
        'data-value' => 3,
    )),
  ),
));
echo CHtml::activeHiddenField($model, 'left');
echo CHtml::activeHiddenField($model, 'middle');
echo CHtml::activeHiddenField($model, 'right');

上記のコードでは、Model という単語をモデル名に置き換え、left、middle、right という単語をモデルの属性に置き換える必要があります。データ値は、各ボタンが表す値に設定する必要があります。

Javascript:

Yii::app()->clientScript->registerScript('buttonGroup', "
$(function(){
    $('.btn-group a').click(function(){
        var fieldId = $(this).data('field');
        var value = $(this).data('value');
        $('#' + fieldId).val(value);
    });
});
", CClientScript::POS_END);

その後、通常どおりフォームを送信できます。

于 2013-02-23T12:32:19.273 に答える
0

各ボタンに ID を設定するだけです。

<?php $this->widget('bootstrap.widgets.TbButtonGroup', array(
  'type' => 'primary',
  'toggle' => 'radio', // 'checkbox' or 'radio'
  'buttons' => array(
    array('label'=>'Left', 'url' => '#', 'linkOptions'=>array('id' => 'btn_1')),
    array('label'=>'Middle', 'url' => '#', 'linkOptions'=>array('id' => 'btn_2')),
    array('label'=>'Right', 'url' => '#', 'linkOptions'=>array('id' => 'btn_3')),
  ),
)); ?>
于 2013-09-09T19:54:25.980 に答える