layoutcomponents-8.x-1.14-beta2/modules/sliderwidget/src/Plugin/Field/FieldWidget/SliderUIFieldWidget.php

modules/sliderwidget/src/Plugin/Field/FieldWidget/SliderUIFieldWidget.php
<?php

namespace Drupal\sliderwidget\Plugin\Field\FieldWidget;

use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\WidgetBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Field\FieldFilteredMarkup;
use Drupal\Component\Utility\Html;

/**
 * Plugin implementation of the 'sliderwidget_widget' widget.
 *
 * @FieldWidget(
 *   id = "sliderwidget_widget",
 *   label = @Translation("Slider ui field widget"),
 *   field_types = {
 *     "integer",
 *     "range_integer",
 *   }
 * )
 */
class SliderUIFieldWidget extends WidgetBase {

  /**
   * {@inheritdoc}
   */
  public static function defaultSettings() {
    return [
      'sliderwidget_settings' => [
        'animate' => FALSE,
        'orientation' => 'horizontal',
        'range' => FALSE,
        'step' => 1,
        'slider_style' => NULL,
        'display_values' => TRUE,
        'multi_value' => FALSE,
        'display_values_format' => '%{value}%',
        'display_bubble' => FALSE,
        'display_bubble_format' => '%{value}%',
        'slider_length' => NULL,
        'hide_inputs' => TRUE,
        'hide_slider_handle_when_no_value' => FALSE,
      ],
    ] + parent::defaultSettings();
  }

  /**
   * {@inheritdoc}
   */
  public function settingsForm(array $form, FormStateInterface $form_state) {
    $elements = [];
    $settings = $this->getSettings();

    $elements['sliderwidget_settings'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Slider Settings'),
      '#collapsible' => TRUE,
      '#collapsed' => FALSE,
      '#weight' => 0,
    ];

    $elements['sliderwidget_settings']['animate'] = [
      '#type' => 'select',
      '#title' => $this->t('Animate'),
      '#options' => [
        FALSE => $this->t('Disable'),
        TRUE => $this->t('Default'),
        'fast' => $this->t('Fast'),
        'slow' => $this->t('Slow'),
        'custom' => $this->t('Custom'),
      ],
      '#default_value' => $settings['sliderwidget_settings']['animate'],
    ];

    $elements['sliderwidget_settings']['orientation'] = [
      '#type' => 'select',
      '#title' => $this->t('Orientation'),
      '#options' => [
        'horizontal' => $this->t('Horizontal'),
        'vertical' => $this->t('Vertical'),
      ],
      '#require' => TRUE,
      '#description' => $this->t('Determines whether the slider handles move horizontally (min on left, max on right) or vertically (min on bottom, max on top).'),
      '#default_value' => $settings['sliderwidget_settings']['orientation'],
    ];

    $elements['sliderwidget_settings']['range'] = [
      '#type' => 'select',
      '#title' => $this->t('Range'),
      '#options' => [
        FALSE => $this->t('Disable'),
        'min' => $this->t('Minimum'),
        'max' => $this->t('Maximum'),
      ],
      '#description' => $this->t('Whether the slider represents a range.'),
      '#default_value' => $settings['sliderwidget_settings']['range'],
    ];

    $elements['sliderwidget_settings']['step'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Step'),
      '#size' => 5,
      '#description' => $this->t('Determines the size or amount of each interval or step the slider takes between the min and max. The full specified value range of the slider (max - min) should be evenly divisible by the step.'),
      '#required' => TRUE,
      '#element_validate' => [$this, 'sliderwidgetValidatePositiveNumber'],
      '#default_value' => $settings['sliderwidget_settings']['step'],
    ];

    $elements['sliderwidget_settings']['slider_style'] = [
      '#type' => 'select',
      '#title' => $this->t('Style'),
      '#options' => $this->sliderwidgetStyles(),
      '#description' => $this->t('Some default color styles for ease of use'),
      '#default_value' => $settings['sliderwidget_settings']['slider_style'],
    ];

    $elements['sliderwidget_settings']['display_values'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Display Values'),
      '#description' => $this->t('If enabled display the current values of slider as simple text.'),
      '#default_value' => $settings['sliderwidget_settings']['display_values'],
    ];

    $display_values_format = $settings['sliderwidget_settings']['display_values_format'];
    $display_values_format = !isset($display_values_format) ? '%{value}%' : $display_values_format;
    $elements['sliderwidget_settings']['display_values_format'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Display Values Format'),
      '#size' => 15,
      '#description' => $this->t('Format of the displaied values, The usage is mostly for showing $,% or other signs near the value. Use %{value}% as slider value'),
      '#default_value' => $display_values_format,
    ];

    $display_bubble = $settings['sliderwidget_settings']['display_bubble'];
    $display_bubble = !isset($display_bubble) ? '%{value}%' : $display_bubble;
    $elements['sliderwidget_settings']['display_bubble'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Display bubble/hint'),
      '#description' => $this->t('Display a hint/bubble near each slider handle showing the value of that handle.'),
      '#default_value' => $display_bubble,
    ];

    $display_bubble_format = $settings['sliderwidget_settings']['display_bubble_format'];
    $display_bubble_format = !isset($display_bubble_format) ? '%{value}%' : $display_bubble_format;
    $elements['sliderwidget_settings']['display_bubble_format'] = [
      '#type' => 'textfield',
      '#size' => 15,
      '#title' => $this->t('Display bubble/hint format'),
      '#description' => $this->t('Format of the displaied values in bubble/hint, The usage is mostly for showing $,% or other signs near the value. Use %{value}% as slider value. For range slider it can have two values separated by || like "$%{value}%MIN||$%{value}%MAX"'),
      '#default_value' => $display_bubble_format,
    ];

    $elements['sliderwidget_settings']['slider_length'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Slider Length'),
      '#size' => 5,
      '#description' => $this->t('Acceptable types are the same as css width and height (100px) and it will be used as width or height depending on #orientation'),
      '#default_value' => $settings['sliderwidget_settings']['slider_length'],
    ];

    $elements['sliderwidget_settings']['hide_inputs'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Hide Input Textfields'),
      '#description' => $this->t('If enabled displays only the slider and hides input textfields.'),
      '#default_value' => $settings['sliderwidget_settings']['hide_inputs'],
    ];

    $elements['sliderwidget_settings']['hide_slider_handle_when_no_value'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Hide slider handle when there is no value'),
      '#description' => $this->t("When the slider does not have any value by enabling this option it won't show the the slider handle unless user clicks on the slider to select a value."),
      '#default_value' => $settings['sliderwidget_settings']['hide_slider_handle_when_no_value'],
    ];

    return $elements;
  }

