如何使用JavaScript获取组件和组件模板tcm id?

时间:2012-07-20 12:52:46

标签: tridion tridion-2011

我需要从任何Tridion页面的Component Presentation选项卡中获取组件和组件模板tcm ID。

情景:

  • 在Tridion的现有页面上。
  • 转到“组件演示”选项卡。
  • 当我点击“插入”按钮时,我想迭代组件和组件模板tcm id并在JavaScript警告框中显示它。

我想找到确切的javascript文件/函数来完成这个,我找不到确切的。

我正在使用SDL Tridion 2011 SP1。

任何帮助/建议都将受到高度赞赏。

修改

我有这个脚本,当我们点击“插入组件演示文稿”窗口中的“插入”按钮时会触发该脚本。

 
Tridion.Cme.Views.InsertCpDialog.prototype.onInsertClick = 
                    function InsertCpDialog$onInsertClick()
{
  var p = this.properties;
  var c = p.controls;
  var templateId = c.templateSelect.getValue();
  var components = c.list.getSelection().getItems();

  p.componentPresentationsAdded += components.length;

  var compId = components[components.length - 1];
  var component = $models.getItem(compId);
  if (component)
  {
    var userSettings = Tridion.UI.UserSettings.getInstance();
    if (userSettings && userSettings.isLoaded())
    {
      Tridion.UI.UserSettings.setLastSelectedLocation(
          component.getPublicationId(), $const.ItemType.COMPONENT, p.contextUri);
    }
  }

  this.fireEvent("insert", {
    components: components,
    template: templateId
  });
};

所以在这里我将获得所选组件和模板“compId”&的tcm id。 “templateId”,即插入。现在我的问题是:如何检查组件演示文稿选项卡上是否已存在此组件和模板?

如果我能以某种方式获得页面上已存在的所有组件和模板的ID(来自我的“插入”按钮),那么我可以比较它们。但我没有得到任何能给我这些身份的功能。在这里我被困住了。

修改

我正在尝试使用这些代码进入页面,但是我无法获得正确的函数,该函数在单击Insert时被触发,或者将返回我列出的组件和模板ID列表。

Extensions.Test.prototype.isEnabled = function Test$isEnabled(selection) {
  try
  {
    console.log($controls);
    var masterTabControl = $controls.getControl($("#MasterTabControl"), 
                                            "Tridion.Controls.TabControl");

    console.log(masterTabControl);
    alert("Mastercontrol - ComponentpresentationsTab");
    console.log(masterTabControl.getPage("ComponentPresentationsTab"));
    console.log("list of component presentations");
    console.log(masterTabControl.getPage("ComponentPresentationsTab").
                             getListComponentPresentations().getItems());
    console.log("list of get xml");
    console.log(masterTabControl.getPage ("ComponentPresentationsTab").
                             getListComponentPresentations().getItems().getXml);
  }
  (catch exc)
  {
  }
  return true;
}

修改 我使用此代码获得了CP TAB下列出的所有CP ID。感谢@Frank van Puffelen

var p = this.properties;
var tgp = this.properties;
var c = p.controls;

var pageId = selection.getItem(0);
var masterTabControl = $controls.getControl($("#MasterTabControl"), 
                                            "Tridion.Controls.TabControl");
var compPresTab = masterTabControl.getPage("ComponentPresentationsTab");
var comPresList = p.compPresTab.getListComponentPresentations(); 
for (var i = 0; i <= myStringArray.length; i++) 
{     
  console.log(comPresList.getItems()[i].getComponentId());
  console.log(comPresList.getItems()[i].getComponentTemplateId());     
}

2 个答案:

答案 0 :(得分:3)

获得“页面”对话框的“组件演示”选项卡后,您可以获得此类组件演示文稿列表

 
comPresList = compPresTab.getListComponentPresentations();

您可以像这样检查XML格式的列表:

comPresList.getXml()

或者,正如您正在尝试使用代码段,您可以使用以下方式获取项目:

comPresList.getItems()

这会为您提供Tridion.ContentManager.ComponentPresentation个对象的列表,您可以在其中调用getComponentIdgetComponentTemplateId

comPresList.getItems()[0].getComponentId()
comPresList.getItems()[0].getComponentTemplateId()

我通过the snippet that John Winter provided you earlier获取此信息,将其粘贴到Chrome JavaScript控制台,然后在源树(光盘上)上执行一些文本搜索,以查找"insert"等关键短语(查找insert事件的所有处理程序)和ComponentPresentation =(查找ComponentPresentation类)。

答案 1 :(得分:2)

我在这里回答了这个问题:restrict user to insert same component and template

似乎问题已经改变,因为答案现在似乎并不相关,但我相信这会帮助你弄清楚你需要做什么。