breezy_utility-1.0.x-dev/src/Element/BreezyUtilityClassSelect.php

src/Element/BreezyUtilityClassSelect.php
<?php

namespace Drupal\breezy_utility\Element;

use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element;
use Drupal\Core\Render\Element\FormElement;

/**
 * Provides a BreezyUtilityClassSelect element.
 *
 * @FormElement("breezy_utility_class_select")
 */
class BreezyUtilityClassSelect extends FormElement {

  /**
   * {@inheritdoc}
   */
  public function getInfo() {
    $class = get_class($this);
    return [
      '#input' => TRUE,
      '#property' => NULL,
      '#multiple' => FALSE,
      '#required' => FALSE,
      '#title_display' => 'invisible',
      '#process' => [
        [$class, 'processBreezyUtilityClassSelect'],
        [$class, 'processAjaxForm'],
      ],
      '#pre_render' => [
        [$class, 'preRenderBreezyUtilityClassSelect'],
      ],
      '#theme_wrappers' => ['form_element'],
    ];
  }

  /**
   * {@inheritdoc}
   */
  public static function valueCallback(&$element, $input, FormStateInterface $form_state) {
    if ($input === FALSE) {
      if (isset($element['#default_value'])) {
        $default_value = $element['#default_value'];
        return $default_value;
      }
      else {
        return '';
      }
    }
    elseif (!empty($input['value'])) {
      return $input['value'];
    }
    else {
      return '';
    }
  }

  /**
   * Process a breezy_utility_class_select element.
   *
   * @param array $element
   *   The element array.
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The form state object.
   */
  public static function processBreezyUtilityClassSelect(array &$element, FormStateInterface $form_state) {

    if (isset($element['#property'])) {

      $property = $element['#property'];
      /** @var \Drupal\breezy_utility\BreezyUtilityClassServiceInterface $class_service */
      $class_service = \Drupal::service('breezy_utility.utility_classes');
      $options = $class_service->getClassOptions($property);

      $default_value = $element['#default_value'] ?? '';

      $element['value'] = [
        '#type' => 'select',
        '#multiple' => FALSE,
        '#empty_option' => t('-- Select --'),
        '#options' => $options,
        '#required' => $element['required'] ?? FALSE,
        '#default_value' => $default_value,
        '#property' => $property,
      ];

    }

    // Add validate callback.
    $element += ['#element_validate' => []];
    array_unshift($element['#element_validate'], [get_called_class(), 'validateBreezyUtilityClassSelectValue']);

    return $element;
  }

  /**
   * Prepares a BreezyUtilityClassSelect element.
   *
   * @param array $element
   *   The element array.
   *
   * @return array
   *   The element array.
   */
  public static function preRenderBreezyUtilityClassSelect(array $element) : array {
    Element::setAttributes($element, [
      '#id' => 'id',
      '#name' => 'breezy',
      '#size' => 'size',
    ]);
    static::setAttributes($element, ['form-select']);
    return $element;
  }

  /**
   * Validates a BreezyUtilityClassSelect element.
   *
   * @param array $element
   *   The element array.
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The form state object.
   * @param array $complete_form
   *   The complete form array.
   */
  public static function validateBreezyUtilityClassSelectValue(array &$element, FormStateInterface $form_state, array &$complete_form) {
    $value = NestedArray::getValue($form_state->getValues(), $element['#parents']);
    if (empty($value['value'])) {
      // @todo Add error.
    }

    $form_state->setValueForElement($element['value'], NULL);

    $element['#value'] = $value['value'];
    $form_state->setValueForElement($element, $value['value']);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc