Tridion 功能区组上的Javascript

Tridion 功能区组上的Javascript,tridion,tridion-2011,Tridion,Tridion 2011,我通过阅读中提到的文章,获得了一个新的ribbon组 我现在尝试在Gui中发生变化时运行Javascript(隐藏/显示按钮) 我在配置中有以下内容: /Scripts/CreateRibbonGroup.js Tridion.Web.UI.Editors.CME ~/Scripts/ContentGroup.ascx ClientGuiMods.ContentGroup 在Javascript中: Type.registerNamespace(“ClientGuiMods”); Clien

我通过阅读中提到的文章,获得了一个新的ribbon组

我现在尝试在Gui中发生变化时运行Javascript(隐藏/显示按钮)

我在配置中有以下内容:


/Scripts/CreateRibbonGroup.js
Tridion.Web.UI.Editors.CME
~/Scripts/ContentGroup.ascx
ClientGuiMods.ContentGroup
在Javascript中:

Type.registerNamespace(“ClientGuiMods”);
ClientGuiMods.ContentGroup=函数ContentGroup(元素)
{
log('RibbonGroupCreated');
enableInterface(这是“ClientGuiMods.ContentGroup”);
这个.addInterface(“Tridion.Controls.RibbonItemsGroup”,[element]);
};

我为此尝试了不同的参数。addInterface(),但它从未被调用。这是正确的方法吗?或者是否有其他方法可以在主功能区工具栏上调用脚本?

我从来没有真正将组视为命令容器(读取按钮)之外的任何东西。所以我使用的唯一界面是JavaScript按钮上的
Tridion.Cme.Command

但我认为您需要的是可以在ContentGroup.ascx.cs中指定的ControlResource

使用Tridion.Web.UI.Core;
使用Tridion.Web.UI.Controls;
使用Tridion.Web.UI.Core.Controls;
名称空间ClientGuiMods
{
[ControlResources(“ClientGuiMods.ContentGroup”)]
公共类内容组:TridionUserControl
{
}
}
现在,您可以在JavaScript中使用
Tridion.ControlBase
接口

Type.registerNamespace(“ClientGuiMods”);
ClientGuiMods.ContentGroup=函数ContentGroup(元素){
log('RibbonGroupCreated');
enableInterface(这是“ClientGuiMods.ContentGroup”);
这个.addInterface(“Tridion.ControlBase,[element]);
};
ClientGuiMods.ContentGroup.prototype.initialize=函数ContentGroup$initialize(){
//控件在这里初始化,我们现在可以使用以下属性
var props=this.properties;
var控制=道具控制;
var container=this.getElement();
};

@Bart,我试过这个解决方案,但没能奏效

在chrome中进一步挖掘Javascripts,我发现没有钩子可以作为RibbonGroup启动任何额外的Javascript(如果我错了,请纠正我)

不过,我确实找到了一种方法,可以进入“主页”RibbonPage并从那里启动活动

我还需要在DOM中名为Homepage的RibbonPage上添加一个“c:pagetype='Homepage'”,默认情况下不在那里。这可以通过在末尾包含加载事件脚本来设置。 现在我的脚本看起来像这样

Type.registerNamespace("ClientGuiMods");

ClientGuiMods.CreateRibbonPage = function CreateRibbonPage(element)
{
    Tridion.OO.enableInterface(this, "ClientGuiMods.CreateRibbonPage");
    this.addInterface("Tridion.Controls.RibbonPage", [element]);
};
ClientGuiMods.CreateRibbonPage.prototype.updateState = function CreateRibbonPage$updateState(stateObject)
{
    //...
    //Ribbonpage logic to update the state of your buttons and groups
};

console.log('Homepage: ' + document.getElementById('HomePage')); //.setAttribute('c:pagetype', 'HomePage');

var ClientScripts = {
    registerHomepage: function() {
        console.log('adding c:pagetype att');

        var homepage = document.getElementById('HomePage');

        if (homepage) {

            homepage.setAttribute('c:pagetype', 'HomePage');


        }
    }
}
if (document.addEventListener && !Tridion.Utils.Dom.isIE)
    $evt.addEventHandler(window, "DOMContentLoaded", ClientScripts.registerHomepage);
else
    $evt.addEventHandler(window, "readystatechange", ClientScripts.registerHomepage);

Tridion.Controls.Deck.registerPageType(ClientGuiMods.CreateRibbonPage, "HomePage");

我在这里可能有点不对劲,但听起来好像在同一个组下有一系列按钮,您希望它们在可用性方面表现一致

我有一个类似的案例,我需要在Save、Save&Close和Save&New操作中触发相同的事件。我最后做的是将代码编写为Save命令扩展名(基本上基于Jaime的详细信息),然后从SaveClose和SaveNew扩展名调用Save。_isEnabledand Save。_isAvailable函数确定我的命令是否可用,以及Save.\u在编辑器单击SaveClose和SaveNew时执行


虽然不像Peter的建议那样优雅,但完成了任务。

用缺少的initialize方法更新了我的代码示例,不确定这是否有什么不同。在我看来,您在这里走错了方向。请你澄清一下你想做什么(见我的评论),也许我们可以找到一个更适合现有框架的解决方案……你想做什么还不清楚。您所说的“我现在试图在Gui中发生变化时运行Javascript(隐藏/显示按钮)”是什么意思?通常,您将实现一个命令,然后将其连接到一个按钮。如果命令已启用,则按钮将被启用,等等。然后单击按钮时,执行命令。按钮将定期自动更新,例如当列表中的选择更改时。@PeterKjaer:我有一个功能区按钮组,由ascx组成。这一部分我是按照巴特的文章完成的。我现在有了一个功能区按钮组,其中的一些按钮也位于“主页”和“创建功能区”上。我现在要做的是隐藏不可用的按钮(或命令),这与CreateRibbonPage上发生的事情是一样的。CreateRibbonPage的不同之处在于,我是在一个ribbon组中完成这一切的。我可以在每个按钮上都这样做,但我可能需要单独实现每个按钮。底线是我想在功能区页面上完成我可以完成的相同事情,但只是在功能区组上。我提供的解决方案将挂钩到添加功能区组的功能区页面(本例中为Home),并在此处运行逻辑。我对更好的解决方案持开放态度。从你刚才所说的,我看不出有任何理由偏离现有的指挥模式。如果您希望避免代码重复,只需为各种命令创建一个基类,实现您想要用于禁用或隐藏按钮的任何逻辑。关键是,您的命令应该独立于按钮的添加位置或添加方式。@PeterKjaer我知道大多数按钮逻辑应该编程到命令中,以使其松散耦合。但是,在这种情况下,它是否应该可见的逻辑取决于它出现的功能区(组)。大部分的代码都是从默认的创建功能区页面借用来的,在那里同样的事情也在发生。客户端的要求是合并主功能区并创建功能区。一些按钮需要移除,其他按钮不应显示