Date_Holidays
[ class tree: Date_Holidays ] [ index: Date_Holidays ] [ all elements ]

Source for file Holidays.php

Documentation is available at Holidays.php

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4: */
  3. /**
  4.  * Holidays.php
  5.  *
  6.  * PHP Version 5
  7.  *
  8.  * Copyright (c) 1997-2008 The PHP Group
  9.  *
  10.  * This source file is subject to version 2.0 of the PHP license,
  11.  * that is bundled with this package in the file LICENSE, and is
  12.  * available at through the world-wide-web at
  13.  * http://www.php.net/license/2_02.txt.
  14.  * If you did not receive a copy of the PHP license and are unable to
  15.  * obtain it through the world-wide-web, please send a note to
  16.  * license@php.net so we can mail you a copy immediately.
  17.  *
  18.  * Authors:   Carsten Lucke <luckec@tool-garage.de>
  19.  *
  20.  * CVS file id: $Id$
  21.  *
  22.  * @category Date
  23.  * @package  Date_Holidays
  24.  * @author   Carsten Lucke <luckec@tool-garage.de>
  25.  * @author   Stephan Schmidt <schst@php.net>
  26.  * @license  http://www.php.net/license/3_01.txt PHP License 3.0.1
  27.  * @version  CVS: $Id$
  28.  * @link     http://pear.php.net/package/Date_Holidays
  29.  */
  30.  
  31. /**
  32.  * uses PEAR errors
  33.  */
  34. require_once 'PEAR.php';
  35.  
  36. /**
  37.  * uses PEAR::Date
  38.  */
  39. require_once 'Date.php';
  40.  
  41. /**
  42.  * Class that wraps a holiday's data
  43.  */
  44. require_once 'Date/Holidays/Holiday.php';
  45.  
  46. /**
  47.  * Driver baseclass
  48.  */
  49. require_once 'Date/Holidays/Driver.php';
  50.  
  51. /**
  52.  * could not find file of driver-class
  53.  *
  54.  * @access  public
  55.  */
  56. define('DATE_HOLIDAYS_ERROR_DRIVERFILE_NOT_FOUND'1);
  57.  
  58. /**
  59.  * invalid argument was passed to a method
  60.  *
  61.  * @access  public
  62.  */
  63. define('DATE_HOLIDAYS_ERROR_INVALID_ARGUMENT'2);
  64.  
  65. /**
  66.  * Driver directory does not exist
  67.  *
  68.  * @access  public
  69.  */
  70. define('DATE_HOLIDAYS_ERROR_MISSING_DRIVER_DIR'3);
  71.  
  72. /**
  73.  * Filter directory does not exist
  74.  *
  75.  * @access  public
  76.  */
  77. define('DATE_HOLIDAYS_ERROR_MISSING_FILTER_DIR'4);
  78.  
  79. /**
  80.  * class that helps you to locate holidays for a year
  81.  *
  82.  * @category Date
  83.  * @package  Date_Holidays
  84.  * @author   Carsten Lucke <luckec@tool-garage.de>
  85.  * @author   Stephan Schmidt <schst@php.net>
  86.  * @license  http://www.php.net/license/3_01.txt PHP License 3.0.1
  87.  * @version  CVS: $Id$
  88.  * @link     http://pear.php.net/package/Date_Holidays
  89.  * @abstract
  90.  */
  91. {
  92.     /**
  93.      * Constructor
  94.      *
  95.      * Use the Date_Holidays::factory() method to construct an object of
  96.      * a certain driver
  97.      *
  98.      * @access   protected
  99.      */
  100.     function Date_Holidays()
  101.     {
  102.     }
  103.  
  104.     /**
  105.      * Factory method that creates a driver-object
  106.      *
  107.      * @param string  $driverId driver-name
  108.      * @param string  $year     year
  109.      * @param string  $locale   locale name
  110.      * @param boolean $external external driver
  111.      *
  112.      * @static
  113.      * @access   public
  114.      * @return   object  Date_Holidays driver-object on success,
  115.      *                    otherwise a PEAR_Error object
  116.      * @throws   object PEAR_Error
  117.      */
  118.     function factory($driverId$year = null$locale = null$external = false)
  119.     {
  120.         if (isset($GLOBALS['_DATE_HOLIDAYS']['DIE_ON_MISSING_LOCALE'])) {
  121.             Date_Holidays::staticSetProperty('DIE_ON_MISSING_LOCALE'true);
  122.         }
  123.  
  124.         $driverId basename($driverId);
  125.         $driverClass 'Date_Holidays_Driver_' $driverId;
  126.         if ($external{
  127.             $driverClass $driverId;
  128.         }
  129.  
  130.         if (class_exists($driverClass)) {
  131.             $driverFile 'Date/Holidays/Driver/' $driverId '.php';
  132.             if ($external{
  133.                 $driverFile str_replace('_''/'$driverClass'.php';
  134.             }
  135.  
  136.             @include_once $driverFile;
  137.             if (class_exists($driverClass)) {
  138.                 return Date_Holidays::raiseError(DATE_HOLIDAYS_ERROR_DRIVERFILE_NOT_FOUND,
  139.                     'Couldn\'t find file of the driver-class,  filename: ' $driverFile);
  140.             }
  141.         }
  142.         $driver = new $driverClass;
  143.  
  144.         if (is_null($year)) {
  145.             $year date('Y');
  146.         }
  147.         // sets internal var $_year and performs _buildHolidays()
  148.         $res $driver->setYear($year);
  149.         if (Date_Holidays::isError($res)) {
  150.             return $res;
  151.         }
  152.  
  153.         if (is_null($locale)) {
  154.             $locale setlocale(LC_MESSAGES0);
  155.             //encoding might be appended to the locale, For example en_IE.UTF-8
  156.             //so ignore it
  157.             $tmp    explode("."$locale);
  158.             $locale $tmp[0];
  159.         }
  160.         $driver->setLocale($locale);
  161.         return $driver;
  162.     }
  163.  
  164.     /**
  165.      * Factory method that creates a driver-object
  166.      *
  167.      * @param string  $isoCode  ISO3166 code identifying the driver
  168.      * @param string  $year     year
  169.      * @param string  $locale   locale name
  170.      * @param boolean $external external driver
  171.      *
  172.      * @static
  173.      * @access   public
  174.      * @return   object  Date_Holidays driver-object on success, otherwise
  175.      *                    a PEAR_Error object
  176.      * @throws   object PEAR_Error
  177.      */
  178.     function factoryISO3166($isoCode,
  179.                             $year = null,
  180.                             $locale = null,
  181.                             $external = false)
  182.     {
  183.         $driverDir dirname(__FILE__'/Holidays/Driver';
  184.         if (is_dir($driverDir)) {
  185.                     'Date_Holidays driver directory does not exist');
  186.         }
  187.  
  188.         $driverMappings = array();
  189.         $driverFiles    = array();
  190.         $dh             opendir($driverDir);
  191.         while (false !== ($filename readdir($dh))) {
  192.             array_push($driverFiles$filename);
  193.         }
  194.  
  195.         foreach ($driverFiles as $driverFileName{
  196.  
  197.             $file dirname(__FILE__'/Holidays/Driver/' $driverFileName;
  198.             if (is_file($file)) {
  199.                 continue;
  200.             }
  201.  
  202.             $driverId       str_replace('.php'''$driverFileName);
  203.             $driverClass    'Date_Holidays_Driver_' $driverId;
  204.             $driverFilePath $driverDir '/' $driverFileName;
  205.  
  206.             @include_once $driverFilePath;
  207.             if (class_exists($driverClass)) {
  208.                 return Date_Holidays::raiseError(DATE_HOLIDAYS_ERROR_DRIVERFILE_NOT_FOUND,
  209.                         'Couldn\'t find file of the driver-class ' $driverClass
  210.                                 . ',  filename: ' $driverFilePath);
  211.             }
  212.  
  213.             $isoCodes call_user_func(array(
  214.                             $driverClass,
  215.                             DATE_HOLIDAYS_DRIVER_IDENTIFY_ISO3166_METHOD));
  216.  
  217.             foreach ($isoCodes as $code{
  218.                 if (strtolower($code=== $isoCode{
  219.                     return Date_Holidays::factory($driverId,
  220.                                                   $year,
  221.                                                   $locale,
  222.                                                   $external);
  223.                 }
  224.             }
  225.         }
  226.  
  227.         /*
  228.          * If this line is reached the iso-code couldn't be mapped to
  229.          * a driver-class and an error will be thrown.
  230.          */
  231.             'Couldn\'t find a driver for the given ISO 3166 code: ' $isoCode);
  232.  
  233.     }
  234.  
  235.     /**
  236.      * Returns a list of the installed drivers
  237.      *
  238.      * @param string $directory where the drivers are installed
  239.      *
  240.      * @access public
  241.      * @static
  242.      * @return array 
  243.      */
  244.     function getInstalledDrivers($directory = null)
  245.     {
  246.         $drivers = array();
  247.         if ($directory === null{
  248.             $directory dirname(__FILE__'/Holidays/Driver';
  249.         }
  250.         if (!file_exists($directory|| !is_dir($directory)) {
  251.             $msg 'The driver directory "'.$directory.'" does not exist';
  252.             return PEAR::raiseError(DATE_HOLIDAYS_ERROR_MISSING_DRIVER_DIR$msg);
  253.         }
  254.         return Date_Holidays::_getModulesFromDir($directory);
  255.     }
  256.  
  257.     /**
  258.      * Returns a list of the installed filters
  259.      *
  260.      * @param string $directory where the filters are installed
  261.      *
  262.      * @access public
  263.      * @static
  264.      * @return array 
  265.      */
  266.     function getInstalledFilters($directory = null)
  267.     {
  268.         $filters = array();
  269.         if ($directory === null{
  270.             $directory dirname(__FILE__'/Holidays/Filter';
  271.         }
  272.         if (!file_exists($directory|| !is_dir($directory)) {
  273.             $msg 'The filter directory "'.$directory.'" does not exist';
  274.             return PEAR::raiseError(DATE_HOLIDAYS_ERROR_MISSING_FILTER_DIR$msg);
  275.         }
  276.         return Date_Holidays::_getModulesFromDir($directory);
  277.     }
  278.  
  279.     /**
  280.      * Fetch all modules from a directory and its subdirectories
  281.      *
  282.      * @param string $directory specified directory
  283.      * @param string $prefix    for the class names, will be used in recursive calls
  284.      *
  285.      * @static
  286.      * @access protected
  287.      * @return array modules
  288.      */
  289.     function _getModulesFromDir($directory$prefix '')
  290.     {
  291.         $modules = array();
  292.         $d       dir($directory);
  293.         while (false !== $moduleFile $d->read()) {
  294.             if ($moduleFile === '.' ||
  295.                 $moduleFile === '..' ||
  296.                 $moduleFile === 'CVS'{
  297.                 continue;
  298.             }
  299.             if (is_dir($directory.'/'.$moduleFile)) {
  300.                 $modules array_merge($modules,
  301.                         Date_Holidays::_getModulesFromDir($directory.'/'.$moduleFile,
  302.                                                           $prefix.$moduleFile.'_'));
  303.                 continue;
  304.             }
  305.             $matches = array();
  306.             if (preg_match('/(.*)\.php$/'$moduleFile$matches)) {
  307.                 array_push($modulesarray('id'    => $prefix.$matches[1],
  308.                                            'title' => $prefix.$matches[1]));
  309.             }
  310.         }
  311.         return $modules;
  312.     }
  313.  
  314.     /**
  315.      * Returns the error-stack
  316.      *
  317.      * @static
  318.      * @access   public
  319.      * @return   object PEAR_ErrorStack  error-stack
  320.      */
  321.     function &getErrorStack()
  322.     {
  323.         return PEAR_ErrorStack::singleton('Date_Holidays'falsefalsetrue);
  324.     }
  325.  
  326.     /**
  327.      * Pushes a new error on the error-stack and returns a PEAR_Error object
  328.      *
  329.      * @param int    $code error-code
  330.      * @param string $msg  error-message
  331.      *
  332.      * @static
  333.      * @access   public
  334.      * @return   object PEAR_Error 
  335.      */
  336.     function raiseError($code$msg = null)
  337.     {
  338.         $errorStack &Date_Holidays::getErrorStack();
  339.         return $errorStack->push($code,
  340.                                  'error',
  341.                                  array(),
  342.                                  $msg,
  343.                                  false,
  344.                                  debug_backtrace());
  345.     }
  346.  
  347.     /**
  348.      * Checks a variable to determine whether it represents an error object or not
  349.      *
  350.      * @param mixed $data variable to test
  351.      * @param int   $code if $data is an PEAR_Error object, return true
  352.      *                     only if $code is a string and
  353.      *                     $obj->getMessage() == $code or
  354.      *                     $code is an integer and $obj->getCode() == $code
  355.      *
  356.      * @static
  357.      * @access   public
  358.      * @return   boolean true if $subject is an error object
  359.      */
  360.     function isError($data$code = null)
  361.     {
  362.         if (!is_object($data)) {
  363.             return false;
  364.         }
  365.         $errorClass get_class($data);
  366.         switch (strtolower($errorClass)) {
  367.         case 'pear_error':
  368.             return PEAR::isError($data$code);
  369.         case 'pear_errorstack':
  370.             return $data->hasErrors();
  371.         }
  372.         return false;
  373.     }
  374.  
  375.     /**
  376.      * Checks whether errors occured
  377.      *
  378.      * @static
  379.      * @access   public
  380.      * @return   boolean true if errors occurred
  381.      */
  382.     function errorsOccurred()
  383.     {
  384.         $errorStack &Date_Holidays::getErrorStack();
  385.         return $errorStack->hasErrors();
  386.     }
  387.  
  388.     /**
  389.      * Returns the errors the error-stack contains
  390.      *
  391.      * @param boolean $purge true if the stall shall be purged
  392.      *
  393.      * @static
  394.      * @access   public
  395.      * @return   array   errors
  396.      */
  397.     function getErrors($purge = false)
  398.     {
  399.         $errorStack &Date_Holidays::getErrorStack();
  400.         return $errorStack->getErrors($purge);
  401.     }
  402.  
  403.     /**
  404.      * Set a property for the Date_Holidays drivers
  405.      *
  406.      * Available properties:
  407.      * <pre>
  408.      * DIE_ON_MISSING_LOCALE = boolean
  409.      *   false: if no localized holiday-title is found an error will be returned
  410.      *   true: if no localized holiday-title is found then the default
  411.      *         translation (English) will be used
  412.      * </pre>
  413.      *
  414.      * @param string $prop  property
  415.      * @param string $value property-value
  416.      *
  417.      * @access   public
  418.      * @static
  419.      * @return   void 
  420.      */
  421.     function staticSetProperty($prop$value)
  422.     {
  423.         if (isset($GLOBALS['_DATE_HOLIDAYS'])) {
  424.             $GLOBALS['_DATE_HOLIDAYS'= array();
  425.         }
  426.  
  427.         switch ($prop{
  428.         case 'DIE_ON_MISSING_LOCALE':
  429.             if (is_bool($value)) {
  430.                 $GLOBALS['_DATE_HOLIDAYS'][$prop$value;
  431.             }
  432.             break;
  433.         }
  434.     }
  435.  
  436.     /**
  437.      * Returns an internal property value
  438.      *
  439.      * @param string $prop property-name
  440.      *
  441.      * @static
  442.      * @access   public
  443.      * @return   mixed   property value on success, otherwise null
  444.      */
  445.     function staticGetProperty($prop)
  446.     {
  447.         if (isset($GLOBALS['_DATE_HOLIDAYS'])) {
  448.             return null;
  449.         }
  450.  
  451.         switch ($prop{
  452.         case 'DIE_ON_MISSING_LOCALE':
  453.             if (isset($GLOBALS['_DATE_HOLIDAYS'][$prop])) {
  454.                 return $GLOBALS['_DATE_HOLIDAYS'][$prop];
  455.             }
  456.         }
  457.  
  458.         return null;
  459.     }
  460. }
  461. ?>

Documentation generated on Tue, 22 Jan 2013 01:00:09 +0000 by phpDocumentor 1.4.3. PEAR Logo Copyright © PHP Group 2004.