view Options.inc.php @ 134:b6b4a58c7625

Using .inc.php rather than just .inc for include files.
author Tom Fredrik Blenning <bfg@bfgconsult.no>
date Sun, 22 Jan 2023 19:22:00 +0100
parents Options.inc@14959382c901
children 2fe6713ccd64
line wrap: on
line source

<?php
/**
 */
abstract class Cacheable {
  const NO = 0;
  const YES = 1;
  const UNDETERMINED = -1;
}

/**
 * Contains alle configurable parameters, and "globals"
 *
 * @author Tom Fredrik Blenning Klaussen
 */
class Options
{
  private $defaultLang;
  private $lang;
  private $name;
  private $acceptedLanguages = array();
  private $inputDefaults = array();
  private $cache;
  private $urlParams = array();
  private $basePath;
  private $flagUrl;
  private $baseUrl;
  private $cacheable = Cacheable::YES;

  /**
   * Gets the default language
   *
   * @return two letter code for the language
   */
  function getDefaultLang()
  {
    return $this->defaultLang;
  }

  /**
   * Gets the selected language
   *
   * @return two letter code for the language
   */
  function getLang()
  {
    return $this->lang;
  }

  /**
   *  Sets wether or not this page may be cached
   *
   * @param $cacheable Cacheable
   */
  function setCacheable($cacheable)
  {
    $this->cacheable = $cacheable;
  }

  /**
   * Gets wether or not this page may be cached
   *
   * @return Cacheable, default is YES
   */
  function getCacheable()
  {
    return $this->cacheable;
  }

  /**
   * Get the base url, or if non set, extracts it from _SERVER
   *
   * @return the baseurl for the scripts
   */
  function getBaseUrl()
  {
    if ($this->baseUrl)
      return $this->baseUrl;

    $request = $_SERVER['REQUEST_URI'];

    $l = strpos($request, '?');
    $base = ($l) ? substr($request, 0 , $l) : $request;
    $base = rtrim($base, '/');

    return "//" . $_SERVER['HTTP_HOST'] . $base;
  }

  /**
   * Replaces placeholder variables, with actual values.
   *
   * Currently supported values:
   * @li \%HOST\%
   *
   * @param $value string to replace values in
   * @return the processed string
   */
  static function replacePlaceholders($value)
  {
    $value = preg_replace('/%HOST%/', $_SERVER['HTTP_HOST'], $value);
    return $value;
  }

  /**
   * Sets the base url where scripts are located
   *
   * @param $baseUrl the url where scripts are located
   */
  function setBaseUrl($baseUrl)
  {
    $baseUrl = self::replacePlaceholders($baseUrl);
    $this->baseUrl = $baseUrl;
  }

  /**
   * Sets the url for the flag script
   *
   * @param $flagUrl for flag script
   */
  function setFlagUrl($flagUrl)
  {
    $flagUrl = self::replacePlaceholders($flagUrl);
    $this->flagUrl = $flagUrl;
  }

  /**
   * Gets the url for the flag script, or autogenerate if not set
   *
   * @return url for flag script
   */
  function getFlagUrl()
  {
    if ($this->flagUrl)
      return $this->flagUrl;

    return $this->getBaseUrl() . "/flag.php";
  }

  /**
   * Sets the selected language
   *
   * @param $lang two letter code for the language
   */
  function setLang($lang)
  {
    $this->lang = $lang;
  }

  /**
   * Gets the path where the scripts are located
   *
   * @return path where scripts are located
   */
  function getBasePath()
  {
    return $this->basePath;
  }

  /**
   * Sets the path where the scripts are located
   *
   * @param $basePath path where scripts are located
   */
  function setBasePath($basePath)
  {
    $this->basePath = $basePath;
  }

  /**
   * Sets a set of urlparameters
   *
   * @param $urlParams list of parameters to get from the URL
   */
  function setUrlParams($urlParams)
  {
    foreach($urlParams as $key) {
      $value = array_key_exists($key, $_GET) ? $_GET[$key] : '';
      $this->urlParams[$key] = $value;
    }
  }

  /**
   * Gets the default language
   *
   * @return associative array of key and value for the url parameters
   */
  function getUrlParams()
  {
    return $this->urlParams;
  }

  /**
   * Sets the name(identity) for this page
   *
   * @param $name name(identity)
   */
  function setName($name)
  {
    $this->name = $name;
  }

  /**
   * Gets the name(identity) for this page
   *
   * @return name(identity)
   */
  function getName()
  {
    return $this->name;
  }

  /**
   * Sets a cache object
   *
   * @param $cache CacheTimeCheck object
   */
  function setCache($cache)
  {
    $this->cache = $cache;
  }

  /**
   * Gets the cache object
   *
   * @return cache object
   */
  function getCache()
  {
    return $this->cache;
  }

  /**
   * A list of languages which this configuration supports.
   *
   * @return array of two letter language codes
   */
  function getAcceptedLanguages()
  {
    return $this->acceptedLanguages;
  }

  /**
   * Gets the default value associated whith the key
   *
   * @param $key as specified in master xml file.
   * @return associated default
   */
  function getInputDefault($key)
  {
    return $this->inputDefaults[$key];
  }

  /**
   * Constructs an options object
   *
   * This contstructor will consume any tag with the type option, and
   * extract values from any tag with type input
   *
   * @include master.xml
   *
   * @param $baseDocument An open xml file
   */
  function __construct($baseDocument)
  {
    $params = $baseDocument->getElementsByTagName("param");
    $toRemove = array();
    foreach ($params as $param) {
      if ($param->getAttribute("type") == "option") {
	$id = $param->getAttribute("id");
	if ($id == "lang") {
	  $this->defaultLang = $param->getAttribute("default");
	  $accepts = $param->getElementsByTagName("accept_value");
	  foreach($accepts as $accept) {
	    foreach($accept->childNodes as $child) {
	      array_push($this->acceptedLanguages, $child->nodeValue);
	    }
	  }
	}
	elseif ($id == "baseUrl") {
	  $value = $param->getAttribute("value");
	  if($value)
	    $this->setBaseUrl($value);
	}
	elseif ($id == "flagUrl") {
	  $value = $param->getAttribute("value");
	  if($value)
	    $this->setFlagUrl($value);
	}
	else {
	  warn("Invalid option: ${id}");
	}
	//We need to iterate in the opposite direction when removing,
	//so best shifting.
	array_unshift($toRemove, $param);
      }
      elseif ($param->getAttribute("type") == "input") {
	$id = $param->getAttribute("id");
	$default = $param->getAttribute("default");
	$this->inputDefaults[$id] = $default;
      }
    }
    foreach($toRemove as $param) {
      $parent = $param->parentNode;
      $parent->removeChild($param);
    }
  }
}
?>