DatalistWidget.php 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. namespace Tools\View\Widget;
  3. use Cake\Utility\Text;
  4. use Cake\View\Form\ContextInterface;
  5. use Cake\View\Widget\SelectBoxWidget;
  6. /**
  7. * Datalist widget
  8. *
  9. * See /docs for usage.
  10. *
  11. * Additional config:
  12. * - keys: Use as true to use the keys of the select options instead of the values.
  13. * - input: Attributes for input element
  14. */
  15. class DatalistWidget extends SelectBoxWidget
  16. {
  17. /**
  18. * @param array $data
  19. * @param \Cake\View\Form\ContextInterface $context
  20. * @return string|null
  21. */
  22. public function render(array $data, ContextInterface $context)
  23. {
  24. $data += [
  25. 'id' => null,
  26. 'name' => '',
  27. 'empty' => false,
  28. 'escape' => true,
  29. 'options' => [],
  30. 'disabled' => null,
  31. 'val' => null,
  32. 'input' => [],
  33. 'keys' => false,
  34. 'templateVars' => [],
  35. ];
  36. $options = $this->_renderContent($data);
  37. if (!$data['keys']) {
  38. $options = str_replace(
  39. 'value',
  40. 'data-value',
  41. $options
  42. );
  43. }
  44. $name = $data['name'];
  45. $id = $data['id'] ?: Text::slug($name);
  46. $default = isset($data['val']) ? $data['val'] : null;
  47. $inputData = $data['input'] + [
  48. 'id' => $id,
  49. 'name' => $name,
  50. 'autocomplete' => 'off',
  51. ];
  52. unset($data['name'], $data['options'], $data['empty'], $data['val'], $data['escape'], $data['keys'], $data['input'], $data['id']);
  53. if (isset($data['disabled']) && is_array($data['disabled'])) {
  54. unset($data['disabled']);
  55. }
  56. $inputData['value'] = $default;
  57. $inputAttrs = $this->_templates->formatAttributes($inputData);
  58. $datalistAttrs = $this->_templates->formatAttributes($data);
  59. return $this->_templates->format(
  60. 'datalist',
  61. [
  62. 'name' => $name,
  63. 'inputAttrs' => $inputAttrs,
  64. 'datalistAttrs' => $datalistAttrs,
  65. 'content' => implode('', $options),
  66. 'id' => $id,
  67. ]
  68. );
  69. }
  70. }