From ff1d63c0d4650eafa76d9d889924376a18350c2b Mon Sep 17 00:00:00 2001 From: Ryan Cramer Date: Mon, 27 Jul 2020 16:38:53 -0400 Subject: [PATCH] Fix issue processwire/processwire-issues#1175 --- wire/core/Field.php | 23 ++++++++++++++++--- wire/core/Fields.php | 6 ++++- .../Fieldtype/FieldtypeFieldsetOpen.module | 14 +++++------ 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/wire/core/Field.php b/wire/core/Field.php index 75c33680..c407fbb5 100644 --- a/wire/core/Field.php +++ b/wire/core/Field.php @@ -19,6 +19,7 @@ * @property string $name Name of field #pw-group-properties * @property string $table Database table used by the field #pw-group-properties * @property string $prevTable Previously database table (if field was renamed) #pw-group-properties + * @property string $prevName Previously used name (if field was renamed), 3.0.164+ #pw-group-properties * @property Fieldtype|null $type Fieldtype module that represents the type of this field #pw-group-properties * @property Fieldtype|null $prevFieldtype Previous Fieldtype, if type was changed #pw-group-properties * @property int $flags Bitmask of flags used by this field #pw-group-properties @@ -179,18 +180,26 @@ class Field extends WireData implements Saveable, Exportable { protected $prevTable; /** - * A specifically set table name by setTable() for override purposes + * If the field name changed, this is the previous name * * @var string * */ - protected $setTable = ''; + protected $prevName = ''; /** * If the field type changed, this is the previous fieldtype so that it can be changed at save time * */ protected $prevFieldtype; + + /** + * A specifically set table name by setTable() for override purposes + * + * @var string + * + */ + protected $setTable = ''; /** * Accessed properties, becomes array when set to true, null when set to false @@ -269,6 +278,9 @@ class Field extends WireData implements Saveable, Exportable { } else if($key == 'prevTable') { $this->prevTable = $value; return $this; + } else if($key == 'prevName') { + $this->prevName = $value; + return $this; } else if($key == 'prevFieldtype') { $this->prevFieldtype = $value; return $this; @@ -389,6 +401,7 @@ class Field extends WireData implements Saveable, Exportable { else if($key == 'editRoles') return $this->editRoles; else if($key == 'table') return $this->getTable(); else if($key == 'prevTable') return $this->prevTable; + else if($key == 'prevName') return $this->prevName; else if($key == 'prevFieldtype') return $this->prevFieldtype; else if(isset($this->settings[$key])) return $this->settings[$key]; else if($key == 'icon') return $this->getIcon(true); @@ -616,7 +629,10 @@ class Field extends WireData implements Saveable, Exportable { throw new WireException("You may not change the name of field '{$this->settings['name']}' because it is a system field."); } $this->trackChange('name'); - if($this->settings['name']) $this->prevTable = $this->getTable(); // so that Fields can perform a table rename + if($this->settings['name']) { + $this->prevName = $this->settings['name']; + $this->prevTable = $this->getTable(); // so that Fields can perform a table rename + } } $this->settings['name'] = $name; @@ -1481,6 +1497,7 @@ class Field extends WireData implements Saveable, Exportable { $info['flags'] = $info['flags'] ? "$this->flagsStr ($info[flags])" : ""; $info = array_merge($info, parent::__debugInfo()); if($this->prevTable) $info['prevTable'] = $this->prevTable; + if($this->prevName) $info['prevName'] = $this->prevName; if($this->prevFieldtype) $info['prevFieldtype'] = (string) $this->prevFieldtype; if(!empty($this->trackGets)) $info['trackGets'] = $this->trackGets; if($this->useRoles) { diff --git a/wire/core/Fields.php b/wire/core/Fields.php index 6d18802f..ee76f742 100644 --- a/wire/core/Fields.php +++ b/wire/core/Fields.php @@ -266,9 +266,13 @@ class Fields extends WireSaveableItems { $database->exec("RENAME TABLE `$prevTable` TO `tmp_$table`"); // QA $database->exec("RENAME TABLE `tmp_$table` TO `$table`"); // QA } - $item->type->renamedField($item, str_replace(Field::tablePrefix, '', $prevTable)); $item->prevTable = ''; } + + if(!$isNew && $item->prevName && $item->prevName != $item->name) { + $item->type->renamedField($item, $item->prevName); + $item->prevName = ''; + } if($item->prevFieldtype && $item->prevFieldtype->name != $item->type->name) { if(!$this->changeFieldtype($item)) { diff --git a/wire/modules/Fieldtype/FieldtypeFieldsetOpen.module b/wire/modules/Fieldtype/FieldtypeFieldsetOpen.module index c7efe8c8..c819cd37 100644 --- a/wire/modules/Fieldtype/FieldtypeFieldsetOpen.module +++ b/wire/modules/Fieldtype/FieldtypeFieldsetOpen.module @@ -333,14 +333,14 @@ class FieldtypeFieldsetOpen extends Fieldtype { // avoid ending up in infinite loop, since FieldtypeFieldsetClose extends this if($this instanceof FieldtypeFieldsetClose) return; // rename the _END field to match this one - $fields = $this->wire('fields'); + $fields = $this->wire()->fields; + $oldName = $prevName . self::fieldsetCloseIdentifier; + $newName = $field->name . self::fieldsetCloseIdentifier; $closer = $this->getFieldsetCloseField($field); - if(!$closer) { - $closer = $fields->get($prevName . self::fieldsetCloseIdentifier); - if($closer) { - $closer->name = $field->name . self::fieldsetCloseIdentifier; - $fields->save($closer); - } + if(!$closer) $closer = $fields->get($oldName); + if($closer && $closer->name != $newName) { + $closer->name = $newName; + $fields->save($closer); } parent::___renamedField($field, $prevName); }