1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-11 17:24:46 +02:00

Add new $pages->saveFields([ 'field1', 'field2', 'etc.' ]); method that enables you to save multiple fields on a page. Previously you could only save the entire page, or 1 field at a time.

This commit is contained in:
Ryan Cramer
2024-10-11 16:13:36 -04:00
parent 1c0aa2d248
commit 0ef8a4de0b
2 changed files with 116 additions and 4 deletions

View File

@@ -39,8 +39,9 @@
* HOOKABLE METHODS * HOOKABLE METHODS
* ================ * ================
* @method PageArray find($selectorString, array $options = array()) Find and return all pages matching the given selector string. Returns a PageArray. #pw-group-retrieval * @method PageArray find($selectorString, array $options = array()) Find and return all pages matching the given selector string. Returns a PageArray. #pw-group-retrieval
* @method bool save(Page $page, $options = array()) Save any changes made to the given $page. Same as : $page->save() Returns true on success. #pw-group-manipulation * @method bool save(Page $page, $options = array()) Save any changes made to the given $page. Same as $page->save(); Returns true on success. #pw-group-manipulation
* @method bool saveField(Page $page, $field, array $options = array()) Save just the named field from $page. Same as: $page->save('field') #pw-group-manipulation * @method bool saveField(Page $page, $field, array $options = array()) Save just the named field from $page. Same as: $page->save('field') #pw-group-manipulation
* @method array saveFields(Page $page, $fields, array $options = array()) Saved multiple named fields for $page. @since 3.0.242 #pw-group-manipulation
* @method bool trash(Page $page, $save = true) Move a page to the trash. If you have already set the parent to somewhere in the trash, then this method won't attempt to set it again. #pw-group-manipulation * @method bool trash(Page $page, $save = true) Move a page to the trash. If you have already set the parent to somewhere in the trash, then this method won't attempt to set it again. #pw-group-manipulation
* @method bool restore(Page $page, $save = true) Restore a trashed page to its original location. #pw-group-manipulation * @method bool restore(Page $page, $save = true) Restore a trashed page to its original location. #pw-group-manipulation
* @method int|array emptyTrash(array $options = array()) Empty the trash and return number of pages deleted. #pw-group-manipulation * @method int|array emptyTrash(array $options = array()) Empty the trash and return number of pages deleted. #pw-group-manipulation
@@ -90,9 +91,6 @@
* @method savedPageOrField(Page $page, array $changes) Hook inclusive of both saved() and savedField(). * @method savedPageOrField(Page $page, array $changes) Hook inclusive of both saved() and savedField().
* @method found(PageArray $pages, array $details) Hook called at the end of a $pages->find(). * @method found(PageArray $pages, array $details) Hook called at the end of a $pages->find().
* *
* TO-DO
* =====
* @todo Update saveField to accept array of field names as an option.
* *
*/ */
@@ -870,6 +868,36 @@ class Pages extends Wire {
return $this->editor()->saveField($page, $field, $options); return $this->editor()->saveField($page, $field, $options);
} }
/**
* Save multiple named fields from given page
*
* ~~~~~
* // you can specify field names as array…
* $a = $pages->saveFields($page, [ 'title', 'body', 'summary' ]);
*
* // …or a CSV string of field names:
* $a = $pages->saveFields($page, 'title, body, summary');
*
* // return value is array of saved field/property names
* print_r($a); // outputs: array( 'title', 'body', 'summary' )
* ~~~~~
*
* @param Page $page Page to save
* @param array|string|string[]|Field[] $fields Array of field names to save or CSV/space separated field names to save.
* These should only be Field names and not native page property names.
* @param array|string $options Optionally specify one or more of the following to modify default behavior:
* - `quiet` (boolean): Specify true to bypass updating of modified user and time (default=false).
* - `noHooks` (boolean): Prevent before/after save hooks (default=false), please also use $pages->___saveField() for call.
* - See $options argument for Pages::save() for additional options
* @return array Array of saved field names (may also include property names if they were modified)
* @throws WireException
* @since 3.0.242
*
*/
public function ___saveFields(Page $page, $fields, array $options = array()) {
return $this->editor()->saveFields($page, $fields, $options);
}
/** /**
* Add a new page using the given template and parent * Add a new page using the given template and parent
* *

View File

@@ -937,6 +937,90 @@ class PagesEditor extends Wire {
return $return; return $return;
} }
/**
* Save multiple named fields from given page
*
* ~~~~~
* // you can specify field names as array…
* $a = $pages->saveFields($page, [ 'title', 'body', 'summary' ]);
*
* // …or a CSV string of field names:
* $a = $pages->saveFields($page, 'title, body, summary');
*
* // return value is array of saved field/property names
* print_r($a); // outputs: array( 'title', 'body', 'summary' )
* ~~~~~
*
* @param Page $page Page to save
* @param array|string|string[]|Field[] $fields Array of field names to save or CSV/space separated field names to save.
* These should only be Field names and not native page property names.
* @param array|string $options Optionally specify one or more of the following to modify default behavior:
* - `quiet` (boolean): Specify true to bypass updating of modified user and time (default=false).
* - `noHooks` (boolean): Prevent before/after save hooks (default=false), please also use $pages->___saveField() for call.
* - See $options argument for Pages::save() for additional options
* @return array Array of saved field names (may also include property names if they were modified)
* @throws WireException
* @since 3.0.242
*
*/
public function saveFields(Page $page, $fields, array $options = array()) {
$saved = array();
$quiet = !empty($options['quiet']);
$noHooks = !empty($options['noHooks']);
// do not update modified user/time until last save
if(!$quiet) $options['quiet'] = true;
if(!is_array($fields)) {
$fields = explode(' ', str_replace(',', ' ', "$fields"));
}
foreach($fields as $key => $field) {
$field = trim("$field");
if(empty($field) || !$page->hasField($field)) unset($fields[$key]);
}
// save each field
foreach($fields as $field) {
if($noHooks) {
$success = $this->saveField($page, $field, $options);
} else {
$success = $this->pages->saveField($page, $field, $options);
}
if($success) {
$saved[$field] = $field;
$page->untrackChange($field);
}
}
if($quiet) {
// do not save native properties or update page modified-user/modified
} else {
// finish by saving the page without fields
$options['quiet'] = false;
foreach($page->getChanges() as $name) {
if($page->hasField($name)) continue;
// add only changed native properties to saved list
$saved[$name] = $name;
}
$options['noFields'] = true;
if($noHooks) {
$this->save($page, $options);
} else {
$this->pages->save($page, $options);
}
}
$this->pages->debugLog('saveFields', "$page:" . implode(',', $fields), $saved);
return $saved;
}
/** /**
* Silently add status flag to a Page and save * Silently add status flag to a Page and save
* *