Drupal 8 - Как определить, созданы ли какие-либо контактные формы? - PullRequest
0 голосов
/ 07 августа 2020

Контекст: На моем сайте Drupal 8 я пытаюсь добавить новый раздел, содержащий представление, в котором перечислены все формы. Затем пользователь может щелкнуть одну из форм, и она начнет загрузку всех сообщений, отправленных через эту форму. Однако этот раздел должен быть виден только в том случае, если пользователь создал хотя бы одну форму.

Что я пробовал: На данный момент я обнаружил, что контактные формы хранятся в таблица конфигурации в базе данных, так что теоретически я мог бы запустить запрос типа «ВЫБРАТЬ 1 ИЗ конфигурации WHERE name LIKE '% contact.form%'» или любой другой эквивалент в D8. Однако похоже, что должен быть более быстрый способ вернуть либо наличие контактных форм, либо сами контактные формы программно.

Последний вопрос: Как я могу вернуть контактные формы сами или хотя бы логическое значение, представляющее наличие контактных форм программно?

1 Ответ

0 голосов
/ 08 августа 2020

Запрос сущностей контактной формы

\Drupal::entityTypeManager()
   ->getStorage('contact_form')
   ->loadMultiple();

=> [
  "feedback" => Drupal\contact\Entity\ContactForm {#3213},
  "personal" => Drupal\contact\Entity\ContactForm {#3994},
]

Количество контактных форм

\Drupal::entityTypeManager()
  ->getStorage('contact_form')
  ->getQuery()
  ->count()
  ->execute();

=> 2

И на ваш последний вопрос ; Один из способов приблизиться к этому - создать подкласс ContactFormListBuilder и переопределить его по умолчанию render() logi c:

Routing YAML

my_module.custom_contact_form_list:
  path: '/admin/foo/custom-contact-form-listing'
  defaults:
    _controller: '\Drupal\my_module\Controller\ContactFormListController::listing'
    _title: 'A custom contact form listing view'
  requirements:
    _permission: 'administer contact forms'

Контроллер листинга

<?php

namespace Drupal\my_module\Controller;

use Drupal\Core\Controller\ControllerBase;
use Drupal\my_module\CustomContactFormListBuilder;

/**
 * Class ContactFormListController.
 *
 * @package Drupal\my_module\Controller
 */
class ContactFormListController extends ControllerBase {

  /**
   * Provides a custom listing page for contact forms.
   *
   * @return array
   *   A render array as expected by
   *   \Drupal\Core\Render\RendererInterface::render().
   */
  public function listing() {
    $definition = $this->entityTypeManager()->getDefinition('contact_form');
    return $this
      ->entityTypeManager()
      ->createHandlerInstance(CustomContactFormListBuilder::class, $definition)
      ->render();
  }
}

Класс построителя списков

<?php

namespace Drupal\my_module;

use Drupal\contact\ContactFormListBuilder;

/**
 * Class CustomContactFormListBuilder.
 *
 * @package Drupal\my_module
 */
class CustomContactFormListBuilder extends ContactFormListBuilder {

  /**
   * {@inheritdoc}
   */
  public function render() {
    return parent::render(); // TODO: Change the autogenerated stub
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...