view Sitemap.inc @ 91:1d4c980f4255

Change the way headers are set. Disabled validation for non-html pages.
author Tom Fredrik "BFG" Klaussen <bfg@blenning.no>
date Thu, 18 Oct 2012 00:28:48 +0200
parents b9654b9c4a66
children 8aadd7a23b68
line wrap: on
line source

<?
include_once 'ScriptIncludeCache.inc';

/// @cond
$baseDir = dirname(__FILE__);
$cache = ScriptIncludeCache::instance(__FILE__);
$cache->includeOnce('common-functions.inc', $baseDir);
$cache->includeOnce('Page.inc', dirname(__FILE__));
/// @endcond

/**
 * Functionality for generating a sitemap
 */
class Sitemap extends Page
{
  private $master;
  private $options;

  /**
   * Constructs a sitemap object from a master document
   *
   * @param $path location of master document
   */
  function __construct($path) {
    $this->master = new DOMDocument();
    $this->master->load($path);

    $this->options = new Options($this->master);
  }

  function cacheCheck()
  {
    return false;
  }

  function mayValidate()
  {
    return false;
  }

  function generateContent() {
    /// The final output variable
    $out = '<?xml version="1.0" encoding="UTF-8"?>';
    $out .= "\n";
    $out .= '<urlset
      xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
            http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
';

    $base = 'http://' . $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    $base = substr($base, 0, strrpos($base, '/'));

    $acceptedLanguages = $this->options->getAcceptedLanguages();

    foreach($this->options->getAcceptedLanguages() as $lang) {
      if ($handle = opendir("${lang}")) {
	while (false !== ($entry = readdir($handle))) {
	  if (endsWith($entry, '.xml')) {
	    $fentry = "${lang}/${entry}";
	    $doc = new DOMDocument();

	    if (file_exists($fentry)) {
	      $doc->load($fentry);

	      $opts = array();
	      if (count($acceptedLanguages) > 1) {
		$opts['lang'] = $lang;
	      }

	      $toplevel = $doc->getElementsByTagName("toplevel");

	      if($toplevel->length) {
		$name = substr($entry, 0, -4);

		if ($name != $this->options->getInputDefault('name')) {
		  $opts['name'] = $name;
		}

		$optstring = opttostring($opts);

		$location = "${base}/${optstring}";
		$headers = getHeaders($location);

		$location = htmlentities($location);

		$lastmod = $headers["Last-Modified"];

		$n = StatusCodes::codeFromHeader($headers['']);

		if ($n == StatusCodes::HTTP_OK) {
		  $lastmod = strtotime($lastmod);
		  $lastmod = date(DateTime::W3C, $lastmod);

		  $out .= "<url>\n";
		  $out .= "<loc>${location}</loc>\n";
		  $out .= "<lastmod>${lastmod}</lastmod>\n";
		  $out .= "</url>\n";
		}
	      }
	    }
	  }
	}
	closedir($handle);
      }
    }

    $out .= '</urlset>';

    $res = new PageContent($out);
    $res->setHeader('Content-type', 'application/xml');
    return $res;
  }
}
?>