2012-05-14 4 views
1

У меня есть два массива. Один из них - $ Категории, который содержит все категории, извлеченные из моего db, а другой - $ preSelectedCategories, который содержит категории, которые должны быть предварительно выбраны в моем списке флажков при загрузке моей формы. Я пытался это сделать:предварительно выбранные элементы в CActiveForm-> checkBoxList в Yii

<?php echo $form->labelEx($model,'category_id'); ?> 
<?php echo $form->checkBoxList($model, 'category_id', $categories, $preSelectedCategories, array('multiple'=>true)); ?> 
<?php echo $form->error($model,'category_id'); ?> 

Но мне это не удалось. Может ли кто-нибудь помочь мне решить эту проблему? Благодаря!

Edit: я уже знал, что с помощью CHtml :: CheckBoxList может помочь, но то, что я хочу здесь использовать виджет CActiveForm :: CheckBoxList, потому что я использую модель для проверки списка флажка.

ответ

3

Один из вариантов заключается в использовании CHtml::activeName, чтобы получить соответствующее имя для ввода и передать его CHtml::checkBoxList, как и другие.

Еще один вариант, который, на мой взгляд, более уместен, заключается в том, чтобы добавить те category_id, которые вы хотите предварительно проверить модели в контроллере, перед тем как визуализировать форму (только когда это запрос GET). Тогда вам не нужно будет изменять форму вообще.

+0

Я не знаю, как установить предварительно проверенную 'category_id' в контроллер. Не могли бы вы привести мне пример? –

+2

Вы пробовали '$ model-> category_id = array_merge ((array) $ model-> category_id, $ preSelectedCategories);' перед вызовом '$ this-> render();' в действии контроллера? Я понятия не имею, как вы сохраняете эти значения и как это поле определено на вашей модели, поэтому это может не сработать, но это общая идея. (Добавьте код контроллера и модель к вашему вопросу, если он не работает, и вам нужна дополнительная помощь.) – DCoder

+0

Спасибо, ваше решение работает очень хорошо! Я забыл, что мы можем устанавливать значения для атрибутов модели, прежде чем визуализировать представление, мое плохое! –

1

CHtml::actviceCheckBoxList (виджет CActiveForm :: CheckBoxList, что вы используете обертка для него) имеет такого синтаксис

public static function activeCheckBoxList($model,$attribute,$data,$htmlOptions=array()) 

Если вы хотите, чтобы вручную установить предварительно выбранные значения - вы Шоули использовать CHtml :: CheckBoxList вместо

public static function checkBoxList($name,$select,$data,$htmlOptions=array()) 

Вот часть ссылки класса CHtml

* @param string $name name of the check box list. You can use this name to retrieve 
    * the selected value(s) once the form is submitted. 
    * @param mixed $select selection of the check boxes. This can be either a string 
    * for single selection or an array for multiple selections. 
    * @param array $data value-label pairs used to generate the check box list. 
    * Note, the values will be automatically HTML-encoded, while the labels will not. 
+0

I alread y знал, что CHtml :: checkBoxList может помочь, но проблема в том, что я хочу использовать CActiveForm :: checkBoxList, чтобы я мог проверять поле, используя правила моей модели. –

1
<?php 
$categories = array(1,2,3); 
$preSelectedCategories = array(1=>true,2=>true); // use this way 
echo CHtml::checkBoxList('category_id',$preSelectedCategories,$categories); 
?> 

Попробуйте это, я пробовал, он работает успешно.

+0

Ваше решение не работает. Насколько мне известно, 'checkAllLast' имеет тип boolean, который определяет, следует ли поставить флажок check all в конце списка флажков. Я хочу, чтобы флажки были автоматически проверены при загрузке страницы. –

+0

Извините за непроверенный ответ, я исправил ответ, и он отлично работает. –

+0

Теперь вы просто повторяете предложение sl4mmer. – DCoder

1

удалить переменную $ preSelectedCategories. Установите $ model-> category_id как массив, который содержит выбранные флажки.

<?php echo $form->labelEx($model,'category_id'); ?> 
<?php 
$model->category_id = array('value1','value2'); 
echo $form->checkBoxList($model, 'category_id', $categories, array('multiple'=>true)); ?> 
<?php echo $form->error($model,'category_id'); ?> 

Вы должны попробовать это, но я не проверял это.

1

Заполните свой атрибут массивом перед его отображением в форме.

В контроллере:

public function actionUpdate($id) { 

    $model=$this->loadModel($id); 

    //For example 
    $categories = array(0=>'Option One',1=>'Option Two',2=>'Option Three'); 
    $preSelectedCategories = array(1,2); 

    //Magic here 
    $model->category_id = $preSelectedCategories; 

    if(isset($_POST['NameOfModel']) { 
    //category_id reset with incoming form data... 
    } 
    ... 
    $this->render('update',array('model'=>$model,'categories'=>$categories)); 
} 

В представлении, в форме:

echo $form->checkBoxList($model,'category_id',$categories); 

непроверенный, так как я изменил его здесь ... адаптирован из виджетов форм внутреннего абонента Bootstrap в.

2

Вы можете легко предварительно заполнить checkBoxList выбранными элементами, он берет массив выбранных ключей во втором параметре.

$selected_keys = array_keys(CHtml::listData($model->books, 'id' , 'id')); 

echo CHtml::checkBoxList('Author[books][]', $selected_keys, $books); 

Пожалуйста, смотрите полный пример здесь, в моем блоге:

http://scriptbaker.com/how-to-make-yii-checkboxlist-selected/

+0

Спасибо за сообщение! Обязательно внимательно прочитайте [FAQ по самопомощи] (http://stackoverflow.com/faq#promotion). Также обратите внимание, что * требуется *, что вы публикуете отказ от ответственности каждый раз, когда вы ссылаетесь на свой собственный сайт/продукт. Я добавил раскрытие для вас; пожалуйста, не забудьте позаботиться об этом сами в будущем! –

+0

@AndrewBarber спасибо за ваш комментарий, вы имеете в виду, если я цитирую URL-адрес из своего собственного блога, я должен прямо сказать, что это из моего блога? и добавить такие слова, как «на моем блоге»? –

+0

Точно, да! Спасибо. –

1

Большинство YII членов, имеющих такой же вопрос, так что здесь более сладкий код с четким объяснением.

Прежде всего, необходимо, чтобы найти предварительно выбранные категории, как -

$criteria = new CDbCriteria(); 
$criteria->select = 'category_id as id'; 
$criteria->condition = 'userid = :userid'; 
$criteria->params = array(':userid' => Yii::app()->user->id); 

//store pre-selected id into variable - $selected_keys 
$selected_keys = array_keys(CHtml::listData(MyCategory::model()->findAll($criteria), 'id', 'id')); 

Теперь генерировать весь список категорий, как -

$list = CHtml::listData(Categories::model()->findAll(array('order'=>'id')), 'id', 'category_name'); 

//htmlOptions for class and others elements 
$htmlOptions = array('template' => '{input}{label}', 'separator'=>'', 'class'=>'in-checkbox', 'multiple'=>true, 'checked'=>'checked'); 

Вид часть -

<?php echo $form->labelEx($model, 'Category', array('class'=>'col-md-3 control-label')); ?> 
<?php $model->Category = $selected_keys; //assign pre-selected list to Category list 
     echo $form->checkBoxList($model, 'Category', $list, $htmlOptions); ?> 
<?php echo $form->error($model, 'Category'); ?> 

Попробуйте это , работа замечательная ..

Смежные вопросы