Revision #2                                    has been created by 
 matkaz                                    on Aug 18, 2010, 7:18:33 PM with the memo:
                                
                                
                                    -                                
                                                                    « previous (#1)                                                                                            
                            Changes
                            
    Title
    changed
    List with multiple checkboxs
    Category
    unchanged
    Tutorials
    Yii version
    unchanged
    
    Tags
    unchanged
    
    Content
    changed
    It is a common case we often come accross. For example the purpose of these checkboxs is to mark records to be deletedcoders often come accross. For example the purpose of these checkbox is to mark records to be deleted
 
 
First of all lets define a very useful 'polymorphic' form. I am sure you will use it a lot now !
 
 
 
```php 
<?php
 
/**
 
 * PolymorphicForm.php in 'models' directory
 
 */
 
class PolymorphicForm extends CFormModel
 
{
 
  private $data = array();
 
 
  public function __get($key) {
 
    return (isset($this->data[$key]) ? $this->data[$key] : null);
 
  }
 
 
  public function __set($key, $value) {
 
    $this->data[$key] = $value;
 
  }
 
}
 
?>
 
```
 
 
Continuing with models, lets define a table 'Example' with fields : keyExample, Field_one, Field_two. You know how to do it don't you ? ...
 
 
Then in the controller ExampleAction.php, the action dealing with the list of this table 'Example'
 
 
 
```php 
...
 
// an over simplified 'list' action	
 
public function actionList ()
 
{
 
  $form = new PolymorphicForm;
 
 
  $this->render("list", array(
 
    "models" => Example::model()->findAll(),
 
    "form"   => $form, 
 
  ));
 
}
 
...
 
```
 
 
Then the view defined in file list.php
 
 
 
```php 
<script language="javascript">
 
  function byebye ()
 
  {
 
    // need a confirmation before submiting
 
    if (confirm('Are you sure ?'))			
 
      $("#myForm").submit ();
 
  }
 
 
  $(document).ready(function(){
 
    // powerful jquery ! Clicking on the checkbox 'checkAll' change the state of all checkbox  
 
    $('.checkAll').click(function () {
 
      $("input[type='checkbox']:not([disabled='disabled'])").attr('checked', this.checked);
 
    });
 
  });
 
</script>
 
 
<?php echo CHtml::beginForm("index.php?r=Example/delete", "post", array("id"=>"myForm")); ?>
 
 
<table>
 
  <tr>
 
    <th><?php echo "Blabla" ?></th>
 
    <th><?php echo "Blabla bis"; ?></th>
 
    <th>
 
	All <?php echo CHtml::activeCheckBox($form, "checkAll", array ("class" => "checkAll")); ?>
 
	<button
 
  	  type="button"				
 
	  onClick="byebye()"
 
	>
 
	  Delete
 
	</button>
 
    </th>
 
  </tr>
 
 
  <?php foreach($models as $n=>$rec): ?>
 
  <tr>
 
    <td>
 
	<?php echo CHtml::encode($rec->Field_one); ?>
 
    </td>
 
    <td>
 
	<?php echo CHtml::encode($rec->Field_two); ?>
 
    </td>
 
    <td>
 
	<?php echo CHtml::activeCheckBox($form, "checkRecord_$rec->keyExample"); ?>
 
    </td>
 
  </tr>
 
  <?php endforeach; ?>
 
 
</table>
 
<?php echo CHtml::endForm(); ?>
 
 
```
 
 
Finally the trick to deal with these checkboxs in ExampleAction.php
 
 
 
```php 
...
 
/**
 
* Deletes a range of model
 
* If deletion is successful, the browser will be redirected to the "list" page.
 
*/
 
public function actionDelete()
 
{
 
  // I want a post	
 
  if(Yii::app()->request->isPostRequest)
 
  {
 
    // parse $_POST variables
 
    foreach($_POST["PolymorphicForm"] as $key => $val) {
 
      // is one a these checkbox ?
 
      if (strstr ($key, "checkRecord")) {
 
        // checkbox in state checked ?
 
        if ($val == 1) {
 
          // get the key of the record
 
          $ar = explode ("_", $key);
 
          // deleting record 
 
          $model = Example::model()->findByPk ($ar[1])->delete ();
 
        }
 
      }
 
    }
 
    $this->redirect(array("list"));
 
  }	
 
  else
 
    throw new CHttpException(400,"Invalid request. Please do not repeat this request again.");
 
}
 
 
...
 
```
 
 
The result can be tested, calling
 
http://myHttpServer/myApp?r=Example/list
 
 
I hope this will be useful for some of the Yii coders.