Browse Source

Support single file template

pull/1141/head
maliming 7 years ago
parent
commit
d1657d5555
  1. 4
      framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultEmailTemplateProvider.cs
  2. 9
      framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinition.cs
  3. 25
      framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateProvider.cs
  4. 9
      framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/EmailTemplateDefinitionExtensions.cs
  5. 4
      framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/MultipleVirtualFilesEmailTemplateContributor.cs
  6. 34
      framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/SingleVirtualFileEmailTemplateContributor.cs
  7. 2
      framework/test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.csproj
  8. 12
      framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/AbpEmailingTestModule.cs
  9. 8
      framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/EmailTemplateStore_Tests.cs
  10. 10
      framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/AbpEmailingTestResource.cs
  11. 6
      framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/en.json
  12. 6
      framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/tr.json
  13. 11
      framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestEmailTemplateProvider.cs
  14. 1
      framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/Template3/Template.tpl

4
framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultEmailTemplateProvider.cs

@ -7,10 +7,10 @@ namespace Volo.Abp.Emailing.Templates
public override void Define(IEmailTemplateDefinitionContext context) public override void Define(IEmailTemplateDefinitionContext context)
{ {
context.Add(new EmailTemplateDefinition(StandardEmailTemplates.DefaultLayout, isLayout: true, layout: null) context.Add(new EmailTemplateDefinition(StandardEmailTemplates.DefaultLayout, isLayout: true, layout: null)
.AddTemplateVirtualFile("/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Layout")); .AddTemplateVirtualFiles("/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Layout"));
context.Add(new EmailTemplateDefinition(StandardEmailTemplates.SimpleMessage) context.Add(new EmailTemplateDefinition(StandardEmailTemplates.SimpleMessage)
.AddTemplateVirtualFile("/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Message")); .AddTemplateVirtualFiles("/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Message"));
} }
} }
} }

9
framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinition.cs

@ -1,5 +1,4 @@
using System; using System;
using System.Collections.Generic;
using JetBrains.Annotations; using JetBrains.Annotations;
namespace Volo.Abp.Emailing.Templates namespace Volo.Abp.Emailing.Templates
@ -18,9 +17,12 @@ namespace Volo.Abp.Emailing.Templates
public EmailTemplateContributorList Contributors { get; } public EmailTemplateContributorList Contributors { get; }
public string DefaultCultureName { get; set; } public string DefaultCultureName { get; }
public EmailTemplateDefinition([NotNull]string name, Type localizationResource = null, bool isLayout = false, string layout = DefaultLayoutPlaceHolder, string defaultCultureName = null) public bool SingleTemplateFile { get; }
public EmailTemplateDefinition([NotNull] string name, Type localizationResource = null, bool isLayout = false,
string layout = DefaultLayoutPlaceHolder, string defaultCultureName = null, bool singleTemplateFile = false)
{ {
Name = Check.NotNullOrWhiteSpace(name, nameof(name)); Name = Check.NotNullOrWhiteSpace(name, nameof(name));
LocalizationResource = localizationResource; LocalizationResource = localizationResource;
@ -28,6 +30,7 @@ namespace Volo.Abp.Emailing.Templates
IsLayout = isLayout; IsLayout = isLayout;
Layout = layout; Layout = layout;
DefaultCultureName = defaultCultureName; DefaultCultureName = defaultCultureName;
SingleTemplateFile = singleTemplateFile;
} }
} }
} }

25
framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateProvider.cs

