eav_field-2.x-dev/src/Form/EavWidgetForm.php

src/Form/EavWidgetForm.php
<?php

namespace Drupal\eav_field\Form;

use Drupal\Core\Entity\Entity\EntityFormDisplay;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\FieldableEntityInterface;
use Drupal\Core\Field\WidgetInterface;
use Drupal\Core\Field\WidgetPluginManager;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class EavWidgetForm extends FormBase {

  protected EntityTypeManagerInterface $entityTypeManager;

  protected EntityFieldManagerInterface $entityFieldManager;

  protected WidgetPluginManager $fieldWidgetManager;

  /**
   * Form constructor.
   */
  public function __construct(
    EntityTypeManagerInterface $entity_type_manager,
    EntityFieldManagerInterface $entity_field_manager,
    WidgetPluginManager $field_widget_manager,
  ) {
    $this->entityTypeManager = $entity_type_manager;
    $this->entityFieldManager = $entity_field_manager;
    $this->fieldWidgetManager = $field_widget_manager;
  }

  /**
   * {@inheritDoc}
   */
  public static function create(ContainerInterface $container): static {
    return new static(
      $container->get('entity_type.manager'),
      $container->get('entity_field.manager'),
      $container->get('plugin.manager.field.widget')
    );
  }

  /**
   * {@inheritDoc}
   */
  public function getFormId(): string {
    return 'eav_entity_attributes_form';
  }

  /**
   * {@inheritDoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state, $field_name = NULL): array {
    $entity = eav_field_get_entity_from_route_match($this->getRouteMatch());
    $eav_field_definition = $entity->get($field_name)->getFieldDefinition();
    $eav_field_name = $eav_field_definition->getName();
    $form_display = EntityFormDisplay::collectRenderDisplay($entity, 'edit');

    $eav_widget = $this->fieldWidgetManager->getInstance([
      'field_definition' => $eav_field_definition,
      'configuration' => $form_display->getComponent($eav_field_name) ?: [],
    ]);

    $form['#parents'] = $form['#parents'] ?? [];
    $form[$eav_field_name] = $eav_widget->form($entity->get($eav_field_name), $form, $form_state);

    $form['actions'] = [
      '#type' => 'actions',
    ];

    $form['actions']['save'] = [
      '#type' => 'submit',
      '#value' => $this->t('Save'),
      '#button_type' => 'primary',
    ];

    if (!$entity->get($eav_field_name)->isEmpty()) {
      $form['actions']['delete'] = [
        '#type' => 'submit',
        '#value' => $this->t('Clear all attributes value'),
        '#button_type' => 'danger',
        '#submit' => ['::clearAllValues'],
      ];
    }

    $form['#title'] = $this->t('Editing attributes of "@entity_label"', ['@entity_label' => $entity->label()]);

    $form_state->set('entity', $entity);
    $form_state->set('eav_widget', $eav_widget);

    return $form;
  }

  /**
   * {@inheritDoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state): void {
    $host_entity = $form_state->get('entity'); /** @var FieldableEntityInterface $host_entity */
    $eav_widget = $form_state->get('eav_widget'); /** @var WidgetInterface $eav_widget */
    $eav_field_name = $form_state->getBuildInfo()['args'][0];

    $eav_widget->extractFormValues($host_entity->get($eav_field_name), $form, $form_state);
    $host_entity->save();

    $this->messenger()->addMessage($this->t('Values saved.'));
  }

  /**
   * "delete" button submit callback.
   */
  public function clearAllValues(array &$form, FormStateInterface $form_state): void {
    $entity = $form_state->get('entity'); /** @var EntityInterface $entity */
    $eav_field_name = $form_state->getBuildInfo()['args'][0];

    // Delete all eav_value entities and clear eav field value
    $entity->set($eav_field_name, NULL);
    $entity->save();

    $this->messenger()->addMessage($this->t('Values cleared.'));
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc