File indexing completed on 2024-12-22 05:36:41
0001 <?php 0002 /** 0003 * Zend Framework 0004 * 0005 * LICENSE 0006 * 0007 * This source file is subject to the new BSD license that is bundled 0008 * with this package in the file LICENSE.txt. 0009 * It is also available through the world-wide-web at this URL: 0010 * http://framework.zend.com/license/new-bsd 0011 * If you did not receive a copy of the license and are unable to 0012 * obtain it through the world-wide-web, please send an email 0013 * to license@zend.com so we can send you a copy immediately. 0014 * 0015 * @category Zend 0016 * @package Zend_Filter 0017 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0018 * @license http://framework.zend.com/license/new-bsd New BSD License 0019 * @version $Id$ 0020 */ 0021 0022 /** 0023 * @see Zend_Filter_Interface 0024 */ 0025 // require_once 'Zend/Filter/Interface.php'; 0026 0027 /** 0028 * @category Zend 0029 * @package Zend_Filter 0030 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0031 * @license http://framework.zend.com/license/new-bsd New BSD License 0032 */ 0033 class Zend_Filter_Boolean implements Zend_Filter_Interface 0034 { 0035 const BOOLEAN = 1; 0036 const INTEGER = 2; 0037 const FLOAT = 4; 0038 const STRING = 8; 0039 const ZERO = 16; 0040 const EMPTY_ARRAY = 32; 0041 const NULL = 64; 0042 const PHP = 127; 0043 const FALSE_STRING = 128; 0044 const YES = 256; 0045 const ALL = 511; 0046 0047 protected $_constants = array( 0048 self::BOOLEAN => 'boolean', 0049 self::INTEGER => 'integer', 0050 self::FLOAT => 'float', 0051 self::STRING => 'string', 0052 self::ZERO => 'zero', 0053 self::EMPTY_ARRAY => 'array', 0054 self::NULL => 'null', 0055 self::PHP => 'php', 0056 self::FALSE_STRING => 'false', 0057 self::YES => 'yes', 0058 self::ALL => 'all', 0059 ); 0060 0061 /** 0062 * Internal type to detect 0063 * 0064 * @var integer 0065 */ 0066 protected $_type = self::PHP; 0067 0068 /** 0069 * Internal locale 0070 * 0071 * @var array 0072 */ 0073 protected $_locale = array('auto'); 0074 0075 /** 0076 * Internal mode 0077 * 0078 * @var boolean 0079 */ 0080 protected $_casting = true; 0081 0082 /** 0083 * Constructor 0084 * 0085 * @param string|array|Zend_Config $options OPTIONAL 0086 */ 0087 public function __construct($options = null) 0088 { 0089 if ($options instanceof Zend_Config) { 0090 $options = $options->toArray(); 0091 } elseif (!is_array($options)) { 0092 $options = func_get_args(); 0093 $temp = array(); 0094 if (!empty($options)) { 0095 $temp['type'] = array_shift($options); 0096 } 0097 0098 if (!empty($options)) { 0099 $temp['casting'] = array_shift($options); 0100 } 0101 0102 if (!empty($options)) { 0103 $temp['locale'] = array_shift($options); 0104 } 0105 0106 $options = $temp; 0107 } 0108 0109 if (array_key_exists('type', $options)) { 0110 $this->setType($options['type']); 0111 } 0112 0113 if (array_key_exists('casting', $options)) { 0114 $this->setCasting($options['casting']); 0115 } 0116 0117 if (array_key_exists('locale', $options)) { 0118 $this->setLocale($options['locale']); 0119 } 0120 } 0121 0122 /** 0123 * Returns the set null types 0124 * 0125 * @return int 0126 */ 0127 public function getType() 0128 { 0129 return $this->_type; 0130 } 0131 0132 /** 0133 * Set the null types 0134 * 0135 * @param integer|array $type 0136 * @throws Zend_Filter_Exception 0137 * @return Zend_Filter_Boolean 0138 */ 0139 public function setType($type = null) 0140 { 0141 if (is_array($type)) { 0142 $detected = 0; 0143 foreach($type as $value) { 0144 if (is_int($value)) { 0145 $detected += $value; 0146 } elseif (in_array($value, $this->_constants)) { 0147 $detected += array_search($value, $this->_constants); 0148 } 0149 } 0150 0151 $type = $detected; 0152 } elseif (is_string($type) && in_array($type, $this->_constants)) { 0153 $type = array_search($type, $this->_constants); 0154 } 0155 0156 if (!is_int($type) || ($type < 0) || ($type > self::ALL)) { 0157 // require_once 'Zend/Filter/Exception.php'; 0158 throw new Zend_Filter_Exception('Unknown type'); 0159 } 0160 0161 $this->_type = $type; 0162 return $this; 0163 } 0164 0165 /** 0166 * Returns the set locale 0167 * 0168 * @return array 0169 */ 0170 public function getLocale() 0171 { 0172 return $this->_locale; 0173 } 0174 0175 /** 0176 * Set the locales which are accepted 0177 * 0178 * @param string|array|Zend_Locale $locale 0179 * @throws Zend_Filter_Exception 0180 * @return Zend_Filter_Boolean 0181 */ 0182 public function setLocale($locale = null) 0183 { 0184 if (is_string($locale)) { 0185 $locale = array($locale); 0186 } elseif ($locale instanceof Zend_Locale) { 0187 $locale = array($locale->toString()); 0188 } elseif (!is_array($locale)) { 0189 // require_once 'Zend/Filter/Exception.php'; 0190 throw new Zend_Filter_Exception('Locale has to be string, array or an instance of Zend_Locale'); 0191 } 0192 0193 // require_once 'Zend/Locale.php'; 0194 foreach ($locale as $single) { 0195 if (!Zend_Locale::isLocale($single)) { 0196 // require_once 'Zend/Filter/Exception.php'; 0197 throw new Zend_Filter_Exception("Unknown locale '$single'"); 0198 } 0199 } 0200 0201 $this->_locale = $locale; 0202 return $this; 0203 } 0204 0205 /** 0206 * Returns the casting option 0207 * 0208 * @return boolean 0209 */ 0210 public function getCasting() 0211 { 0212 return $this->_casting; 0213 } 0214 0215 /** 0216 * Set the working mode 0217 * 0218 * @param boolean $locale When true this filter works like cast 0219 * When false it recognises only true and false 0220 * and all other values are returned as is 0221 * @throws Zend_Filter_Exception 0222 * @return Zend_Filter_Boolean 0223 */ 0224 public function setCasting($casting = true) 0225 { 0226 $this->_casting = (boolean) $casting; 0227 return $this; 0228 } 0229 0230 /** 0231 * Defined by Zend_Filter_Interface 0232 * 0233 * Returns a boolean representation of $value 0234 * 0235 * @param string $value 0236 * @return string 0237 */ 0238 public function filter($value) 0239 { 0240 $type = $this->getType(); 0241 $casting = $this->getCasting(); 0242 0243 // STRING YES (Localized) 0244 if ($type >= self::YES) { 0245 $type -= self::YES; 0246 if (is_string($value)) { 0247 // require_once 'Zend/Locale.php'; 0248 $locales = $this->getLocale(); 0249 foreach ($locales as $locale) { 0250 if ($this->_getLocalizedQuestion($value, false, $locale) === false) { 0251 return false; 0252 } 0253 0254 if (!$casting && ($this->_getLocalizedQuestion($value, true, $locale) === true)) { 0255 return true; 0256 } 0257 } 0258 } 0259 } 0260 0261 // STRING FALSE ('false') 0262 if ($type >= self::FALSE_STRING) { 0263 $type -= self::FALSE_STRING; 0264 if (is_string($value) && (strtolower($value) == 'false')) { 0265 return false; 0266 } 0267 0268 if ((!$casting) && is_string($value) && (strtolower($value) == 'true')) { 0269 return true; 0270 } 0271 } 0272 0273 // NULL (null) 0274 if ($type >= self::NULL) { 0275 $type -= self::NULL; 0276 if ($value === null) { 0277 return false; 0278 } 0279 } 0280 0281 // EMPTY_ARRAY (array()) 0282 if ($type >= self::EMPTY_ARRAY) { 0283 $type -= self::EMPTY_ARRAY; 0284 if (is_array($value) && ($value == array())) { 0285 return false; 0286 } 0287 } 0288 0289 // ZERO ('0') 0290 if ($type >= self::ZERO) { 0291 $type -= self::ZERO; 0292 if (is_string($value) && ($value == '0')) { 0293 return false; 0294 } 0295 0296 if ((!$casting) && (is_string($value)) && ($value == '1')) { 0297 return true; 0298 } 0299 } 0300 0301 // STRING ('') 0302 if ($type >= self::STRING) { 0303 $type -= self::STRING; 0304 if (is_string($value) && ($value == '')) { 0305 return false; 0306 } 0307 } 0308 0309 // FLOAT (0.0) 0310 if ($type >= self::FLOAT) { 0311 $type -= self::FLOAT; 0312 if (is_float($value) && ($value == 0.0)) { 0313 return false; 0314 } 0315 0316 if ((!$casting) && is_float($value) && ($value == 1.0)) { 0317 return true; 0318 } 0319 } 0320 0321 // INTEGER (0) 0322 if ($type >= self::INTEGER) { 0323 $type -= self::INTEGER; 0324 if (is_int($value) && ($value == 0)) { 0325 return false; 0326 } 0327 0328 if ((!$casting) && is_int($value) && ($value == 1)) { 0329 return true; 0330 } 0331 } 0332 0333 // BOOLEAN (false) 0334 if ($type >= self::BOOLEAN) { 0335 $type -= self::BOOLEAN; 0336 if (is_bool($value)) { 0337 return $value; 0338 } 0339 } 0340 0341 if ($casting) { 0342 return true; 0343 } 0344 0345 return $value; 0346 } 0347 0348 /** 0349 * Determine the value of a localized string, and compare it to a given value 0350 * 0351 * @param string $value 0352 * @param boolean $yes 0353 * @param array $locale 0354 * @return boolean 0355 */ 0356 protected function _getLocalizedQuestion($value, $yes, $locale) 0357 { 0358 if ($yes == true) { 0359 $question = 'yes'; 0360 $return = true; 0361 } else { 0362 $question = 'no'; 0363 $return = false; 0364 } 0365 $str = Zend_Locale::getTranslation($question, 'question', $locale); 0366 $str = explode(':', $str); 0367 if (!empty($str)) { 0368 foreach($str as $no) { 0369 if (($no == $value) || (strtolower($no) == strtolower($value))) { 0370 return $return; 0371 } 0372 } 0373 } 0374 } 0375 }