1708486158
2024-02-20 16:30:46
昨日同僚から、カタログ コンテンツのプロパティをどのように移行すればよいか尋ねられました。 残念ながら、それを行うための正式な方法はありません。 ただし、非公式な方法がいくつかあります。 今日は、安全性と下位互換性の観点から、私が個人的に推奨する方法を検討します。
あるとしましょう FashionProduct とともに MSRP タイプのプロパティ Money、今度はこれを次のように変更したいと思います。 Decimal 。 これを行うためのハッキングな方法がいくつかありますが、それらはすべてデータベースの直接操作を必要とするため、可能であれば回避する必要があります。
まず、このコードが必要になります。 それは私の同僚から「盗まれ」、数え切れないほど使用されてきました。 将来役立つ可能性が高いので、ブックマークしておくとよいでしょう (必要なときに毎回見つけなければならないので、おそらく自分でブックマークする必要があります)。 これは、必要なコンテンツ タイプに基づいてカタログ構造を横断するためのスニペットです。
public virtual IEnumerable GetEntriesRecursive(ContentReference parentLink, CultureInfo defaultCulture) where T : EntryContentBase
{
foreach (var nodeContent in LoadChildrenBatched(parentLink, defaultCulture))
{
foreach (var entry in GetEntriesRecursive(nodeContent.ContentLink, defaultCulture))
{
yield return entry;
}
}
foreach (var entry in LoadChildrenBatched(parentLink, defaultCulture))
{
yield return entry;
}
}
private IEnumerable LoadChildrenBatched(ContentReference parentLink, CultureInfo defaultCulture) where T : IContent
{
var start = 0;
while (true)
{
var batch = _contentLoader.GetChildren(parentLink, defaultCulture, start, 50);
if (!batch.Any())
{
yield break;
}
foreach (var content in batch)
{
// Don't include linked products to avoid including them multiple times when traversing the catalog
if (!parentLink.CompareToIgnoreWorkID(content.ParentLink))
{
continue;
}
yield return content;
}
start += 50;
}
}
一度に多くのコンテンツを読み込まないように、バッチのサイズは 50 に設定されていますが、もちろんこれは (あなた次第で) 構成可能です。
ここからが楽しい部分で、実際に動作するところです。 コンテンツを取得したら、実際にデータを移行する必要があります。これは次のように簡単です。
private void MigrateProperty(IEnumerable contents) where T: EntryContentBase
{
var batch = new List();
foreach(var content in contents)
{
var writeableClone = content.CreateWriteableClone();
Transform(writeableClone);
batch.Add(writeableClone);
}
_contentRepository.Publish(batch, PublishAction.SyncDraft);
}
とともに Transform このメソッドでは、プロパティ値を使って何でも行うことができます。 名前を変更したいだけかもしれませんが、新しいプロパティに値を割り当てること以外は何もできません。 または、冒頭で述べた場合、変換します Money に Decimal 簡単な作業です (Money の精度の低いバージョンです Decimal)。 データ型間で変換する場合、たとえば、 double に int 、データが失われる可能性がありますが、おそらくすでにそれを認識しているでしょう。
最後のステップは、変更を公開することです。 パフォーマンス上の理由から、おそらく、 Publish の拡張方法 IContentRepository 複数のコンテンツを 1 つのバッチで保存します (サイズは 50 または 100 です)。最適なパフォーマンスを得るために新しいバージョンを作成するなどの作業は省略されます。 ここで読むことができます コマース向けの新しいシンプルなバッチ保存 API | Optimizely 開発者 C
残る問題はそれをどこに置くかです。 完璧な世界では、移行ステップ (つまり、 IMigrationStep ) なので、新しいプロパティにアクセスする新しいコードや、移行後のコンテンツのインデックス作成など、他の作業を実行する前に、データが適切に移行されることを確認できます。 ただし、大規模なカタログがある場合、これには時間がかかるため、カタログが完了するまでユーザーを待たせるのは得策ではない可能性があります。 そのためには、これをスケジュール ジョブで実行し、それが完了したら切り替えるのが合理的です。
プロパティの移行は簡単または迅速な作業ではありませんが、比較的簡単に実行できます。 また、モデリングについても思い出させます。移行する必要がないように、最初から正しく行うようにしてください。 結局のところ、最も速いコードは、実行する必要のないコードです。
#カタログ #コンテンツ #プロパティの移行 #Quan #Mai #のブログ