@ -36,7 +36,7 @@ namespace Volo.Abp.Emailing.Templates
if (emailTemplateDefinition == null) if (emailTemplateDefinition == null)
{ {
// TODO: Localized message // TODO: Localized message
throw new AbpException("email template name not definition"); throw new AbpException($"email template {name} not definition");
} }
var emailTemplateString = emailTemplateDefinition.Contributors.GetOrNull(cultureName); var emailTemplateString = emailTemplateDefinition.Contributors.GetOrNull(cultureName);
@ -55,7 +55,11 @@ namespace Volo.Abp.Emailing.Templates
var emailTemplate = new EmailTemplate(emailTemplateString, emailTemplateDefinition); var emailTemplate = new EmailTemplate(emailTemplateString, emailTemplateDefinition);
await SetLayoutAsync(emailTemplateDefinition, emailTemplate, cultureName); await SetLayoutAsync(emailTemplateDefinition, emailTemplate, cultureName);
await LocalizeAsync(emailTemplateDefinition, emailTemplate, cultureName);
if (emailTemplateDefinition.SingleTemplateFile)
{
await LocalizeAsync(emailTemplateDefinition, emailTemplate, cultureName);
}
return emailTemplate; return emailTemplate;
} }
@ -92,10 +96,19 @@ namespace Volo.Abp.Emailing.Templates
} }
var localizer = StringLocalizerFactory.Create(emailTemplateDefinition.LocalizationResource); var localizer = StringLocalizerFactory.Create(emailTemplateDefinition.LocalizationResource);
if (cultureName != null)
emailTemplate.SetContent( {
TemplateLocalizer.Localize(localizer.WithCulture(new CultureInfo(cultureName)), emailTemplate.Content) emailTemplate.SetContent(
); TemplateLocalizer.Localize(localizer.WithCulture(new CultureInfo(cultureName)),
emailTemplate.Content)
);
}
else
{
emailTemplate.SetContent(
TemplateLocalizer.Localize(localizer, emailTemplate.Content)
);
}
return Task.CompletedTask; return Task.CompletedTask;
} }

9
framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/EmailTemplateDefinitionExtensions.cs

@ -5,7 +5,14 @@
public static EmailTemplateDefinition AddTemplateVirtualFile( public static EmailTemplateDefinition AddTemplateVirtualFile(
this EmailTemplateDefinition emailTemplateDefinition, string path) this EmailTemplateDefinition emailTemplateDefinition, string path)
{ {
emailTemplateDefinition.Contributors.Add(new VirtualFileEmailTemplateContributor(path)); emailTemplateDefinition.Contributors.Add(new SingleVirtualFileEmailTemplateContributor(path));
return emailTemplateDefinition;
}
public static EmailTemplateDefinition AddTemplateVirtualFiles(
this EmailTemplateDefinition emailTemplateDefinition, string path)
{
emailTemplateDefinition.Contributors.Add(new MultipleVirtualFilesEmailTemplateContributor(path));
return emailTemplateDefinition; return emailTemplateDefinition;
} }
} }

4
framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/VirtualFileEmailTemplateContributor.cs → framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/MultipleVirtualFilesEmailTemplateContributor.cs

@ -6,7 +6,7 @@ using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.Emailing.Templates.VirtualFiles namespace Volo.Abp.Emailing.Templates.VirtualFiles
{ {
public class VirtualFileEmailTemplateContributor : IEmailTemplateContributor public class MultipleVirtualFilesEmailTemplateContributor : IEmailTemplateContributor
{ {
private readonly string _virtualPath; private readonly string _virtualPath;
@ -16,7 +16,7 @@ namespace Volo.Abp.Emailing.Templates.VirtualFiles
private readonly object _syncObj = new object(); private readonly object _syncObj = new object();
public VirtualFileEmailTemplateContributor(string virtualPath) public MultipleVirtualFilesEmailTemplateContributor(string virtualPath)
{ {
_virtualPath = virtualPath; _virtualPath = virtualPath;
} }

34
framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/SingleVirtualFileEmailTemplateContributor.cs

@ -0,0 +1,34 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.Emailing.Templates.VirtualFiles
{
public class SingleVirtualFileEmailTemplateContributor : IEmailTemplateContributor
{
private readonly string _virtualPath;
private IVirtualFileProvider _virtualFileProvider;
public SingleVirtualFileEmailTemplateContributor(string virtualPath)
{
_virtualPath = virtualPath;
}
public void Initialize(EmailTemplateInitializationContext context)
{
_virtualFileProvider = context.ServiceProvider.GetRequiredService<IVirtualFileProvider>();
}
public string GetOrNull(string cultureName)
{
var file = _virtualFileProvider.GetFileInfo(_virtualPath);
if (file == null || !file.Exists || file.IsDirectory)
{
return null;
}
return file.ReadAsString();
}
}
}

2
framework/test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.csproj

@ -13,6 +13,8 @@
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="Volo\Abp\Emailing\TestTemplates\*\*.tpl" /> <EmbeddedResource Include="Volo\Abp\Emailing\TestTemplates\*\*.tpl" />
<None Remove="Volo\Abp\Emailing\TestTemplates\*\*.tpl" /> <None Remove="Volo\Abp\Emailing\TestTemplates\*\*.tpl" />
<EmbeddedResource Include="Volo\Abp\Emailing\Localization\*.json" />
<None Remove="Volo\Abp\Emailing\Localization\*.json" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

12
framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/AbpEmailingTestModule.cs

@ -1,4 +1,6 @@
using Volo.Abp.Modularity; using Volo.Abp.Emailing.Localization;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.Emailing namespace Volo.Abp.Emailing
@ -14,6 +16,14 @@ namespace Volo.Abp.Emailing
{ {
options.FileSets.AddEmbedded<AbpEmailingTestModule>(); options.FileSets.AddEmbedded<AbpEmailingTestModule>();
}); });
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<AbpEmailingTestResource>()
.AddVirtualJson("/Volo/Abp/Emailing/Localization");
});
} }
} }
} }

