CheckboxTree.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <?php
  2. namespace Drupal\term_reference_tree\Element;
  3. use Drupal\Core\Form\FormStateInterface;
  4. use Drupal\Core\Render\Element\CompositeFormElementTrait;
  5. use Drupal\Core\Render\Element\FormElement;
  6. /**
  7. * Provides a form element for term reference tree.
  8. *
  9. * @FormElement("checkbox_tree")
  10. */
  11. class CheckboxTree extends FormElement {
  12. use CompositeFormElementTrait;
  13. /**
  14. * {@inheritdoc}
  15. */
  16. public function getInfo() {
  17. $class = get_class($this);
  18. return [
  19. '#input' => TRUE,
  20. '#tree' => TRUE,
  21. '#process' => [
  22. [$class, 'processCheckboxTree'],
  23. ],
  24. '#pre_render' => [
  25. [$class, 'preRenderCompositeFormElement'],
  26. ],
  27. '#default_value' => [],
  28. '#attached' => [
  29. 'library' => [
  30. 'term_reference_tree/term_reference_tree_js',
  31. 'term_reference_tree/term_reference_tree_css',
  32. ],
  33. ],
  34. '#theme' => 'checkbox_tree',
  35. ];
  36. }
  37. /**
  38. * Processes a checkboxes form element.
  39. */
  40. public static function processCheckboxTree(&$element, FormStateInterface $form_state, &$complete_form) {
  41. $value = is_array($element['#value']) ? $element['#value'] : [];
  42. $allowed = [];
  43. $filter = FALSE;
  44. if (!empty($element['#max_choices']) && $element['#max_choices'] != '-1') {
  45. $element['#attached']['drupalSettings'] = [
  46. 'term_reference_tree' => [
  47. 'trees' => [
  48. $element['#id'] => [
  49. 'max_choices' => $element['#max_choices'],
  50. ],
  51. ],
  52. ],
  53. ];
  54. }
  55. if (!empty($element['#allowed'])) {
  56. $allowed = $element['#allowed'];
  57. $filter = TRUE;
  58. }
  59. if (empty($element['#options'])) {
  60. $options_tree = [];
  61. foreach ($element['#vocabularies'] as $vocabulary) {
  62. $options = _term_reference_tree_get_term_hierarchy(0, $vocabulary->id(), $allowed, $filter, '', $value);
  63. $options_tree = array_merge($options_tree, $options);
  64. }
  65. $element['#options_tree'] = $options_tree;
  66. $element['#options'] = _term_reference_tree_get_options($element['#options_tree'], $allowed, $filter);
  67. }
  68. $terms = !empty($element['#options_tree']) ? $element['#options_tree'] : [];
  69. $tree = new \stdClass();
  70. $tree->children = $terms;
  71. unset($element['#needs_validation']);
  72. $element[] = _term_reference_tree_build_level($element, $tree, $form_state, $value, $element['#max_choices'], [], 1);
  73. return $element;
  74. }
  75. /**
  76. * {@inheritdoc}
  77. */
  78. public static function valueCallback(&$element, $input, FormStateInterface $form_state) {
  79. $value = [];
  80. $element += ['#default_value' => []];
  81. foreach ($element['#default_value'] as $key) {
  82. if (isset($key['target_id'])) {
  83. $value[$key['target_id']] = $key['target_id'];
  84. }
  85. }
  86. return $value;
  87. }
  88. }