custom_elements-8.x-2.x-dev/src/Form/SettingsForm.php

src/Form/SettingsForm.php
<?php

namespace Drupal\custom_elements\Form;

use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\custom_elements\PreviewProvider\CustomElementsPreviewResolver;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Configure Custom Elements settings.
 */
class SettingsForm extends ConfigFormBase {

  /**
   * The preview provider resolver.
   *
   * @var \Drupal\custom_elements\PreviewProvider\CustomElementsPreviewResolver
   */
  protected $previewResolver;

  /**
   * Constructs a SettingsForm object.
   *
   * @param \Drupal\custom_elements\PreviewProvider\CustomElementsPreviewResolver $preview_resolver
   *   The preview provider resolver.
   */
  public function __construct(CustomElementsPreviewResolver $preview_resolver) {
    $this->previewResolver = $preview_resolver;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('custom_elements.preview_resolver')
    );
  }

  /**
   * {@inheritdoc}
   */
  protected function getEditableConfigNames() {
    return ['custom_elements.settings'];
  }

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

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $config = $this->config('custom_elements.settings');

    $form['settings_warning'] = [
      '#type' => 'item',
      '#markup' => '<div class="messages messages--warning">' . $this->t('<strong>Warning:</strong> Changing these settings may require updating your frontend application.') . '</div>',
    ];

    // Build options for render variant, including all available preview
    // providers.
    $render_variant_options = [
      'markup' => $this->t('Custom Elements Markup'),
    ];

    // Add specific preview provider services.
    foreach ($this->previewResolver->getProviders() as $provider) {
      $definition = $provider->getPluginDefinition();
      $render_variant_options['preview:' . $provider->getPluginId()] = $this->t('Preview: @label', [
        '@label' => $definition['label'],
      ]);
    }

    $form['default_render_variant'] = [
      '#type' => 'radios',
      '#title' => $this->t('Default rendering mode in Drupal pages'),
      '#description' => $this->t('Choose the default rendering mode for custom elements when they are part of a traditionally rendered Drupal page. <em>Custom Elements Markup</em> renders the actual custom element tags as part of the markup. <em>Preview options</em> render a preview representation for content editing and administration interfaces. Note: This does not influence API responses of the <a href=":lupus_ce_renderer_url">Lupus Custom Elements Renderer</a> or modules that explicitly render a preview representation, e.g. <a href=":canvas_url">Canvas ExtJS</a>.', [
        ':lupus_ce_renderer_url' => 'https://www.drupal.org/project/lupus_ce_renderer',
        ':canvas_url' => 'https://www.drupal.org/project/canvas_extjs',
      ]),
      '#options' => $render_variant_options,
      '#default_value' => $config->get('default_render_variant') ?? 'markup',
    ];

    $form['markup_style'] = [
      '#type' => 'radios',
      '#title' => $this->t('Markup style'),
      '#description' => $this->t('The markup style to use when rendering custom elements as markup. This affects the slot syntax used in the generated markup.'),
      '#options' => [
        'web_component' => $this->t('Web component style'),
        'vue-3' => $this->t('Vue 3 shorthand style'),
      ],
      '#default_value' => $config->get('markup_style') ?? 'web_component',
    ];

    $form['json_format'] = [
      '#type' => 'radios',
      '#title' => $this->t('JSON serialization format'),
      '#description' => $this->t('The format to use when serializing custom elements to JSON for API responses.'),
      '#options' => [
        'explicit' => $this->t('Explicit (props and slots separated)'),
        'legacy' => $this->t('Legacy (props and slots mixed at root level)'),
      ],
      '#default_value' => $config->get('json_format') ?? 'explicit',
    ];

    return parent::buildForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $this->config('custom_elements.settings')
      ->set('markup_style', $form_state->getValue('markup_style'))
      ->set('json_format', $form_state->getValue('json_format'))
      ->set('default_render_variant', $form_state->getValue('default_render_variant'))
      ->save();

    parent::submitForm($form, $form_state);
  }

}

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

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