/type/Int.class.php

https://github.com/stvvt/ef · PHP · 159 lines · 113 code · 16 blank · 30 comment · 0 complexity · a4ea252b884219309d4b61db996ac60b MD5 · raw file

  1. <?php
  2. /**
  3. * Кой символ да използваме за разделител на хилядите?
  4. */
  5. defIfNot('EF_NUMBER_THOUSANDS_SEP', ' ');
  6. /**
  7. * Клас 'type_Int' - Тип за цели числа
  8. *
  9. *
  10. * @category ef
  11. * @package type
  12. * @author Milen Georgiev <milen@download.bg>
  13. * @copyright 2006 - 2012 Experta OOD
  14. * @license GPL 3
  15. * @since v 0.1
  16. * @link
  17. */
  18. class type_Int extends core_Type {
  19. /**
  20. * MySQL тип на полето в базата данни
  21. */
  22. var $dbFieldType = 'int';
  23. /**
  24. * Дължина на полето в mySql таблица
  25. */
  26. var $dbFieldLen = '11';
  27. /**
  28. * Стойност по подразбиране
  29. */
  30. var $defaultValue = 0;
  31. /**
  32. * Атрибути на елемента "<TD>" когато в него се записва стойност от този тип
  33. */
  34. var $cellAttr = 'align="right"';
  35. /**
  36. * Конвертира от вербална стойност
  37. */
  38. function fromVerbal_($val)
  39. {
  40. $originalVal = $val;
  41. $from = array(',', EF_TYPE_DOUBLE_DEC_POINT, ' ', "'", EF_TYPE_DOUBLE_THOUSANDS_SEP);
  42. $to = array('.', '.', '', '', '');
  43. $val = str_replace($from, $to, trim($val));
  44. if($val === '') return NULL;
  45. // Превръщаме 16-тичните числа в десетични
  46. //$val = trim(preg_replace('/[^0123456789]{0,1}0x([a-fA-F0-9]*)/e', "substr('\\0',0,1).hexdec('\\0')", ' '.$val));
  47. // Ако имаме букви или др. непозволени символи - връщаме грешка
  48. if(preg_replace('`([^+\-*=/\(\)\d\^<>&|\.]*)`', '', $val) != $val) {
  49. $this->error = "Недопустими символи в число/израз";
  50. return FALSE;
  51. }
  52. if(empty($val)) $val = '0';
  53. $code = "\$val = $val;";
  54. if(@eval('return TRUE;' . $code)) {
  55. eval($code);
  56. return (int) $val;
  57. } else {
  58. $this->error = "Грешка при превръщане на |*<b>'" . parent::escape($originalVal) . "'</b> |в число";
  59. return FALSE;
  60. }
  61. }
  62. /**
  63. * Връща атрибутите на MySQL полето
  64. */
  65. function getMysqlAttr()
  66. {
  67. $size = $this->params['size'] ? $this->params['size'] : $this->params[0] ;
  68. if(!$size || $size <= 11) {
  69. $this->dbFieldType = "INT";
  70. } else {
  71. $this->dbFieldType = "BIGINT";
  72. }
  73. if(isset($this->params['min']) && $this->params['min'] >= 0) {
  74. $this->params['unsigned'] = 'unsigned';
  75. }
  76. return parent::getMysqlAttr();
  77. }
  78. /**
  79. * Рендира HTML инпут поле
  80. */
  81. function renderInput_($name, $value = '', &$attr = array())
  82. {
  83. setIfNot($attr['size'],
  84. $this->params[0],
  85. $this->params['size'],
  86. Mode::is('screenMode', 'narrow') ? 10 : 20
  87. );
  88. setIfNot($attr['maxlen'], 16);
  89. // В мобилен режим слагаме тип = number, за да форсираме цифрова клавиатура
  90. if(Mode::is('screenMode', 'narrow') && empty($attr['type'])) {
  91. $attr['type'] = 'number';
  92. }
  93. $tpl = $this->createInput($name, $value, $attr);
  94. return $tpl;
  95. }
  96. /**
  97. * Форматира числото в удобна за четене форма
  98. */
  99. function toVerbal_($value)
  100. {
  101. if(!isset($value)) return NULL;
  102. $thousandsSep = EF_NUMBER_THOUSANDS_SEP;
  103. if(strlen($value) > 4) {
  104. $value = number_format($value, 0, '', $thousandsSep);
  105. }
  106. return str_replace(' ', '&nbsp;', $value);
  107. }
  108. /**
  109. * Връща стойността по подразбиране за съответния тип
  110. */
  111. function defVal()
  112. {
  113. return 0;
  114. }
  115. }