From: avl Date: Fri, 12 Sep 2008 01:40:33 +0000 (+0300) Subject: Inline Tabular Complete X-Git-Tag: 0.5~491 X-Git-Url: https://git.andy128k.dev/?a=commitdiff_plain;h=c1f32effdd06601bcb3ecb4a9046578f8ca0cde2;p=ipf.git Inline Tabular Complete --- diff --git a/ipf/admin/model.php b/ipf/admin/model.php index 07f52e2..394ef50 100644 --- a/ipf/admin/model.php +++ b/ipf/admin/model.php @@ -38,11 +38,11 @@ class IPF_Admin_Model{ return array('view', 'add', 'change', 'delete'); } - protected function setInlines(&$instance=null){ + protected function setInlines($model, &$data){ $il = $this->inlines(); if (is_array($il)){ foreach($il as $inlineName=>$inlineClassName){ - $this->inlineInstances[] = new $inlineClassName($this->model,$instance); + $this->inlineInstances[] = new $inlineClassName($model,$data); } } } @@ -55,12 +55,10 @@ class IPF_Admin_Model{ protected function _setupEditForm($form){ $this->_setupForm($form); - $this->setInlines($this->instance); } protected function _setupAddForm($form){ $this->_setupForm($form); - $this->setInlines(); } protected function _setupForm($form){ @@ -73,7 +71,7 @@ class IPF_Admin_Model{ public function isValidInlines(){ foreach($this->inlineInstances as &$il){ if ($il->isValid()===false){ - //return false; + return false; } } return true; @@ -142,7 +140,7 @@ class IPF_Admin_Model{ } } - protected function UrlForResult(&$o){ + protected function UrlForResult($o){ return $o->__get($this->qe->getTable()->getIdentifier()).'/'; } @@ -169,8 +167,10 @@ class IPF_Admin_Model{ // Views Function public function AddItem($request, $lapp, $lmodel){ if ($request->method == 'POST'){ - $form = $this->_getAddForm($this->model,$request->POST+$request->FILES,array('user_fields'=>$this->fields())); + $data = $request->POST+$request->FILES; + $form = $this->_getAddForm($this->model, &$data, array('user_fields'=>$this->fields())); $this->_setupAddForm($form); + $this->setInlines($this->model, &$data); if ($form->isValid()) { $item = $form->save(); AdminLog::logAction($request, $item, AdminLog::ADDITION); @@ -181,6 +181,7 @@ class IPF_Admin_Model{ else{ $form = $this->_getAddForm($this->model,null,array('user_fields'=>$this->fields())); $this->_setupAddForm($form); + $this->setInlines($this->model, null); } $context = array( 'page_title'=>'Add '.$this->modelName, @@ -194,9 +195,13 @@ class IPF_Admin_Model{ public function EditItem($request, $lapp, $lmodel, $o){ if ($request->method == 'POST'){ - $form = $this->_getEditForm($o,$request->POST+$request->FILES,array('user_fields'=>$this->fields())); + $data = $request->POST+$request->FILES; + $form = $this->_getEditForm($o,&$data,array('user_fields'=>$this->fields())); $this->_setupEditForm($form); + $this->setInlines($o, &$data); + if ( ($form->isValid()) && ($this->isValidInlines()) ) { + //print_r($form->cleaned_data); $item = $form->save(); $this->saveInlines($item); AdminLog::logAction($request, $item, AdminLog::CHANGE); @@ -205,8 +210,10 @@ class IPF_Admin_Model{ } } else{ - $form = $this->_getEditForm($o,$o->getData(),array('user_fields'=>$this->fields())); + $data = $o->getData(); + $form = $this->_getEditForm($o,&$data,array('user_fields'=>$this->fields())); $this->_setupEditForm($form); + $this->setInlines($o, &$data); } $context = array( diff --git a/ipf/admin/modelinline.php b/ipf/admin/modelinline.php index b7b32c9..4d43f8e 100644 --- a/ipf/admin/modelinline.php +++ b/ipf/admin/modelinline.php @@ -17,16 +17,19 @@ abstract class IPF_Admin_ModelInline{ abstract function getModelName(); - function getAddNum(){ return 2; } + function getAddNum(){ return 4; } function getLegend(){ return get_class($this->model); } + function isValid(){ foreach($this->formset as &$form){ - if ($form->isValid()==false){ - return false; + if (!$form->isValid()){ + if (!$form->isAdd){ + return false; + } } } return true; @@ -37,7 +40,7 @@ abstract class IPF_Admin_ModelInline{ if ($rel->getClass()==get_class($this->parentModel)) return $rel->getAlias(); } - throw new IPF_Exception('Cannot get fkName for '.$this->getModelName()); + throw new IPF_Exception(__('Cannot get fkName for '.$this->getModelName())); } function getFkLocal(){ @@ -45,26 +48,111 @@ abstract class IPF_Admin_ModelInline{ if ($rel->getClass()==get_class($this->parentModel)) return $rel->getLocal(); } - throw new IPF_Exception('Cannot get fkLocal for '.$this->getModelName()); + throw new IPF_Exception(__('Cannot get fkLocal for '.$this->getModelName())); } function createFormSet(&$data){ + $this->formset = array(); + + $first = true; + + if ($this->parentModel->exists()){ + + $objects = IPF_ORM_Query::create() + ->from(get_class($this->model)) + ->orderby('id') + ->where($this->getFkLocal().'='.$this->parentModel->id) + ->execute(); + + 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; + } + $form = IPF_Shortcuts::GetFormForModel($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')), + ),$form->fields); + + $form->isAdd = false; + if ($first){ + $form->isFirst = true; + $first = false; + } + else + $form->isFirst = false; + $this->formset[] = $form; + } + } + for($i=0; $i<$this->getAddNum(); $i++ ){ - $form = IPF_Shortcuts::GetFormForModel($this->model, null, array('exclude'=>array($this->getFkName(),$this->getFkLocal()))); + $form = IPF_Shortcuts::GetFormForModel($this->model->copy(), null, array('exclude'=>array($this->getFkName(),$this->getFkLocal()))); $form->fields = array_merge(array(new IPF_Form_Field_Boolean(array('label'=>'Del','name'=>'delete_', 'widget_attrs'=>array('disabled'=>'disabled')))),$form->fields); - $form->prefix = 'add_'.get_class($this->model).'_'.$i; + $form->prefix = 'add_'.get_class($this->model).'_'.$i.'_'; $form->data = $data; - if ($i==0) + $form->isAdd = true; + if ($first){ $form->isFirst = true; + $first = false; + } else $form->isFirst = false; - //print_r($form->fields); $this->formset[] = $form; } } function save(){ - + $fk_name = $this->getFkName(); + + if ($this->parentModel->exists()){ + $objects = IPF_ORM_Query::create() + ->from(get_class($this->model)) + ->orderby('id') + ->where($this->getFkLocal().'='.$this->parentModel->id) + ->execute(); + foreach ($objects as $obj){ + 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) + $obj->delete(); + else{ + unset($form->cleaned_data[0]); + foreach($form->fields as $fname=>$f){ + if (is_a($f,'IPF_Form_Field_File')){ + if($form->cleaned_data[$fname]===null) + continue; + if($form->cleaned_data[$fname]=='') + unset($form->cleaned_data[$fname]); + } + } + $obj->synchronizeWithArray($form->cleaned_data); + $obj->save(); + } + break; + } + } + } + } + + foreach($this->formset as $form){ + unset($form->cleaned_data[0]); + if ($form->isValid()){ + if ($form->isAdd){ + $form->cleaned_data[$fk_name] = $this->parentModel; + $form->save(); + } + } + } } } \ No newline at end of file diff --git a/ipf/admin/templates/admin/change.html b/ipf/admin/templates/admin/change.html index 5261399..6d23e28 100644 --- a/ipf/admin/templates/admin/change.html +++ b/ipf/admin/templates/admin/change.html @@ -15,7 +15,7 @@ {foreach $inlineInstances as $inline} -
+
{$inline->getLegend()} {foreach $inline.formset as $formset} @@ -28,13 +28,14 @@ {/if} {foreach $formset.fields as $fieldname=>$field} - + {/foreach} {/foreach}
{$formset.field($fieldname)|safe}{$formset.field($fieldname).fieldErrors()}{$formset.field($fieldname)|safe}
{/foreach} +
{if array_search('delete',$perms)!==false}

