2012-05-14 8 views
1

私は2つの配列を持っています。 1つは$ categoriesで、私のデータベースからすべてのカテゴリを取得し、もう1つは$ preSelectedCategoriesで、フォームがロードされるときにチェックボックスのリストで事前に選択する必要があるカテゴリが含まれています。私はこれをやろうとしました:あらかじめ選択されたCActiveFormの項目 - >チェックボックス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'); ?> 

私は成功しませんでした。誰も私がこの問題を解決するのを助けることができますか?ありがとう!

編集:私はすでに:: CheckBoxListのCHTMLを使用して助けることができることを知っていたが、私はここにしたいことはCActiveFormを使用することです:: CheckBoxListの私は、チェックボックスのリストを検証するためにモデルを使用していますので。

答えて

3

1つのオプションは、CHtml::activeNameを使用して入力の適切な名前を取得し、CHtml::checkBoxListに渡すことです。

私の意見では、フォームをレンダリングする前に(コントローラがGET要求の場合のみ)コントローラ内のモデルにあらかじめチェックしたいものを追加することをお勧めします。その後、フォームをまったく変更する必要はありません。

+0

コントローラーで事前にチェックされた 'category_id'を設定する方法がわかりません。あなたは私に例を教えていただけますか? –

+2

コントローラのアクションで '$ this-> render();'を呼び出す前に '$ model-> category_id = array_merge((array)$ model-> category_id、$ preSelectedCategories);これらの値をどのように保存しているのか、そのフィールドがモデル上でどのように定義されているのかわからないので、これはうまくいかないかもしれませんが、一般的な考えです。 (コントローラとモデルコードを追加しても問題が解決しない場合は、ヘルプが必要です) – DCoder

+0

ありがとうございます、あなたのソリューションはかなりうまくいきます!ビューをレンダリングする前にモデル属性の値を設定できることを忘れました。 –

1

CHtml::actviceCheckBoxList(CActiveForm :: CheckBoxListのあなたはそれにラッパーで使用していること)を手動で設定するあらかじめ選択された値にしたい場合は

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

、このような構文を持っている - あなたはCHTMLを使用shoul :: 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

私は、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型であり、チェックボックスをチェックボックスのリストの最後に置かなければなりません。私がしたいのは、ページがロードされたときにチェックボックスを自動的にチェックすることです。 –

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

テストされていない、私はここでそれを修正するので...ブートストラップの拡張機能のフォームウィジェットから適応。

2

checkBoxListには、選択した項目を簡単に事前に入力できます。選択されたキーの配列を2番目のパラメータに取り込みます。

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

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

私のブログに、ここでは完全な例を参照してください:ので、ここでは、明確な説明とより甘いのコードを同じ問題を抱えてYiiのメンバーの

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

+0

あなたの答えを投稿してくれてありがとう! [自己プロモーションに関するよくある質問](http://stackoverflow.com/faq#promotion)をよく読んでください。また、自分のサイト/製品にリンクするたびに免責条項を掲示することが必須*であることにも注意してください。私はあなたに開示を追加しました。あなた自身でこれからも世話をしてください! –

+0

@AndrewBarberあなたのコメントのおかげで、私は自分のブログからURLを引用すると、私は明示的に私のブログからそれを伝える必要がありますか? 「自分のブログに」などの単語を追加しますか? –

+0

まったく、はい!ありがとうございました。 –

1

ほとんどを。一部

$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'); ?> 

これを試してみてくださいように、今、全カテゴリのリストを生成

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

-

まず、あなたは次のようにあなたの事前選択したカテゴリを見つける必要があります、素晴らしい仕事..

関連する問題