sterzycom/kirby/core/children.php

207 lines
No EOL
4.4 KiB
PHP

<?php
/**
* Children
*
* @package Kirby CMS
* @author Bastian Allgeier <bastian@getkirby.com>
* @link http://getkirby.com
* @copyright Bastian Allgeier
* @license http://getkirby.com/license
*/
abstract class ChildrenAbstract extends Pages {
protected $page = null;
protected $cache = array();
/**
* Constructor
*/
public function __construct($page) {
$this->page = $page;
}
/**
* Creates a new Page object and adds it to the collection
*/
public function add($dirname) {
$page = new Page($this->page, $dirname);
$this->data[$page->id()] = $page;
return $page;
}
/**
* Creates a new subpage
*
* @param string $uid
* @param string $template
* @param array $data
*/
public function create($uid, $template, $data = array()) {
$page = page::create($this->page->id() . '/' . $uid, $template, $data);
$this->data[$page->id()] = $page;
return $page;
}
/**
* Returns the parent page
*
* @return Page
*/
public function page() {
return $this->page;
}
/**
* Returns the Children of Children
*
* @return Children
*/
public function children() {
$grandChildren = new Children($this->page);
foreach($this->data as $page) {
foreach($page->children() as $subpage) {
$grandChildren->data[$subpage->id()] = $subpage;
}
}
return $grandChildren;
}
/**
* Find a specific page by its uri
*
* @return Page or false
*/
public function find() {
$args = func_get_args();
if(!count($args)) {
return false;
} else if (count($args) === 1 and is_array($args[0])) {
$args = $args[0];
}
if(count($args) > 1) {
$collection = new Children($this->page);
foreach($args as $id) {
if($page = $this->find($id)) {
$collection->data[$page->id()] = $page;
}
}
return $collection;
} else {
// get the first argument and remove slashes
$id = trim($args[0], '/');
// build the direct uri
$directId = trim($this->page()->id() . '/' . $id, '/');
// fast access to direct uris
if(isset($this->data[$directId])) return $this->data[$directId];
$path = explode('/', $id);
$obj = $this;
$page = false;
foreach($path as $uid) {
$id = ltrim($obj->page()->id() . '/' . $uid, '/');
if(!isset($obj->data[$id])) return false;
$page = $obj->data[$id];
$obj = $page->children();
}
return $page;
}
}
/**
* Finds pages by it's unique URI
*
* @param mixed $uri Either a single URI string or an array of URIs
* @param string $use The field, which should be used (uid or slug)
* @return mixed Either a Page object, a Pages object for multiple pages or null if nothing could be found
*/
public function findByURI() {
$args = func_get_args();
if(count($args) == 0) {
return false;
} else if(count($args) > 1) {
$collection = new Children($this->page);
foreach($args as $uri) {
$page = $this->findByURI($uri);
if($page) $collection->data[$page->id()] = $page;
}
return $collection;
} else {
// get the first argument and remove slashes
$uri = trim($args[0], '/');
$array = str::split($uri, '/');
$obj = $this;
$page = false;
foreach($array as $p) {
$next = $obj->findBy('slug', $p);
if(!$next) break;
$page = $next;
$obj = $next->children();
}
return ($page and $page->slug() != a::last($array)) ? false : $page;
}
}
/**
* Creates a clean one-level collection with all
* pages, subpages, subsubpages, etc.
*
* @param object Pages object for recursive indexing
* @return Children
*/
public function index(Children $obj = null) {
if(is_null($obj)) {
if(isset($this->cache['index'])) return $this->cache['index'];
$this->cache['index'] = new Children($this->page);
$obj = $this;
}
foreach($obj->data as $key => $page) {
$this->cache['index']->data[$page->uri()] = $page;
$this->index($page->children());
}
return $this->cache['index'];
}
/**
* Extended group method
* detaches children and converts them to
* a simple pages collection
*
* @param function $callback
* @return Pages
*/
public function group($callback) {
$collection = new Pages($this);
return $collection->group($callback);
}
}