joomla_test/libraries/joomla/document/opensearch/opensearch.php
2020-01-02 22:20:31 +07:00

304 lines
6.1 KiB
PHP

<?php
/**
* @package Joomla.Platform
* @subpackage Document
*
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('JPATH_PLATFORM') or die;
/**
* OpenSearch class, provides an easy interface to display an OpenSearch document
*
* @package Joomla.Platform
* @subpackage Document
* @see http://www.opensearch.org/
* @since 11.1
*/
class JDocumentOpensearch extends JDocument
{
/**
* ShortName element
*
* required
*
* @var string
* @since 11.1
*/
private $_shortName = "";
/**
* Images collection
*
* optional
*
* @var object
* @since 11.1
*/
private $_images = array();
/**
* The url collection
*
* @var array
* @since 11.1
*/
private $_urls = array();
/**
* Class constructor
*
* @param array $options Associative array of options
*
* @since 11.1
*/
public function __construct($options = array())
{
parent::__construct($options);
// Set document type
$this->_type = 'opensearch';
// Set mime type
$this->_mime = 'application/opensearchdescription+xml';
// Add the URL for self updating
$update = new JOpenSearchUrl;
$update->type = 'application/opensearchdescription+xml';
$update->rel = 'self';
$update->template = JRoute::_(JUri::getInstance());
$this->addUrl($update);
// Add the favicon as the default image
// Try to find a favicon by checking the template and root folder
$app = JFactory::getApplication();
$dirs = array(JPATH_THEMES . '/' . $app->getTemplate(), JPATH_BASE);
foreach ($dirs as $dir)
{
if (file_exists($dir . '/favicon.ico'))
{
$path = str_replace(JPATH_BASE . '/', '', $dir);
$path = str_replace('\\', '/', $path);
$favicon = new JOpenSearchImage;
$favicon->data = JUri::base() . $path . '/favicon.ico';
$favicon->height = '16';
$favicon->width = '16';
$favicon->type = 'image/vnd.microsoft.icon';
$this->addImage($favicon);
break;
}
}
}
/**
* Render the document
*
* @param boolean $cache If true, cache the output
* @param array $params Associative array of attributes
*
* @return The rendered data
*
* @since 11.1
*/
public function render($cache = false, $params = array())
{
$xml = new DOMDocument('1.0', 'utf-8');
if (defined('JDEBUG') && JDEBUG)
{
$xml->formatOutput = true;
}
// The OpenSearch Namespace
$osns = 'http://a9.com/-/spec/opensearch/1.1/';
// Create the root element
$elOs = $xml->createElementNS($osns, 'OpenSearchDescription');
$elShortName = $xml->createElementNS($osns, 'ShortName');
$elShortName->appendChild($xml->createTextNode(htmlspecialchars($this->_shortName)));
$elOs->appendChild($elShortName);
$elDescription = $xml->createElementNS($osns, 'Description');
$elDescription->appendChild($xml->createTextNode(htmlspecialchars($this->description)));
$elOs->appendChild($elDescription);
// Always set the accepted input encoding to UTF-8
$elInputEncoding = $xml->createElementNS($osns, 'InputEncoding');
$elInputEncoding->appendChild($xml->createTextNode('UTF-8'));
$elOs->appendChild($elInputEncoding);
foreach ($this->_images as $image)
{
$elImage = $xml->createElementNS($osns, 'Image');
$elImage->setAttribute('type', $image->type);
$elImage->setAttribute('width', $image->width);
$elImage->setAttribute('height', $image->height);
$elImage->appendChild($xml->createTextNode(htmlspecialchars($image->data)));
$elOs->appendChild($elImage);
}
foreach ($this->_urls as $url)
{
$elUrl = $xml->createElementNS($osns, 'Url');
$elUrl->setAttribute('type', $url->type);
// Results is the default value so we don't need to add it
if ($url->rel != 'results')
{
$elUrl->setAttribute('rel', $url->rel);
}
$elUrl->setAttribute('template', $url->template);
$elOs->appendChild($elUrl);
}
$xml->appendChild($elOs);
parent::render();
return $xml->saveXML();
}
/**
* Sets the short name
*
* @param string $name The name.
*
* @return JDocumentOpensearch instance of $this to allow chaining
*
* @since 11.1
*/
public function setShortName($name)
{
$this->_shortName = $name;
return $this;
}
/**
* Adds an URL to the OpenSearch description.
*
* @param JOpenSearchUrl $url The url to add to the description.
*
* @return JDocumentOpensearch instance of $this to allow chaining
*
* @since 11.1
*/
public function addUrl(JOpenSearchUrl $url)
{
$this->_urls[] = $url;
return $this;
}
/**
* Adds an image to the OpenSearch description.
*
* @param JOpenSearchImage $image The image to add to the description.
*
* @return JDocumentOpensearch instance of $this to allow chaining
*
* @since 11.1
*/
public function addImage(JOpenSearchImage $image)
{
$this->_images[] = $image;
return $this;
}
}
/**
* JOpenSearchUrl is an internal class that stores the search URLs for the OpenSearch description
*
* @package Joomla.Platform
* @subpackage Document
* @since 11.1
*/
class JOpenSearchUrl
{
/**
* Type item element
*
* required
*
* @var string
* @since 11.1
*/
public $type = 'text/html';
/**
* Rel item element
*
* required
*
* @var string
* @since 11.1
*/
public $rel = 'results';
/**
* Template item element. Has to contain the {searchTerms} parameter to work.
*
* required
*
* @var string
* @since 11.1
*/
public $template;
}
/**
* JOpenSearchImage is an internal class that stores Images for the OpenSearch Description
*
* @package Joomla.Platform
* @subpackage Document
* @since 11.1
*/
class JOpenSearchImage
{
/**
* The images MIME type
*
* required
*
* @var string
* @since 11.1
*/
public $type = "";
/**
* URL of the image or the image as base64 encoded value
*
* required
*
* @var string
* @since 11.1
*/
public $data = "";
/**
* The image's width
*
* required
*
* @var string
* @since 11.1
*/
public $width;
/**
* The image's height
*
* required
*
* @var string
* @since 11.1
*/
public $height;
}