  /**
   * Helper function return available styles for slider.
   */
  protected function sliderwidgetStyles() {
    $items = [
      '' => $this->t('Default'),
      'red' => $this->t('Red'),
      'green' => $this->t('Green'),
      'blue' => $this->t('Blue'),
      'orange' => $this->t('Orange'),
      'purple' => $this->t('Purple'),
      'steel-blue' => $this->t('Steel Blue'),
      'tiger-orange' => $this->t('Tiger Orange'),
      'wild-blue-yonder' => $this->t('Wild Blue Yonder'),
      'cinereous' => $this->t('Cinereous'),
      'laurel-green' => $this->t('Laurel Green'),
    ];

    return $items;
  }

  /**
   * Validate slider steps to be positive.
   *
   * @param array $element
   *   Form element.
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   Form state.
   */
  public function sliderwidgetValidatePositiveNumber(array $element, FormStateInterface $form_state) {
    $value = $form_state->getValue($element['#parents']);
    if (!is_numeric($value) && !is_float($value) && !empty($value)) {
      $form_state->setError($element, $this->t('The value should be a valid number'));
    }
    elseif ($value < 0) {
      $form_state->setError($element, $this->t('The value should be a valid positive number'));
    }
  }

  /**
   * {@inheritdoc}
   */
  public function settingsSummary() {
    $settings = $this->getSettings();
    $summary = [];
    $summary[] = $this->t('Textfield orientation: @orientation', ['@orientation' => $settings['sliderwidget_settings']['orientation']]);
    $summary[] = $this->t('Steps: @step', ['@step' => $settings['sliderwidget_settings']['step']]);
    return $summary;
  }

