Files
lichterei-web/kirby/src/Cms/HasChildren.php
Bastian Allgeier 9c89153d35 Upgrade to 3.2.0
2019-06-25 09:56:08 +02:00

260 lines
5.4 KiB
PHP
Executable File

<?php
namespace Kirby\Cms;
use Kirby\Toolkit\Str;
/**
* HasChildren
*
* @package Kirby Cms
* @author Bastian Allgeier <bastian@getkirby.com>
* @link https://getkirby.com
* @copyright Bastian Allgeier GmbH
* @license https://getkirby.com/license
*/
trait HasChildren
{
/**
* The Pages collection
*
* @var Kirby\Cms\Pages
*/
public $children;
/**
* The list of available drafts
*
* @var Kirby\Cms\Pages
*/
public $drafts;
/**
* Returns the Pages collection
*
* @return Kirby\Cms\Pages
*/
public function children()
{
if (is_a($this->children, 'Kirby\Cms\Pages') === true) {
return $this->children;
}
return $this->children = Pages::factory($this->inventory()['children'], $this);
}
/**
* Returns all children and drafts at the same time
*
* @return Kirby\Cms\Pages
*/
public function childrenAndDrafts()
{
return $this->children()->merge($this->drafts());
}
/**
* Return a list of ids for the model's
* toArray method
*
* @return array
*/
protected function convertChildrenToArray(): array
{
return $this->children()->keys();
}
/**
* Searches for a child draft by id
*
* @param string $path
* @return Kirby\Cms\Page|null
*/
public function draft(string $path)
{
$path = str_replace('_drafts/', '', $path);
if (Str::contains($path, '/') === false) {
return $this->drafts()->find($path);
}
$parts = explode('/', $path);
$parent = $this;
foreach ($parts as $slug) {
if ($page = $parent->find($slug)) {
$parent = $page;
continue;
}
if ($draft = $parent->drafts()->find($slug)) {
$parent = $draft;
continue;
}
return null;
}
return $parent;
}
/**
* Return all drafts of the model
*
* @return Kirby\Cms\Pages
*/
public function drafts()
{
if (is_a($this->drafts, 'Kirby\Cms\Pages') === true) {
return $this->drafts;
}
$kirby = $this->kirby();
// create the inventory for all drafts
$inventory = Dir::inventory(
$this->root() . '/_drafts',
$kirby->contentExtension(),
$kirby->contentIgnore(),
$kirby->multilang()
);
return $this->drafts = Pages::factory($inventory['children'], $this, true);
}
/**
* Finds one or multiple children by id
*
* @param string ...$arguments
* @return Kirby\Cms\Page|Kirby\Cms\Pages
*/
public function find(...$arguments)
{
return $this->children()->find(...$arguments);
}
/**
* Finds a single page or draft
*
* @return Kirby\Cms\Page|null
*/
public function findPageOrDraft(string $path)
{
return $this->children()->find($path) ?? $this->drafts()->find($path);
}
/**
* Returns a collection of all children of children
*
* @return Kirby\Cms\Pages
*/
public function grandChildren()
{
return $this->children()->children();
}
/**
* Checks if the model has any children
*
* @return boolean
*/
public function hasChildren(): bool
{
return $this->children()->count() > 0;
}
/**
* Checks if the model has any drafts
*
* @return boolean
*/
public function hasDrafts(): bool
{
return $this->drafts()->count() > 0;
}
/**
* @deprecated 3.0.0 Use `Page::hasUnlistedChildren` instead
* @return boolean
*/
public function hasInvisibleChildren(): bool
{
return $this->hasUnlistedChildren();
}
/**
* Checks if the page has any listed children
*
* @return boolean
*/
public function hasListedChildren(): bool
{
return $this->children()->listed()->count() > 0;
}
/**
* Checks if the page has any unlisted children
*
* @return boolean
*/
public function hasUnlistedChildren(): bool
{
return $this->children()->unlisted()->count() > 0;
}
/**
* @deprecated 3.0.0 Use `Page::hasListedChildren` instead
* @return boolean
*/
public function hasVisibleChildren(): bool
{
return $this->hasListedChildren();
}
/**
* Creates a flat child index
*
* @param bool $drafts
* @return Kirby\Cms\Pages
*/
public function index(bool $drafts = false)
{
if ($drafts === true) {
return $this->childrenAndDrafts()->index($drafts);
} else {
return $this->children()->index();
}
}
/**
* Sets the Children collection
*
* @param array|null $children
* @return self
*/
protected function setChildren(array $children = null)
{
if ($children !== null) {
$this->children = Pages::factory($children, $this);
}
return $this;
}
/**
* Sets the Drafts collection
*
* @param array|null $drafts
* @return self
*/
protected function setDrafts(array $drafts = null)
{
if ($drafts !== null) {
$this->drafts = Pages::factory($drafts, $this, true);
}
return $this;
}
}