From be1b5a2de4eb1bd6bb4b9c38648c845c2ab5ebc1 Mon Sep 17 00:00:00 2001 From: Andrey Kutejko Date: Mon, 25 Nov 2013 23:24:59 +0200 Subject: [PATCH] better admin inlines --- ipf/admin/model.php | 26 +++++++++----- ipf/admin/modelinline.php | 51 +++++++++++++++++---------- ipf/admin/templates/admin/change.html | 2 +- 3 files changed, 52 insertions(+), 27 deletions(-) diff --git a/ipf/admin/model.php b/ipf/admin/model.php index de353ca..eacc4e0 100644 --- a/ipf/admin/model.php +++ b/ipf/admin/model.php @@ -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, diff --git a/ipf/admin/modelinline.php b/ipf/admin/modelinline.php index cf32366..6693b86 100644 --- a/ipf/admin/modelinline.php +++ b/ipf/admin/modelinline.php @@ -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()) diff --git a/ipf/admin/templates/admin/change.html b/ipf/admin/templates/admin/change.html index 2108b00..e18b14b 100644 --- a/ipf/admin/templates/admin/change.html +++ b/ipf/admin/templates/admin/change.html @@ -26,7 +26,7 @@
- {if $form.errors} + {if $errors}

Please correct the error below.

{/if}
-- 2.49.0