paragraphs_tools-8.x-1.0-beta5/paragraphs_tools_choose_one/paragraphs_tools_choose_one.module

paragraphs_tools_choose_one/paragraphs_tools_choose_one.module
<?php

use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\WidgetInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\paragraphs\Plugin\Field\FieldWidget\ParagraphsWidget;

/**
 * Implements hook_field_widget_multivalue_form_alter().
 *
 * @see \Drupal\Core\Field\WidgetBase::form
 * @see \Drupal\paragraphs\Plugin\Field\FieldWidget\ParagraphsWidget::formMultipleElements
 */
function paragraphs_tools_choose_one_field_widget_multivalue_form_alter(array &$elements, FormStateInterface $form_state, array $context) {
  /** @var \Drupal\Core\Field\WidgetInterface $widget */
  $widget = $context['widget'];

  // Only do this on single-valued paragraph field.
  if (!$widget instanceof ParagraphsWidget) {
    return;
  }
  if ($elements['#cardinality'] != 1) {
    return;
  }
  if (!$widget->getThirdPartySetting('paragraphs_tools_choose_one', 'enable')) {
    return;
  }

  // "Add-more" means the field is empty.
  if (isset($elements['add_more']['add_more_select']) && isset($elements['add_more']['add_more_button'])) {

    $addMoreSelect =& $elements['add_more']['add_more_select'];
    $options = $addMoreSelect['#options'];
    if (count($options) > 1) {
      $addMoreSelect['#type'] = 'radios';
      unset($addMoreSelect['#title']);
    }
    else {
      $addMoreSelect['#type'] = 'checkbox';
      $addMoreSelect['#return_value'] = key($options);
      $addMoreSelect['#title'] = reset($options);
      unset($addMoreSelect['#options']);
    }

    // Add ajax to options element.
    $elements['add_more']['add_more_select']['#ajax'] = $elements['add_more']['add_more_button']['#ajax'];
    $elements['add_more']['add_more_select']['#ajax']['trigger_as']['name'] = $elements['add_more']['add_more_button']['#name'];
    // Also hide submit button.
    if (!isset($elements['add_more']['add_more_button']['#attributes']['class'])) {
      $elements['add_more']['add_more_button']['#attributes']['class'] = [];
    }
    $elements['add_more']['add_more_button']['#attributes']['class'][] = 'js-hide';

  }
}

/**
 * Implements hook_field_widget_third_party_settings_form().
 */
function paragraphs_tools_choose_one_field_widget_third_party_settings_form(WidgetInterface $plugin, FieldDefinitionInterface $fieldDefinition, $form_mode, $form, FormStateInterface $form_state) {
  $element = [];
  if ($plugin->getPluginId() === 'paragraphs' && !$fieldDefinition->getFieldStorageDefinition()->isMultiple()) {
    $element['#type'] = 'fieldset';
    $element['#title'] = t('Paragraphs Tools: Choose One');
    $element['enable'] = [
      '#type' => 'checkbox',
      '#title' => t('Add paragraphs via options instead of select list'),
      '#description' => t('Adding paragraphs via select list must be added for this, otherwise this setting will have no effect.'),
      '#default_value' => $plugin->getThirdPartySetting('paragraphs_tools_choose_one', 'enable'),
    ];
  }
  return $element;
}

/**
 * Implements hook_field_widget_settings_summary_alter().
 */
function paragraphs_tools_choose_one_field_widget_settings_summary_alter(&$summary, $context) {
  /** @var \Drupal\Core\Field\WidgetInterface $widget */
  $widget = $context['widget'];
  if ($widget->getThirdPartySetting('paragraphs_tools_choose_one', 'enable')) {
    $summary[] = t('Add paragraphs via options instead of select list');
  }
}

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

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