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');
}
}
