web-dev-qa-db-fra.com

Comment placer le formulaire de contact en bloc?

Je dois incorporer un formulaire de contact à l'intérieur d'un bloc, et j'essaie d'utiliser le service entity.form_builder, mais je ne sais pas quelle entité je dois lui donner, j'ai trouvé l'entité Message et ContactForm, donc ce que je suis la pensée est de créer une entité de formulaire de contact et de la donner à la entityFormBuilder->getForm($contactFormEntity)

Mon code actuel est:

<?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')
    );
}

}

Ma question est essentiellement:

  • Est-ce que je le fais de la bonne façon?
  • Comment initialiser correctement l'entité ContactForm, si j'ai raison, dois-je simplement l'importer ou dois-je l'exiger via un service ou quelque chose?
  • Si je ne me trompe pas, avez-vous une idée de comment je dois le faire alors?
6
DenLilleMand

Essayez le module Bloc de contact , qui fournit le formulaire de contact dans un bloc.

De la documentation du module,

Le module Contact Block fournit des formulaires de contact dans un bloc. Il utilise les formulaires de contact qui peuvent être créés en utilisant le module de contact Drupal 8 core).

10
Suresh R

Essayez https://www.drupal.org/project/entityform_block projet, qui vous permet de créer des blocs de formulaire d'ajout pour tout type d'entité.

5
Berdir

Il existe également un module FormBlock , qui semble plus général.

Permet la présentation des formulaires d'enregistrement des utilisateurs, de contact à l'échelle du site ou de création de nœuds en blocs. Cela est particulièrement utile pour inclure des formulaires sur des panneaux.

J'ai trouvé un issue , pour fusionner le FormBlock et le module ContactBlock ensemble.

3
sreher

Le moyen le plus simple consiste à utiliser bloc de contact module spécialement conçu pour ce besoin. Il fournira des blocs pour chacun de vos formulaires de contact.

3
gagarine

Créez un nouveau type de bloc avec un champ ER qui pointe vers les formulaires de contact, activez contact_storage et créez un bloc, aucun codage requis

3
larowlan

Étant donné que cela s'applique à quelques-unes des réponses, je poste une réponse distincte, j'espère que ça va ...

Pour contact_block et formblock, j'ai testé un thème personnalisé, puis (pour être sûr) Bartik (8.6.1 pour le site 8.6.x sur le panthéon, si cela est important). Pour les deux, le module "échoue" pour rendre le bloc. Cependant, il crée un "espace" comme s'il avait été rendu. Autrement dit, si vous le mettez dans la barre latérale en premier et que c'est la seule chose pour la barre latérale en premier dans la disposition de bloc, il y a une grosse marge comme si elle rendait la barre latérale avec le formulaire de contact.

Sur une intuition, j'ai désinstallé BigPipe, et hop! Ça marche.

(Sachant que l'ordre d'implémentation du module est parfois important, j'ai essayé de réinstaller BigPipe et le comportement de non-rendu est revenu.)

J'ai eu une intuition à publier en tant que problème, mais je ne suis pas certain de la façon dont BigPipe s'intègre à tout cela, donc je ne l'ai pas fait. Peut-être que quelqu'un qui en sait plus sur BigPipe et pourquoi cela aurait cet effet peut répondre à ce message, et peut-être le soumettre comme un problème.

1
bradlowry

Solution simple de votre problème:

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

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