Commit 07721283 authored by Volodymyr Mostepaniuk's avatar Volodymyr Mostepaniuk
Browse files

Issue #3295753 by mostepaniukvm, fago, useernamee: Configurable custom elements processors

parent db35f791
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
core.entity_view_display.*.*.*.third_party_settings.custom_elements:
  type: mapping
  label: 'Per-view-mode Custom elements settings'
  mapping:
    enabled:
      type: boolean
      label: 'Whether the custom elements rendering is enabled for view display mode'
    custom_element_name:
      type: string
      label: 'Custom element name'
    custom_element_fields:
      type: sequence
      sequence:
        type: custom_elements.field

custom_elements.field:
  type: mapping
  label: 'Custom element field '
  mapping:
    label:
      type: string
      label: 'Custom element name'
    is_slot:
      type: bool
      label: 'is Slot'
    type:
      type: string
      label: 'Custom element renderer'
    weight:
      type: integer
      label: 'Weight'
    region:
      type: string
      label: 'Region'
+1 −1
Original line number Diff line number Diff line
@@ -183,7 +183,7 @@ function custom_elements_module_implements_alter(&$implementations, $hook) {
function custom_elements_entity_view_display_alter(EntityViewDisplayInterface $display, array $context) {
  // Enable for all view-modes named appropriately by default.
  if (strpos($context['view_mode'], 'custom_elements') === 0) {
    $display->setThirdPartySetting('custom_elements', 'enabled', 1);
    $display->setThirdPartySetting('custom_elements', 'enabled', TRUE);
  }
}

+1 −1
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ function custom_elements_everywhere_entity_prepare_view($entity_type_id, array $
    // such that custom elements processor may use it to render
    // individual fields.
    foreach ($displays as $display) {
      $display->setThirdPartySetting('custom_elements', 'enabled', 1);
      $display->setThirdPartySetting('custom_elements', 'enabled', TRUE);
    }
  }
}
+7 −0
Original line number Diff line number Diff line
name: Custom Elements UI
description: 'Provides a user interface for the Custom Elements module.'
package: Other
type: module
core_version_requirement: ^9
dependencies:
  - custom_elements:custom_elements
+86 −0
Original line number Diff line number Diff line
<?php

/**
 * @file
 * Provides hook implementations for Custom Elements UI.
 */

use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
use Drupal\custom_elements_ui\Form\EntityCustomElementsDisplayForm;
use Drupal\field_ui\FieldUI;

/**
 * Implements hook_entity_type_alter().
 */
function custom_elements_ui_entity_type_alter(array &$entity_types) {
  /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */
  $entity_types['entity_view_display']
    ->setFormClass('custom_elements_builder', EntityCustomElementsDisplayForm::class);
}

/**
 * Implements hook_form_FORM_ID_alter() for \Drupal\field_ui\Form\EntityViewDisplayEditForm.
 */
function custom_elements_ui_form_entity_view_display_edit_form_alter(&$form, FormStateInterface $form_state) {
  /** @var \Drupal\Core\Entity\EntityFormInterface $display_form */
  $display_form = $form_state->getFormObject();
  /** @var \Drupal\Core\Entity\Entity\EntityViewDisplay $display_entity */
  $display_entity = $display_form->getEntity();
  $is_enabled = $display_entity->getThirdPartySetting('custom_elements', 'enabled', FALSE);

  // Hide the table of fields custom_elements display is activated.
  if ($is_enabled) {
    $form['fields']['#access'] = FALSE;
    $form['#fields'] = [];
    $form['#extra'] = [];
  }

  $entity_type = \Drupal::entityTypeManager()->getDefinition($display_entity->getTargetEntityTypeId());
  $route_parameters = FieldUI::getRouteBundleParameter($entity_type, $display_entity->getTargetBundle());
  $route_parameters['view_mode_name'] = $display_entity->getMode();
  $mode = $display_entity->getMode();
  $mode_component = ($mode === 'default') ? $mode : 'view_mode';
  $route_name = "entity.entity_ce_display.{$display_entity->getTargetEntityTypeId()}.{$mode_component}";
  $ce_builder_url = Url::fromRoute($route_name, $route_parameters);

  $form['manage_custom_element'] = [
    '#type' => 'link',
    '#title' => t('Manage custom element'),
    '#weight' => -10,
    '#attributes' => ['class' => ['button']],
    '#url' => $ce_builder_url,
    '#access' => $is_enabled,
  ];

  $form['custom_elements'] = [
    '#type' => 'details',
    '#open' => TRUE,
    '#title' => t('Custom Element'),
    '#tree' => TRUE,
  ];

  $form['custom_elements']['enabled'] = [
    '#type' => 'checkbox',
    '#title' => t('Use Custom Element Display'),
    '#default_value' => $is_enabled,
  ];

  $form['actions']['submit']['#submit'][] = '_custom_elements_ui_entity_view_display_edit_form_submit';
}

/**
 * Form submission handler for entity_view_display_edit_form.
 *
 * @see custom_elements_ui_form_entity_view_display_edit_form_alter()
 */
function _custom_elements_ui_entity_view_display_edit_form_submit($form, FormStateInterface $form_state) {
  $enabled = (bool) $form_state->getValue(['custom_elements', 'enabled'], FALSE);
  /** @var \Drupal\Core\Entity\EntityFormInterface $display_form */
  $display_form = $form_state->getFormObject();
  /** @var \Drupal\Core\Entity\Entity\EntityViewDisplay $display_entity */
  $display_entity = $display_form->getEntity();
  $display_entity->setThirdPartySetting('custom_elements', 'enabled', $enabled);
  // @todo Autogenerate fields and names from view display entity?
  $display_entity->save();
}
Loading