0

上下文:在我的 Drupal 8 站点上,我试图添加一个包含列出所有表单的视图的新部分。然后,用户可以单击其中一个表单,并启动通过该表单发送的所有消息的下载。但是,该部分仅在用户创建了至少 1 个表单时才可见。

我试过的:到目前为止,我发现联系表格存储在数据库的配置表中,所以理论上我可以运行类似“SELECT 1 FROM config WHERE name LIKE '%contact.form% '" 或 D8 中的任何等价物。但是,似乎必须有一种更快的方法来以编程方式返回联系表单的存在或联系表单本身。

最后一个问题:如何以编程方式返回联系表单本身或至少一个表示联系表单存在的布尔值?

4

1 回答 1

0

查询联系表单实体

\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()逻辑:

路由 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
  }

}
于 2020-08-08T11:14:03.363 回答