Source for file jDatatype.class.php

Documentation is available at jDatatype.class.php

  1. <?php
  2. /**
  3. @package     jelix
  4. @subpackage  utils
  5. @author      Laurent Jouanneau
  6. @contributor Julien Issler, Hadrien Lanneau
  7. @copyright   2006-2009 Laurent Jouanneau
  8. @copyright   2008 Julien Issler, 2011 Hadrien Lanneau
  9. @link        http://www.jelix.org
  10. @licence     http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
  11. */
  12. /**
  13.  * interface for datatypes which can filter value
  14.  * @package     jelix
  15.  * @subpackage  utils
  16.  * @since 1.1
  17.  */
  18. interface jIFilteredDatatype {
  19.     /**
  20.      * return the value on which filters are applied
  21.      * should be call after a call of check() method
  22.      */
  23.     public function getFilteredValue();
  24. }
  25. /**
  26.  *
  27.  * @package     jelix
  28.  * @subpackage  utils
  29.  */
  30. abstract class jDatatype {
  31.  
  32.     protected $hasFacetsfalse;
  33.     protected $facets = array();
  34.  
  35.     /**
  36.     * call it to add restriction on possible values
  37.     * @param string $type 
  38.     * @param string $value 
  39.     */
  40.     public function addFacet($type,$value=null){
  41.         if(in_array($type$this->facets)){
  42.             $this->hasFacets = true;
  43.             $this->_addFacet($type,$value);
  44.         }
  45.     }
  46.  
  47.     /**
  48.     * get a restriction value
  49.     * @param string $type 
  50.     * @return mixed  the value
  51.     * @since 1.0
  52.     */
  53.     public function getFacet($type){
  54.         if(in_array($type$this->facets)){
  55.             return $this->$type;
  56.         }
  57.         return null;
  58.     }
  59.  
  60.     protected function _addFacet($type,$value){
  61.         $this->$type $value;
  62.     }
  63.  
  64.     /**
  65.     * verify a value : it should correspond to the datatype
  66.     * @param string   $value 
  67.     * @return boolean true if the value is ok
  68.     */
  69.     public function check($value){
  70.         return true;
  71.     }
  72. }
  73.  
  74. /**
  75.  * Datatype String.
  76.  *
  77.  * Possible facets are: 'length','minLength','maxLength', 'pattern'
  78.  * @package     jelix
  79.  * @subpackage  utils
  80.  */
  81. class jDatatypeString extends jDatatype {
  82.     protected $length=null;
  83.     protected $minLength=null;
  84.     protected $maxLength=null;
  85.     protected $pattern=null;
  86.     protected $facets = array('length','minLength','maxLength''pattern');
  87.  
  88.     public function check($value){
  89.         if($this->hasFacets){
  90.             $len iconv_strlen(
  91.                 trim(preg_replace'@\s+@'' '$value)),
  92.                 $GLOBALS['gJConfig']->charset
  93.             );
  94.             if($this->length !== null && $len != $this->length)
  95.                 return false;
  96.             if($this->minLength !== null && $len $this->minLength)
  97.                 return false;
  98.             if($this->maxLength !== null && $len $this->maxLength)
  99.                 return false;
  100.             if($this->pattern !== null && !preg_match($this->pattern,$value))
  101.                 return false;
  102.         }
  103.         return true;
  104.     }
  105. }
  106.  
  107. /**
  108.  * Datatype HTML String.
  109.  *
  110.  * Possible facets are: 'length','minLength','maxLength'
  111.  * @package     jelix
  112.  * @subpackage  utils
  113.  * @since 1.1
  114.  */
  115. class jDatatypeHtml extends jDatatype implements jIFilteredDatatype {
  116.     protected $length=null;
  117.     protected $minLength=null;
  118.     protected $maxLength=null;
  119.     protected $facets = array('length','minLength','maxLength');
  120.     public $outputXhtml = false;
  121.     public $fromWysiwyg = false;
  122.  
  123.     protected $newValue;
  124.  
  125.     public function __construct($aOutputXhtml false$fromWysiwyg false{
  126.         $this->outputXhtml = $aOutputXhtml;
  127.         $this->fromWysiwyg = $fromWysiwyg;
  128.     }
  129.  
  130.     public function check($value){
  131.         if($this->hasFacets){
  132.             if ($this->fromWysiwyg)
  133.                 $len iconv_strlen(strip_tags($value,'<img><img/><object><embed><video><video/><svg>')$GLOBALS['gJConfig']->charset);
  134.             else
  135.                 $len iconv_strlen($value$GLOBALS['gJConfig']->charset);
  136.             if($this->length !== null && $len != $this->length)
  137.                 return false;
  138.             if($this->minLength !== null && $len $this->minLength)
  139.                 return false;
  140.             if($this->maxLength !== null && $len $this->maxLength)
  141.                 return false;
  142.         }
  143.         $this->newValue = jFilter::cleanHtml($value$this->outputXhtml);
  144.         return is_string($this->newValue);
  145.     }
  146.  
  147.     public function getFilteredValue({
  148.         return $this->newValue;
  149.     }
  150. }
  151.  
  152. /**
  153.  * Datatype BoolĂ©en
  154.  * @package     jelix
  155.  * @subpackage  utils
  156.  */
  157. class jDatatypeBoolean extends jDatatype {
  158.     public function check($valuereturn jFilter::isBool($value)}
  159. }
  160.  
  161. /**
  162.  * Datatype Decimal
  163.  *
  164.  * Possible facets are: 'maxValue', 'minValue'
  165.  * @package     jelix
  166.  * @subpackage  utils
  167.  */
  168. class jDatatypeDecimal extends jDatatype {
  169.     // xxxx.yyyyy
  170.     protected $maxValue=null;
  171.     protected $minValue=null;
  172.     protected $facets = array('maxValue''minValue');
  173.     public function check($valuereturn jFilter::isFloat($value$this->minValue$this->maxValue)}
  174.     protected function _addFacet($type,$value){
  175.         if($type == 'maxValue' || $type == 'minValue'){
  176.             $this->$type floatval($value);
  177.         }
  178.     }
  179. }
  180.  
  181. /**
  182.  * Datatype Integer
  183.  * @package     jelix
  184.  * @subpackage  utils
  185.  */
  186. class jDatatypeInteger extends jDatatypeDecimal {
  187.     public function check($valuereturn jFilter::isInt($value$this->minValue$this->maxValue)}
  188.     protected function _addFacet($type,$value){
  189.         if($type == 'maxValue' || $type == 'minValue'){
  190.             $this->$type intval($value);
  191.         }
  192.     }
  193. }
  194.  
  195.  
  196. /**
  197.  * Datatype Hexa
  198.  * @package     jelix
  199.  * @subpackage  utils
  200.  */
  201. class jDatatypeHexadecimal extends jDatatypeDecimal {
  202.     public function check($value{
  203.         if(substr($value,0,2!= '0x'$value='0x'.$value;
  204.         return jFilter::isHexInt($value$this->minValue$this->maxValue);
  205.     }
  206.     protected function _addFacet($type,$value){
  207.         if($type == 'maxValue' || $type == 'minValue'){
  208.             $this->$type intval($value,16);
  209.         }
  210.     }
  211. }
  212.  
  213.  
  214. /**
  215.  * Datatype datetime
  216.  *
  217.  * Possible facets are: 'maxValue', 'minValue'
  218.  * @package     jelix
  219.  * @subpackage  utils
  220.  */
  221. class jDatatypeDateTime extends jDatatype {
  222.     protected $facets = array('maxValue''minValue');
  223.     protected $maxValue;
  224.     protected $minValue;
  225.     private $dt;
  226.     protected $format=21;
  227.     protected $_date_format = 'Y-m-d H:i:s';
  228.     public function check($value{
  229.         $this->dt new jDateTime();
  230.         if(!$this->dt->setFromString($value,$this->format)) return false;
  231.         if($this->maxValue !== null){
  232.             if($this->dt->compareTo($this->maxValue== 1return false;
  233.         }
  234.         if($this->minValue !== null){
  235.             if($this->dt->compareTo($this->minValue== -1return false;
  236.         }
  237.         return true;
  238.     }
  239.  
  240.     protected function _addFacet($type,$value){
  241.         if($type == 'maxValue' || $type == 'minValue'){
  242.             if(!preg_match('#^\d{4}-\d{2}-\d{2} (\d{2}:\d{2}(:\d{2})?)?$#',$value))
  243.                 $value date($this->_date_format,strtotime($value));
  244.             $this->$type new jDateTime();
  245.             $this->$type->setFromString($value,$this->format);
  246.         }
  247.         else
  248.             parent::_addFacet($type,$value);
  249.     }
  250.     /**
  251.      * @since 1.0
  252.      */
  253.     public function getFormat(return $this->format}
  254. }
  255.  
  256. /**
  257.  * Datatype time
  258.  * @package     jelix
  259.  * @subpackage  utils
  260.  */
  261. class jDatatypeTime extends jDatatypeDateTime {
  262.     protected $format=22;
  263. }
  264. /**
  265.  * Datatype date
  266.  * @package     jelix
  267.  * @subpackage  utils
  268.  */
  269. class jDatatypeDate extends jDatatypeDateTime {
  270.     protected $format=20;
  271.     protected $_date_format = 'Y-m-d';
  272. }
  273.  
  274. /**
  275.  * Datatype localedatetime
  276.  * @package     jelix
  277.  * @subpackage  utils
  278.  */
  279. class jDatatypeLocaleDateTime extends jDatatypeDateTime {
  280.     protected $format=11;
  281. }
  282.  
  283. /**
  284.  * Datatype localedate
  285.  * @package     jelix
  286.  * @subpackage  utils
  287.  */
  288. class jDatatypeLocaleDate extends jDatatypeDateTime {
  289.     protected $format=10;
  290. }
  291.  
  292. /**
  293.  * Datatype localetime
  294.  * @package     jelix
  295.  * @subpackage  utils
  296.  */
  297. class jDatatypeLocaleTime extends jDatatypeDateTime {
  298.     protected $format=12;
  299. }
  300.  
  301.  
  302. /**
  303.  * Datatype url
  304.  *
  305.  * Possible facets are: 'schemeRequired','hostRequired','pathRequired', 'queryRequired'.
  306.  * all are booleans.
  307.  * @package     jelix
  308.  * @subpackage  utils
  309.  */
  310. class jDatatypeUrl extends jDatatype {
  311.     protected $schemeRequired=true;
  312.     protected $hostRequired=true;
  313.     protected $pathRequired=null;
  314.     protected $queryRequired=null;
  315.  
  316.     protected $facets = array('schemeRequired','hostRequired','pathRequired''queryRequired');
  317.  
  318.     public function check($value){
  319.         return jFilter::isUrl($value$this->schemeRequired$this->hostRequired$this->pathRequired$this->queryRequired);
  320.     }
  321. }
  322.  
  323. /**
  324.  * Datatype ipv4
  325.  * @package     jelix
  326.  * @subpackage  utils
  327.  */
  328. class jDatatypeIPv4 extends jDatatype {
  329.     public function check($value){
  330.         return jFilter::isIPv4($value);
  331.     }
  332. }
  333.  
  334. /**
  335.  * Datatype ipv6
  336.  * @package     jelix
  337.  * @subpackage  utils
  338.  */
  339. class jDatatypeIPv6 extends jDatatype {
  340.     public function check($value){
  341.         return jFilter::isIPv6($value);
  342.     }
  343. }
  344.  
  345. /**
  346.  * Datatype mail
  347.  * @package     jelix
  348.  * @subpackage  utils
  349.  */
  350. class jDatatypeEmail extends jDatatype {
  351.     public function check($value){
  352.         return jFilter::isEmail($value);
  353.     }
  354. }

Documentation generated on Mon, 19 Sep 2011 14:12:21 +0200 by phpDocumentor 1.4.3