Commit df52f601 authored by Adam Shepherd's avatar Adam Shepherd
Browse files

Issue #3265297 by AdamPS: Remove core entity title workaround

parent 16b51d3c
Loading
Loading
Loading
Loading
+0 −5
Changes for modules/manage_display_fix_title/manage_display_fix_title.info.yml: 0 added lines, 5 removed lines.
Original line number Diff line number Diff line
name: Manage Display Fix Title
type: module
description: Workaround for core bugs in display of entity title
core_version_requirement: ^8.8 || ^9
package: Fields
+0 −69
Changes for modules/manage_display_fix_title/manage_display_fix_title.module: 0 added lines, 69 removed lines.
Original line number Diff line number Diff line
<?php

/**
 * @file
 * Workaround for core bugs in display of entity title.
 */

// EntityViewController::buildTitle creates problems,
// see https://www.drupal.org/node/2941208. It runs as a pre_render hook with
// apparently no way to alter it (see comment below for explanation). Solution
// found is to override the controller for the relevant routes using a route
// enhancer service.
//
// Sequence of events.
// 1) Building
// - EntityViewController::view
// - EntityViewBuilder::view
// - hook_entity_build_defaults_alter: can add OWN_entity_pre_render but Core
//   pre_render not available to alter
// 2) Rendering
// - pre_render
//   - OWN_entity_pre_render:
//     - too late to alter Core pre_render; no built fields to hook
//   - EntityViewBuilder::build
//     - hook_entity_view_display_alter: ideal place, except can't detect
//       whether the entity is on its own page
//     - hook_entity_prepare_view: no good as it acts on entities
//     - EntityViewDisplay::buildMultiple formatter builds the output,
//       so after this it's too late to swap to a different formatter
//     - hook_entity_display_build_alter
//     - hook_entity_view, hook_entity_view_alter
//   - EntityViewController::buildTitle
//     - title field: #pre_render, template_preprocess_field,
//       hook_preprocess_field
// - preprocess
//   - node: #pre_render, template_preprocess_node, hook_preprocess_node
//   - field: #pre_render, template_preprocess_field, hook_preprocess_field.

/**
 * Implements hook_theme().
 */
function manage_display_fix_title_theme() {
  return [
    'entity_page_title' => [
      'variables' => [
        'attributes' => [],
        'title' => NULL,
        'entity' => NULL,
        'view_mode' => NULL,
      ],
    ],
  ];
}

/**
 * Implements hook_preprocess_HOOK() for entity_page_title.
 *
 * On behalf of quickedit.module.
 */
function manage_display_fix_title_preprocess_entity_page_title(&$variables) {
  $variables['#cache']['contexts'][] = 'user.permissions';
  $entity = $variables['entity'];
  if (!\Drupal::currentUser()->hasPermission('access in-place editing') || !$entity->isLatestRevision()) {
    return;
  }

  $label_field = $entity->getEntityType()->getKey('label');
  $variables['attributes']['data-quickedit-field-id'] = $entity->getEntityTypeId() . '/' . $entity->id() . '/' . $label_field . '/' . $entity->language()->getId() . '/' . $variables['view_mode'];
}
+0 −5
Changes for modules/manage_display_fix_title/manage_display_fix_title.services.yml: 0 added lines, 5 removed lines.
Original line number Diff line number Diff line
services:
  route_enhancer.manage_display:
    class: Drupal\manage_display_fix_title\Entity\ManageDisplayRouteEnhancer
    tags:
      - { name: route_enhancer }
+0 −39
Changes for modules/manage_display_fix_title/src/Controller/ManageDisplayEntityViewController.php: 0 added lines, 39 removed lines.
Original line number Diff line number Diff line
<?php

namespace Drupal\manage_display_fix_title\Controller;

use Drupal\Core\Entity\FieldableEntityInterface;
use Drupal\Core\Entity\Controller\EntityViewController;

/**
 * Defines a controller to render a single node.
 */
class ManageDisplayEntityViewController extends EntityViewController {

  /**
   * Pre-render callback to build the page title.
   *
   * @param array $page
   *   A page render array.
   *
   * @return array
   *   The changed page render array.
   */
  public function buildTitle(array $page) {
    $entity_type = $page['#entity_type'];
    $entity = $page['#' . $entity_type];
    if ($entity instanceof FieldableEntityInterface) {
      $label_field = $entity->getEntityType()->getKey('label');
      $page_title = [
        '#theme' => 'entity_page_title',
        '#title' => $entity->label(),
        '#entity' => $entity,
        '#view_mode' => $page['#view_mode'],
      ];
      $page['#title'] = $this->renderer->render($page_title);
      unset($page[$label_field]);
    }
    return $page;
  }

}
+0 −41
Changes for modules/manage_display_fix_title/src/Controller/ManageDisplayNodeViewController.php: 0 added lines, 41 removed lines.
Original line number Diff line number Diff line
<?php

namespace Drupal\manage_display_fix_title\Controller;

use Drupal\Core\Entity\FieldableEntityInterface;
use Drupal\node\Controller\NodeViewController;

/**
 * Defines a controller to render a single node.
 */
class ManageDisplayNodeViewController extends NodeViewController {

  /**
   * Pre-render callback to build the page title.
   *
   * @param array $page
   *   A page render array.
   *
   * @return array
   *   The changed page render array.
   */
  public function buildTitle(array $page) {
    $entity_type = $page['#entity_type'];
    $entity = $page['#' . $entity_type];
    if ($entity instanceof FieldableEntityInterface) {
      $label_field = $entity->getEntityType()->getKey('label');
      if ($label_field) {
        $page_title = [
          '#theme' => 'entity_page_title',
          '#title' => $entity->label(),
          '#entity' => $entity,
          '#view_mode' => $page['#view_mode'],
        ];
        $page['#title'] = $this->renderer->render($page_title);
        unset($page[$label_field]);
      }
    }
    return $page;
  }

}
Loading