I'm having trouble figuring out how to correctly use checkboxes with model bound forms. Here's basically what I have:
class MyModel extends Model {
public $is_sent; // bool in MySQL
}
class MyModelForm extends Form {
public function initialize() {
$this->add(new Check('is_sent'));
}
}
class MyController extends Controller {
public function myAction($id) {
$model = MyModel::findFirst($id);
$form = new MyModelForm($model, $_POST);
if ($this->request->isPost()) {
if ($form->isValid($_POST, $model)) {
$model->save();
}
}
$this->view->form = $form;
}
}
Rendering this to HTML surely creates a checkbox which is either checked or unchecked according to the $is_sent value in the model.
But also the value of the checkbox changes; it's "1" for true/checked and "0" for false/unchecked. So checking the checkbox doesn't actually change the model value since it's posted as "0". A dirty fix for this is to force the value to "1":
class MyModelForm extends Form {
public function initialize() {
$this->add(new Check('is_sent', array('value' => 1));
}
}
So this fixes the problem of changing the value from unchecked to checked. But the other way round doesn't work. When I uncheck the checkbox, it's not included in $_POST and the value on the model isn't changed. Another dirty fix does the trick:
class MyController extends Controller {
public function myAction($id) {
$model = MyModel::findFirst($id);
$form = new MyModelForm($model, $_POST);
if ($this->request->isPost()) {
if (!$this->request->hasPost('is_sent')) $_POST['is_sent'] = 0;
if ($form->isValid($_POST, $model)) {
$model->save();
}
}
$this->view->form = $form;
}
}
Am I doing something wrong or is the model-form buggy and the only solution is these dirty kludges?