1710568033
2024-03-15 00:00:00
Optimizely Forms を使用すると、フォームの機能を構成する方法が複数あることがわかります。 エディターが設定できるオプションの 1 つは、「同じ IP/Cookie からの複数の送信を許可する」です。これは一般に、訪問者がフォームを再送信することを防止/拒否するために使用され、フォームの情報を含むブラウザー Cookie を作成することで機能します。
これは、訪問者がフォームを継続的に再送信するのを防ぐために必要な便利なオプションですが、確実ではありません。 訪問者は、シークレット モード (プライベート ブラウジング) でフォームを簡単に再送信したり、ブラウザの Cookie をクリアしてフォームを再送信したり、Cookie の有効期限が切れるまで待つこともできます。
しかし、一定時間が経過した後にユーザーがフォームを再送信できるようにしたい場合はどうすればよいでしょうか? フォーム再送信のタイムアウトを変更する方法を見てみましょう。
デフォルト設定
デフォルトでは、フォーム再送信のタイムアウトは 90 日に設定されています。 これは適切なデフォルト値ですが、特定の使用例には最適な値ではない可能性があります。 この値を 30 日、7 日、さらには 1 日などの短い値に変更することもできます。
この値を変更する最も簡単な方法は、 appsettings.json
ファイルに新しい値を指定します。 FormsConfig
セクション。 値を 1 日に設定する方法の例を次に示します。
{
"EPiServer": {
"Forms": {
"FormsConfig": {
"VisitorSubmitTimeout": 1
}
}
}
}
値を設定する別の方法は、 ConfigureServices
で機能する Startup.cs
。 値を 1 日に設定する方法の例を次に示します。
services.Configure<FormsConfigOptions>(options => options.VisitorSubmitTimeout = 1);
内にはさらに多くの設定が利用可能です FormsConfigOptions
クラス。 オプションの完全なリストは、 Optimizely Forms のドキュメント。
しかし、この値を 1 日より短く変更したい場合はどうすればよいでしょうか? ではそれはできません FormsConfig
セクションでは、デフォルトの機能ではその値が日数としてのみ考慮されるため、 VisitorSubmitTimeout
プロパティは integer
タイプ。 値を 1 日より短く設定する場合は、カスタム実装を作成する必要があります。
日から秒への切り替え
値を日から秒に変更するには、次の機能を拡張する必要があります。 ProgressiveSubmitInfoService
にあるクラス EPiServer.Forms.Core.Internal
名前空間。
このクラスは 内部名前空間これは、サポートされているパブリック API の一部ではないことを意味します。
このようなクラスは引き続き使用できますが、セマンティック バージョン管理の約束の対象ではないため、事前の警告なしにマイナー リリース間で変更される可能性があります。 このようなクラスの使用に起因する問題についても、通常のサポートの対象外となります。
つまり、これは、Optimizely Forms の将来のバージョンでクラスが変更される可能性があり、実装が壊れる可能性があることを意味します。 ただし、そのリスクを負っても構わない場合は、次の方法でそれを行うことができます。
まず、 ProgressiveSubmitInfoService
クラスを作成してオーバーライドします SetProgressiveSubmitInfo
関数。 この拡張クラスでは、Cookie を変更するだけです。 Expires
現在の秒数に秒を追加するオプション DateTime
日々の代わりに。
public class ExtendedProgressiveSubmitInfoService : ProgressiveSubmitInfoService
{
public override void SetProgressiveSubmitInfo(Guid formContentGuid, HttpContext httpContext, ProgressiveSubmitInfo progressiveSubmitInfo, string formLanguage)
{
var visitorIdentifier = _visitorIdentifyService.Service.GetVisitorIdentifyProvider(httpContext).GetVisitorIdentifier();
if (string.IsNullOrWhiteSpace(visitorIdentifier))
{
return;
}
string progressiveSubmitCookieKey = GetProgressiveSubmitCookieKey(formContentGuid, visitorIdentifier, formLanguage);
httpContext.Response.Cookies.Append(progressiveSubmitCookieKey, progressiveSubmitInfo.ToJson(), new CookieOptions()
{
HttpOnly = true,
Path = "/",
Expires = new DateTimeOffset?((DateTimeOffset)DateTime.Now.AddSeconds(_formConfig.Service.VisitorSubmitTimeout)),
Secure = httpContext.Request.IsHttps
});
}
}
この拡張クラスの使用
この拡張クラスを使用するには、残念ながら、単にそれを ConfigureServices
で機能する Startup.cs
。 を作成する必要があります。 IConfigurableModule
に依存していることを確認します。 EPiServer.Forms.InitializationModule
初期化。 これにより、デフォルトの実装をオーバーライドして、 ExtendedProgressiveSubmitInfoService
クラス。
[InitializableModule]
[ModuleDependency(typeof(EPiServer.Forms.InitializationModule))]
public class FormsInitialization : IConfigurableModule
{
public void ConfigureContainer(ServiceConfigurationContext context)
{
context.ConfigurationComplete += (o, e) =>
{
context.Services.AddSingleton<ProgressiveSubmitInfoService, ExtendedProgressiveSubmitInfoService>();
};
}
public void Initialize(InitializationEngine context) { }
public void Uninitialize(InitializationEngine context) { }
}
このエディターをさらに構成可能にする
このアプローチの 1 つの問題は、すべてのフォームがこれと同じものを使用することです。 VisitorSubmitTimeout
価値。 フォームごとに異なる値を設定したい場合があります。 これをエディターでさらに構成できるようにしたい場合は、もう少し作業が必要です。
まず、カスタムする必要があります FormContainerBlock
。 がある これを行う方法を示すドキュメントが利用可能です。
その習慣に FormContainerBlock
、エディターが設定できるようにする新しいプロパティを追加する必要があります。 VisitorSubmitTimeout
価値:
public class ExtendedFormContainerBlock : FormContainerBlock
{
[Display(Name = "Visitor Submit Timeout (In seconds)", GroupName = SiteConstants.GroupNames.Settings, Order = 1,
Description = "Used when 'Allow multiple submissions from the same IP/cookie' is not checked. Default value is 90 days.")]
[Range(0, int.MaxValue, ErrorMessage = "Only positive number allowed.")]
public virtual double VisitorSubmitTimeout { get; set; }
}
最後に、 ExtendedProgressiveSubmitInfoService
この新しい値を使用するクラス。 また、デフォルトの機能も日を使用するように戻します。
public class ExtendedProgressiveSubmitInfoService : ProgressiveSubmitInfoService
{
protected Injected<IContentLoader> _contentLoader;
public override void SetProgressiveSubmitInfo(Guid formContentGuid, HttpContext httpContext, ProgressiveSubmitInfo progressiveSubmitInfo, string formLanguage)
{
var visitorIdentifier = _visitorIdentifyService.Service.GetVisitorIdentifyProvider(httpContext).GetVisitorIdentifier();
if (string.IsNullOrWhiteSpace(visitorIdentifier))
{
return;
}
string progressiveSubmitCookieKey = GetProgressiveSubmitCookieKey(formContentGuid, visitorIdentifier, formLanguage);
httpContext.Response.Cookies.Append(progressiveSubmitCookieKey, progressiveSubmitInfo.ToJson(), new CookieOptions()
{
HttpOnly = true,
Path = "/",
Expires = GetExpires(formContentGuid),
Secure = httpContext.Request.IsHttps
});
}
private DateTimeOffset? GetExpires(Guid formContentGuid)
{
var expires = new DateTimeOffset?((DateTimeOffset)DateTime.Now.AddDays(_formConfig.Service.VisitorSubmitTimeout));
var currentForm = _contentLoader.Service.Get<IContent>(formContentGuid) as ExtendedFormContainerBlock.ExtendedFormContainerBlock;
if (currentForm != null && currentForm.VisitorSubmitTimeout > 0)
{
expires = new DateTimeOffset?((DateTimeOffset)DateTime.Now.AddSeconds(currentForm.VisitorSubmitTimeout));
}
return expires;
}
}
これにより、別の設定を行うことができるようになりました VisitorSubmitTimeout
各フォームの値を設定することで、訪問者ははるかに短い時間でフォームを再送信できるようになります。
#CMS #の #Optimizely #Forms #での訪問者の送信タイムアウトの変更