How to extend the CheckOut command in SDL Tridion 2011 SP1?

I am trying to expand the "CheckOut" Tridion command, and for now I am trying to display my own message, and I expect that the OOTB CheckOut action should appear when I click the "CheckOut" button from the ribbon bar tool.

I created a configuration file and a .js file as follows, I also made changes to System.config and also created a virtual directory. However, my .js does not start and does not display my custom message.

config.xml

<?xml version="1.0"?> <Configuration xmlns="http://www.sdltridion.com/2009/GUI/Configuration/Merge" xmlns:cfg="http://www.sdltridion.com/2009/GUI/Configuration" xmlns:ext="http://www.sdltridion.com/2009/GUI/extensions" xmlns:cmenu="http://www.sdltridion.com/2009/GUI/extensions/ContextMenu"> <resources cache="true"> <cfg:filters/> <cfg:groups> <cfg:group name="CommandsExtensions.Commandset" merger="Tridion.Web.UI.Core.Configuration.Resources.CommandGroupProcessor" merge="always"> <cfg:fileset> <cfg:file type="script">/js/ExtendCheckOut.js</cfg:file> <cfg:file type="reference">CommandsExtensions.Interface</cfg:file> </cfg:fileset> <cfg:dependencies> <cfg:dependency>Tridion.Web.UI.Editors.CME</cfg:dependency> <cfg:dependency>Tridion.Web.UI.Editors.CME.commands</cfg:dependency> </cfg:dependencies> </cfg:group> </cfg:groups> </resources> <definitionfiles/> <extensions> <ext:editorextensions> <ext:editorextension target="CME"> <ext:editurls/> <ext:listdefinitions/> <ext:taskbars/> <ext:commands/> <ext:commandextensions> <ext:commands> <ext:command name="CheckOut" extendingcommand="ExtendCheckOut" /> </ext:commands> <ext:dependencies> <cfg:dependency>CommandsExtensions.Commandset</cfg:dependency> </ext:dependencies> </ext:commandextensions> <ext:contextmenus/> <ext:lists/> <ext:tabpages/> <ext:toolbars/> <ext:ribbontoolbars/> </ext:editorextension> </ext:editorextensions> <ext:dataextenders/> </extensions> <commands> <cfg:commandset id="CommandsExtensions.Interface"> <cfg:command name="ExtendCheckOut" implementation="CommandsExtensions.ExtendCheckOut"/> </cfg:commandset> </commands> <contextmenus/> <localization/> <settings> <defaultpage>/Views/Default.aspx</defaultpage> <navigatorurl>/Views/Default.aspx</navigatorurl> <editurls/> <listdefinitions/> <itemicons/> <theme> <path>css</path> </theme> <customconfiguration/> </settings> 

.js

 Type.registerNamespace("Extensions"); Extensions.ExtendCheckOut = function Extensions.ExtendCheckOut() { Type.enableInterface(this, "Extensions.ExtendCheckOut"); this.addInterface("Tridion.Cme.Command", ["ExtendCheckOut"]); }; Extensions.ExtendCheckOut.prototype.isAvailable = function ExtendCheckOut$isAvailable(selection) { return true; } Extensions.ExtendCheckOut.prototype.isEnabled = function ExtendCheckOut$isEnabled(selection) { return true; } Extensions.ExtendCheckOut.prototype._execute = function ExtendCheckOut$_execute(selection) { $messages.registerWarning("This is Extended CheckOut"); } 
+3
source share
2 answers

This is what I did by expanding the Save button:

 <cfg:groups> <cfg:group name="ValidateTitleField.CommandSet"> <cfg:fileset> <cfg:file type="script">/Commands/ValidateTitleFieldCommand.js</cfg:file> <cfg:file type="reference">ValidateTitleField.Interface</cfg:file> </cfg:fileset> <cfg:dependencies> <cfg:dependency>Tridion.Web.UI.Editors.CME</cfg:dependency> <cfg:dependency>Tridion.Web.UI.Editors.CME.commands</cfg:dependency> </cfg:dependencies> </cfg:group> <cfg:group name="ValidateTitleField.Views.ValidateTitleFieldPopup"> <cfg:fileset> <cfg:file type="script">/Views/ValidateTitleFieldPopup.js</cfg:file> <cfg:file type="style">/Views/ValidateTitleFieldPopup.css</cfg:file> </cfg:fileset> <cfg:dependencies> <cfg:dependency>Tridion.Web.UI.Editors.CME</cfg:dependency> <cfg:dependency>Tridion.Web.UI.Editors.CME.commands</cfg:dependency> </cfg:dependencies> </cfg:group> </cfg:groups> 

[...]

  <ext:editorextension target="CME"> <ext:editurls /> <ext:listdefinitions /> <ext:taskbars /> <ext:commands /> <ext:commandextensions> <ext:commands> <ext:command name="Save" extendingcommand="ValidateTitleField"/> </ext:commands> <ext:dependencies> <cfg:dependency>ValidateTitleField.CommandSet</cfg:dependency> </ext:dependencies> </ext:commandextensions> <ext:contextmenus /> <ext:lists /> <ext:tabpages /> <ext:toolbars /> <ext:ribbontoolbars /> </ext:editorextension> 

[...]

 <commands> <cfg:commandset id="ValidateTitleField.Interface"> <cfg:command name="ValidateTitleField" implementation="Company.Extensions.ValidateTitleFieldCommand"/> </cfg:commandset> </commands> 

Then, in my implementation of the (JS) command, I used the following to call the "original" methods:

 Company.Extensions.ValidateTitleFieldCommand.prototype._isAvailable = function ValidateTitleFieldCommand$_isAvailable(selection) { console.debug("Is Available called"); return $cme.getCommand("Save")._isAvailable(selection); }; 

And finally, somewhere deep in the _execute method:

 if (!failed) return $cme.getCommand("Save")._execute(selection, pipeline); else { this.loadPopup(); } 

Hope this helps,

N

+4
source

You have a mismatch between implementation your configuration file points to:

 <commands> <cfg:commandset id="CommandsExtensions.Interface"> <cfg:command name="ExtendCheckOut" implementation="CommandsExtensions.ExtendCheckOut"/> </cfg:commandset> </commands> 

And the actual JavaScript code:

 Extensions.ExtendCheckOut = function Extensions.ExtendCheckOut() { 

You probably want to change the configuration file to:

  <cfg:command name="ExtendCheckOut" implementation="Extensions.ExtendCheckOut"/> 
+3
source

All Articles