0

1 つのプレースホルダーに複数のコンポーネント、異なるコンポーネント タイプ、および同じタイプの複数のページがあります。ページには特定の順序で 3 つのコンポーネントがあります。順序を変更することが望ましいと判断されました。コンポーネントを選択すると、コンポーネントを移動できます。保存を押すまで、コンポーネントは正しく動作しているように見えますが、その後消えます。これは、しばらく前にここに投稿された SO と非常によく似ています。このバグが修正されたことを示すものは見つかりませんでした。参考までに、私は Sitecore 7.1 (rev.140324) を使用しています。

この後、同じタイプのコンポーネントをページに追加しようとしても機能しません。プレゼンテーションの詳細を介してページを初期状態にリセットした後、プレースホルダーにコンポーネントを追加すると、そもそも問題があることが明らかになりました。現時点での回避策は、プレゼンテーションの詳細を介してページを操作することですが、これはコンテンツ エディターにはあまり役に立ちません。回避策として、プレースホルダーをフィールドに明示的に入力し、該当する場合はネストして、ページ上のすべてのコンポーネントを指定する必要があります。

Sitecore ログには何も表示されません。コンポーネントを移動した後、ブラウザー コンソールに「コマンド パラメーターを解析できません」というメッセージが 2 回表示されます。関連する JavaScript:

