You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							97 lines
						
					
					
						
							2.5 KiB
						
					
					
				
			
		
		
	
	
							97 lines
						
					
					
						
							2.5 KiB
						
					
					
				| <?php | |
| /** | |
|  * @link http://www.yiiframework.com/ | |
|  * @copyright Copyright (c) 2008 Yii Software LLC | |
|  * @license http://www.yiiframework.com/license/ | |
|  */ | |
|  | |
| namespace yii\web; | |
|  | |
| use DOMDocument; | |
| use DOMElement; | |
| use DOMText; | |
| use yii\base\Arrayable; | |
| use yii\base\Component; | |
| use yii\helpers\StringHelper; | |
|  | |
|  | |
| /** | |
|  * XmlResponseFormatter formats the given data into an XML response content. | |
|  * | |
|  * @author Qiang Xue <qiang.xue@gmail.com> | |
|  * @since 2.0 | |
|  */ | |
| class XmlResponseFormatter extends Component implements ResponseFormatter | |
| { | |
| 	/** | |
| 	 * @var string the Content-Type header for the response | |
| 	 */ | |
| 	public $contentType = 'application/xml'; | |
| 	/** | |
| 	 * @var string the XML version | |
| 	 */ | |
| 	public $version = '1.0'; | |
| 	/** | |
| 	 * @var string the XML encoding. If not set, it will use the value of [[Response::charset]]. | |
| 	 */ | |
| 	public $encoding; | |
| 	/** | |
| 	 * @var string the name of the root element. | |
| 	 */ | |
| 	public $rootTag = 'response'; | |
| 	/** | |
| 	 * @var string the name of the elements that represent the array elements with numeric keys. | |
| 	 */ | |
| 	public $itemTag = 'item'; | |
|  | |
| 	/** | |
| 	 * Formats the specified response. | |
| 	 * @param Response $response the response to be formatted. | |
| 	 */ | |
| 	public function format($response) | |
| 	{ | |
| 		$response->getHeaders()->set('Content-Type', $this->contentType); | |
| 		$dom = new DOMDocument($this->version, $this->encoding === null ? $response->charset : $this->encoding); | |
| 		$root = new DOMElement($this->rootTag); | |
| 		$dom->appendChild($root); | |
| 		$this->buildXml($root, $response->data); | |
| 		$response->content = $dom->saveXML(); | |
| 	} | |
|  | |
| 	/** | |
| 	 * @param DOMElement $element | |
| 	 * @param mixed $data | |
| 	 */ | |
| 	protected function buildXml($element, $data) | |
| 	{ | |
| 		if (is_object($data)) { | |
| 			$child = new DOMElement(StringHelper::basename(get_class($data))); | |
| 			$element->appendChild($child); | |
| 			if ($data instanceof Arrayable) { | |
| 				$this->buildXml($child, $data->toArray()); | |
| 			} else { | |
| 				$array = array(); | |
| 				foreach ($data as $name => $value) { | |
| 					$array[$name] = $value; | |
| 				} | |
| 				$this->buildXml($child, $array); | |
| 			} | |
| 		} elseif (is_array($data)) { | |
| 			foreach ($data as $name => $value) { | |
| 				if (is_int($name) && is_object($value)) { | |
| 					$this->buildXml($element, $value); | |
| 				} elseif (is_array($value) || is_object($value)) { | |
| 					$child = new DOMElement(is_int($name) ? $this->itemTag : $name); | |
| 					$element->appendChild($child); | |
| 					$this->buildXml($child, $value); | |
| 				} else { | |
| 					$child = new DOMElement(is_int($name) ? $this->itemTag : $name); | |
| 					$element->appendChild($child); | |
| 					$child->appendChild(new DOMText((string)$value)); | |
| 				} | |
| 			} | |
| 		} else { | |
| 			$element->appendChild(new DOMText((string)$data)); | |
| 		} | |
| 	} | |
| }
 | |
| 
 |