web-dev-qa-db-ja.com

お問い合わせフォームでメールを無効にしようとしましたが、送信時にまだ必要です

コンタクトフォームのメールフィールドをオプションにしようとしています。私は、hook_form_alterを実装することによって、アスタリスクをなんとかして削除します。

function contact_field_form_alter(&$form, &$form_state, $form_id) {
    $form['mail']['#required'] = FALSE;
}

ただし、フォームを送信すると、「有効な電子メールアドレスを入力する必要があります」というメッセージが表示されます。フォームではフィールドはオプションですが、まだ検証しようとしているようです。本当にオプションにする方法を誰かに教えてもらえますか?

前もって感謝します

3
codependent

サイト全体の連絡フォームまたは各ユーザーが持つことができる個人の連絡フォームについて話しているのですか?サイト全体のフォームについてお話しますが、以下はおおよそ個人的なフォームにも当てはまります。

電子メールの検証は contact_site_form_validate に組み込まれており、$mailも送信ハンドラに必要であるため、適切な方法はありません。

簡単な方法:メールフィールドのデフォルト値を自分が所有するアドレスに設定し、次のようにフィールドへのアクセスを無効にします。

function contact_field_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'contact_site_form') {
    $form['mail']['#required'] = FALSE;
    $form['mail']['#default_value'] = '[email protected]';
    $form['mail']['#access'] = FALSE;
  }
}

これにより、メールフィールドが完全に非表示になります。

ハードコアな方法:フォームの変更で、デフォルトの検証と送信のコールバックを上書きし($form['#validate']および$form['#submit']を使用)、それらをカスタムのコールバックに置き換えることができます。これには副作用のリスクがないわけではありません。お問い合わせフォームにカスタムのものとロジックを追加したい他のモジュールがある場合、これはおそらくそれらを壊します。

別の方法として、 webform モジュールを使用できます。それはあなたがあなたが要求したい情報に関してより多くの柔軟性をあなたに与え、そこにオプションの電子メールフィールドを持つことは非常に簡単です。

更新:以下を試すこともできます(テストされていません):

function contact_field_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'contact_site_form') {
    $form['mail']['#required'] = FALSE;
    $form['mail']['#default_value'] = '';
    // This makes our custom validation come first.
    array_unshift($form['#validate'], 'my_custom_validation');
  }
}

function my_custom_validation($form, &$form_state) {
  // This fills an empty mail value with a default one.
  if (empty($form_state['values']['mail']) {
    form_set_value($form['mail'], '[email protected]', $form_state);
  }
  // After this the default validation will run.
}

これにより、アスタリスクが削除され、事前設定値が非表示になり、ユーザーによって何も送信されていない場合、検証ハンドラーでメールフィールドのデフォルト値が設定されます。そうすれば、ハードワイヤード検証に文句を言う理由がなくなるはずです。

5
berliner