improvements-2.x-dev/src/Plugin/Field/FieldWidget/MultipleStringTextfield.php
src/Plugin/Field/FieldWidget/MultipleStringTextfield.php
<?php
namespace Drupal\improvements\Plugin\Field\FieldWidget;
use Drupal\Core\Field\Attribute\FieldWidget;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\Field\WidgetBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
#[FieldWidget(
id: 'multiple_string_textfield',
label: new TranslatableMarkup('Textfield (values by a comma)'),
field_types: ['string'],
multiple_values: TRUE,
)]
class MultipleStringTextfield extends WidgetBase {
/**
* {@inheritdoc}
*/
public static function defaultSettings(): array {
return [
'separator' => ', ',
] + parent::defaultSettings();
}
/**
* {@inheritdoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state): array {
$element = parent::settingsForm($form, $form_state);
$element['separator'] = [
'#type' => 'textfield',
'#title' => t('Separator'),
'#default_value' => $this->getSetting('separator'),
];
return $element;
}
/**
* {@inheritdoc}
*/
public function settingsSummary(): array {
return [
$this->t('Separator') . ': ' . $this->getSetting('separator'),
];
}
/**
* {@inheritdoc}
*/
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state): array {
$values = array_map(function (FieldItemInterface $item) {
return $item->value;
}, iterator_to_array($items));
$element['value'] = $element + [
'#type' => 'textfield',
'#default_value' => implode($this->getSetting('separator'), $values),
];
return $element;
}
/**
* {@inheritdoc}
*/
public function massageFormValues(array $values, array $form, FormStateInterface $form_state): array {
$new_values = [];
foreach (explode($this->getSetting('separator'), $values['value']) as $value) {
$value = trim($value);
if ($value !== '') {
$new_values[] = ['value' => $value];
}
}
return $new_values;
}
/**
* {@inheritDoc}
*/
public static function isApplicable(FieldDefinitionInterface $field_definition): bool {
$cardinality = $field_definition->getFieldStorageDefinition()->getCardinality();
return $cardinality > 1 || $cardinality == FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED;
}
}
