view Sitemap.inc @ 124:6766250a0baa

Support for parameters as directory structure.
author Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
date Fri, 29 Dec 2017 19:59:22 +0100
parents 74c22a8dd38f
children 6b882fb6ea46
line wrap: on
line source

<?php
include_once 'ScriptIncludeCache.inc';

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

class SimpleCache extends Cache {
  private $time;

  function __construct($time = 0) {
    $this->time = $time;
  }
  function getNewest() {
    return $this->time;
  }
};

function cmp_length_lex($a, $b)
{
  if ($a == $b) {
    return 0;
  }
  $la = strlen($a);
  $lb = strlen($b);
  if ($la == $lb) {
    return ($la < $lb) ? -1 : 1;
  }
  return ($a < $b) ? -1 : 1;
}


/**
 * 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);
    $this->lastmod=0;
  }

  function cacheCheck()
  {
    if ($this->lastmod == 0)
      return Cacheable::UNDETERMINED;
    else
      return Cacheable::YES;
  }

  function mayValidate()
  {
    return false;
  }

  private function processDir($dir, $lang, $acceptedLanguages, $base) {
    $urls = array();

    $base=basePath();
    $base=$_SERVER['DOCUMENT_ROOT'];
    $baseurl = $_SERVER["REQUEST_SCHEME"] ."://". $_SERVER["SERVER_NAME"];


    if ($handle = opendir($base . "/${dir}")) {
      while (false !== ($entry = readdir($handle))) {
	if (endsWith($entry, '.xml')) {
	  $fentry = $base . "/${dir}/${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 = genUrl($opts, array(), array('lang', 'name'));
	      $location = "${baseurl}${optstring}/";
	      array_push($urls, $location);
	    }
	  }
	}
      }
      closedir($handle);
    }
    return $urls;
  }

  function generateContent() {

    /// The final output variable
    $out = '<?xml version="1.0" encoding="UTF-8"?>';
    $out .= "\n";
    $out .= '<?xml-stylesheet type="text/xsl" href="/css/gss.xsl"?>';
    $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 = $_SERVER["REQUEST_SCHEME"] ."://". $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    $l = strrpos($base, '/');
    if ($l)
      $base = substr($base, 0, $l);

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

    $urls = array();

    foreach($this->options->getAcceptedLanguages() as $lang) {
      $urls=array_merge($urls,
			$this->processDir($lang, $lang,
					  $acceptedLanguages, $base)
			);
      $urls=array_merge($urls,
			$this->processDir("common", $lang,
					  $acceptedLanguages, $base)
			);
    }

    usort($urls, "cmp_length_lex");

    foreach($urls as $location) {
      $headers = Http::getHeaders($location, 5);

      $location = htmlentities($location);

      if (array_key_exists('Last-Modified', $headers)) {
	$lastmod = $headers["Last-Modified"];
      }

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

      if ($n == StatusCodes::HTTP_OK) {
	if (isset($lastmod)) {

	  $lastmod = strtotime($lastmod);
	  if ($lastmod > $this->lastmod) {
	    $this->lastmod = $lastmod;
	  }
	  $lastmod = date(DateTime::W3C, $lastmod);
	}

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

    $out .= "</urlset>";

    $res = new PageContent($out);
    $cache=new SimpleCache($this->lastmod);
    $cache->setMaxAge(86400);
    $this->setCache($cache);
    $res->setHeader('Content-type', 'application/xml');
    return $res;
  }
}
?>