Delete

{/if} diff --git a/ipf/auth/models/User.php b/ipf/auth/models/User.php index 16c8643..b638f18 100644 --- a/ipf/auth/models/User.php +++ b/ipf/auth/models/User.php @@ -95,7 +95,7 @@ class User extends BaseUser // Inspect user errors foreach($userErrors as $fieldName => $errorCodes) { echo "Error:".$fieldName; - print_r($errorCodes); + //print_r($errorCodes); } } return $user; diff --git a/ipf/form.php b/ipf/form.php index 13e092c..6a6e5d6 100644 --- a/ipf/form.php +++ b/ipf/form.php @@ -36,7 +36,7 @@ class IPF_Form implements Iterator function addPrefix($field_name) { if ('' !== $this->prefix) { - return $this->prefix.'-'.$field_name; + return $this->prefix.$field_name; } return $field_name; } diff --git a/ipf/form/field/file.php b/ipf/form/field/file.php index d345da8..113cc34 100644 --- a/ipf/form/field/file.php +++ b/ipf/form/field/file.php @@ -14,7 +14,6 @@ class IPF_Form_Field_File extends IPF_Form_Field IPF::loadFunction($this->remove_function); return call_user_func($this->remove_function, $value['data']); } - $value = $value['data']; if ($value['name']=='') diff --git a/ipf/form/field/float.php b/ipf/form/field/float.php index ab78f78..e9e0d4f 100644 --- a/ipf/form/field/float.php +++ b/ipf/form/field/float.php @@ -11,10 +11,8 @@ class IPF_Form_Field_Float extends IPF_Form_Field parent::clean($value); if (in_array($value, $this->empty_values)) { - $value = ''; + return null; } - $_value = $value; - $value = (float) $value; if (!is_numeric($value)) { throw new IPF_Exception_Form(__('Enter a number.'));