this.parseCommandClick = function(commandClick) {
var msg = commandClick;
var commandParams = null;
var idx1 = commandClick.indexOf("(");
var idx2 = commandClick.indexOf(")");
if (idx1 >= 0 && idx2 > idx1) {
  msg = commandClick.substring(0, idx1);
  try {
    commandParams = $sc.evalJSON(commandClick.substring(idx1 + 1, idx2));
  }
  catch (e) {
    console.log("Cannot parse command parameters");
  }
}

return { message: msg, params : commandParams};

プレゼンテーションの詳細がページの標準値に設定されている場合、一部のコンポーネントではプレースホルダーが指定されず、他のコンポーネントではネストされません。この問題は、追加されたコンポーネントの特定のプレースホルダーを削除し、それらを移動して保存することで、別の場所で再現できます。これにより、コンポーネントが削除されます。コンソール ログがこれに直接関連しているかどうかはわかりません。

なぜこれが起こっているのかを理解しようとしています。

4

2 に答える 2

1

最終的には (7.1 の時点で) Sitecore がデフォルトで動作する方法であり、変更や構成の問題ではないようです。新しいインスタンスが作成された後、標準値のプレゼンテーションの詳細を介してページにコンポーネントを追加することで、問題を再現することができました。この問題は、プレースホルダー フィールドを空のままにしておくと発生します。この場合、ページにコンポーネントを追加すると、「エラーが発生しました」というメッセージが表示され、コンポーネントを移動すると削除されることがよくあります。したがって、これを修正するには、影響を受けるすべてのアイテムの標準値を変更します。Sitecore が空のフィールドを処理しているときに興味深いことが起こっているようです。これは、私が問題を回避するために使用したアプローチです。

Sitecore サポートは、データ損失を回避するための追加の回避策を返信しました。

添付のレイアウト定義ファイルを \Website\sitecore\shell\Applications\Page Modes フォルダーに置き、ブラウザーのキャッシュをクリアします (js ファイルを置き換えます)。このスクリプトは、コンポーネントの削除を防ぎ、次のメッセージを表示します。プレゼンテーションの詳細 (リボンの [詳細設定] タブ) を介してコンポーネントを選択します。" この回避策は十分にテストされていないことに注意してください。変更を適用する前に、ソリューションをバックアップすることをお勧めします。

LayoutDefinition.js

Sitecore.LayoutDefinition = new function() {
};

Sitecore.LayoutDefinition.insert = function(placeholderKey, id) {
  var layoutDefinition = this.getLayoutDefinition();
  var device = this.getDevice(layoutDefinition);

  var r = new Object();
  r["@id"] = id;
  r["@ph"] = placeholderKey;

  device.r.splice(0, 0, r);

  this.setLayoutDefinition(layoutDefinition);
};

Sitecore.LayoutDefinition.getRendering = function(uid) {
  var layoutDefinition = this.getLayoutDefinition();
  var device = this.getDevice(layoutDefinition);
  if (!device) {
    return null;
  }

  for (var n = 0; n < device.r.length; n++) {
    if (this.getShortID(device.r[n]["@uid"]) == uid) {
      return device.r[n];            
    }
  }
};

Sitecore.LayoutDefinition.remove = function(uid) {
  var layoutDefinition = this.getLayoutDefinition();
  var device = this.getDevice(layoutDefinition);

  this.removeRendering(device, uid);  
  this.setLayoutDefinition(layoutDefinition);
};

Sitecore.LayoutDefinition.removeRendering = function(device, uid) {
  for (n = 0; n < device.r.length; n++) {
    if (this.getShortID(device.r[n]["@uid"]) == uid) {
      r = device.r[n];
      device.r.splice(n, 1);
      return r;
    }
  }
  return null;
};

Sitecore.LayoutDefinition.moveToPosition = function(uid, placeholderKey, position) {
  var layoutDefinition = this.getLayoutDefinition();
  var device = this.getDevice(layoutDefinition);
  var originalPosition = this._getRenderingPositionInPlaceholder(device, placeholderKey, uid);

  for (var totalCount = 0; totalCount < device.r.length; totalCount++)
  {
    var rendering = device.r[totalCount];       
    if (rendering["@ph"]=="")
    {
       window.alert('The component is visually moved but some information could be lost if you move the component in PE.  Please save the changes (reload page if save is disabled) in order to see actual presentation and move the component via the Presentation Details (Advanced tab on the Ribbon).');   
      return;
    }
  }


  var r = this.removeRendering(device, uid);
  if (r == null) {
    return;
  }

  r["@ph"] = placeholderKey;

  if (position == 0) {
     device.r.splice(0, 0, r);
     this.setLayoutDefinition(layoutDefinition);
     return;
  }
  // Rendering is moving down inside the same placeholder. Decrement the real position, because rendering itself is removed 
  // from his original position. 
  if (originalPosition > -1 && originalPosition < position) {
    position--;
  }

  var placeholderWiseCount = 0;
   var flag = true;
  for (var totalCount = 0; totalCount < device.r.length; totalCount++)
  {
    var rendering = device.r[totalCount];       
    if (Sitecore.PageModes.Utility.areEqualPlaceholders(rendering["@ph"], placeholderKey))
    {
      placeholderWiseCount++;
    }

    if (placeholderWiseCount == position)
    {    
      device.r.splice(totalCount + 1, 0, r);
      break;
    }
  }

  this.setLayoutDefinition(layoutDefinition);
};

Sitecore.LayoutDefinition.getRenderingConditions = function(renderingUid) {
  if (!Sitecore.PageModes.Personalization) {
    return [];
  }

  var layoutDefinition = this.getLayoutDefinition();
  var device = this.getDevice(layoutDefinition);
  var conditions = [];
  for (var i = 0; i < device.r.length; i++) {
    if (this.getShortID(device.r[i]["@uid"]) == renderingUid && device.r[i].rls) {
      var rules = device.r[i].rls.ruleset;
      if (rules && rules.rule) {
        if(!$sc.isArray(rules.rule)) {
          rules.rule = [rules.rule];
        }

        for (var j = 0; j < rules.rule.length; j++) {
          var conditionId = rules.rule[j]["@uid"];
          var isActive = Sitecore.PageModes.Personalization.ConditionStateStorage.isConditionActive(renderingUid, conditionId);
          conditions.push(new Sitecore.PageModes.Personalization.Condition(
            conditionId,
            rules.rule[j]["@name"],
            isActive
          ));
        }
      }
    }
  }

  return conditions;
};

Sitecore.LayoutDefinition.GetConditionById = function(conditionId) {
  var layoutDefinition = this.getLayoutDefinition();
  var device = this.getDevice(layoutDefinition);  
  for (var i = 0; i < device.r.length; i++) {
     var rules = device.r[i].rls ? device.r[i].rls.ruleset: null;
     if (rules && rules.rule) {
        if(!$sc.isArray(rules.rule)) {
          rules.rule = [rules.rule];
        }

        for (var j = 0; j < rules.rule.length; j++) {
          if (rules.rule[j]["@uid"] == conditionId) {
            return {rule : rules.rule[j]};
          }
        }
     }
  }

  return {};
};

Sitecore.LayoutDefinition.getRenderingIndex = function(placeholderKey, index) {
  var layoutDefinition = this.getLayoutDefinition();
  var device = this.getDevice(layoutDefinition);

  var i = 0;

  for (n = 0; n < device.r.length; n++) {
    if (device.r[n]["@ph"] == placeholderKey) {
      if (i == index) {
        return n;
      }

      i++;
    }
  }

  return -1;
};

Sitecore.LayoutDefinition.getRenderingPositionInPlaceholder = function(placeholderKey, uid) {
  var layoutDefinition = this.getLayoutDefinition();
  var device = this.getDevice(layoutDefinition);
  return this._getRenderingPositionInPlaceholder(device, placeholderKey, uid);
};

Sitecore.LayoutDefinition.getLayoutDefinition = function() {
  return JSON.parse($sc("#scLayout").val());
};

Sitecore.LayoutDefinition.setLayoutDefinition = function(layoutDefinition) {
  var newValue = $sc.type(layoutDefinition) === "string" ? layoutDefinition : JSON.stringify(layoutDefinition);
  if ($sc("#scLayout").val() != newValue) {
    $sc("#scLayout").val(newValue);
    Sitecore.PageModes.PageEditor.setModified(true);
  }
};

Sitecore.LayoutDefinition.getDeviceID = function() {
  return $sc("#scDeviceID").val();
};

Sitecore.LayoutDefinition.getDevice = function(layoutDefinition) {
  var deviceID = this.getDeviceID();

  if (!layoutDefinition.r.d) {
    return null;
  }

  //By serialization behaivour. If there is single element- it would not be serialized as array
  if (!layoutDefinition.r.d.length) {
    layoutDefinition.r.d = [layoutDefinition.r.d];
  }

  var list = layoutDefinition.r.d;

  for (var n = 0; n < list.length; n++) {
    var d = list[n];

    var id = this.getShortID(d["@id"]);

    if (id == deviceID) {
      //By serialization behaivour. If there is single element- it would not be serialized as array
      if (d.r && !d.r.length) {
        d.r = [d.r];
      }
      return d;
    }
  }

  return null;
};

Sitecore.LayoutDefinition.getShortID = function(id) {
  return id.substr(1, 8) + id.substr(10, 4) + id.substr(15, 4) + id.substr(20, 4) + id.substr(25, 12);
};

Sitecore.LayoutDefinition.readLayoutFromRibbon = function() {
  var layout = Sitecore.PageModes.PageEditor.ribbon().contentWindow.$("scLayoutDefinition").value;    
  if (layout && layout.length > 0) {
    this.setLayoutDefinition(layout);
    return true;
  }

  return false;
};

Sitecore.LayoutDefinition._getRenderingPositionInPlaceholder = function(device, placeholderKey, uid) {
  var counter = 0;
  for (var i = 0; i < device.r.length; i++) {
    if (Sitecore.PageModes.Utility.areEqualPlaceholders(device.r[i]["@ph"],placeholderKey)) {
      if (this.getShortID(device.r[i]["@uid"]) == uid) {
        return counter;
      }

      counter++;
    }
  }

  return -1;
};
于 2014-09-22T19:08:02.660 に答える
0

このブログ投稿を読んでください。同じ問題が発生している可能性があります。つまり、(バグとして報告されていた) 問題は次のとおりです。

ページ エディターは、挿入されたコントロールのテンプレートが /sitecore/templates/System/Layout/Renderings/Sublayout テンプレートであるかどうかを確認します。コントロールがそのテンプレートに基づいていない場合、コントロールはサブレイアウトとして識別できません。

私の場合、この問題は Sitecore 6.5 で発生し、6.6 SP2 で修正されたと思われるため、7.1 でも修正されるはずです。

于 2014-09-19T06:51:40.077 に答える