web-dev-qa-db-fra.com

Rediriger le formulaire de contact lors de la soumission

Utiliser Drupal 8 et essayer d'obtenir le formulaire de contact pour rediriger vers la même page après l'envoi. Par défaut, il semble rediriger vers la page d'accueil.

J'ai modifié mon fichier themename.theme

function themename_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {

  //contact page form
  if ($form_id == 'contact_message_feedback_form') {
    $url = Url::fromRoute('contact.site_page');
    $form_state->setRedirectUrl($url);
  }
}

Cela jette un tas d'erreurs mysql. Ainsi:

Uncaught exception thrown in session handler.

Drupal\Core\Database\DatabaseExceptionWrapper: SQLSTATE[08S01]: Communication link failure: 1153 Got a packet bigger than 'max_allowed_packet' bytes: UPDATE {sessions} SET uid=:db_update_placeholder_0, hostname=:db_update_placeholder_1, session=:db_update_placeholder_2, timestamp=:db_update_placeholder_3 WHERE ( (sid = :db_condition_placeholder_0) ); Array ( [:db_update_placeholder_0] => 1 [:db_update_placeholder_1] => ::1 [:db_update_placeholder_2] => _sf2_attributes|a:1:{s:3:"uid";s:1:"1";}_sf2_flashes|a:0:{}_sf2_meta|a:4:{s:1:"u";i:1454074283;s:1:"c";i:1452243053;s:1:"l";s:7:"2000000";s:1:"s";s:43:"dVseXv540u6wL5GZm_gs6fzuP9qtck-j5A5lexqnaQE";}authorize_page_title|O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"*string";s:14:"Update manager";s:12:"*arguments";a:0:{}s:10:"*options";a:0:{}}messages|a:1:{s:6:"status";a:2:{i:0;O:25:"Drupal\Core\Render\Markup":1:{s:9:"*string";s:1020035:"<script class="-kint-js">(function(){if("undefined"===typeof kintInitialized){kintInitialized=1;var e=[],f=-1,g=function(b){var a=window in Drupal\Core\Session\SessionHandler->write() (line 89 of /Users/timmcdonald/Code/waypoint/v3/core/lib/Drupal/Core/Session/SessionHandler.php).

et autres erreurs. Y a-t-il quelque chose qui me manque?

5
Tim McDonald

Voici ce que j'ai fini par faire dans un module personnalisé si quelqu'un d'autre devait le faire

 utilisez Drupal\Core\Url; 
 
 fonction custom_module_form_alter (& $ form,\Drupal\Core\Form\FormStateInterface $ form_state, $ form_id) {
 
 // formulaire de page de contact 
 if ($ form_id == 'contact_message_feedback_form') {
 $ form ['actions'] ['submit'] ['# submit'] [] = 'custom_module_contact_submit'; 
 dpm ($ form ['actions'] ['submit']); 
} 
 
} 
 
 fonction custom_module_contact_submit (& $ form,\Drupal\Core\Form\FormStateInterface $ form_state, $ form_id) {
 drupal_set_message ('nous avons envoyé un formulaire woohoo'); 
 $ url = Url :: fromRoute ('contact.site_page'); 
 $ form_state-> setRedirectUrl ($ url); 
} 
5
Tim McDonald

Et pour le rendre encore meilleur

/**
 * hook_form_FORM_ID_alter
 * @param $form
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 * @param $form_id
 */
function minimal_form_contact_message_contact_me_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
  $form['actions']['submit']['#submit'][] = 'minimal_contact_submit';
}

/**
 * Contact form submit handler
 * @param $form
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 */
function minimal_contact_submit(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {
  drupal_set_message('we sent a form woohoo');
  // From URL to URL object
  $url = \Drupal\Core\Url::fromUserInput('/node/16');
  $form_state->setRedirect('contact.site_page');
}

Je l'ai trouvé utile, alors peut-être que d'autres personnes pourraient aussi le trouver utile

4
Cifren

La solution de Tim fonctionnera également à partir d'un thème.

Dans ce cas, le thème est appelé "minimal" et le code ci-dessous se trouve dans le fichier minimal.theme. J'appelle hook_form_FORM_ID_alter sur un formulaire avec l'ID: contact_message_contact_me

Notez également la signature du gestionnaire de soumission, ainsi que l'appel direct à rediriger avec l'itinéraire par défaut à l'échelle du site pour le formulaire de contact (mon formulaire ci-dessus est défini par défaut). Vous n'avez pas besoin de créer l'URL en premier.

/**
 * hook_form_FORM_ID_alter
 * @param $form
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 * @param $form_id
 */
function minimal_form_contact_message_contact_me_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
  $form['actions']['submit']['#submit'][] = 'minimal_contact_submit';
}

/**
 * Contact form submit handler
 * @param $form
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 */
function minimal_contact_submit(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {
  $form_state->setRedirect('contact.site_page');
}
1
Blue Waters

Pour rediriger vers la même page, quelle qu'elle soit (si vous utilisez le module de bloc de contact par exemple), vous pouvez l'utiliser dans votre rappel de soumission:

$form_state->setRedirectUrl(\Drupal\Core\Url::fromRouteMatch(\Drupal::routeMatch()));
1
GaëlG

J'ai créé un module personnalisé pour mon formulaire. Dans la fonction d'envoi, je n'ai pas défini d'URL de redirection, dans laquelle la fonction d'envoi ne redirigera vers aucune page, et affichera donc à nouveau la page du formulaire. Cela parce que le formulaire se soumet à la même page que le formulaire est sur.

Edit: Après avoir posté cette réponse, j'ai remarqué que vous avez posé des questions sur le formulaire de contact Drupal. Donc, naturellement, cette réponse est fausse. Lisez toujours le mémoire deux fois, puis deux fois de plus.

<?php
/**
 * File: ContactForm.php
 */

namespace Drupal\module_name\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Component\Utility\UrlHelper;

class ContactForm extends FormBase
{
    /**
     * {@inheritDoc}
     */
    public function getFormId() {
        return 'module_name_contact_form';
    }

    /**
     * {@inheritDoc}
     */
    public function buildForm(array $form, FormStateInterface $form_state) {
        // Form 
        return $form;
    }

    /**
     * {@inheritDoc}
     */
    public function validateForm(array &$form, FormStateInterface $form_state) {
        // Form validation
    }

    /**
     * {@inheritDoc}
     */
    public function submitForm(array &$form, FormStateInterface $form_state) {
        drupal_set_message('Form submitted');
    }
}
0
pusle