From 2d20f90b9741597918a0d64dcb910fe71482240f Mon Sep 17 00:00:00 2001 From: Andrey Kutejko Date: Sun, 14 Sep 2014 15:42:34 +0300 Subject: [PATCH] ordered inlines --- src/adminmodel.php | 34 +++++++++++++++++++++++++++++++++- src/adminmodelinline.php | 20 +++++++++++++------- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/adminmodel.php b/src/adminmodel.php index 75d0b94..a97ec6f 100644 --- a/src/adminmodel.php +++ b/src/adminmodel.php @@ -312,7 +312,10 @@ class IPF_Admin_ModelForm extends IPF_Form_Model $modelName = $inline->getModelName(); $fk_local = $inline->getFkLocal(); - foreach ($this->cleaned_data[$modelName] as $objData) { + foreach ($this->cleaned_data[$modelName] as $index => $objData) { + if ($index === 'reorder') + continue; + if (array_key_exists('id', $objData) && array_key_exists($objData['id'], $objIndex)) { $obj = $objIndex[$objData['id']]; if (isset($objData['is_remove'])) { @@ -323,11 +326,40 @@ class IPF_Admin_ModelForm extends IPF_Form_Model } } else { $objData[$fk_local] = $model->id; + unset($objData['id']); $obj = new $modelName; $obj->synchronizeWithArray($objData); $obj->save(); } } + + $reorder = \PFF\Arr::get($this->cleaned_data[$modelName], 'reorder'); + $this->reorderInline($inline, $objIndex, $reorder); + } + + private function reorderInline($inline, $objIndex, $reorder) + { + $ord = $inline->_orderableColumn(); + if ($ord === null || !$reorder) + return; + + $objs = array(); + $ords = array(); + foreach ($reorder as $id) { + if (array_key_exists($id, $objIndex)) { + $objs[] = $objIndex[$id]; + $ords[] = $objIndex[$id]->$ord; + } + } + + sort($ords); + + $i = 0; + foreach ($objs as $obj) { + $obj->$ord = $ords[$i]; + $obj->save(); + $i++; + } } } diff --git a/src/adminmodelinline.php b/src/adminmodelinline.php index bb5e4dd..c9e70e0 100644 --- a/src/adminmodelinline.php +++ b/src/adminmodelinline.php @@ -87,24 +87,30 @@ abstract class IPF_Admin_ModelInline public function createField() { + $args = array( + 'fields' => array(), + 'addCount' => $this->getAddNum(), + ); + $exclude = array( $this->getFkName(), $this->getFkLocal(), ); $o = $this->_orderableColumn(); - if ($o) + if ($o) { + $fieldClass = 'IPF_Form_Field_OrderedSet'; $exclude[] = $o; + $args['orderBy'] = $o; + } else { + $fieldClass = 'IPF_Form_Field_Set'; + } - $fields = array(); foreach (IPF_Form_Model::suggestFields($this->getTable(), null, $exclude, null) as $field) { list($n, $f) = $field; - $fields[$n] = $f; + $args['fields'][$n] = $f; } - return new IPF_Form_Field_Set(array( - 'fields' => $fields, - 'addCount' => $this->getAddNum(), - )); + return new $fieldClass($args); } } -- 2.49.0