bricks-2.x-dev/modules/bricks_paragraphs/src/Plugin/Field/FieldWidget/BricksTreeParagraphsWidget.php
modules/bricks_paragraphs/src/Plugin/Field/FieldWidget/BricksTreeParagraphsWidget.php
<?php
namespace Drupal\bricks_paragraphs\Plugin\Field\FieldWidget;
use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\paragraphs\Plugin\Field\FieldWidget\ParagraphsWidget;
/**
* Bricks widget based on the stable paragraphs widget, for use with paragraphs.
*
* @FieldWidget(
* id = "bricks_tree_paragraphs",
* label = @Translation("Bricks tree (paragraphs)"),
* description = @Translation("Bricks widget based on the stable paragraphs widget."),
* field_types = {
* "bricks",
* "bricks_revisioned"
* },
* multiple_values = false
* )
*/
class BricksTreeParagraphsWidget extends ParagraphsWidget {
/**
* {@inheritdoc}
*/
public function form(FieldItemListInterface $items, array &$form, FormStateInterface $form_state, $get_delta = NULL) {
$widget = parent::form($items, $form, $form_state, $get_delta);
// This lets us pull in the widget CSS from paragraphs module.
$widget['#attributes']['class'][] = 'field--widget-paragraphs';
return $widget;
}
/**
* {@inheritdoc}
*/
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$element = parent::formElement($items, $delta, $element, $form, $form_state);
$widget_state = static::getWidgetState($element['#field_parents'], $this->fieldDefinition->getName(), $form_state);
$entity = $widget_state['paragraphs'][$delta]['entity'];
$item = $items[$delta];
// ::duplicateSubmit sets up depth for duplicated entities. $item is an empty
// item added in parent::formMultipleElements() with $items->appendItem().
if ($entity?->isNew() && isset($widget_state['paragraphs'][$delta]['depth'])) {
$item->depth = $widget_state['paragraphs'][$delta]['depth'];
}
_bricks_form_element_alter($element, $item, $entity);
// Restore keyboard/screenreader accessibility for the depth field.
$element['depth']['#type'] = 'textfield';
$element['depth']['#size'] = 3;
return $element;
}
public static function duplicateSubmit(array $form, FormStateInterface $form_state) {
parent::duplicateSubmit($form, $form_state);
// All this is copied from the parent.
$button = $form_state->getTriggeringElement();
$element = NestedArray::getValue($form, array_slice($button['#array_parents'], 0, -5));
$field_name = $element['#field_name'];
$parents = $element['#field_parents'];
$widget_state = static::getWidgetState($parents, $field_name, $form_state);
$delta = array_search($button['#delta'], $widget_state['original_deltas']);
// The parent appended the duplicate paragraph to the end of the
// paragraphs list in widget state. Copy the depth of the original.
// This single line is the only specific piece of logic, everything else
// is copied from the parent.
$widget_state['paragraphs'][array_key_last($widget_state['paragraphs'])]['depth'] = $element[$delta]['depth']['#value'];
static::setWidgetState($parents, $field_name, $form_state, $widget_state);
}
/**
* {@inheritdoc}
*/
public function formMultipleElements(FieldItemListInterface $items, array &$form, FormStateInterface $form_state) {
$elements = parent::formMultipleElements($items, $form, $form_state);
$elements['#widget'] = 'bricks_tree_paragraphs';
return $elements;
}
}
