5

我按照如何在 Tridion 的功能区中水平创建自定义按钮一个低于另一个中提到的文章设法获得了一个新的功能区组

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

我在配置中有这个:

<!-- 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() 尝试了不同的参数,但它永远不会被调用。这是正确的方法吗?或者是否有另一种方法可以在主页功能区工具栏上调用脚本?

4

3 回答 3

3

除了命令容器(阅读按钮)之外,我从未真正将组视为其他任何东西。所以我使用的唯一界面是Tridion.Cme.Command按钮 JavaScript。

但我认为您正在寻找的是您可以在ContentGroup.ascx.cs中指定的 ControlResource

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
    {
    }
}

现在,您可以Tridion.ControlBase在 JavaScript 中使用该接口。

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();
};
于 2012-08-29T10:14:00.193 回答
1

@Bart,我尝试了解决方案,但无法让它发挥作用。

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

然而,我确实找到了一种方法来访问“主页”功能区页面并让它从那里触发事件。

我需要的额外内容是 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");
于 2012-08-29T11:55:09.533 回答
1

我在这里可能会偏离标准,但听起来您在同一组下有一系列按钮,并且您希望它们在可用性方面表现一致。

我有一个类似的情况,我需要在 Save、Save & Close 和 Save & New 操作上触发相同的事件。我最终做的是将代码编写为 Save 命令扩展(大致基于 Jaime在此处的详细信息),然后,从 SaveClose 和 SaveNew 扩展中,我将调用 Save._isEnabled 和 Save._isAvailable 函数来确定我的命令是否可用,并且每当编辑者单击 SaveClose 和 SaveNew 时 Save._execute。

虽然不像彼得的建议那么优雅,但完成了工作。

于 2012-08-30T15:57:38.787 回答