You are here

class XMLSitemapWriter in XML sitemap 6.2

Same name and namespace in other branches
  1. 7.2 xmlsitemap.xmlsitemap.inc \XMLSitemapWriter

Extended class for writing XML sitemap files.

Hierarchy

Expanded class hierarchy of XMLSitemapWriter

File

./xmlsitemap.xmlsitemap.inc, line 15
XML sitemap integration functions for xmlsitemap.module.

View source
class XMLSitemapWriter extends XMLWriter {
  protected $uri = NULL;
  protected $sitemapElementCount = 0;
  protected $linkCountFlush = 500;
  protected $sitemap = NULL;
  protected $sitemap_page = NULL;
  protected $rootElement = 'urlset';

  /**
   * Constructor.
   *
   * @param $sitemap
   *   The sitemap array.
   * @param $page
   *   The current page of the sitemap being generated.
   */
  function __construct(stdClass &$sitemap, $page) {
    $this->sitemap = $sitemap;
    $this->sitemap_page = $page;
    $this->uri = xmlsitemap_sitemap_get_file($sitemap, $page);
    $this
      ->openUri($this->uri);
  }
  public function openUri($uri) {
    if ($realpath = realpath($uri)) {

      // Convert to a real path if possible. Sometimes this function returns
      // a FALSE value, so use the original value when that happens.
      $uri = $realpath;
    }
    $return = parent::openUri($uri);
    if (!$return) {
      throw new XMLSitemapGenerationException(t('Could not open file @file for writing.', array(
        '@file' => $uri,
      )));
    }
    return $return;
  }
  public function startDocument($version = '1.0', $encoding = 'UTF-8', $standalone = NULL) {
    $this
      ->setIndent(FALSE);
    $result = parent::startDocument($version, $encoding);
    if (!$result) {
      throw new XMLSitemapGenerationException(t('Unknown error occurred while writing to file @file.', array(
        '@file' => $this->uri,
      )));
    }
    if (variable_get('xmlsitemap_xsl', 1)) {
      $this
        ->writeXSL();
    }
    $this
      ->startElement($this->rootElement, TRUE);
    return $result;
  }
  public function getSitemapUrl($path, array $options = array()) {
    $options += $this->sitemap->uri['options'];
    $options += array(
      'absolute' => TRUE,
      'base_url' => variable_get('xmlsitemap_base_url', $GLOBALS['base_url']),
      'language' => language_default(),
      'alias' => TRUE,
    );
    if (!empty($options['protocol_relative'])) {
      $options['base_url'] = preg_replace('~^https?:~', '', $options['base_url']);
    }
    return url($path, $options);
  }

  /**
   * Add the XML stylesheet to the XML page.
   */
  public function writeXSL() {
    $this
      ->writePi('xml-stylesheet', 'type="text/xsl" href="' . $this
      ->getSitemapUrl('sitemap.xsl', array(
      'protocol_relative' => TRUE,
    )) . '"');
    $this
      ->writeRaw(PHP_EOL);
  }

  /**
   * Return an array of attributes for the root element of the XML.
   */
  public function getRootAttributes() {
    $attributes['xmlns'] = 'http://www.sitemaps.org/schemas/sitemap/0.9';
    if (variable_get('xmlsitemap_developer_mode', 0)) {
      $attributes['xmlns:xsi'] = 'http://www.w3.org/2001/XMLSchema-instance';
      $attributes['xsi:schemaLocation'] = 'http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd';
    }
    return $attributes;
  }
  public function generateXML() {
    return xmlsitemap_generate_chunk($this->sitemap, $this, $this->sitemap_page);
  }
  public function startElement($name, $root = FALSE) {
    parent::startElement($name);
    if ($root) {
      foreach ($this
        ->getRootAttributes() as $name => $value) {
        $this
          ->writeAttribute($name, $value);
      }
      $this
        ->writeRaw(PHP_EOL);
    }
  }

  /**
   * Write an full XML sitemap element tag.
   *
   * @param $name
   *   The element name.
   * @param $element
   *   An array of the elements properties and values.
   */
  public function writeSitemapElement($name, array &$element) {
    $this
      ->writeElement($name, $element);
    $this
      ->writeRaw(PHP_EOL);

    // After a certain number of elements have been added, flush the buffer
    // to the output file.
    $this->sitemapElementCount++;
    if ($this->sitemapElementCount % $this->linkCountFlush == 0) {
      $this
        ->flush();
    }
  }

  /**
   * Write full element tag including support for nested elements.
   *
   * @param string $name
   *   The element name.
   * @param string|array $content
   *   The element contents or an array of the elements' sub-elements.
   *
   * @todo Missing a return value since XMLWriter::writeElement() has one.
   */
  public function writeElement($name, $content = NULL) {
    if (is_array($content)) {
      $this
        ->startElement($name);
      $xml_content = format_xml_elements($content);

      // Remove additional spaces from the output.
      $xml_content = str_replace(array(
        " <",
        ">\n",
      ), array(
        "<",
        ">",
      ), $xml_content);
      $this
        ->writeRaw($xml_content);
      $this
        ->endElement();
    }
    else {
      parent::writeElement($name, check_plain((string) $content));
    }
  }
  public function getURI() {
    return $this->uri;
  }
  public function getSitemapElementCount() {
    return $this->sitemapElementCount;
  }
  public function endDocument() {
    $return = parent::endDocument();
    if (!$return) {
      throw new XMLSitemapGenerationException(t('Unknown error occurred while writing to file @file.', array(
        '@file' => $this->uri,
      )));
    }

    //if (xmlsitemap_var('gz')) {

    //  $file_gz = $file . '.gz';
    //  file_put_contents($file_gz, gzencode(file_get_contents($file), 9));

    //}
    return $return;
  }

  /**
   * Explicitly define the writeRaw() function since it is not available
   * before PHP 5.2.
   */
  public function writeRaw($content) {
    static $writeraw_parent;
    if (!isset($writeraw_parent)) {
      $writeraw_parent = method_exists('XMLWriter', 'writeRaw');
    }
    return $writeraw_parent ? parent::writeRaw($content) : parent::text($content);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
XMLSitemapWriter::$linkCountFlush protected property
XMLSitemapWriter::$rootElement protected property 1
XMLSitemapWriter::$sitemap protected property
XMLSitemapWriter::$sitemapElementCount protected property
XMLSitemapWriter::$sitemap_page protected property
XMLSitemapWriter::$uri protected property
XMLSitemapWriter::endDocument public function
XMLSitemapWriter::generateXML public function 1
XMLSitemapWriter::getRootAttributes public function Return an array of attributes for the root element of the XML. 1
XMLSitemapWriter::getSitemapElementCount public function
XMLSitemapWriter::getSitemapUrl public function
XMLSitemapWriter::getURI public function
XMLSitemapWriter::openUri public function
XMLSitemapWriter::startDocument public function
XMLSitemapWriter::startElement public function
XMLSitemapWriter::writeElement public function Write full element tag including support for nested elements.
XMLSitemapWriter::writeRaw public function Explicitly define the writeRaw() function since it is not available before PHP 5.2.
XMLSitemapWriter::writeSitemapElement public function Write an full XML sitemap element tag.
XMLSitemapWriter::writeXSL public function Add the XML stylesheet to the XML page.
XMLSitemapWriter::__construct function Constructor. 1