Drupal 8を使用して、送信後に連絡先フォームを同じページにリダイレクトしようとしています。デフォルトでは、ホームページにリダイレクトされるようです。
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);
}
}
これは多くのmysqlエラーをスローします。そのようです:
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).
およびその他のエラー。何か足りないものはありますか?
他の誰かがこれをする必要がある場合、私がカスタムモジュールでやったことはここにあります
use Drupal\Core\Url; function custom_module_form_alter(&$ form、\ Drupal\Core\Form\FormStateInterface $ form_state、$ form_id){ //お問い合わせフォーム if($ form_id == 'contact_message_feedback_form'){ $ form ['actions'] ['submit'] ['#submit'] [] = 'custom_module_contact_submit'; dpm($ form ['actions'] ['submit']); } } function custom_module_contact_submit(&$ form、\ Drupal\Core\Form\FormStateInterface $ form_state、$ form_id){ drupal_set_message( 'form sent a woohoo'); $ url = Url :: fromRoute( 'contact.site_page'); $ form_state-> setRedirectUrl($ url); }
そしてそれをさらに良くするために
/**
* 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');
}
役に立ったので、他の人にも役立つかも
Timのソリューションもテーマから機能します。
この場合、テーマは「minimal」と呼ばれ、以下のコードはminimal.themeファイルにあります。次のIDのフォームでhook_form_FORM_ID_alterを呼び出しています:contact_message_contact_me
また、送信ハンドラの署名と、連絡先フォームのデフォルトのサイト全体のルートでリダイレクトする直接呼び出しにも注意してください(上記の私のフォームはデフォルトに設定されています)。最初にUrlを作成する必要はありません。
/**
* 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');
}
同じページにリダイレクトするには、それが何であれ(たとえば、連絡先ブロックモジュールを使用している場合)、送信コールバックでこれを使用できます。
$form_state->setRedirectUrl(\Drupal\Core\Url::fromRouteMatch(\Drupal::routeMatch()));
フォーム用のカスタムモジュールを作成しました。 submit関数では、リダイレクトURLを設定していません。この場合、submit関数はどのページにもリダイレクトしないため、フォームページが再び表示されます。これは、フォームがフォームと同じページに送信されるためです。
編集:この回答を投稿した後、Drupalお問い合わせフォームについてお尋ねしました。当然のことながら、この回答は間違っています。概要を2回読んでから、あと2回読んでください。
<?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');
}
}