From af53ff66a481df40c35068c99fe88d55128805e9 Mon Sep 17 00:00:00 2001 From: avl Date: Sun, 1 Feb 2009 23:41:49 +0200 Subject: [PATCH] Inline CheckBoxes fix --- ipf/admin/model.php | 7 +++---- ipf/admin/modelinline.php | 30 +++++++++++++++++++----------- ipf/form.php | 1 + ipf/form/widget/checkboxinput.php | 4 ++-- ipf/orm/record.php | 3 --- 5 files changed, 25 insertions(+), 20 deletions(-) diff --git a/ipf/admin/model.php b/ipf/admin/model.php index a4b21b8..5c7d0a7 100644 --- a/ipf/admin/model.php +++ b/ipf/admin/model.php @@ -64,7 +64,7 @@ class IPF_Admin_Model{ return array('view', 'add', 'change', 'delete'); } - protected function setInlines($model, &$data){ + protected function setInlines($model, $data){ $il = $this->inlines(); if (is_array($il)){ foreach($il as $inlineName=>$inlineClassName){ @@ -241,7 +241,7 @@ class IPF_Admin_Model{ $form = $this->_getAddForm($this->model,null,array('user_fields'=>$this->fields())); $this->_setupAddForm($form); $data = array(); - $this->setInlines($this->model, &$data); + $this->setInlines($this->model); } $context = array( @@ -265,7 +265,6 @@ class IPF_Admin_Model{ $form = $this->_getEditForm($o,&$data,array('user_fields'=>$this->fields())); $this->_setupEditForm($form); $this->setInlines($o, &$data); - if ( ($form->isValid()) && ($this->isValidInlines()) ) { $item = $form->save(); $this->saveInlines($item); @@ -289,7 +288,7 @@ class IPF_Admin_Model{ } $form = $this->_getEditForm($o,&$data,array('user_fields'=>$this->fields())); $this->_setupEditForm($form); - $this->setInlines($o, &$data); + $this->setInlines($o); } $context = array( diff --git a/ipf/admin/modelinline.php b/ipf/admin/modelinline.php index 7543e81..d576286 100644 --- a/ipf/admin/modelinline.php +++ b/ipf/admin/modelinline.php @@ -7,12 +7,11 @@ abstract class IPF_Admin_ModelInline{ var $parentModel = null; var $formset = null; - function __construct($parentModel,$data){ + function __construct($parentModel,$data=null){ $this->parentModel = $parentModel; $modelName = $this->getModelName(); $this->model = new $modelName(); - $this->createFormSet($data); } @@ -55,7 +54,7 @@ abstract class IPF_Admin_ModelInline{ throw new IPF_Exception(__('Cannot get fkLocal for '.$this->getModelName())); } - function createFormSet(&$data){ + function createFormSet($data){ $this->formset = array(); @@ -71,15 +70,24 @@ abstract class IPF_Admin_ModelInline{ foreach ($objects as $obj){ $prefix = 'edit_'.get_class($this->model).'_'.$obj->id.'_'; $d = array(); - foreach ($obj->getData() as $k=>$v) - $d[$prefix.$k] = $v; - foreach ($data as $k=>$v){ - if (strpos($k,$prefix)==0) - $d[$k] = $v; - } + + if ($data===null){ + foreach ($obj->getData() as $k=>$v){ + $d[$prefix.$k] = $v; + } + } + else{ + foreach ($data as $k=>$v){ + if (strpos($k,$prefix)==0) + $d[$k] = $v; + } + } + $form = $this->_getForm($obj, $d, array('exclude'=>array($this->getFkName(),$this->getFkLocal())) ); + + $form->prefix = $prefix; $form->fields = array_merge(array( new IPF_Form_Field_Boolean(array('label'=>'Del','name'=>'is_remove')), @@ -113,7 +121,6 @@ abstract class IPF_Admin_ModelInline{ } function save($parent_obj){ - if ($this->parentModel->exists()){ $objects = IPF_ORM_Query::create() ->from(get_class($this->model)) @@ -124,6 +131,7 @@ abstract class IPF_Admin_ModelInline{ foreach($this->formset as $form){ if ($form->isAdd) continue; + @list($x1,$x2,$id,$x3) = @split('_',$form->prefix); if ($id==$obj->id){ if ($form->cleaned_data[0]==true) @@ -137,8 +145,8 @@ abstract class IPF_Admin_ModelInline{ if($form->cleaned_data[$fname]=='') unset($form->cleaned_data[$fname]); } - } + } $obj->synchronizeWithArray($form->cleaned_data); $obj->save(); } diff --git a/ipf/form.php b/ipf/form.php index 517135d..b8f6c45 100644 --- a/ipf/form.php +++ b/ipf/form.php @@ -59,6 +59,7 @@ class IPF_Form implements Iterator $this->cleaned_data = array(); $this->errors = array(); $form_methods = get_class_methods($this); + foreach ($this->fields as $name=>$field) { $value = $field->widget->valueFromFormData($this->addPrefix($name), &$this->data); try { diff --git a/ipf/form/widget/checkboxinput.php b/ipf/form/widget/checkboxinput.php index d365982..3905ba2 100644 --- a/ipf/form/widget/checkboxinput.php +++ b/ipf/form/widget/checkboxinput.php @@ -9,13 +9,13 @@ class IPF_Form_Widget_CheckboxInput extends IPF_Form_Widget_Input if ((bool)$value) { $extra_attrs['checked'] = 'checked'; } + $extra_attrs['value'] = '1'; return parent::render($name, '', $extra_attrs); } public function valueFromFormData($name, $data) { - if (!isset($data[$name]) - or false === $data[$name] or (string)$data[$name] === '0') { + if (!isset($data[$name]) or false === $data[$name] or (string)$data[$name] === '0' or (string)$data[$name] === 'off') { return false; } return true; diff --git a/ipf/orm/record.php b/ipf/orm/record.php index a8baf48..9eeb8f1 100644 --- a/ipf/orm/record.php +++ b/ipf/orm/record.php @@ -863,21 +863,18 @@ abstract class IPF_ORM_Record extends IPF_ORM_Record_Abstract implements Countab $this->assignIdentifier((array) $value); continue; } - if ($deep && $this->getTable()->hasRelation($key)) { $this->get($key)->synchronizeWithArray($value); } else if ($this->getTable()->hasField($key)) { $this->set($key, $value); } } - // eliminate relationships missing in the $array foreach ($this->_references as $name => $obj) { if ( ! isset($array[$name])) { unset($this->$name); } } - if ($refresh) { $this->refresh(); } -- 2.49.0