Jag arbetar med ett fall då kunden vill ha en bekräfta-ruta när publicera-knappen trycks ner om ett argument är uppfyllt. Man ska alltså kunna avbryta publiceringen eller forstätta som vanligt
Tack på förhand
Martin Hedlund
Här är en möjlig lösning. Det är en plugin som inte syns. När den kör så hittar den publiceringsknapparna och lägger på javascript på knapparna. Koden nedan är bara ett exempel på hur man kan gå till väga, inget testkört exempel som garanterat fungerar.
namespace ExtendedButton
{
///
/// This class has no UI. It's purpose is to add javascript confirmations
/// on the Publish button.
/// The reason for register as a plugin is to be able to enter the lifecycle of the page rendering
/// specially handling PreRender event when all controls on page are in place.
///
///
[
GuiPlugIn( DisplayName = "wont be visible",
Description = "",
Area = PlugInArea.EditPanel,
Url = "" )
]
public class PublishConfirmation : UserControlBase, ICustomPlugInLoader
{
PlugInDescriptor[] ICustomPlugInLoader.List()
{
PlugInDescriptor [] plugins = new PlugInDescriptor[0];
this.PageBase.PreRender += new EventHandler( Page_PreRender );
return plugins;
}
private void Page_Load(object sender, System.EventArgs e)
{
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void Page_PreRender(object sender, EventArgs e)
{
// first Find active tab control
//index 0 = PreView
//index 1 = Edit
//index 2 = VersionList
int activeTab = GetActiveTab( page.Controls[0] );
switch (activeTab)
{
//We are only interested to handle publish button on PreView or Edit tab
case 0:
RegisterConfirmationOnCommandTool( page.Controls[0] );
break;
case 1:
RegisterConfirmationOnCommandTool( page.Controls[0] );
break;
default:
break;
}
}
//Recursive function that finds tab ctrl and returns index of the currently active tab
private int GetActiveTab( Control ctrl )
{
if ( ctrl is EPiServer.SystemControls.Tab )
{
EPiServer.SystemControls.Tab command = (EPiServer.SystemControls.Tab) ctrl;
if ( command.Active )
return command.Index;
}
//If not found check child ctls
foreach ( Control child in ctrl.Controls )
{
int tab = GetActiveTab( child );
if ( tab != -1 )
return tab;
}
return -1;
}
//Recursive function that finds ctrl of type CommandTool (publish button e.g.) with name Publish.
//It will then add a client javascript to the control for clientside confirmation
private void RegisterConfirmationOnCommandTool( Control ctrl )
{
if ( ctrl is EPiServer.SystemControls.CommandTool )
{
EPiServer.SystemControls.CommandTool command = (EPiServer.SystemControls.CommandTool) ctrl;
if (command.Name != null && command.Name.IndexOf("Publish") != -1 )
{
command.CustomClickScript = string.Format(
"if( !confirm('Are you sure you want to publish page?'))return false;SimulateFormField('Publish','Publish');__doPostBack('{0}$SaveAndPublish','');",
command.NamingContainer.ClientID );
}
}
//Check child ctls
foreach ( Control child in ctrl.Controls )
{
RegisterConfirmationOnCommandTool( child );
}
}
}
}