2012-08-29 6 views
5

habe ich es geschafft, indem Sie die Artikel erwähnt eine neue Ribbon-Gruppe erhalten in How to create the custom buttons horizontally one below the other in ribbon of TridionJavascript auf Ribbon-Gruppe

Ich bin jetzt ein Javascript ausgeführt wird, wenn sich etwas ändert in der Gui (versteckt/zeigt Tasten) zu erhalten versuchen.

Ich habe dies in der Konfiguration:

<!-- 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> 

Und dies in der Javascript:

Type.registerNamespace("ClientGuiMods"); 

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

ich verschiedene Argumente für this.addInterface() versucht haben, aber es wird nie genannt. Ist das der richtige Weg? Oder gibt es vielleicht einen anderen Weg, um ein Skript in der Home-Multifunktionsleisten-Symbolleiste aufzurufen?

+0

Es ist überhaupt nicht klar, was Sie zu tun versuchen. Was meinst du mit "Ich versuche jetzt, ein Javascript laufen zu lassen, wenn sich etwas im Gui ändert (Schaltflächen verstecken/anzeigen)."? Normalerweise würden Sie einen Befehl implementieren, den Sie dann an eine Schaltfläche anschließen würden.Wenn der Befehl aktiviert ist, wird die Schaltfläche aktiviert usw. Wenn Sie auf die Schaltfläche klicken, wird der Befehl ausgeführt. Die Schaltflächen werden regelmäßig automatisch aktualisiert, z. B. wenn sich die Auswahl in der Liste ändert. –

+0

@PeterKjaer: Ich habe eine Multifunktionsleisten-Schaltflächengruppe, die aus einem Ascx besteht. Diesen Teil habe ich geschafft, indem ich dem Artikel von Bart folgte. Ich habe jetzt eine Ribbon-Button-Gruppe mit einigen Buttons, die auch auf dem Home-Bereich sind und Bänder erstellen. Ich versuche nun, die nicht verfügbaren Schaltflächen (oder Befehle) zu verbergen, die auf der CreateRibbonPage vorkommen. Der Unterschied zu CreateRibbonPage ist, dass ich das alles in einer Ribbon-Gruppe mache. Ich könnte dies auf jedem Knopf tun, aber dann müsste ich wahrscheinlich jeden Knopf einzeln implementieren. –

+0

Bottomline ist ich möchte das gleiche erreichen, was ich kann auf einer Multifunktionsleiste Seite, aber nur auf einer Multifunktionsleiste Gruppe. Die Lösung Ich habe Hooks in die Ribbon-Seite eingefügt, wo die Ribbon-Gruppe hinzugefügt wurde (Home in diesem Beispiel) und führe die Logik hier aus. Ich bin offen für eine bessere Lösung. –

Antwort

1

@Bart, ich versuchte die Lösung, aber das konnte nicht funktionieren.

Ein wenig weiter in den Javascripts in Chrom graben Ich fand, dass es keinen Haken gibt, um zusätzliches Javascript als RibbonGroup auszulösen (korrigiere mich, wenn ich falsch liege).

Ich habe jedoch einen Weg gefunden, um auf die 'HomePage' RibbonPage zu kommen und es von dort Ereignisse zu feuern.

Das Extra, was ich brauche, ist ein "c: pagetype = 'Homepage'" auf der RibbonPage mit dem Namen HomePage im DOM, die nicht standardmäßig vorhanden ist. Dies kann festgelegt werden, indem am Ende ein Load-Ereignis-Skript eingefügt wird. So jetzt sieht mein Skript so aus.

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"); 
+0

aktualisiert mein Codebeispiel mit der fehlenden Initialize-Methode, nicht sicher, ob das einen Unterschied macht –

+0

Es scheint mir, dass Sie hier in die falsche Richtung bewegen. Könntest du klarstellen, was du zu tun versuchst (siehe meinen Kommentar oben) und vielleicht könnten wir eine Lösung finden, die besser zum bestehenden Framework passt ... –

3

Ich habe die Gruppe nie wirklich als etwas anderes als einen Container für Befehle (Leseknöpfe) angesehen. Also die einzige Schnittstelle, die ich verwendete, ist Tridion.Cme.Command auf der Schaltfläche JavaScript.

Aber ich denke, was Sie suchen für die ControlResource ist, die Sie in Ihrem 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 
    { 
    } 
} 

Jetzt können angeben, können Sie die Tridion.ControlBase Schnittstelle in Ihrem JavaScript verwenden.

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

ich markieren hier sein könnte, aber es klingt wie Sie eine Reihe von Schaltflächen unter der gleichen Gruppe haben, und Sie wollen, um sie in Bezug auf die Verfügbarkeit konsequent haben verhalten.

Ich hatte einen ähnlichen Fall, wo ich das gleiche Ereignis auf Speichern, Speichern & Schließen und Speichern & neue Operationen auslösen muss. Am Ende habe ich den Code als Erweiterung des Befehls Save geschrieben (basierend auf Jaimes Details here) und dann von den Erweiterungen SaveClose und SaveNew die Funktionen Save._isEnabled und Save._isAvailable aufgerufen, um festzustellen, ob meine Befehle korrekt waren verfügbar, und die Datei Save._execute, wenn die Redakteure auf SaveClose klicken & SaveNew.

Nicht so elegant wie Peters Vorschlag, aber hat den Job erledigt.

+0

Danke nuno. Die Anforderung durch den Client besteht darin, das Home- und das Create-Menüband zusammenzuführen. Einige Schaltflächen müssen entfernt werden und andere sollten nicht angezeigt werden, wenn sie deaktiviert sind. Die Schaltflächen haben außer ihrem Standardverhalten keine zusätzlichen Anforderungen. Und der schwierigste Teil ist, sie zu verbergen (wie das im Create-Ribbon passiert, zB versteckt sich die Neue Komponente, wenn Sie in einer Strukturgruppe sind.) Ich weiß, dass es auch in einem Befehl möglich ist, aber es scheint besser zu sein Die Art und Weise, wie es in der Multifunktionsleiste Erstellt wird, wo die Methode updateState des Menübands dafür sorgt. –

+0

Das Create-Ribbon ruft nur die isAvailable-Methode jedes Befehls auf. Die Logik dafür, ob sie verfügbar ist oder nicht, ist vollständig im Befehl selbst eingekapselt - so wie es sein sollte. –