フォームエントリの送信後に送信される電子メール通知の外観と内容を構成またはカスタマイズするにはどうすればよいですか?

問題

  • Liferayフォームのネイティブメール通知を使用しています
  • このメールの内容と外観を変更したいと思います。

not.png
画像:Liferayネイティブメール通知

環境

  • Liferay DXP 7.0+

解決

  • 現在、電子メール通知をより簡単にカスタマイズできるようにするための 機能リクエスト 今後のLiferayバージョンでこの機能が必要な場合は、必ず投票してください。
  • 独自の電子メールテンプレートを作成し、ネイティブテンプレートよりも優先することができます。 効果的に行う方法については、次のガイドを参照してください。

com.liferay.dynamic.data.mapping.service OSGiバンドルをホストとして使用して、Liferayモジュールフラグメントを作成する必要があります。 このフラグメントの目的は、内部パッケージ com.liferay.dynamic.data.mapping.internal.notificationをエクスポートすることです。これにより、電子メール通知の送信を担当するクラスを拡張し、新しいカスタム電子メールテンプレートを保存できます(テンプレートを次の段落のモジュールに保存することもできます。そのリソースを取得するために使用するクラスローダーと、そのOSGiバンドルがその機能を提供しているかどうかに注意してください)。

Bundle-Name: ddm-service-fragment
Bundle-SymbolicName: ddm.service.fragment
Bundle-Version: 1.0.0
Export-Package: com.liferay.dynamic.data.mapping.internal.notification
Fragment-Host: com.liferay.dynamic.data.mapping.service;bundle-version="5.3.12"
Portal-Bundle-Version: 7.3.10

コード:Liferay DXP 7.3GA1を使用したフラグメントのbnb.bndファイルの例

作成したら、カスタムメールテンプレートをフラグメントの src / main / resources / META-INF / フォルダー内に配置します(ホストのテンプレートと同じ修飾パスを使用しないようにしてください。 OSGiは、フラグメントを通過する前に、まずホスト内のリソースを検索するように設計されています。

Screen_Shot_2020-11-17_at_16.58.30.png

画像:カスタムメール本文テンプレートの例

そのフラグメントが完成したら、新しいLiferayサービスモジュールを作成できます。 このモジュール内では、拡張する必要があり、新しいクラスがあります DDMFormEmailNotificationSender。 サービスのためのOSGiコンポーネントとして、新しい拡張機能を設定 DDMFormEmailNotificationSender.class ので、およびサービスのランキングをバンプ、あなたがあなたのサーバーを起動するたびに、カスタムサービスはLiferayのオーバー優先順位を持っていることを保証(ホットモジュールをデプロイするおそれがあることを覚えてデフォルトのサービスを指す参照)。

@Component(
immediate = true, property = "service.ranking:Integer=" + Integer.MAX_VALUE,
service = DDMFormEmailNotificationSender.class
)
public class DDMCustomNotificationSender extends DDMFormEmailNotificationSender {
...
}

コード:カスタムDDMFormEmailNotificationSenderサービス構成の例

これで、カスタムサービスで必要なものをカスタマイズする(つまり、テンプレートパスを変更する)だけで済みます。 ただし、 getTemplateResource(String templatePath) をオーバーライドしてテンプレートパスをハードコーディングし、 getClass() 呼び出しを DDMFormEmailNotificationSender.classに変更して、カスタマイズで正しいクラスローダーからのテンプレートは機能しません。

@Override
protected TemplateResource getTemplateResource(String templatePath) {
Class<?> clazz = DDMFormEmailNotificationSender.class;

ClassLoader classLoader = clazz.getClassLoader();

URL templateURL = classLoader.getResource("/META-INF/resources/email/notification.soy");

return new URLTemplateResource(templateURL.getPath(), templateURL);
}

コード:これはそれ自体では機能しません

あなたは多くの遭遇ます NullPointerExceptionsが 使用すると、次々に修正しようとした場合、実行中。 これは、スーパークラスのメソッドが、最初にデプロイした時点でカスタム拡張機能でまだ参照されていないいくつかのLiferayサービスを使用しているために発生します。 したがって、これらのサービスを参照し、それらを使用するすべてのメソッドを事前にオーバーライドする必要があります。

private DDMFormFieldTypeServicesTracker _ddmFormFieldTypeServicesTracker;

@Reference
private GroupLocalService _groupLocalService;

private MailService _mailService;

@Reference
private Portal _portal;

@Reference
private SoyDataFactory _soyDataFactory;

private UserLocalService _userLocalService;

コード:サービスがで使用される 必要があなたのサービスによって参照されることをDDMFormEmailNotificationSender

その後、カスタムの電子メール通知を受信できるようになります。

チップ

開発時間を短縮したい場合があるので、スーパークラス全体をコピーして拡張機能に貼り付けることをお勧めします。 ただ、目を離さ はgetClass() というのコール が必要 スーパークラスを指すことにすると、プライベート定数の _TEMPLATE_PATH カスタムテンプレートのパスを指していることが必要です。

ResourceBundle resourceBundle = ResourceBundleUtil.getBundle("content.Language", locale, getClass());

コード:はgetClass()の必要性をと交換することを、元のクラスでのコールの例 DDMFormEmailNotificationSender.classカスタムにコピーしたときに1

private static final String _TEMPLATE_PATH = "/META-INF/resources/notification/form_entry_add_body.soy";

コード:_TEMPLATE_PATH定数の元の値

大豆のテンプレート言語とLiferayの組み込みのテンプレート処理APIを使用して、あなたのコンパイルする必要はありません .soy それは実行時に行われていますから、ファイルを。 したがって、コンパイルスクリプトからそれを除外することができます。

transpileJS {
enabled = false
}

コード:Gradleを使用している場合は、これをフラグメントのbuild.gradleファイルに追加できます

あなたのプロジェクトを開発するためにLiferayのワークスペースを使用している場合は、あなただけのサービスモジュール設定 bnd.bndインポート、パッケージ 手動あなたのバンドル内のすべての必要なパッケージを宣言する場合は、ヘッダーを。

Bundle-Name: ddm-custom-notification-sender
Bundle-SymbolicName: ddm.custom.notification.sender
Bundle-Version: 1.0.0

コード:機能するはずのサービスモジュールのbnb.bndファイルの例。 Bndtoolsは、宣言しない場合、最終的なMANIFEST.MFにImport-Packageヘッダーを自動的に設定します。

追加情報

この記事は役に立ちましたか?
4人中2人がこの記事が役に立ったと言っています