Drupal 8のコアからContact moduleを使用して、カスタムフォーム(いくつかの追加フィールドを追加)を作成しました。
フォームを送信すると、すべての値を含むemailが送信されますが、実際にはbad formatです。電子メールには、フィールドラベルのないフォームの値のみが含まれ、それは判読不能です。
フォームの送信時に送信されるメールのテンプレートをカスタマイズするにはどうすればよいですか?
Drupal 7の同じ問題についていくつかの回答が見つかりました。カスタムhook_mail_alter
関数の実装を提案しています(例: 1 、 2 )。
だから私は自分の関数でカスタムモジュールを作成しました:
/**
* Implements hook_mail_alter().
*/
function mymodule_mail_alter(&$message) {
// Process only 'contact_page_mail' messages
if ($message['id'] != 'contact_page_mail') {
return;
}
$params = $message['params'];
// Body
$message['body'] = [];
$message['body'][] = t('Some custom message');
// I don't know what should I do here?
// How can I access values of all fields in the form?
// ...
return;
}
メールが送信される前に関数が正しくトリガーされますが、フィールドの値にアクセスできないため、カスタムメールを作成できません。
また、フォームのIDを取得できないため(すべての連絡先フォームで有効な一般的な'contact_page_mail'
のみ)、この関数で別の連絡先フォームを処理できません。
この他の同様の質問 で示唆されているように、私は Swift Mailerモジュール で試しました。
何らかの努力 の後、私はそれを機能させることができ、次の内容のswiftmailer.html.twig
テンプレートファイルができました。
<div>
{{ body }}
</div>
しかし、hook_mail_alter
ソリューションについては、フォームのフィールド値にアクセスする方法がわからないため、メール形式をカスタマイズできません。
さらに、Swift Mailerモジュールは現在alphaバージョン(8.x-1.0-alpha1)であり、Mailsystemモジュール(物を取得するために必要)動作中)はbetaバージョンです。したがって、本番Webサイトに不安定なモジュールをインストールしないようにしたいと思います(他に何も動作しない場合は、これが最後の解決策になる可能性があります)。
[〜#〜]編集[〜#〜]
@Berdirのおかげで、今はhook_mail_alter
関数内でフィールド値にアクセスできます。
$contactMessage = $message['params']['contact_message'];
// Value of 'field_my_field_name'
$contactMessage->get('field_my_field_name')->getString();
だから私は$message['body']
の中にそれらを置くことができます。
かなり複雑ですが、機能します。
Swift Mailerテンプレート内でフィールド値を取得する方法はありますか?{{ params.contact_message.field_work_with_us_name }}
で試しましたが、機能しません。
お問い合わせフォームが2つ以上ある場合はどうなりますか?関数hook_mail_alter
は、それらすべてでトリガーされます。各連絡先フォームに特定の機能を持たせる方法はありますか?
コメント/ディスカッションに基づいて回答をまとめ、受け入れ/クローズできるようにします。
メールにテーマを設定する方法の一般的な説明は、この既存の回答にあります: 送信する連絡先メールにテーマを設定するにはどうすればよいですか?
https://www.drupal.org/node/2680731 を監視することをお勧めします。解決したら、独自のカスタムコードの代わりにそれを使用してメールを送信できます。 HTML。
メールの内部にカスタムテンプレートを使用するには、hook_contact_message_view()
でカスタムテンプレートを設定できます。または、特定のフィールドにフィールドテンプレートを使用します。
特定の連絡先フォームを確認するには、連絡先メッセージエンティティのbundle()
メソッドを使用できます。これは、hook_mail_alter()
の$message['params]['contact_message']
にあります。これとエンティティオブジェクトが存在することの確認を組み合わせてください。そうしないと、他のメールで致命的なエラーが発生する可能性があります。