Как получить значение от кнопок флажка начальной загрузки в yii?

Я использую расширение 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'),
  ),
)); ?>

person gooy    schedule 23.02.2013    source источник


Ответы (3)


Я проверил источник TbButtonGroup, и, похоже, нет способа привязать каждый флажок к атрибуту. Однако вы можете использовать атрибуты данных, чтобы связать каждую кнопку со скрытым полем, представляющим атрибут модели. Это, вероятно, следующая ближайшая вещь и, вероятно, также требует наименьшего количества кода. Вот как вы можете это сделать:

PHP: требуется, чтобы ваша модель хранилась в переменной с именем $model. Поместите в теги формы. Убедитесь, что 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');

В приведенном выше коде слово «Модель» необходимо заменить именем вашей модели, а слова «левый», «средний», «правый» — атрибутами вашей модели. Значение данных должно быть установлено на значение, которое вы хотите, чтобы каждая кнопка представляла.

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);

Затем вы можете просто отправить форму в обычном режиме.

person frostyterrier    schedule 23.02.2013
comment
большое спасибо! Я только что просмотрел ваш ответ, потому что у меня не было на это времени в прошлом месяце. во всяком случае я нашел это очень вдохновляющим. Мне просто нужно было внести некоторые изменения, чтобы сделать именно то, что я хотел. я опубликую свой код результата в другом ответе. - person gooy; 03.04.2013

Мне нужна была эта группа кнопок, чтобы выбрать, какие детали должны использоваться для фильтрации в поиске. Вот почему в моей модели были некоторые вспомогательные атрибуты, называемые (придерживаясь соглашения об именах в этих примерах) $leftSearch, $middleSearch и $rightSearch.

Я хотел, чтобы кнопки оставались нажатыми или выдвигаемыми в зависимости от выбора пользователя (иначе это могло бы запутать, потому что кнопки не нажимались бы после каждого обновления, но атрибуты поиска сохранялись бы в скрытых полях, которые пользователь не видит ). Я добился этого, используя

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

Еще одним моментом было значение данных, которое могло различаться в зависимости от того, что пользователь выбрал перед отправкой страницы. Это было сделано с помощью:

'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 остается точно таким же, как и то, что опубликовал морозный терьер.

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.

person gooy    schedule 03.04.2013

Вы можете просто установить идентификаторы для каждой кнопки:

<?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')),
  ),
)); ?>
person FlyBot    schedule 09.09.2013