/kernel/classes/datatypes/ezfloat/ezfloattype.php

https://github.com/GunioRobot/ezpublish · PHP · 415 lines · 331 code · 45 blank · 39 comment · 58 complexity · afbef0559ab00a4d03971711a3774d3c MD5 · raw file

  1. <?php
  2. /**
  3. * File containing the eZFloatType class.
  4. *
  5. * @copyright Copyright (C) 1999-2011 eZ Systems AS. All rights reserved.
  6. * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2
  7. * @version //autogentag//
  8. * @package kernel
  9. */
  10. /*!
  11. \class eZFloatType ezfloattype.php
  12. \ingroup eZDatatype
  13. \brief Stores a float value
  14. */
  15. class eZFloatType extends eZDataType
  16. {
  17. const DATA_TYPE_STRING = "ezfloat";
  18. const MIN_FIELD = "data_float1";
  19. const MIN_VARIABLE = "_ezfloat_min_float_value_";
  20. const MAX_FIELD = "data_float2";
  21. const MAX_VARIABLE = "_ezfloat_max_float_value_";
  22. const DEFAULT_FIELD = "data_float3";
  23. const DEFAULT_VARIABLE = "_ezfloat_default_value_";
  24. const INPUT_STATE_FIELD = "data_float4";
  25. const NO_MIN_MAX_VALUE = 0;
  26. const HAS_MIN_VALUE = 1;
  27. const HAS_MAX_VALUE = 2;
  28. const HAS_MIN_MAX_VALUE = 3;
  29. function eZFloatType()
  30. {
  31. $this->eZDataType( self::DATA_TYPE_STRING, ezpI18n::tr( 'kernel/classes/datatypes', "Float", 'Datatype name' ),
  32. array( 'serialize_supported' => true,
  33. 'object_serialize_map' => array( 'data_float' => 'value' ) ) );
  34. $this->FloatValidator = new eZFloatValidator();
  35. }
  36. /*!
  37. Sets the default value.
  38. */
  39. function initializeObjectAttribute( $contentObjectAttribute, $currentVersion, $originalContentObjectAttribute )
  40. {
  41. if ( $currentVersion != false )
  42. {
  43. // $contentObjectAttributeID = $contentObjectAttribute->attribute( "id" );
  44. // $currentObjectAttribute = eZContentObjectAttribute::fetch( $contentObjectAttributeID,
  45. // $currentVersion );
  46. $dataFloat = $originalContentObjectAttribute->attribute( "data_float" );
  47. $contentObjectAttribute->setAttribute( "data_float", $dataFloat );
  48. }
  49. else
  50. {
  51. $contentClassAttribute = $contentObjectAttribute->contentClassAttribute();
  52. $default = $contentClassAttribute->attribute( "data_float3" );
  53. if ( $default !== 0 )
  54. {
  55. $contentObjectAttribute->setAttribute( "data_float", $default );
  56. }
  57. }
  58. }
  59. /*!
  60. Fetches the http post var float input and stores it in the data instance.
  61. */
  62. function fetchObjectAttributeHTTPInput( $http, $base, $contentObjectAttribute )
  63. {
  64. if ( $http->hasPostVariable( $base . "_data_float_" . $contentObjectAttribute->attribute( "id" ) ) )
  65. {
  66. $data = $http->postVariable( $base . "_data_float_" . $contentObjectAttribute->attribute( "id" ) );
  67. $contentObjectAttribute->setHTTPValue( $data );
  68. $locale = eZLocale::instance();
  69. $data = $locale->internalNumber( $data );
  70. $data = str_replace(" ", "", $data);
  71. $contentObjectAttribute->setAttribute( "data_float", $data );
  72. return true;
  73. }
  74. return false;
  75. }
  76. /*!
  77. Validates the input and returns true if the input was
  78. valid for this datatype.
  79. */
  80. function validateObjectAttributeHTTPInput( $http, $base, $contentObjectAttribute )
  81. {
  82. if ( $http->hasPostVariable( $base . "_data_float_" . $contentObjectAttribute->attribute( "id" ) ) )
  83. {
  84. $data = $http->postVariable( $base . "_data_float_" . $contentObjectAttribute->attribute( "id" ) );
  85. $data = str_replace(" ", "", $data );
  86. $classAttribute = $contentObjectAttribute->contentClassAttribute();
  87. $min = $classAttribute->attribute( self::MIN_FIELD );
  88. $max = $classAttribute->attribute( self::MAX_FIELD );
  89. $input_state = $classAttribute->attribute( self::INPUT_STATE_FIELD );
  90. if ( !$contentObjectAttribute->validateIsRequired() && ( $data == "" ) )
  91. {
  92. return eZInputValidator::STATE_ACCEPTED;
  93. }
  94. $locale = eZLocale::instance();
  95. $data = $locale->internalNumber( $data );
  96. switch( $input_state )
  97. {
  98. case self::NO_MIN_MAX_VALUE:
  99. {
  100. $state = $this->FloatValidator->validate( $data );
  101. if( $state===1 )
  102. return eZInputValidator::STATE_ACCEPTED;
  103. else
  104. $contentObjectAttribute->setValidationError( ezpI18n::tr( 'kernel/classes/datatypes',
  105. 'The given input is not a floating point number.' ) );
  106. } break;
  107. case self::HAS_MIN_VALUE:
  108. {
  109. $this->FloatValidator->setRange( $min, false );
  110. $state = $this->FloatValidator->validate( $data );
  111. if( $state===1 )
  112. return eZInputValidator::STATE_ACCEPTED;
  113. else
  114. $contentObjectAttribute->setValidationError( ezpI18n::tr( 'kernel/classes/datatypes',
  115. 'The input must be greater than %1' ),
  116. $min );
  117. } break;
  118. case self::HAS_MAX_VALUE:
  119. {
  120. $this->FloatValidator->setRange( false, $max );
  121. $state = $this->FloatValidator->validate( $data );
  122. if( $state===1 )
  123. return eZInputValidator::STATE_ACCEPTED;
  124. else
  125. $contentObjectAttribute->setValidationError( ezpI18n::tr( 'kernel/classes/datatypes',
  126. 'The input must be less than %1' ),
  127. $max );
  128. } break;
  129. case self::HAS_MIN_MAX_VALUE:
  130. {
  131. $this->FloatValidator->setRange( $min, $max );
  132. $state = $this->FloatValidator->validate( $data );
  133. if( $state===1 )
  134. return eZInputValidator::STATE_ACCEPTED;
  135. else
  136. $contentObjectAttribute->setValidationError( ezpI18n::tr( 'kernel/classes/datatypes',
  137. 'The input is not in defined range %1 - %2' ),
  138. $min, $max );
  139. } break;
  140. }
  141. }
  142. return eZInputValidator::STATE_INVALID;
  143. }
  144. function fixupObjectAttributeHTTPInput( $http, $base, $contentObjectAttribute )
  145. {
  146. }
  147. function storeObjectAttribute( $attribute )
  148. {
  149. }
  150. function fetchClassAttributeHTTPInput( $http, $base, $classAttribute )
  151. {
  152. $minValueName = $base . self::MIN_VARIABLE . $classAttribute->attribute( "id" );
  153. $maxValueName = $base . self::MAX_VARIABLE . $classAttribute->attribute( "id" );
  154. $defaultValueName = $base . self::DEFAULT_VARIABLE . $classAttribute->attribute( "id" );
  155. if ( $http->hasPostVariable( $minValueName ) and
  156. $http->hasPostVariable( $maxValueName ) and
  157. $http->hasPostVariable( $defaultValueName ) )
  158. {
  159. $locale = eZLocale::instance();
  160. $minValueValue = $http->postVariable( $minValueName );
  161. $minValueValue = str_replace(" ", "", $minValueValue );
  162. $minValueValue = $locale->internalNumber( $minValueValue );
  163. $maxValueValue = $http->postVariable( $maxValueName );
  164. $maxValueValue = str_replace(" ", "", $maxValueValue );
  165. $maxValueValue = $locale->internalNumber( $maxValueValue );
  166. $defaultValueValue = $http->postVariable( $defaultValueName );
  167. $defaultValueValue = str_replace(" ", "", $defaultValueValue );
  168. $defaultValueValue = $locale->internalNumber( $defaultValueValue );
  169. $classAttribute->setAttribute( self::MIN_FIELD, $minValueValue );
  170. $classAttribute->setAttribute( self::MAX_FIELD, $maxValueValue );
  171. $classAttribute->setAttribute( self::DEFAULT_FIELD, $defaultValueValue );
  172. if ( ( $minValueValue == "" ) && ( $maxValueValue == "") ){
  173. $input_state = self::NO_MIN_MAX_VALUE;
  174. $classAttribute->setAttribute( self::INPUT_STATE_FIELD, $input_state );
  175. }
  176. else if ( ( $minValueValue == "" ) && ( $maxValueValue !== "") )
  177. {
  178. $input_state = self::HAS_MAX_VALUE;
  179. $classAttribute->setAttribute( self::INPUT_STATE_FIELD, $input_state );
  180. }
  181. else if ( ( $minValueValue !== "" ) && ( $maxValueValue == "") )
  182. {
  183. $input_state = self::HAS_MIN_VALUE;
  184. $classAttribute->setAttribute( self::INPUT_STATE_FIELD, $input_state );
  185. }
  186. else
  187. {
  188. $input_state = self::HAS_MIN_MAX_VALUE;
  189. $classAttribute->setAttribute( self::INPUT_STATE_FIELD, $input_state );
  190. }
  191. return true;
  192. }
  193. return false;
  194. }
  195. function validateClassAttributeHTTPInput( $http, $base, $classAttribute )
  196. {
  197. $minValueName = $base . self::MIN_VARIABLE . $classAttribute->attribute( "id" );
  198. $maxValueName = $base . self::MAX_VARIABLE . $classAttribute->attribute( "id" );
  199. $defaultValueName = $base . self::DEFAULT_VARIABLE . $classAttribute->attribute( "id" );
  200. if ( $http->hasPostVariable( $minValueName ) and
  201. $http->hasPostVariable( $maxValueName ) and
  202. $http->hasPostVariable( $defaultValueName ) )
  203. {
  204. $locale = eZLocale::instance();
  205. $minValueValue = $http->postVariable( $minValueName );
  206. $minValueValue = str_replace(" ", "", $minValueValue );
  207. $minValueValue = $locale->internalNumber( $minValueValue );
  208. $maxValueValue = $http->postVariable( $maxValueName );
  209. $maxValueValue = str_replace(" ", "", $maxValueValue );
  210. $maxValueValue = $locale->internalNumber( $maxValueValue );
  211. $defaultValueValue = $http->postVariable( $defaultValueName );
  212. $defaultValueValue = str_replace(" ", "", $defaultValueValue );
  213. $defaultValueValue = $locale->internalNumber( $defaultValueValue );
  214. if ( ( $minValueValue == "" ) && ( $maxValueValue == "") ){
  215. return eZInputValidator::STATE_ACCEPTED;
  216. }
  217. else if ( ( $minValueValue == "" ) && ( $maxValueValue !== "") )
  218. {
  219. $max_state = $this->FloatValidator->validate( $maxValueValue );
  220. return $max_state;
  221. }
  222. else if ( ( $minValueValue !== "" ) && ( $maxValueValue == "") )
  223. {
  224. $min_state = $this->FloatValidator->validate( $minValueValue );
  225. return $min_state;
  226. }
  227. else
  228. {
  229. $min_state = $this->FloatValidator->validate( $minValueValue );
  230. $max_state = $this->FloatValidator->validate( $maxValueValue );
  231. if ( ( $min_state == eZInputValidator::STATE_ACCEPTED ) and
  232. ( $max_state == eZInputValidator::STATE_ACCEPTED ) )
  233. {
  234. if ($minValueValue <= $maxValueValue)
  235. return eZInputValidator::STATE_ACCEPTED;
  236. else
  237. {
  238. $state = eZInputValidator::STATE_INTERMEDIATE;
  239. eZDebug::writeNotice( "Integer minimum value great than maximum value." );
  240. return $state;
  241. }
  242. }
  243. }
  244. if ($defaultValueValue == ""){
  245. $default_state = eZInputValidator::STATE_ACCEPTED;
  246. }
  247. else
  248. $default_state = $this->FloatValidator->validate( $defaultValueValue );
  249. }
  250. return eZInputValidator::STATE_INVALID;
  251. }
  252. function fixupClassAttributeHTTPInput( $http, $base, $classAttribute )
  253. {
  254. $minValueName = $base . self::MIN_VARIABLE . $classAttribute->attribute( "id" );
  255. $maxValueName = $base . self::MAX_VARIABLE . $classAttribute->attribute( "id" );
  256. if ( $http->hasPostVariable( $minValueName ) and $http->hasPostVariable( $maxValueName ) )
  257. {
  258. $locale = eZLocale::instance();
  259. $minValueValue = $http->postVariable( $minValueName );
  260. $minValueValue = str_replace(" ", "", $minValueValue );
  261. $minValueValue = $locale->internalNumber( $minValueValue );
  262. $maxValueValue = $http->postVariable( $maxValueName );
  263. $maxValueValue = str_replace(" ", "", $maxValueValue );
  264. $maxValueValue = $locale->internalNumber( $maxValueValue );
  265. if ($minValueValue > $maxValueValue)
  266. {
  267. $this->FloatValidator->setRange( $minValueValue, false );
  268. $maxValueValue = $this->FloatValidator->fixup( $maxValueValue );
  269. $http->setPostVariable( $maxValueName, $maxValueValue );
  270. }
  271. }
  272. }
  273. function storeClassAttribute( $attribute, $version )
  274. {
  275. }
  276. function metaData( $contentObjectAttribute )
  277. {
  278. return (float)$contentObjectAttribute->attribute( "data_float" );
  279. }
  280. /*!
  281. Returns the content.
  282. */
  283. function objectAttributeContent( $contentObjectAttribute )
  284. {
  285. return $contentObjectAttribute->attribute( 'data_float' );
  286. }
  287. /*!
  288. Returns the float value.
  289. */
  290. function title( $contentObjectAttribute, $name = null )
  291. {
  292. return $contentObjectAttribute->attribute( "data_float" );
  293. }
  294. function hasObjectAttributeContent( $contentObjectAttribute )
  295. {
  296. return $contentObjectAttribute->attribute( 'data_float' ) !== null;
  297. }
  298. /*!
  299. \return string representation of an contentobjectattribute data for simplified export
  300. */
  301. function toString( $contentObjectAttribute )
  302. {
  303. return $contentObjectAttribute->attribute( 'data_float' );
  304. }
  305. function fromString( $contentObjectAttribute, $string )
  306. {
  307. return $contentObjectAttribute->setAttribute( 'data_float', $string );
  308. }
  309. function serializeContentClassAttribute( $classAttribute, $attributeNode, $attributeParametersNode )
  310. {
  311. $defaultValue = $classAttribute->attribute( self::DEFAULT_FIELD );
  312. $minValue = $classAttribute->attribute( self::MIN_FIELD );
  313. $maxValue = $classAttribute->attribute( self::MAX_FIELD );
  314. $minMaxState = $classAttribute->attribute( self::INPUT_STATE_FIELD );
  315. $dom = $attributeParametersNode->ownerDocument;
  316. $defaultValueNode = $dom->createElement( 'default-value' );
  317. $defaultValueNode->appendChild( $dom->createTextNode( $defaultValue ) );
  318. $attributeParametersNode->appendChild( $defaultValueNode );
  319. if ( $minMaxState == self::HAS_MIN_VALUE or $minMaxState == self::HAS_MIN_MAX_VALUE )
  320. {
  321. $minValueNode = $dom->createElement( 'min-value' );
  322. $minValueNode->appendChild( $dom->createTextNode( $minValue ) );
  323. $attributeParametersNode->appendChild( $minValueNode );
  324. }
  325. if ( $minMaxState == self::HAS_MAX_VALUE or $minMaxState == self::HAS_MIN_MAX_VALUE )
  326. {
  327. $maxValueNode = $dom->createElement( 'max-value' );
  328. $maxValueNode->appendChild( $dom->createTextNode( $maxValue ) );
  329. $attributeParametersNode->appendChild( $maxValueNode );
  330. }
  331. }
  332. function unserializeContentClassAttribute( $classAttribute, $attributeNode, $attributeParametersNode )
  333. {
  334. $defaultValue = $attributeParametersNode->getElementsByTagName( 'default-value' )->item( 0 )->textContent;
  335. $minValue = $attributeParametersNode->getElementsByTagName( 'min-value' )->item( 0 )->textContent;
  336. $maxValue = $attributeParametersNode->getElementsByTagName( 'max-value' )->item( 0 )->textContent;
  337. if ( strlen( $minValue ) > 0 and strlen( $maxValue ) > 0 )
  338. $minMaxState = self::HAS_MIN_MAX_VALUE;
  339. else if ( strlen( $minValue ) > 0 )
  340. $minMaxState = self::HAS_MIN_VALUE;
  341. else if ( strlen( $maxValue ) > 0 )
  342. $minMaxState = self::HAS_MAX_VALUE;
  343. else
  344. $minMaxState = self::NO_MIN_MAX_VALUE;
  345. $classAttribute->setAttribute( self::DEFAULT_FIELD, $defaultValue );
  346. $classAttribute->setAttribute( self::MIN_FIELD, $minValue );
  347. $classAttribute->setAttribute( self::MAX_FIELD, $maxValue );
  348. $classAttribute->setAttribute( self::INPUT_STATE_FIELD, $minMaxState );
  349. }
  350. function supportsBatchInitializeObjectAttribute()
  351. {
  352. return true;
  353. }
  354. function batchInitializeObjectAttributeData( $classAttribute )
  355. {
  356. $default = $classAttribute->attribute( 'data_float3' );
  357. if ( $default !== 0 )
  358. {
  359. return array( 'data_float' => $default );
  360. }
  361. return array();
  362. }
  363. /// \privatesection
  364. /// The float value validator
  365. public $FloatValidator;
  366. }
  367. eZDataType::register( eZFloatType::DATA_TYPE_STRING, "eZFloatType" );
  368. ?>