TrackManiaControl/libs/FML/ManiaLinks.php
2017-04-02 16:32:57 +02:00

214 lines
4.7 KiB
PHP

<?php
namespace FML;
/**
* Class holding several ManiaLinks at once
*
* @author steeffeen <mail@steeffeen.com>
* @copyright FancyManiaLinks Copyright © 2017 Steffen Schröder
* @license http://www.gnu.org/licenses/ GNU General Public License, Version 3
*/
class ManiaLinks
{
/**
* @var ManiaLink[] $children ManiaLinks children
*/
protected $children = array();
/**
* @var CustomUI $customUI Custom UI
*/
protected $customUI = null;
/**
* Create a new ManiaLinks object
*
* @api
* @param ManiaLink[] $children ManiaLink children
* @return static
*/
public static function create(array $children = null)
{
return new static($children);
}
/**
* Construct a new ManiaLinks object
*
* @api
* @param ManiaLink[] $children ManiaLink children
*/
public function __construct(array $children = null)
{
if ($children) {
$this->setChildren($children);
}
}
/**
* Get all child ManiaLinks
*
* @api
* @return ManiaLink[]
*/
public function getChildren()
{
return $this->children;
}
/**
* Add a child ManiaLink
*
* @api
* @param ManiaLink $child Child ManiaLink
* @return static
* @deprecated Use addChild()
* @see ManiaLinks::addChild()
*/
public function add(ManiaLink $child)
{
return $this->addChild($child);
}
/**
* Add a child ManiaLink
*
* @api
* @param ManiaLink $child Child ManiaLink
* @return static
*/
public function addChild(ManiaLink $child)
{
if (!in_array($child, $this->children, true)) {
array_push($this->children, $child);
}
return $this;
}
/**
* Add child ManiaLinks
*
* @api
* @param ManiaLink[] $children Child ManiaLinks
* @return static
*/
public function addChildren(array $children)
{
foreach ($children as $child) {
$this->addChild($child);
}
return $this;
}
/**
* Set ManiaLink children
*
* @api
* @param ManiaLink[] $children ManiaLink children
* @return static
*/
public function setChildren(array $children)
{
return $this->removeAllChildren()
->addChildren($children);
}
/**
* Remove all child ManiaLinks
*
* @api
* @return static
*/
public function removeAllChildren()
{
$this->children = array();
return $this;
}
/**
* Remove all child ManiaLinks
*
* @api
* @return static
* @deprecated Use removeAllChildren()
* @see ManiaLinks::removeAllChildren()
*/
public function removeChildren()
{
return $this->removeAllChildren();
}
/**
* Get the CustomUI
*
* @api
* @param bool $createIfEmpty (optional) If the Custom UI should be created if it doesn't exist yet
* @return CustomUI
*/
public function getCustomUI($createIfEmpty = true)
{
if (!$this->customUI && $createIfEmpty) {
$this->setCustomUI(new CustomUI());
}
return $this->customUI;
}
/**
* Set the CustomUI
*
* @api
* @param CustomUI $customUI CustomUI object
* @return static
*/
public function setCustomUI(CustomUI $customUI = null)
{
$this->customUI = $customUI;
return $this;
}
/**
* Render the ManiaLinks object
*
* @param bool (optional) $echo If the XML text should be echoed and the Content-Type header should be set
* @return \DOMDocument
*/
public function render($echo = false)
{
$domDocument = new \DOMDocument("1.0", "utf-8");
$domDocument->xmlStandalone = true;
$maniaLinks = $domDocument->createElement("manialinks");
$domDocument->appendChild($maniaLinks);
foreach ($this->children as $child) {
$childXml = $child->render(false, $domDocument);
$maniaLinks->appendChild($childXml);
}
if ($this->customUI) {
$customUIElement = $this->customUI->render($domDocument);
$maniaLinks->appendChild($customUIElement);
}
if ($echo) {
header("Content-Type: application/xml; charset=utf-8;");
echo $domDocument->saveXML();
}
return $domDocument;
}
/**
* Get string representation
*
* @return string
*/
public function __toString()
{
return $this->render()
->saveXML();
}
}