  /**
   * {@inheritdoc}
   */
  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
    $field_settings = $this->getFieldSettings();

    // Set minimum and maximum.
    if (is_numeric($field_settings['min'])) {
      $element['#min'] = $field_settings['min'];
    }
    if (is_numeric($field_settings['max'])) {
      $element['#max'] = $field_settings['max'];
    }

    // Add prefix and suffix.
    if (!empty($field_settings['prefix'])) {
      $prefixes = explode('|', $field_settings['prefix']);
      $element['#field_prefix'] = FieldFilteredMarkup::create(array_pop($prefixes));
    }
    if (!empty($field_settings['suffix'])) {
      $suffixes = explode('|', $field_settings['suffix']);
      $element['#field_suffix'] = FieldFilteredMarkup::create(array_pop($suffixes));
    }

    $settings = $this->getSettings()['sliderwidget_settings'];
    $value = NULL;
    if (!empty($items) && isset($items[$delta]) && isset($items[$delta]->value)) {
      $value = $items[$delta]->value;
    }
    else {
      $value = $field_settings['min'];
    }
    if (!isset($settings['display_values_format'])) {
      $settings['display_values_format'] = '%{value}%';
    }
    if (!isset($settings['display_bubble'])) {
      $settings['display_bubble'] = FALSE;
    }
    if (!isset($settings['display_bubble_format'])) {
      $settings['display_bubble_format'] = '%{value}%';
    }

    $element += [
      '#default_value' => $value,
      '#type' => 'slider',
      '#input_title' => NULL,
      '#animate' => isset($settings['animate']) ? $settings['animate'] : 'fast',
      '#adjust_field_min' => isset($settings['adjust_field_min']) ? '.' . Html::cleanCssIdentifier('sliderwidget-field-adjust-' . $settings['adjust_field_min']) : '',
      '#adjust_field_max' => isset($settings['adjust_field_max']) ? '.' . Html::cleanCssIdentifier('sliderwidget-field-adjust-' . $settings['adjust_field_max']) : '',
      '#disabled' => (isset($element['#disabled'])) ? $element['#disabled'] : FALSE,
      '#orientation' => $settings['orientation'],
      '#range' => $settings['range'],
      '#step' => $settings['step'],
      '#slider_style' => $settings['slider_style'],
      '#size' => 3,
      '#display_inputs' => !$settings['hide_inputs'],
      '#multi_value' => FALSE,
      '#display_values' => $settings['display_values'],
      '#display_values_format' => $settings['display_values_format'],
      '#slider_length' => $settings['slider_length'],
      '#display_inside_fieldset' => FALSE,
      '#validate_range' => FALSE,
      '#display_bubble' => $settings['display_bubble'],
      '#display_bubble_format' => $settings['display_bubble_format'],
      '#hide_slider_handle_when_no_value' => $settings['hide_slider_handle_when_no_value'],
      '#fields_to_sync_css_selector' => @$settings['fields_to_sync_css_selector'],
    ];

    $multi_range_fields = ['range_integer'];
    $type = $this->fieldDefinition->getType();
    $name = $this->fieldDefinition->getName();

    if (in_array($type, $multi_range_fields)) {
      $from = isset($items[$delta]->from) ? $items[$delta]->from : 0;
      $to = isset($items[$delta]->to) ? $items[$delta]->to : 0;
      $element['#multi_value'] = TRUE;
      $element['#values'] = [$from, $to];
      $element['#range'] = TRUE;
      $element['#fields_to_sync_css_selector'] = [
        '[name="' . $name . '[' . $delta . '][from]"]',
        '[name="' . $name . '[' . $delta . '][to]"]',
      ];
      $range_from = [
        '#title' => $this->t('From'),
        '#default_value' => $from,
        '#type' => 'hidden',
      ] + $element;

      $range_to = [
        '#title' => $this->t('To'),
        '#default_value' => $to,
        '#type' => 'hidden',
      ] + $element;

      return [
        'value' => $element,
        'from' => $range_from,
        'to' => $range_to,
      ];
    }

    return [
      'value' => $element,
    ];
  }

}

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

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