Cum se plasează formularul de contact în bloc? (Drupal, Formulare, 8, Entități, Emailuri)

DenLilleMand a intrebat.

Trebuie să încorporez un formular de contact în interiorul unui bloc, și încerc să folosesc serviciul entity.form_builder, Dar nu sunt sigur ce entitate ar trebui să îi dau, am găsit Message și ContactForm entity, așa că ceea ce mă gândesc este să creez o entitate contact form și să o dau la entityFormBuilder->getForm($contactFormEntity)

Codul meu actual este:

<?php


/**
 * @file
 * Contains Drupalpid_contactform_blockPluginBlockTellUsYourStoryBlock
 */

namespace Drupalpid_contactform_blockPluginBlock;

use DrupalCoreBlockBlockBase;
use DrupalCorePluginContainerFactoryPluginInterface;
use SymfonyComponentDependencyInjectionContainerInterface;

/**
 * Class TellUsYourStoryBlock
 * @package Drupalpid_contactform_blockPluginBlock
 * @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 DrupalblockBlockViewBuilder
 */
public function build()
{
    return $this->entityFormBuilder->getForm();

}

/**
 * Creates an instance of the plugin.
 *
 * @param SymfonyComponentDependencyInjectionContainerInterface $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')
    );
}

}

Întrebarea mea este, în principiu:

  • O fac în mod corect?
  • Cum inițializez corect entitatea ContactForm, dacă am dreptate, ar trebui doar să o import sau ar trebui să o cer printr-un serviciu sau ceva de genul acesta?
  • Dacă nu am dreptate, aveți vreo idee despre cum ar trebui să o fac atunci?

7 răspunsuri
Suresh R

Încercați Bloc de contacte modul, care oferă formularul de contact într-un bloc.

Din documentația modulului,

Modulul Contact Block oferă formulare de contact într-un bloc. Folosește formularele de contact care pot fi create cu ajutorul modulului Contact din Drupal 8 core.

Berdir

Încercați https://www.drupal.org/project/entityform_block care vă permite să creați blocuri de formulare de adăugare pentru orice tip de entitate.

Comentarii

  • Berdir, chiar cred că o anumită funcționalitate a blocului de formulare de contact ar trebui să fie în nucleu… O opțiune pentru a plasa formularele de contact ca blocuri… – utilizator16289
larowlan

Creați un nou tip de bloc cu un câmp ER care să indice formulare de contact, activați contact_storage și creați un bloc, fără a fi nevoie de codare

Comentarii

  • A, am crezut că am rezolvat dar când am făcut blocul, am adăugat un câmp trebuia să fac referire la formularul de contact, dar în câmpurile mele nu pot alege decât între general, număr, text și referință . Așa că am ales referință și „altele”, îmi dă o listă de conținuturi la care pot face referire comentariu, mesaj de contact, conținut, bloc personalizat și alte câteva care nu au sens. Apoi, celelalte opțiuni se află sub „configurare”, iar acela are formularul de contact, dar acel câmp va face legătura cu pagina de configurare a formularelor mele și nu cu formularul de contact real. Cum pot face să apară formularul de contact? –  > Por DenLilleMand.
  • Aveți nevoie de modulul contribuit contact_storage și să folosiți formatorul „rendered entity” –  > Por larowlan.
sreher

Există, de asemenea, un modul FormBlock, , care pare mai general.

Permite prezentarea în blocuri a formularelor de înregistrare a utilizatorilor, de contact la nivelul întregului site sau de creare a nodurilor. Acest lucru este deosebit de util pentru a include formulare pe panouri.

Am găsit un problemă, , pentru a unifica modulele FormBlock și ContactBlock împreună.

gagarine

Cea mai simplă modalitate este să folosiți bloc de contact modul care este făcut special pentru această nevoie. Acesta va oferi blocuri pentru fiecare dintre formularele de contact.

bradlowry

Deoarece acest lucru se aplică la câteva dintre răspunsuri, postez un răspuns separat, sper că este în regulă…

Atât pentru contact_block, cât și pentru formblock am testat atât o temă personalizată, cât și apoi (pentru a fi sigur) Bartik (8.6.1 pentru un site 8.6.x pe pantheon, dacă contează). Pentru ambele, modulul „nu reușește” să redea blocul. Cu toate acestea, creează totuși „spațiu” ca și cum ar fi fost redat. Adică, dacă îl puneți în sidebar-first și acesta este singurul lucru pentru sidebar-first în Block-Layout, atunci există o Margine grasă ca și cum ar fi redat sidebarul cu Formularul de contact.

Dintr-o bănuială, am dezinstalat BigPipe și gata! funcționează.

(Știind că ordinea de implementare a modulelor contează uneori, am încercat să reinstalez BigPipe și a revenit comportamentul de nereprezentare).

Am avut o bănuială de a posta ca o problemă, dar nu sunt sigur cum se potrivește BigPipe în toate acestea, așa că nu am făcut-o. Poate că cineva care știe mai multe despre BigPipe și de ce ar avea acest efect poate răspunde la această postare și, poate, să o trimită ca problemă.

arraksis

Soluție simplă a problemei tale:

public function build() {
  $message = DrupalcontactEntityMessage::create(['contact_form' => 'feedback']);

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