1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-13 18:24:57 +02:00

Update $pages API to add getID() and getByIDs() methods, and add $pages->parents() method for direct access to methods in new PagesParents class

This commit is contained in:
Ryan Cramer
2020-05-14 12:09:06 -04:00
parent 5b31d9939b
commit 3aacccedb1

View File

@@ -140,6 +140,12 @@ class Pages extends Wire {
*/ */
protected $trasher; protected $trasher;
/**
* @var PagesParents
*
*/
protected $parents;
/** /**
* Array of PagesType managers * Array of PagesType managers
* *
@@ -318,7 +324,7 @@ class Pages extends Wire {
} }
/** /**
* Like $pages->find() except returns array of IDs rather than Page objects. * Like find() except returns array of IDs rather than Page objects
* *
* - This is a faster method to use when you only need to know the matching page IDs. * - This is a faster method to use when you only need to know the matching page IDs.
* - The default behavior is to simply return a regular PHP array of matching page IDs in order. * - The default behavior is to simply return a regular PHP array of matching page IDs in order.
@@ -340,8 +346,9 @@ class Pages extends Wire {
* #pw-group-retrieval * #pw-group-retrieval
* *
* @param string|array|Selectors $selector Selector to find page IDs. * @param string|array|Selectors $selector Selector to find page IDs.
* @param array|bool $options Options to modify behavior. * @param array|bool|int|string $options Options to modify behavior.
* - `verbose` (bool): Specify true to make return value array of associative arrays, each with verbose info. * - `verbose` (bool|int|string): Specify true to make return value array of associative arrays, each with id, parent_id, templates_id.
* Specify integer `2` or string `*` to return verbose array of associative arrays, each with all columns from pages table.
* - The verbose option above can also be specified as alternative to the $options argument. * - The verbose option above can also be specified as alternative to the $options argument.
* - See `Pages::find()` $options argument for additional options. * - See `Pages::find()` $options argument for additional options.
* @return array Array of page IDs, or in verbose mode: array of arrays, each with id, parent_id and templates_id keys. * @return array Array of page IDs, or in verbose mode: array of arrays, each with id, parent_id and templates_id keys.
@@ -396,17 +403,116 @@ class Pages extends Wire {
public function get($selector, $options = array()) { public function get($selector, $options = array()) {
return $this->loader->get($selector, $options); return $this->loader->get($selector, $options);
} }
/**
* Get one ID of page matching given selector with no exclusions, like get() but returns ID rather than a Page
*
* This method is an alias of the has() method, and depending on what you are after, may make more
* or less sense with your code readability. Use whichever better suits your case.
*
* #pw-group-retrieval
*
* @param string|array|Selectors $selector Specify selector to find first matching page ID
* @param bool|array $options Specify boolean true to return all pages columns rather than just IDs.
* Or specify array of options (see find method for details), `verbose` option can optionally be in array.
* @return int|string|array
* @see Pages::get(), Pages::has(), Pages::findIDs()
* @since 3.0.156
*
*/
public function getID($selector, $options = array()) {
if(is_array($options)) {
if(empty($options['caller'])) $options['caller'] = 'pages.getID';
$verbose = false;
if(isset($options['verbose'])) {
$verbose = $options['verbose'];
unset($options['verbose']);
}
} else {
$verbose = $options;
$options = array();
}
return $this->loader->has($selector, $verbose, $options);
}
/**
* Given array or CSV string of Page IDs, return a PageArray
*
* #pw-group-retrieval
*
* @param array|string|WireArray $ids Array of page IDs, comma or pipe-separated string of page IDs, or single page ID (string or int)
* @param array $options Options to affect behavior. The 'template' and 'parent' options are recommended when you have this info available.
* - `template` (Template|int|string): Template object, name or ID to use for loaded pages. (default=null)
* - `parent` (Page|int|string): Parent Page object, ID, or path to use for loaded pages. (default=null)
* - `cache` (bool): Place loaded pages in memory cache? (default=true)
* - `getFromCache` (bool): Allow use of previously cached pages in memory (rather than re-loading it from DB)? (default=true)
* - `getNumChildren` (bool): Specify false to disable retrieval and population of 'numChildren' Page property. (default=true)
* - `getOne` (bool): Specify true to return just one Page object, rather than a PageArray. (default=false)
* - `autojoin` (bool): Allow use of autojoin option? (default=true)
* - `joinFields` (array): Autojoin the field names specified in this array, regardless of field settings (requires autojoin=true). (default=empty)
* - `joinSortfield` (bool): Whether the 'sortfield' property will be joined to the page. (default=true)
* - `findTemplates` (bool): Determine which templates will be used (when no template specified) for more specific autojoins. (default=true)
* - `pageClass` (string): Class to instantiate Page objects with. Leave blank to determine from template. (default=auto-detect)
* - `pageArrayClass` (string): PageArray-derived class to store pages in (when 'getOne' is false). (default=PageArray)
* - `pageArray` (PageArray|null): Populate this existing PageArray rather than creating a new one. (default=null)
* - `page` (Page|null): Existing Page object to populate (also requires the getOne option to be true). (default=null)
* @return PageArray|Page Returns PageArray unless the getOne option was specified in which case a Page is returned.
* @since 3.0.156 Previous versions can use $pages->getById() for similar behavior
*
*/
public function getByIDs($ids, array $options = array()) {
$template = empty($options['template']) ? null : $options['template'];
$parent = empty($options['parent']) ? null : $options['parent'];
$parent_id = null;
if($template) {
unset($options['template']);
if($template instanceof Template) {
// cool, cool
} else if(is_int($template) || is_string($template)) {
$template = $this->wire('templates')->get($template);
} else {
$template = null;
}
}
if(!empty($options['parent_id'])) {
unset($options['parent_id']);
$parent_id = (int) $options['parent_id'];
} else if($parent) {
unset($options['parent']);
if($parent instanceof Page) {
$parent_id = $parent->id;
} else if(is_int($parent) || ctype_digit("$parent")) {
$parent_id = (int) "$parent";
} else if(is_string($parent) && $parent) {
$parent_id = $this->has($parent);
}
if(!$parent_id) $parent_id = null;
}
if(count($options)) {
$options['template'] = $template && $template instanceof Template ? $template : null;
$options['parent_id'] = $parent_id;
return $this->loader->getById($ids, $options);
} else {
return $this->loader->getById($ids, $template, $parent_id);
}
}
/** /**
* Is there any page that matches the given $selector in the system? (with no exclusions) * Is there any page that matches the given $selector in the system? (with no exclusions)
* *
* - This can be used as an “exists” or “getID” type of method. * - This can be used as an “exists” type of method.
* - Returns ID of first matching page if any exist, or 0 if none exist (returns array if `$verbose` is true). * - Returns ID of first matching page if any exist, or 0 if none exist (returns array if `$verbose` is true).
* - Like with the `get()` method, no pages are excluded, so an `include=all` is not necessary in selector. * - Like with the `get()` method, no pages are excluded, so an `include=all` is not necessary in selector.
* - If you need to quickly check if something exists, this method is preferable to using a count() or get(). * - If you need to quickly check if something exists, this method is preferable to using a count() or get().
* *
* When `$verbose` option is used, an array is returned instead. Verbose return array includes page `id`, * When `$verbose` option is used, an array is returned instead. Verbose return array includes page `id`,
* `parent_id` and `templates_id` indexes. * `parent_id` and `templates_id` indexes.
*
* #pw-group-retrieval
* *
* @param string|int|array|Selectors $selector * @param string|int|array|Selectors $selector
* @param bool $verbose Return verbose array with page id, parent_id, templates_id rather than just page id? (default=false) * @param bool $verbose Return verbose array with page id, parent_id, templates_id rather than just page id? (default=false)
@@ -669,7 +775,7 @@ class Pages extends Wire {
} }
/** /**
* Given an array or CSV string of Page IDs, return a PageArray * Given an array or CSV string of Page IDs, return a PageArray (internal API)
* *
* Note that this method is primarily for internal use and most of the options available are specific to the needs * Note that this method is primarily for internal use and most of the options available are specific to the needs
* of core methods that utilize them. All pages loaded by ProcessWire pass through this method. * of core methods that utilize them. All pages loaded by ProcessWire pass through this method.
@@ -720,7 +826,7 @@ class Pages extends Wire {
* ]); * ]);
* ~~~~~ * ~~~~~
* *
* #pw-advanced * #pw-internal
* *
* @param array|WireArray|string $_ids Array of Page IDs or CSV string of Page IDs. * @param array|WireArray|string $_ids Array of Page IDs or CSV string of Page IDs.
* @param Template|array|null $template Specify a template to make the load faster, because it won't have to attempt to join all possible fields... just those used by the template. * @param Template|array|null $template Specify a template to make the load faster, because it won't have to attempt to join all possible fields... just those used by the template.
@@ -1434,10 +1540,21 @@ class Pages extends Wire {
* *
*/ */
public function trasher() { public function trasher() {
if(is_null($this->trasher)) $this->trasher = $this->wire(new PagesTrash($this)); if(!$this->trasher) $this->trasher = $this->wire(new PagesTrash($this));
return $this->trasher; return $this->trasher;
} }
/**
* @return PagesParents
*
* #pw-internal
*
*/
public function parents() {
if(!$this->parents) $this->parents = $this->wire(new PagesParents($this));
return $this->parents;
}
/** /**
* Get array of all PagesType managers * Get array of all PagesType managers
* *