web-dev-qa-db-ja.com

連絡フォームをブロックに配置する方法は?

私はブロック内に連絡フォームを埋め込む必要があり、entity.form_builderサービスを使用しようとしていますが、どのエンティティを指定すればよいかわからないため、MessageエンティティとContactFormエンティティが見つかりました。考えは、コンタクトフォームエンティティを作成し、それをentityFormBuilder->getForm($contactFormEntity)に渡すことです

私の現在のコードは:

<?php


/**
 * @file
 * Contains Drupal\pid_contactform_block\Plugin\Block\TellUsYourStoryBlock
 */

namespace Drupal\pid_contactform_block\Plugin\Block;

use Drupal\Core\Block\BlockBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Class TellUsYourStoryBlock
 * @package Drupal\pid_contactform_block\Plugin\Block
 * @Block(
 *     id = "tell_us_your_story_block_id",
 *     admin_label = "Tell us your story block",
 *     module = "pid_contactform_block"
 * )
 */
class TellUsYourStoryBlock extends BlockBase implements ContainerFactoryPluginInterface {
    protected $entityFormBuilder;

public function __construct(array $configuration, $plugin_id, $plugin_definition, $entityFormBuilder) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->entityFormBuilder = $entityFormBuilder;
}
/**
 * Builds and returns the renderable array for this block plugin.
 *
 * If a block should not be rendered because it has no content, then this
 * method must also ensure to return no content: it must then only return an
 * empty array, or an empty array with #cache set (with cacheability metadata
 * indicating the circumstances for it being empty).
 *
 * @return array
 *   A renderable array representing the content of the block.
 *
 * @see \Drupal\block\BlockViewBuilder
 */
public function build()
{
    return $this->entityFormBuilder->getForm();

}

/**
 * Creates an instance of the plugin.
 *
 * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
 *   The container to pull out services used in the plugin.
 * @param array $configuration
 *   A configuration array containing information about the plugin instance.
 * @param string $plugin_id
 *   The plugin ID for the plugin instance.
 * @param mixed $plugin_definition
 *   The plugin implementation definition.
 *
 * @return static
 *   Returns an instance of this plugin.
 */
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition)
{
    return new static(
        $configuration,
        $plugin_id,
        $plugin_definition,
        $container->get('entity.form_builder')
    );
}

}

私の質問は基本的に:

  • 私はそれを正しい方法でやっていますか?
  • ContactFormエンティティを正しく初期化する方法を教えてください。正しい場合、それをインポートするだけでよいのですか、それともサービスなどを通じて要求する必要がありますか?
  • 私が正しくない場合は、どうすればよいのでしょうか。
6
DenLilleMand

ブロックで連絡フォームを提供する Contact block モジュールを試してください。

モジュールのドキュメントから、

Contact Blockモジュールは、ブロック内の連絡フォームを提供します。 Drupal 8コアContactモジュールを使用して作成できるコンタクトフォームを使用します。

10
Suresh R

https://www.drupal.org/project/entityform_block プロジェクトを試してください。これにより、任意のエンティティタイプの追加フォームブロックを作成できます。

5
Berdir

より一般的に見えるモジュール FormBlock もあります。

ユーザー登録、サイト全体の連絡先、またはノード作成フォームをブロックで表示できるようにします。これは、パネルにフォームを含める場合に特に便利です。

FormBlockモジュールとContactBlockモジュールをマージする issue を見つけました。

3
sreher

最も簡単な方法は、この必要性のために特別に作成された contact block モジュールを使用することです。お問い合わせフォームごとにブロックを提供します。

3
gagarine

連絡先フォームを指すERフィールドを持つ新しいブロックタイプを作成し、contact_storageを有効にして、ブロックを作成します。コーディングは不要です。

3
larowlan

これは私が別の応答を投稿しているいくつかの回答に適用されるので、それが問題ないことを願っています...

Contact_blockとformblockの両方について、カスタムテーマと、(確かに)Bartik(問題がある場合は、パンテオンの8.6.xサイトの8.6.1)の両方をテストしました。どちらの場合も、モジュールはブロックのレンダリングに「失敗」します。ただし、レンダリングされたかのように「スペース」を作成します。つまり、サイドバーファーストに配置し、それがブロックレイアウトのサイドバーファーストの唯一のものである場合、Fat Margin As-Ifがあり、コンタクトフォームでサイドバーをレンダリングしていました。

直ぐに、BigPipeをアンインストールして、プレストしました!できます。

(モジュール実装の順序が時々問題になることを知っていたので、BigPipeを再インストールしてみたところ、レンダリングされない動作が返されました。)

課題として投稿するのが賢明でしたが、BigPipeがこれらすべてとどのように一致するのかわからないので、そうしませんでした。たぶん、BigPipeについてもっと知っていて、なぜそれがこの効果をもたらすのかを知っている誰かがこの投稿に応答し、おそらくそれを問題として送信できます。

1
bradlowry

あなたの問題の簡単な解決策:

public function build() {
  $message = \Drupal\contact\Entity\Message::create(['contact_form' => 'feedback']);

  return \Drupal::service('entity.form_builder')->getForm($message);
}
1
arraksis