1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-12 09:44:38 +02:00
This commit is contained in:
Ryan Cramer
2020-07-27 16:38:53 -04:00
parent 7391f48c28
commit ff1d63c0d4
3 changed files with 32 additions and 11 deletions

View File

@@ -19,6 +19,7 @@
* @property string $name Name of field #pw-group-properties * @property string $name Name of field #pw-group-properties
* @property string $table Database table used by the 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 $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 $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 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 * @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; protected $prevTable;
/** /**
* A specifically set table name by setTable() for override purposes * If the field name changed, this is the previous name
* *
* @var string * @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 * If the field type changed, this is the previous fieldtype so that it can be changed at save time
* *
*/ */
protected $prevFieldtype; 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 * 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') { } else if($key == 'prevTable') {
$this->prevTable = $value; $this->prevTable = $value;
return $this; return $this;
} else if($key == 'prevName') {
$this->prevName = $value;
return $this;
} else if($key == 'prevFieldtype') { } else if($key == 'prevFieldtype') {
$this->prevFieldtype = $value; $this->prevFieldtype = $value;
return $this; return $this;
@@ -389,6 +401,7 @@ class Field extends WireData implements Saveable, Exportable {
else if($key == 'editRoles') return $this->editRoles; else if($key == 'editRoles') return $this->editRoles;
else if($key == 'table') return $this->getTable(); else if($key == 'table') return $this->getTable();
else if($key == 'prevTable') return $this->prevTable; else if($key == 'prevTable') return $this->prevTable;
else if($key == 'prevName') return $this->prevName;
else if($key == 'prevFieldtype') return $this->prevFieldtype; else if($key == 'prevFieldtype') return $this->prevFieldtype;
else if(isset($this->settings[$key])) return $this->settings[$key]; else if(isset($this->settings[$key])) return $this->settings[$key];
else if($key == 'icon') return $this->getIcon(true); 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."); throw new WireException("You may not change the name of field '{$this->settings['name']}' because it is a system field.");
} }
$this->trackChange('name'); $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; $this->settings['name'] = $name;
@@ -1481,6 +1497,7 @@ class Field extends WireData implements Saveable, Exportable {
$info['flags'] = $info['flags'] ? "$this->flagsStr ($info[flags])" : ""; $info['flags'] = $info['flags'] ? "$this->flagsStr ($info[flags])" : "";
$info = array_merge($info, parent::__debugInfo()); $info = array_merge($info, parent::__debugInfo());
if($this->prevTable) $info['prevTable'] = $this->prevTable; if($this->prevTable) $info['prevTable'] = $this->prevTable;
if($this->prevName) $info['prevName'] = $this->prevName;
if($this->prevFieldtype) $info['prevFieldtype'] = (string) $this->prevFieldtype; if($this->prevFieldtype) $info['prevFieldtype'] = (string) $this->prevFieldtype;
if(!empty($this->trackGets)) $info['trackGets'] = $this->trackGets; if(!empty($this->trackGets)) $info['trackGets'] = $this->trackGets;
if($this->useRoles) { if($this->useRoles) {

View File

@@ -266,9 +266,13 @@ class Fields extends WireSaveableItems {
$database->exec("RENAME TABLE `$prevTable` TO `tmp_$table`"); // QA $database->exec("RENAME TABLE `$prevTable` TO `tmp_$table`"); // QA
$database->exec("RENAME TABLE `tmp_$table` TO `$table`"); // QA $database->exec("RENAME TABLE `tmp_$table` TO `$table`"); // QA
} }
$item->type->renamedField($item, str_replace(Field::tablePrefix, '', $prevTable));
$item->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($item->prevFieldtype && $item->prevFieldtype->name != $item->type->name) {
if(!$this->changeFieldtype($item)) { if(!$this->changeFieldtype($item)) {

View File

@@ -333,14 +333,14 @@ class FieldtypeFieldsetOpen extends Fieldtype {
// avoid ending up in infinite loop, since FieldtypeFieldsetClose extends this // avoid ending up in infinite loop, since FieldtypeFieldsetClose extends this
if($this instanceof FieldtypeFieldsetClose) return; if($this instanceof FieldtypeFieldsetClose) return;
// rename the _END field to match this one // 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); $closer = $this->getFieldsetCloseField($field);
if(!$closer) { if(!$closer) $closer = $fields->get($oldName);
$closer = $fields->get($prevName . self::fieldsetCloseIdentifier); if($closer && $closer->name != $newName) {
if($closer) { $closer->name = $newName;
$closer->name = $field->name . self::fieldsetCloseIdentifier; $fields->save($closer);
$fields->save($closer);
}
} }
parent::___renamedField($field, $prevName); parent::___renamedField($field, $prevName);
} }