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