]> git.andy128k.dev Git - ipf.git/commitdiff
Inline Tabular Complete
authoravl <alex.litovchenko@gmail.com>
Fri, 12 Sep 2008 01:40:33 +0000 (04:40 +0300)
committeravl <alex.litovchenko@gmail.com>
Fri, 12 Sep 2008 01:40:33 +0000 (04:40 +0300)
ipf/admin/model.php
ipf/admin/modelinline.php
ipf/admin/templates/admin/change.html
ipf/auth/models/User.php
ipf/form.php
ipf/form/field/file.php
ipf/form/field/float.php

index 07f52e215b85e2d291abc8719dacadd98180c06d..394ef5071f57f1344b8e46a8bacef8a6956d9390 100644 (file)
@@ -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(
index b7b32c9da156b631118717fe6e18dc5a9485973b..4d43f8e4d2d9577fa639094be5bdc5029d48e110 100644 (file)
@@ -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
index 52613997ca00056d6ce073be79c3ccc880132570..6d23e28da9a12f0202428360f3b8177a2db422a7 100644 (file)
@@ -15,7 +15,7 @@
     </table>
     </fieldset>
     {foreach $inlineInstances as $inline}
-    <fieldset class="inlineTabular">
+    <fieldset class="inlineTabular" style="border:none; width:auto; float:left; padding:0; margin:10px 10px 10px 0;">
     <legend>{$inline->getLegend()}</legend>
     <table>
     {foreach $inline.formset as $formset}
     {/if}
     <tr>
     {foreach $formset.fields as $fieldname=>$field}
-    <td>{$formset.field($fieldname)|safe}</td>
+    <td>{$formset.field($fieldname).fieldErrors()}{$formset.field($fieldname)|safe}</td>
     {/foreach}
     </tr>
     {/foreach}
     </table>
     </fieldset>
     {/foreach}
+    <div style="clear:both;"></div>
 
     <div class="submit-row">
         {if array_search('delete',$perms)!==false}<p class="float-left"><a href="{url 'IPF_Admin_Views_DeleteItem', array($lapp, $lmodel, $object.id)}" class="deletelink">Delete</a></p>{/if}
index 16c864304d2ae4fa3a6a125cdf437d8da7cca4c0..b638f18e1aebbb9be747a205082a01319215969e 100644 (file)
@@ -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;
index 13e092c31df0a779253cd95c4789cb5dbcf65520..6a6e5d6fe2a12358e0248d26e08af80cfca86f52 100644 (file)
@@ -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;
     }
index d345da8c529c4cf48e5b6a440d91bcd2243f269d..113cc3425f0f4a60d5bcfc983f46bc43f9c7521f 100644 (file)
@@ -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']=='')
index ab78f78dc316d118ea9fdd3d9dd87c059ed69205..e9e0d4fd17c08c35218ad9c1b6516a84608fbc44 100644 (file)
@@ -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.'));