1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler 3*a1a3b679SAndreas Boehlernamespace Sabre\DAV\Xml\Property; 4*a1a3b679SAndreas Boehler 5*a1a3b679SAndreas Boehleruse Sabre\DAV\Browser\HtmlOutput; 6*a1a3b679SAndreas Boehleruse Sabre\DAV\Browser\HtmlOutputHelper; 7*a1a3b679SAndreas Boehleruse Sabre\Xml\Element; 8*a1a3b679SAndreas Boehleruse Sabre\Xml\Reader; 9*a1a3b679SAndreas Boehleruse Sabre\Xml\Writer; 10*a1a3b679SAndreas Boehler 11*a1a3b679SAndreas Boehler/** 12*a1a3b679SAndreas Boehler * Href property 13*a1a3b679SAndreas Boehler * 14*a1a3b679SAndreas Boehler * This class represents any WebDAV property that contains a {DAV:}href 15*a1a3b679SAndreas Boehler * element, and there are many. 16*a1a3b679SAndreas Boehler * 17*a1a3b679SAndreas Boehler * It can support either 1 or more hrefs. If while unserializing no valid 18*a1a3b679SAndreas Boehler * {DAV:}href elements were found, this property will unserialize itself as 19*a1a3b679SAndreas Boehler * null. 20*a1a3b679SAndreas Boehler * 21*a1a3b679SAndreas Boehler * @copyright Copyright (C) 2007-2015 fruux GmbH (https://fruux.com/). 22*a1a3b679SAndreas Boehler * @author Evert Pot (http://www.rooftopsolutions.nl/) 23*a1a3b679SAndreas Boehler * @license http://sabre.io/license/ Modified BSD License 24*a1a3b679SAndreas Boehler */ 25*a1a3b679SAndreas Boehlerclass Href implements Element, HtmlOutput { 26*a1a3b679SAndreas Boehler 27*a1a3b679SAndreas Boehler /** 28*a1a3b679SAndreas Boehler * List of uris 29*a1a3b679SAndreas Boehler * 30*a1a3b679SAndreas Boehler * @var array 31*a1a3b679SAndreas Boehler */ 32*a1a3b679SAndreas Boehler protected $hrefs; 33*a1a3b679SAndreas Boehler 34*a1a3b679SAndreas Boehler /** 35*a1a3b679SAndreas Boehler * Automatically prefix the url with the server base directory 36*a1a3b679SAndreas Boehler * 37*a1a3b679SAndreas Boehler * @var bool 38*a1a3b679SAndreas Boehler */ 39*a1a3b679SAndreas Boehler protected $autoPrefix = true; 40*a1a3b679SAndreas Boehler 41*a1a3b679SAndreas Boehler /** 42*a1a3b679SAndreas Boehler * Constructor 43*a1a3b679SAndreas Boehler * 44*a1a3b679SAndreas Boehler * You must either pass a string for a single href, or an array of hrefs. 45*a1a3b679SAndreas Boehler * 46*a1a3b679SAndreas Boehler * If auto-prefix is set to false, the hrefs will be treated as absolute 47*a1a3b679SAndreas Boehler * and not relative to the servers base uri. 48*a1a3b679SAndreas Boehler * 49*a1a3b679SAndreas Boehler * @param string|string[] $href 50*a1a3b679SAndreas Boehler * @param bool $autoPrefix 51*a1a3b679SAndreas Boehler */ 52*a1a3b679SAndreas Boehler function __construct($hrefs, $autoPrefix = true) { 53*a1a3b679SAndreas Boehler 54*a1a3b679SAndreas Boehler if (is_string($hrefs)) { 55*a1a3b679SAndreas Boehler $hrefs = [$hrefs]; 56*a1a3b679SAndreas Boehler } 57*a1a3b679SAndreas Boehler $this->hrefs = $hrefs; 58*a1a3b679SAndreas Boehler $this->autoPrefix = $autoPrefix; 59*a1a3b679SAndreas Boehler 60*a1a3b679SAndreas Boehler 61*a1a3b679SAndreas Boehler } 62*a1a3b679SAndreas Boehler 63*a1a3b679SAndreas Boehler /** 64*a1a3b679SAndreas Boehler * Returns the first Href. 65*a1a3b679SAndreas Boehler * 66*a1a3b679SAndreas Boehler * @return string 67*a1a3b679SAndreas Boehler */ 68*a1a3b679SAndreas Boehler function getHref() { 69*a1a3b679SAndreas Boehler 70*a1a3b679SAndreas Boehler return $this->hrefs[0]; 71*a1a3b679SAndreas Boehler 72*a1a3b679SAndreas Boehler } 73*a1a3b679SAndreas Boehler 74*a1a3b679SAndreas Boehler /** 75*a1a3b679SAndreas Boehler * Returns the hrefs as an array 76*a1a3b679SAndreas Boehler * 77*a1a3b679SAndreas Boehler * @return array 78*a1a3b679SAndreas Boehler */ 79*a1a3b679SAndreas Boehler function getHrefs() { 80*a1a3b679SAndreas Boehler 81*a1a3b679SAndreas Boehler return $this->hrefs; 82*a1a3b679SAndreas Boehler 83*a1a3b679SAndreas Boehler } 84*a1a3b679SAndreas Boehler 85*a1a3b679SAndreas Boehler /** 86*a1a3b679SAndreas Boehler * The xmlSerialize metod is called during xml writing. 87*a1a3b679SAndreas Boehler * 88*a1a3b679SAndreas Boehler * Use the $writer argument to write its own xml serialization. 89*a1a3b679SAndreas Boehler * 90*a1a3b679SAndreas Boehler * An important note: do _not_ create a parent element. Any element 91*a1a3b679SAndreas Boehler * implementing XmlSerializble should only ever write what's considered 92*a1a3b679SAndreas Boehler * its 'inner xml'. 93*a1a3b679SAndreas Boehler * 94*a1a3b679SAndreas Boehler * The parent of the current element is responsible for writing a 95*a1a3b679SAndreas Boehler * containing element. 96*a1a3b679SAndreas Boehler * 97*a1a3b679SAndreas Boehler * This allows serializers to be re-used for different element names. 98*a1a3b679SAndreas Boehler * 99*a1a3b679SAndreas Boehler * If you are opening new elements, you must also close them again. 100*a1a3b679SAndreas Boehler * 101*a1a3b679SAndreas Boehler * @param Writer $writer 102*a1a3b679SAndreas Boehler * @return void 103*a1a3b679SAndreas Boehler */ 104*a1a3b679SAndreas Boehler function xmlSerialize(Writer $writer) { 105*a1a3b679SAndreas Boehler 106*a1a3b679SAndreas Boehler foreach ($this->getHrefs() as $href) { 107*a1a3b679SAndreas Boehler if ($this->autoPrefix) { 108*a1a3b679SAndreas Boehler $href = $writer->contextUri . $href; 109*a1a3b679SAndreas Boehler } 110*a1a3b679SAndreas Boehler $writer->writeElement('{DAV:}href', $href); 111*a1a3b679SAndreas Boehler } 112*a1a3b679SAndreas Boehler 113*a1a3b679SAndreas Boehler } 114*a1a3b679SAndreas Boehler 115*a1a3b679SAndreas Boehler /** 116*a1a3b679SAndreas Boehler * Generate html representation for this value. 117*a1a3b679SAndreas Boehler * 118*a1a3b679SAndreas Boehler * The html output is 100% trusted, and no effort is being made to sanitize 119*a1a3b679SAndreas Boehler * it. It's up to the implementor to sanitize user provided values. 120*a1a3b679SAndreas Boehler * 121*a1a3b679SAndreas Boehler * The output must be in UTF-8. 122*a1a3b679SAndreas Boehler * 123*a1a3b679SAndreas Boehler * The baseUri parameter is a url to the root of the application, and can 124*a1a3b679SAndreas Boehler * be used to construct local links. 125*a1a3b679SAndreas Boehler * 126*a1a3b679SAndreas Boehler * @param HtmlOutputHelper $html 127*a1a3b679SAndreas Boehler * @return string 128*a1a3b679SAndreas Boehler */ 129*a1a3b679SAndreas Boehler function toHtml(HtmlOutputHelper $html) { 130*a1a3b679SAndreas Boehler 131*a1a3b679SAndreas Boehler $links = []; 132*a1a3b679SAndreas Boehler foreach ($this->getHrefs() as $href) { 133*a1a3b679SAndreas Boehler $links[] = $html->link($href); 134*a1a3b679SAndreas Boehler } 135*a1a3b679SAndreas Boehler return implode('<br />', $links); 136*a1a3b679SAndreas Boehler 137*a1a3b679SAndreas Boehler } 138*a1a3b679SAndreas Boehler 139*a1a3b679SAndreas Boehler /** 140*a1a3b679SAndreas Boehler * The deserialize method is called during xml parsing. 141*a1a3b679SAndreas Boehler * 142*a1a3b679SAndreas Boehler * This method is called statictly, this is because in theory this method 143*a1a3b679SAndreas Boehler * may be used as a type of constructor, or factory method. 144*a1a3b679SAndreas Boehler * 145*a1a3b679SAndreas Boehler * Often you want to return an instance of the current class, but you are 146*a1a3b679SAndreas Boehler * free to return other data as well. 147*a1a3b679SAndreas Boehler * 148*a1a3b679SAndreas Boehler * You are responsible for advancing the reader to the next element. Not 149*a1a3b679SAndreas Boehler * doing anything will result in a never-ending loop. 150*a1a3b679SAndreas Boehler * 151*a1a3b679SAndreas Boehler * If you just want to skip parsing for this element altogether, you can 152*a1a3b679SAndreas Boehler * just call $reader->next(); 153*a1a3b679SAndreas Boehler * 154*a1a3b679SAndreas Boehler * $reader->parseInnerTree() will parse the entire sub-tree, and advance to 155*a1a3b679SAndreas Boehler * the next element. 156*a1a3b679SAndreas Boehler * 157*a1a3b679SAndreas Boehler * @param Reader $reader 158*a1a3b679SAndreas Boehler * @return mixed 159*a1a3b679SAndreas Boehler */ 160*a1a3b679SAndreas Boehler static function xmlDeserialize(Reader $reader) { 161*a1a3b679SAndreas Boehler 162*a1a3b679SAndreas Boehler $hrefs = []; 163*a1a3b679SAndreas Boehler foreach ((array)$reader->parseInnerTree() as $elem) { 164*a1a3b679SAndreas Boehler if ($elem['name'] !== '{DAV:}href') 165*a1a3b679SAndreas Boehler continue; 166*a1a3b679SAndreas Boehler 167*a1a3b679SAndreas Boehler $hrefs[] = $elem['value']; 168*a1a3b679SAndreas Boehler 169*a1a3b679SAndreas Boehler } 170*a1a3b679SAndreas Boehler if ($hrefs) { 171*a1a3b679SAndreas Boehler return new self($hrefs, false); 172*a1a3b679SAndreas Boehler } 173*a1a3b679SAndreas Boehler 174*a1a3b679SAndreas Boehler } 175*a1a3b679SAndreas Boehler 176*a1a3b679SAndreas Boehler} 177