我按照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工具栏上调用脚本?
答案 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的建议那么优雅,但完成了工作。