CMS 12 の Optimizely Forms での訪問者の送信タイムアウトの変更

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 #での訪問者の送信タイムアウトの変更

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Recent News

Editor's Pick