View source
<?php
namespace Drupal\message\FormElement;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\message\Entity\MessageTemplate;
class MessageTemplateMultipleTextField {
protected $entity;
protected $callback;
public function __construct(MessageTemplate $entity, $callback, $langcode = '') {
$this->entity = $entity;
$this->callback = $callback;
$this->langcode = $langcode ? $langcode : \Drupal::languageManager()
->getCurrentLanguage()
->getId();
}
public function textField(&$form, FormStateInterface $form_state, $text = []) {
$form['text'] = [
'#type' => 'container',
'#tree' => TRUE,
'#theme' => 'field_multiple_value_form',
'#cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
'#cardinality_multiple' => TRUE,
'#field_name' => 'message_text',
'#title' => t('Message text'),
'#description' => t('Please enter the message text.'),
'#prefix' => '<div id="message-text">',
'#suffix' => '</div>',
];
if (\Drupal::moduleHandler()
->moduleExists('token')) {
$form['token_tree'] = [
'#theme' => 'token_tree_link',
'#token_types' => 'all',
'#show_restricted' => TRUE,
'#theme_wrappers' => [
'form_element',
],
];
}
$form['add_more'] = [
'#type' => 'button',
'#value' => t('Add another item'),
'#href' => '',
'#add_more' => TRUE,
'#ajax' => [
'callback' => $this->callback,
'wrapper' => 'message-text',
],
];
$start_key = 0;
foreach ($this->entity
->get('text') as $item) {
$form['text'][$start_key] = $this
->singleElement($start_key, $item);
$start_key++;
}
$trigger_element = $form_state
->getTriggeringElement();
if (!empty($trigger_element['#add_more']) || !$start_key) {
$form['text'][] = $this
->singleElement($start_key + 1, [
'value' => '',
]);
}
}
protected function singleElement($delta, array $text) {
$element = [
'#type' => 'text_format',
'#format' => isset($text['format']) ? $text['format'] : filter_default_format(),
'#default_value' => $text['value'],
'#rows' => 1,
];
$element['_weight'] = [
'#type' => 'weight',
'#title' => t('Weight for row @number', [
'@number' => $delta + 1,
]),
'#title_display' => 'invisible',
'#delta' => $delta,
'#default_value' => $delta,
];
return $element;
}
}