3 namespace Drupal\text\Plugin\Field\FieldWidget;
5 use Drupal\Core\Form\FormStateInterface;
6 use Symfony\Component\Validator\ConstraintViolationInterface;
7 use Drupal\Core\Field\FieldItemListInterface;
10 * Plugin implementation of the 'text_textarea_with_summary' widget.
13 * id = "text_textarea_with_summary",
14 * label = @Translation("Text area with a summary"),
20 class TextareaWithSummaryWidget extends TextareaWidget {
25 public static function defaultSettings() {
28 'summary_rows' => '3',
30 ] + parent::defaultSettings();
36 public function settingsForm(array $form, FormStateInterface $form_state) {
37 $element = parent::settingsForm($form, $form_state);
38 $element['summary_rows'] = [
40 '#title' => t('Summary rows'),
41 '#default_value' => $this->getSetting('summary_rows'),
42 '#description' => $element['rows']['#description'],
52 public function settingsSummary() {
53 $summary = parent::settingsSummary();
55 $summary[] = t('Number of summary rows: @rows', ['@rows' => $this->getSetting('summary_rows')]);
63 public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
64 $element = parent::formElement($items, $delta, $element, $form, $form_state);
66 $display_summary = $items[$delta]->summary || $this->getFieldSetting('display_summary');
67 $element['summary'] = [
68 '#type' => $display_summary ? 'textarea' : 'value',
69 '#default_value' => $items[$delta]->summary,
70 '#title' => t('Summary'),
71 '#rows' => $this->getSetting('summary_rows'),
72 '#description' => t('Leave blank to use trimmed value of full text as the summary.'),
74 'library' => ['text/drupal.text'],
76 '#attributes' => ['class' => ['js-text-summary', 'text-summary']],
77 '#prefix' => '<div class="js-text-summary-wrapper text-summary-wrapper">',
78 '#suffix' => '</div>',
88 public function errorElement(array $element, ConstraintViolationInterface $violation, array $form, FormStateInterface $form_state) {
89 $element = parent::errorElement($element, $violation, $form, $form_state);
90 if ($element === FALSE) {
93 elseif (isset($violation->arrayPropertyPath[0])) {
94 return $element[$violation->arrayPropertyPath[0]];