Sitecore XP 8.1あるいはSitecore XP 8.2からそれ以降のバージョンにアップグレードする際にレンダリングの順序を保持する方法について


解説

Sitecore XPインスタンスを8.2 Update-7にアップグレードすると、レイアウト デルタがp:before=""のみで構成されている場合、レンダリングの順序が変わる可能性があります。その結果、コンテンツがフロントエンド サイトに正しく表示されません。

以前のSitecore XPバージョン(8.1 Update-1以前)では、レイアウト デルタは、p:before=""属性のみを使用して上から下まで作成・処理されていました。

Sitecore XP 8.1 Update-2からSitecore XP 8.2 Update-6までは、レイアウト デルタは、以下の属性セットを使用して上から下まで作成・処理されていました:

Sitecore XP 8.2 Update-7(Sitecore 9.0 Update-2に統合)以降、関連する問題を修正する一環として、解析ロジックが変更されました。そのため、レイアウト デルタは、上記の属性セットを使用して逆の順序で解析されています。

解決策

この問題を解決するには、以下を実行してください:

  1. 影響を受けるデータベースをバックアップします。
  2. デフォルトのSitecoreインスタンス(Sitecore XP 8.1 Update-2からSitecore XP 8.2 Update-6まで)をインストールします。
  3. 影響を受けるデータベース(masterなど)を使用するようにインスタンスを構成します。
  4. 以下のコードを使用して、影響を受けるアイテムのレイアウト デルタを再作成します。インストールされたインスタンスのWebサイトのルート フォルダーの下にaspxページを作成し、Page_Loadメソッドにコードを配置できます。
    //影響を受けるすべてのアイテム(すべてのコンテンツ アイテムまたは特定のテンプレートのアイテムである可能性があります)を収集し、アイテムごとに以下の方法を使用します:
    
    public void UpdateLayoutField(Item item)
    {
      bool isSharedLayoutFieldUpdated = false;
    
      foreach (var language in item.Languages)
      {
        Item itemInLanguage = _database.GetItem(item.ID, language);
        if (itemInLanguage.Versions.Count > 0)
        {
          foreach (Item itemVersion in itemInLanguage.Versions.GetVersions())
          {
            foreach (Field f in itemVersion.Fields)
            {
              if (f.ID == FieldIDs.FinalLayoutField)
              {
                itemVersion.Editing.BeginEdit();
                string fieldValue = Sitecore.Data.Fields.LayoutField.GetFieldValue(itemVersion.Fields[FieldIDs.FinalLayoutField]);
                LayoutField.SetFieldValue(f, fieldValue);
                itemVersion.Editing.EndEdit();
              }
            }
    
            if (!isSharedLayoutFieldUpdated)
            {
              foreach (Field f in itemVersion.Fields)
              {
                if (f.ID == FieldIDs.LayoutField)
                {
                  itemVersion.Editing.BeginEdit();
                  string fieldValue = LayoutField.GetFieldValue(itemVersion.Fields[FieldIDs.LayoutField]);
                  LayoutField.SetFieldValue(f, fieldValue);
                  itemVersion.Editing.EndEdit();
    
                  isSharedLayoutFieldUpdated = true;
                }
              }
            }
          }
        }
      }
    }