]> git.andy128k.dev Git - ipf.git/commitdiff
better admin inlines
authorAndrey Kutejko <andy128k@gmail.com>
Mon, 25 Nov 2013 21:24:59 +0000 (23:24 +0200)
committerAndrey Kutejko <andy128k@gmail.com>
Mon, 25 Nov 2013 21:24:59 +0000 (23:24 +0200)
ipf/admin/model.php
ipf/admin/modelinline.php
ipf/admin/templates/admin/change.html

index de353cad1cba36eebcbee005ca5be27f42f14363..eacc4e0e0f6dbdf6d83f399a07986166861357ac 100644 (file)
@@ -348,8 +348,8 @@ class IPF_Admin_Model
     {
         $il = $this->inlines();
         if (is_array($il)) {
-            foreach($il as $inlineName=>$inlineClassName) {
-                $this->inlineInstances[] = new $inlineClassName($model,$data);
+            foreach($il as $inlineName => $inlineClassName) {
+                $this->inlineInstances[] = new $inlineClassName($model, $data);
             }
         }
     }
@@ -574,14 +574,17 @@ class IPF_Admin_Model
         if ($perms === false || !in_array('view', $perms) || !in_array('add', $perms))
             return new IPF_HTTP_Response_NotFound($request);
 
-        if ($request->method == 'POST')
-        {
+        $errors = false;
+        if ($request->method == 'POST') {
             $this->_beforeAdd(new $this->model());
             $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()) {
+
+            $validForm = $form->isValid();
+            $validInlines = $this->isValidInlines();
+            if ($validForm && $validInlines) {
                 $item = $form->save();
                 $this->saveInlines($item);
                 AdminLog::logAction($request, $item, AdminLog::ADDITION);
@@ -591,8 +594,8 @@ class IPF_Admin_Model
                     $url = IPF_HTTP_URL::urlForView('IPF_Admin_Views_ListItems', array($lapp, $lmodel));
                 return new IPF_HTTP_Response_Redirect($url);
             }
-        }
-        else{
+            $errors = true;
+        } else {
             $form = $this->_getAddForm($this->model,null,array('user_fields'=>$this->fields()));
             $this->_setupAddForm($form);
             $data = array();
@@ -610,6 +613,7 @@ class IPF_Admin_Model
             'extra_js' => $extraMedia['js'],
             'extra_css' => $extraMedia['css'],
             'inlineInstances'=>$this->inlineInstances,
+            'errors' => $errors,
             'lapp'=>$lapp,
             'perms'=>$perms,
             'lmodel'=>$lmodel,
@@ -657,6 +661,7 @@ class IPF_Admin_Model
         if ($perms === false || !in_array('view', $perms))
             return new IPF_HTTP_Response_NotFound($request);
 
+        $errors = false;
         if ($request->method == 'POST') {
             if (!in_array('change', $perms))
                 return new IPF_HTTP_Response_NotFound($request);
@@ -666,7 +671,10 @@ 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()) ) {
+            
+            $validForm = $form->isValid();
+            $validInlines = $this->isValidInlines();
+            if ($validForm && $validInlines) {
                 $item = $form->save();
                 $this->saveInlines($item);
                 AdminLog::logAction($request, $item, AdminLog::CHANGE);
@@ -676,6 +684,7 @@ class IPF_Admin_Model
                     $url = IPF_HTTP_URL::urlForView('IPF_Admin_Views_ListItems', array($lapp, $lmodel));
                 return new IPF_HTTP_Response_Redirect($url);
             }
+            $errors = true;
         } else {
             $data = $o->getData();
             foreach ($o->getTable()->getRelations() as $rname => $rel) {
@@ -707,6 +716,7 @@ class IPF_Admin_Model
             'extra_js' => $extraMedia['js'],
             'extra_css' => $extraMedia['css'],
             'inlineInstances'=>$this->inlineInstances,
+            'errors' => $errors,
             'lapp'=>$lapp,
             'perms'=>$perms,
             'lmodel'=>$lmodel,
index cf32366f9e39d8bd60da7f79f80d739637e1f8c8..6693b869947b923a1b410bbf2f0c4d751d2d084c 100644 (file)
@@ -8,7 +8,7 @@ abstract class IPF_Admin_ModelInline
 
     var $orderby = 'id';
 
-    function __construct($parentModel,$data=null)
+    function __construct($parentModel, $data=null)
     {
         $this->parentModel = $parentModel;
 
@@ -62,9 +62,16 @@ abstract class IPF_Admin_ModelInline
 
     function isValid()
     {
-        foreach ($this->formset as &$form) {
+        foreach ($this->formset as $form) {
             if (!$form->isValid()) {
-                if (!$form->isAdd) {
+                $empty = true;
+                foreach ($form->data as $k => $v) {
+                    if ($k !== 'is_remove' && $v) {
+                        $empty = false;
+                        break;
+                    }
+                }
+                if (!$form->isAdd || !$empty) {
                     return false;
                 }
             }
@@ -122,18 +129,7 @@ abstract class IPF_Admin_ModelInline
 
             foreach ($objects as $obj) {
                 $prefix = 'edit_'.get_class($this->model).'_'.$obj->id.'_';
-                $d = array();
-
-                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;
-                    }
-                }
+                $d = $this->extractFormData($obj, $data, $prefix);
 
                 $form = $this->_getForm($obj, $d, $form_extra);
 
@@ -153,23 +149,42 @@ abstract class IPF_Admin_ModelInline
 
         $n_addnum = $this->getAddNum();
         for ($i = 0; $i < $n_addnum; $i++) {
-            $form = $this->_getForm($this->model->copy(), null, $form_extra);
+            $prefix = 'add_'.get_class($this->model).'_'.$i.'_';
+            $d = $data !== null ? $this->extractFormData(null, $data, $prefix) : null;
+
+            $form = $this->_getForm($this->model->copy(), $d, $form_extra);
             $form->prefix = 'add_'.get_class($this->model).'_'.$i.'_';
             
             $del = new IPF_Form_Field_Boolean(array(
                 'label' => __('Del'),
-                'name' => 'delete_',
+                'name' => 'is_remove',
                 'widget_attrs' => array('disabled'=>'disabled'),
             ));
             $del->is_del = true;
             
             $form->fields = array_merge(array($del), $form->fields);
-            $form->data = $data;
+
             $form->isAdd = true;
             $this->formset[] = $form;
         }
     }
 
+    private function extractFormData($obj, $data, $prefix)
+    {
+        $d = array();
+        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;
+            }
+        }
+        return $d;
+    }
+
     function save($parent_obj)
     {
         if (!$this->isValid())
index 2108b00a77124ad578500a257f04c9d46771aab7..e18b14b8247968b5d99cf5dca89d53625906a358 100644 (file)
@@ -26,7 +26,7 @@
         <form method="post" enctype="multipart/form-data">
         <input type="hidden" name="ipf_referrer" id="id_ipf_referrer" value="" />
         <div>
-            {if $form.errors}
+            {if $errors}
             <p class="errornote">Please correct the error below.</p>
             {/if}
             <fieldset class="module aligned">