2014-09-18 76 views
0

我在一个占位符,不同组件类型和多个相同类型的多个组件的页面。在页面上有特定顺序的3个组件。改变订单被认为是可取的。选择组件允许移动组件,它会看起来正常工作,直到点击保存,然后它消失。这与SOO发布的帖子非常相似here。我还没有发现任何指示这个错误已被修复的东西。作为参考,我使用Sitecore 7.1(rev.140324)。Sitecore页面编辑器移动和添加组件的问题

之后,尝试向页面添加相同类型的组件也不起作用。通过显示详细信息将页面重置为初始状态后,显然向占位符添加组件是有问题的。现在,解决方法是通过演示详细信息来操作页面,这对内容编辑器来说不是很有帮助。解决方法需要在字段中明确输入占位符,并在适用的位置嵌套页面上的所有组件。

Sitecore日志没有显示任何内容。移动组件后,浏览器控制台显示两次“无法解析命令参数”。相关的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}; 

当演示细节页面的标准值设定,而不是为某些组件指定的占位符,而不是嵌套别人。该问题可以在其他地方复制,方法是删除添加组件的特定占位符,然后移动它们并保存。这会导致组件被删除。我不确定控制台日志与此直接相关。

我想弄明白为什么会发生这种情况。

+0

您可以加入您的网页代码? – 2014-09-18 17:12:08

+0

在Sitecore日志或浏览器控制台窗口中引发任何错误? – jammykam 2014-09-18 17:21:54

回答

1

看来Sitecore在默认情况下是如何工作的(截至7.1),而不是修改和配置的问题。在创建新实例后,我可以通过在标准值中通过显示详细信息向页面添加组件来重新创建问题。问题出现在将占位符字段留空的情况下。如果是这种情况,那么在页面中添加一个组件会给出消息:“发生错误”并且移动组件通常会导致删除。所以修正这个问题就是改变所有受影响项目的标准值。 Sitecore处理空字段时会出现有趣的事情。这是我用来解决问题的方法。

Sitecore的支持与额外的解决办法回答,以避免数据丢失:

把附加布局定义文件到 \网站\ Sitecore的\壳\应用程序\页面模式文件夹,并清空 浏览器缓存(替换你的js文件)。此脚本可防止组件 移除,并显示以下消息:“组件可移动,但移动组件012xx,但如果您在 PE中移动组件,则某些信息可能会丢失。请保存更改(如果保存被禁用则重新加载),以便 请参阅实际演示文稿并通过演示文稿 详细信息(功能区上的高级选项卡)移动组件。“请注意,这个 解决方法未经过深入测试,我们建议您在应用任何更改之前备份您的 解决方案。

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; 
}; 
+0

我填写了一张支持凭单,Sitecore目前正在调查此问题。 – 2014-10-13 19:11:54

0

阅读this博客文章,您可能会遇到同样的问题。总之,(这已被报告为一个bug)的问题是:插入的控件的模板

页面编辑器检查是否是 的/ Sitecore的/模板/系统/布局/效果图/ Sublayout模板。 如果控件不是基于该模板,则控件不能被标识为Sublayout的 。

在我的情况下,这个问题出现在Sitecore 6.5中,据推测固定在6.6 SP2中,所以它肯定会在7.1中修复。

+0

这似乎不会导致我遇到的问题。 – 2014-09-19 21:13:40

相关问题