page_manager-8.x-4.0-beta6/src/Form/LayoutBuilderForm.php

src/Form/LayoutBuilderForm.php
<?php

namespace Drupal\page_manager\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\Context\EntityContext;
use Drupal\Core\TempStore\SharedTempStoreFactory;
use Drupal\layout_builder\Form\PreviewToggleTrait;
use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
use Drupal\layout_builder\SectionStorage\SectionStorageManager;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Provides a form containing the Layout Builder UI for Page Manager.
 *
 * @todo Refactor this after https://www.drupal.org/node/3035189 is resolved.
 */
class LayoutBuilderForm extends FormBase {

  use PreviewToggleTrait;

  /**
   * Layout tempstore repository.
   *
   * @var \Drupal\layout_builder\LayoutTempstoreRepositoryInterface
   */
  protected $layoutTempstoreRepository;

  /**
   * The Section Storage Manager.
   *
   * @var \Drupal\layout_builder\SectionStorage\SectionStorageManager
   */
  protected $sectionStorageManager;

  /**
   * The section storage.
   *
   * @var \Drupal\layout_builder\SectionStorageInterface
   */
  protected $sectionStorage;

  /**
   * The tempstore directory.
   *
   * @var \Drupal\Core\TempStore\SharedTempStoreFactory
   */
  protected $tempstore;

  /**
   * Constructs a new LayoutBuilderForm.
   *
   * @param \Drupal\layout_builder\LayoutTempstoreRepositoryInterface $layout_tempstore_repository
   *   The layout tempstore repository.
   * @param \Drupal\layout_builder\SectionStorage\SectionStorageManager $section_storage_manager
   *   The section storage manager.
   * @param \Drupal\Core\TempStore\SharedTempStoreFactory $tempstore
   *   The tempstore factory.
   */
  public function __construct(LayoutTempstoreRepositoryInterface $layout_tempstore_repository, SectionStorageManager $section_storage_manager, SharedTempStoreFactory $tempstore) {
    $this->layoutTempstoreRepository = $layout_tempstore_repository;
    $this->sectionStorageManager = $section_storage_manager;
    $this->tempstore = $tempstore;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('layout_builder.tempstore_repository'),
      $container->get('plugin.manager.layout_builder.section_storage'),
      $container->get('tempstore.shared')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'page_manager_layout_builder_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $cached_values = $form_state->getTemporaryValue('wizard');
    /** @var \Drupal\page_manager\PageVariantInterface $page_variant */
    $page_variant = $cached_values['page_variant'];

    // If this is a new variant, put it in the tempstore so that we can
    // retrieve it by id later.
    // @see \Drupal\page_manager\Plugin\SectionStorage\PageManagerSectionStorage::deriveContextsFromRoute.
    if ($page_variant->isNew()) {
      $this->tempstore->get('page_manager.layout_builder')->set($page_variant->id(), $page_variant);
    }

    $section_storage = $this->sectionStorageManager->load('page_manager', [
      'entity' => EntityContext::fromEntity($page_variant),
    ]);

    $this->sectionStorage = $this->layoutTempstoreRepository->get($section_storage);

    $form['preview_toggle'] = $this->buildContentPreviewToggle();

    $form['layout_builder'] = [
      '#type' => 'layout_builder',
      '#section_storage' => $this->sectionStorage,
    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $cached_values = $form_state->getTemporaryValue('wizard');

    /** @var \Drupal\page_manager\Entity\PageVariant $page_variant */
    $page_variant = $this->sectionStorage->getContextValue('entity');

    // Pass down the variant settings and let the plugin handle saving it.
    /** @var \Drupal\page_manager\Plugin\DisplayVariant\LayoutBuilderDisplayVariant $variant_plugin */
    $variant_plugin = $cached_values['plugin'];
    $variant_plugin->setConfiguration($page_variant->get('variant_settings'));

    // The form wizard takes care of saving the variant.
    // Clear the layout tempstore.
    $this->layoutTempstoreRepository->delete($this->sectionStorage);
    $this->messenger()->addMessage($this->t('The layout has been saved.'));

    // Clean up the tempstore.
    $this->tempstore->get('page_manager.layout_builder')->delete($page_variant->id());
    $this->tempstore->get('page_manager.page_variant')->delete($page_variant->id());
  }

}

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

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