web-dev-qa-db-ja.com

送信時に問い合わせフォームをリダイレクトする

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).

およびその他のエラー。何か足りないものはありますか?

5
Tim McDonald

他の誰かがこれをする必要がある場合、私がカスタムモジュールでやったことはここにあります

 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); 
} 
5
Tim McDonald

そしてそれをさらに良くするために

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

役に立ったので、他の人にも役立つかも

4
Cifren

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');
}
1
Blue Waters

同じページにリダイレクトするには、それが何であれ(たとえば、連絡先ブロックモジュールを使用している場合)、送信コールバックでこれを使用できます。

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

フォーム用のカスタムモジュールを作成しました。 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');
    }
}
0
pusle