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.