功能区组上的Javascript

时间:2012-08-29 09:00:40

标签: tridion tridion-2011

我按照How to create the custom buttons horizontally one below the other in ribbon of Tridion

中提到的文章设法获得了一个新的功能区组

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

我在配置中有这个:

<!-- In the cfg:groups part -->
<cfg:group name="ClientGuiMods.ContentGroup" description="">
    <cfg:fileset>
        <cfg:file type="script">/Scripts/CreateRibbonGroup.js</cfg:file>
    </cfg:fileset>
    <cfg:dependencies>
        <cfg:dependency>Tridion.Web.UI.Editors.CME</cfg:dependency>
    </cfg:dependencies>
</cfg:group>

<!-- In the ribbontoolbars add part -->
<ext:extension pageid="HomePage" name="Content" assignid="ContentGroupId">
    <ext:group>~/Scripts/ContentGroup.ascx</ext:group>
    <ext:dependencies>
        <cfg:dependency>ClientGuiMods.ContentGroup</cfg:dependency>
    </ext:dependencies>
    <ext:apply>
        <ext:view name="DashboardView">
            <ext:control id="DashboardToolbar" />
        </ext:view>
    </ext:apply>
</ext:extension>

这是在Javascript:

Type.registerNamespace("ClientGuiMods");

ClientGuiMods.ContentGroup = function ContentGroup(element)
{
    console.log('RibbonGroupCreated');
    Tridion.OO.enableInterface(this, "ClientGuiMods.ContentGroup");
    this.addInterface("Tridion.Controls.RibbonItemsGroup", [element]);
};

我为this.addInterface()尝试了不同的参数,但它永远不会被调用。这是正确的方法吗?或者是否有另一种方法可以在Home Ribbon工具栏上调用脚本?

3 个答案:

答案 0 :(得分:3)

除了命令容器(读取按钮)之外,我从来没有真正看过这个组。所以我使用的唯一界面是按钮JavaScript上的Tridion.Cme.Command

但我认为您所寻找的是ControlResource,您可以在 ContentGroup.ascx.cs

中指定
using Tridion.Web.UI.Core;
using Tridion.Web.UI.Controls;
using Tridion.Web.UI.Core.Controls;

namespace ClientGuiMods
{
    [ControlResources("ClientGuiMods.ContentGroup")]
    public class ContentGroup : TridionUserControl
    {
    }
}

现在,您可以在JavaScript中使用Tridion.ControlBase界面。

Type.registerNamespace("ClientGuiMods");

ClientGuiMods.ContentGroup = function ContentGroup(element) {
    console.log('RibbonGroupCreated');
    Tridion.OO.enableInterface(this, "ClientGuiMods.ContentGroup");
    this.addInterface("Tridion.ControlBase", [element]);
};

ClientGuiMods.ContentGroup.prototype.initialize = function ContentGroup$initialize() {
    // the control is initialized here, we can use the following properties now
    var props = this.properties;
    var controls = props.controls;
    var container = this.getElement();
};

答案 1 :(得分:1)

@Bart,我尝试了解决方案,但是不能让它发挥作用。

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

然而,我确实找到了一种方法来访问“HomePage”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");

答案 2 :(得分:1)

我可能会在这里留下痕迹,但听起来你在同一组下面有一系列按钮,并且你希望它们在可用性方面表现一致。

我有一个类似的情况,我需要在Save,Save&amp;关闭并保存&amp;新业务。我最终做的是将代码编写为Save命令扩展(广泛基于Jaime的详细信息here)然后,从SaveClose和SaveNew扩展我将调用Save._isEnabled和Save._isAvailable函数来确定我的命令是否可用,以及编辑器点击SaveClose&amp;时保存的Save._execute。 SaveNew。

虽然没有Peter的建议那么优雅,但完成了工作。