xiaowang/kirby/src/Cms/StructureObject.php

210 lines
4.4 KiB
PHP
Raw Normal View History

2021-10-29 18:05:46 +02:00
<?php
namespace Kirby\Cms;
/**
2021-11-18 17:44:47 +01:00
* The StructureObject represents each item
2021-10-29 18:05:46 +02:00
* in a Structure collection. StructureObjects
* behave pretty much the same as Pages or Users
* and have a Content object to access their fields.
2021-11-18 17:44:47 +01:00
* All fields in a StructureObject are therefore also
2021-10-29 18:05:46 +02:00
* wrapped in a Field object and can be accessed in
* the same way as Page fields. They also use the same
* Field methods.
*
* @package Kirby Cms
* @author Bastian Allgeier <bastian@getkirby.com>
* @link https://getkirby.com
* @copyright Bastian Allgeier GmbH
* @license https://getkirby.com/license
*/
class StructureObject extends Model
{
use HasSiblings;
/**
* The content
*
* @var Content
*/
protected $content;
/**
* @var string
*/
protected $id;
/**
* @var \Kirby\Cms\Site|\Kirby\Cms\Page|\Kirby\Cms\File|\Kirby\Cms\User|null
*/
protected $parent;
/**
* The parent Structure collection
*
* @var Structure
*/
protected $structure;
/**
* Modified getter to also return fields
* from the object's content
*
* @param string $method
* @param array $arguments
* @return mixed
*/
public function __call(string $method, array $arguments = [])
{
// public property access
if (isset($this->$method) === true) {
return $this->$method;
}
2021-11-18 17:44:47 +01:00
return $this->content()->get($method);
2021-10-29 18:05:46 +02:00
}
/**
* Creates a new StructureObject with the given props
*
* @param array $props
*/
public function __construct(array $props)
{
$this->setProperties($props);
}
/**
* Returns the content
*
* @return \Kirby\Cms\Content
*/
public function content()
{
if (is_a($this->content, 'Kirby\Cms\Content') === true) {
return $this->content;
}
if (is_array($this->content) !== true) {
$this->content = [];
}
return $this->content = new Content($this->content, $this->parent());
}
/**
* Returns the required id
*
* @return string
*/
public function id(): string
{
return $this->id;
}
/**
* Compares the current object with the given structure object
*
* @param mixed $structure
* @return bool
*/
public function is($structure): bool
{
if (is_a($structure, 'Kirby\Cms\StructureObject') === false) {
return false;
}
return $this === $structure;
}
/**
* Returns the parent Model object
*
* @return \Kirby\Cms\Model
*/
public function parent()
{
return $this->parent;
}
/**
* Sets the Content object with the given parent
*
* @param array|null $content
* @return $this
*/
protected function setContent(array $content = null)
{
$this->content = $content;
return $this;
}
/**
* Sets the id of the object.
* The id is required. The structure
* class will use the index, if no id is
* specified.
*
* @param string $id
* @return $this
*/
protected function setId(string $id)
{
$this->id = $id;
return $this;
}
/**
* Sets the parent Model
*
* @return $this
* @param \Kirby\Cms\Site|\Kirby\Cms\Page|\Kirby\Cms\File|\Kirby\Cms\User|null $parent
*/
protected function setParent(Model $parent = null)
{
$this->parent = $parent;
return $this;
}
/**
* Sets the parent Structure collection
*
* @param \Kirby\Cms\Structure|null $structure
* @return $this
*/
protected function setStructure(Structure $structure = null)
{
$this->structure = $structure;
return $this;
}
/**
* Returns the parent Structure collection as siblings
*
* @return \Kirby\Cms\Structure
*/
protected function siblingsCollection()
{
return $this->structure;
}
/**
* Converts all fields in the object to a
* plain associative array. The id is
* injected into the array afterwards
* to make sure it's always present and
* not overloaded in the content.
*
* @return array
*/
public function toArray(): array
{
$array = $this->content()->toArray();
$array['id'] = $this->id();
ksort($array);
return $array;
}
}