rocketship_core-8.x-2.0-alpha11/src/Plugin/Field/FieldWidget/RSParagraphsAsymmetricWidget.php
src/Plugin/Field/FieldWidget/RSParagraphsAsymmetricWidget.php
<?php namespace Drupal\rocketship_core\Plugin\Field\FieldWidget; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\paragraphs_asymmetric_translation_widgets\Plugin\Field\FieldWidget\ParagraphsAsymmetricWidget; /** * Plugin implementation of the 'paragraphs_asymmetric' widget. * * @FieldWidget( * id = "rs_paragraphs_asymmetric", * label = @Translation("RS Paragraphs EXPERIMENTAL Asymmetric"), * description = @Translation("An experimental paragraphs inline form widget * that supports asymmetric translations."), field_types = { * "entity_reference_revisions" * } * ) * * IMPORTANT! This widget requires patching paragraphs_asymmetric_translation_widgets. * Missing patch will cause fatal PHP error. * * @see https://www.drupal.org/project/paragraphs_asymmetric_translation_widgets/issues/2959900 * @see https://www.drupal.org/project/drupal/issues/3009016#comment-12828375 * * Make sure the following two patches are applied. If not, add this snippet * to your top-level composer.json file: * * @code * "extra": { * "patches": { * "drupal/paragraphs_asymmetric_translation_widgets": { * "Add support for experimental widget -- https://www.drupal.org/project/paragraphs_asymmetric_translation_widgets/issues/2959900": "https://www.drupal.org/files/issues/2018-11-12/2959900-13.patch" * }, * "drupal/core": { * "Incorrect translation status for duplicated entities. -- https://www.drupal.org/project/drupal/issues/3009016#comment-12828375": "https://www.drupal.org/files/issues/2018-10-25/3009016-6.patch" * } * } * } * @endcode */ class RSParagraphsAsymmetricWidget extends ParagraphsAsymmetricWidget { /** * {@inheritdoc} */ protected function buildButtonsAddMode() { $options = $this->getAccessibleOptions(); $add_mode = $this->getSetting('add_mode'); $paragraphs_type_storage = \Drupal::entityTypeManager() ->getStorage('paragraphs_type'); // Build the buttons. $add_more_elements = []; foreach ($options as $machine_name => $label) { $button_key = 'add_more_button_' . $machine_name; $add_more_elements[$button_key] = $this->expandButton([ '#type' => 'submit', '#name' => $this->fieldIdPrefix . '_' . $machine_name . '_add_more', '#value' => $add_mode == 'modal' ? $label : $this->t('Add @type', ['@type' => $label]), '#attributes' => [ 'class' => ['field-add-more-submit'], 'aria-describedby' => [$this->fieldIdPrefix . '_' . $machine_name . '_add_more-description'], ], '#limit_validation_errors' => [ array_merge($this->fieldParents, [ $this->fieldDefinition->getName(), 'add_more', ]), ], '#submit' => [[get_class($this), 'addMoreSubmit']], '#ajax' => [ 'callback' => [get_class($this), 'addMoreAjax'], 'wrapper' => $this->fieldWrapperId, ], '#bundle_machine_name' => $machine_name, '#prefix' => '', ]); if ($add_mode === 'modal') { if ($icon_file = $paragraphs_type_storage->load($machine_name) ->getIconFile()) { $icon_url = file_create_url($icon_file->getFileUri()); $add_more_elements[$button_key]['#prefix'] .= "<i class=\"paragraphs-add-dialog-row__icon\"><img src=\"$icon_url\" /></i>"; } else { $add_more_elements[$button_key]['#prefix'] .= "<i class=\"paragraphs-add-dialog-row__icon\"></i>"; } if ($desc = $paragraphs_type_storage->load($machine_name) ->getDescription()) { $add_more_elements[$button_key]['#prefix'] .= "<div class=\"paragraphs-add-dialog-row__description\">"; $add_more_elements[$button_key]['#prefix'] .= "<i class=\"paragraphs-add-dialog-row__description__icon\"></i>"; $add_more_elements[$button_key]['#prefix'] .= "<div class=\"paragraphs-add-dialog-row__description__content\" role=\"tooltip\" aria-hidden=\"true\" id=\"" . $this->fieldIdPrefix . "_" . $machine_name . "_add_more" . "-description\">$desc</div>"; $add_more_elements[$button_key]['#prefix'] .= "</div>"; } else { $add_more_elements[$button_key]['#prefix'] .= "<div class=\"paragraphs-add-dialog-row__description\"></div>"; } } } // Determine if buttons should be rendered as dropbuttons. if (count($options) > 1 && $add_mode == 'dropdown') { $add_more_elements = $this->buildDropbutton($add_more_elements); $add_more_elements['#suffix'] = $this->t('to %type', ['%type' => $this->fieldDefinition->getLabel()]); } elseif ($add_mode == 'modal') { $this->buildModalAddForm($add_more_elements); $add_more_elements['add_modal_form_area']['#suffix'] = $this->t('to %type', ['%type' => $this->fieldDefinition->getLabel()]); } $add_more_elements['#weight'] = 1; $add_more_elements['#attached']['library'][] = 'rocketship_core/expanded_asymmetric_paragraphs'; return $add_more_elements; } /** * {@inheritdoc} */ public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { $element = parent::formElement($items, $delta, $element, $form, $form_state); // Add the description for the paragraph. $paragraphs_type = \Drupal::entityTypeManager() ->getStorage('paragraphs_type')->load($element['#paragraph_type']); $element['top']['summary']['description'] = [ '#markup' => '<div class="paragraph-type-description">' . $paragraphs_type->getDescription() . '</div>', '#weight' => 1, ]; return $element; } }