v1.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <?php
  2. namespace zin;
  3. require_once dirname(__DIR__) . DS . 'formgroup' . DS . 'v1.php';
  4. require_once dirname(__DIR__) . DS . 'inputgroup' . DS . 'v1.php';
  5. require_once dirname(__DIR__) . DS . 'picker' . DS . 'v1.php';
  6. require_once dirname(__DIR__) . DS . 'input' . DS . 'v1.php';
  7. class sqlBuilderControl extends wg
  8. {
  9. /**
  10. * @var mixed[]
  11. */
  12. protected static $defineProps = array(
  13. "type?: string", // 控件类型。
  14. "class?: string",
  15. "name?: string", // 控件名。
  16. "label?: string", // 控件标签。
  17. "items?: array", // 控件下拉选项,仅type=picker时有效。
  18. "value?: string", // 控件值。
  19. 'required?: bool=false', // 控件是否可清空,仅type=picker时有效。
  20. 'multiple?: bool=false', // 控件是否多选,仅type=picker时有效。
  21. "placeholder?: string", // 提示文本。
  22. 'labelWidth?: string="80px"', // 标签宽度。
  23. 'labelAlign?: string="center"', // 标签对齐方式。
  24. 'width?: string="60"', // 控件宽度。
  25. "suffix?: string", // 后缀内容。
  26. 'onChange?: function',
  27. "error?: bool=false", // 是否存在错误。
  28. 'errorText?: string' // 错误提示。
  29. );
  30. public static function getPageCSS()
  31. {
  32. return file_get_contents(__DIR__ . DS . 'css' . DS . 'v1.css');
  33. }
  34. /**
  35. * 构建控件。
  36. * Build control.
  37. *
  38. * @access protected
  39. * @return node|null
  40. */
  41. protected function buildControl()
  42. {
  43. list($type, $name, $items, $value, $required, $multiple, $placeholder, $onChange, $error) = $this->prop(array('type', 'name', 'items', 'value', 'required', 'multiple', 'placeholder', 'onChange', 'error'));
  44. if($type == 'picker')
  45. {
  46. if(is_array($items))
  47. {
  48. if(is_string($value) && !isset($items[$value])) $value = null;
  49. if(is_array($value))
  50. {
  51. foreach($value as $currentIndex => $currentValue)
  52. {
  53. if(!isset($items[$currentValue])) unset($value[$currentIndex]);
  54. }
  55. }
  56. }
  57. return picker
  58. (
  59. setID("builderPicker_$name"),
  60. setClass('builder-picker', array('has-error' => $error)),
  61. set::name($name),
  62. set::items($items),
  63. set::placeholder($placeholder),
  64. set::disabled(empty($items)),
  65. set::required($required),
  66. set::multiple($multiple),
  67. on::change()->do($onChange),
  68. !empty($value) ? set::value($value) : null
  69. );
  70. }
  71. if($type == 'input') return input
  72. (
  73. setID("builderInput_$name"),
  74. setClass('builder-input', array('has-error' => $error)),
  75. set::name($name),
  76. set::placeholder($placeholder),
  77. on::change()->do($onChange),
  78. set::value($value)
  79. );
  80. if($type == 'date') return datePicker
  81. (
  82. setID("builderDate$name"),
  83. setClass('builder-date', array('has-error' => $error)),
  84. set::name($name),
  85. set::placeholder($placeholder),
  86. on::change()->do($onChange),
  87. set::value($value)
  88. );
  89. if($type == 'datetime') return datetimePicker
  90. (
  91. setID("builderDatetime$name"),
  92. setClass('builder-datetime', array('has-error' => $error)),
  93. set::name($name),
  94. set::placeholder($placeholder),
  95. on::change()->do($onChange),
  96. set::value($value)
  97. );
  98. return null;
  99. }
  100. protected function build()
  101. {
  102. global $lang;
  103. list($class, $label, $labelWidth, $labelAlign, $width, $suffix, $error, $errorText) = $this->prop(array('class', 'label', 'labelWidth', 'labelAlign', 'width', 'suffix', 'error', 'errorText'));
  104. $padding = $labelAlign == 'center' ? 1 : 3;
  105. return formGroup
  106. (
  107. setClass($class),
  108. set::label($label),
  109. set::labelWidth($labelWidth),
  110. set::labelClass('bg-gray-100 ring ring-border-strong', "justify-$labelAlign-important px-{$padding}-important" ),
  111. set::width($width),
  112. inputGroup
  113. (
  114. setClass('flex col'),
  115. div
  116. (
  117. setClass('flex row'),
  118. $this->buildControl(),
  119. !empty($suffix) ? label($suffix) : null
  120. ),
  121. span
  122. (
  123. setClass('text-danger', array('hidden' => !$error)),
  124. empty($errorText) ? $lang->bi->emptyError : $errorText
  125. )
  126. )
  127. );
  128. }
  129. }