8
framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/EmailTemplateStore_Tests.cs

@ -40,5 +40,13 @@ namespace Volo.Abp.Emailing
template.Content.ShouldContain("<body>\r\n " + "Please confirm your email address by clicking the link below."); template.Content.ShouldContain("<body>\r\n " + "Please confirm your email address by clicking the link below.");
} }
[Fact]
public async Task Should_Get_Registered_Template_With_Localize()
{
var template = await _emailTemplateProvider.GetAsync("template3", "tr");
template.Content.ShouldContain("Merhaba Abp");
}
} }
} }

10
framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/AbpEmailingTestResource.cs

@ -0,0 +1,10 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Volo.Abp.Emailing.Localization
{
public class AbpEmailingTestResource
{
}
}

6
framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/en.json

@ -0,0 +1,6 @@
{
"culture": "en",
"texts": {
"hello": "hello"
}
}

6
framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/tr.json

@ -0,0 +1,6 @@
{
"culture": "tr",
"texts": {
"hello": "Merhaba"
}
}

11
framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestEmailTemplateProvider.cs

@ -1,4 +1,5 @@
using Volo.Abp.Emailing.Templates; using Volo.Abp.Emailing.Localization;
using Volo.Abp.Emailing.Templates;
using Volo.Abp.Emailing.Templates.VirtualFiles; using Volo.Abp.Emailing.Templates.VirtualFiles;
namespace Volo.Abp.Emailing namespace Volo.Abp.Emailing
@ -8,12 +9,16 @@ namespace Volo.Abp.Emailing
public override void Define(IEmailTemplateDefinitionContext context) public override void Define(IEmailTemplateDefinitionContext context)
{ {
var template1 = new EmailTemplateDefinition("template1", defaultCultureName: "en", layout: null) var template1 = new EmailTemplateDefinition("template1", defaultCultureName: "en", layout: null)
.AddTemplateVirtualFile("/Volo/Abp/Emailing/TestTemplates/Template1"); .AddTemplateVirtualFiles("/Volo/Abp/Emailing/TestTemplates/Template1");
context.Add(template1); context.Add(template1);
var template2 = new EmailTemplateDefinition("template2", layout: StandardEmailTemplates.DefaultLayout) var template2 = new EmailTemplateDefinition("template2", layout: StandardEmailTemplates.DefaultLayout)
.AddTemplateVirtualFile("/Volo/Abp/Emailing/TestTemplates/Template2"); .AddTemplateVirtualFiles("/Volo/Abp/Emailing/TestTemplates/Template2");
context.Add(template2); context.Add(template2);
var template3 = new EmailTemplateDefinition("template3", layout: null, singleTemplateFile: true, localizationResource: typeof(AbpEmailingTestResource))
.AddTemplateVirtualFile("/Volo/Abp/Emailing/TestTemplates/Template3/Template.tpl");
context.Add(template3);
} }
} }
} }

1
framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/Template3/Template.tpl

@ -0,0 +1 @@
{{#L:hello}} Abp
Loading…
Cancel
Save