* @link http://www.pradosoft.com/
* @copyright Copyright © 2005 PradoSoft
* @license http://www.pradosoft.com/license/
* @version $Revision: $ $Date: $
* @package System.Web.UI.WebControls
*/
/**
* TLinkButton class
*
* TLinkButton creates a hyperlink style button on the page.
* TLinkButton has the same appearance as a hyperlink. However, it is only
* used to submit data to the same page. If you want to link to another Web page
* when the component is clicked, consider using the THyperLink component.
* Like TButton, you can create either a submit button or a command button.
*
* A command button has a command name (specified by the CommandName property)
* and a command parameter (specified by CommandParameter property)
* associated with the button. This allows you to create multiple TLinkButton components
* on a Web page and programmatically determine which one is clicked with what parameter.
* You can provide an event handler for the OnCommand event to programmatically control
* the actions performed when the command button is clicked.
* In the event handler, you can also determine
* the CommandName property value and the CommandParameter property value
* through name and parameter of the event parameter which is of
* type TCommandEventParameter.
*
* A submit button does not have a command name associated with the button
* and clicking on it simply posts the Web page back to the server.
* By default, a TLinkButton component is a submit button.
* You can provide an event handler for the OnClick event to programmatically
* control the actions performed when the submit button is clicked.
*
* TLinkButton will display the Text property value as the hyperlink text. If Text
* is empty, the body content of TLinkButton will be displayed.
* Therefore, you can use TLinkButton as an image button by enclosing an 'img' tag
* as the body of TLinkButton.
*
* Note, Text will be HTML encoded before it is displayed in the TLinkButton component.
* If you don't want it to be so, set EncodeText to false.
*
* Namespace: System.Web.UI.WebControls
*
* Properties
* - Text, string, kept in viewstate
*
Gets or sets the text caption displayed in the TLinkButton component.
* - EncodeText, boolean, default=true, kept in viewstate
*
Gets or sets the value indicating whether Text should be HTML-encoded when rendering.
* - CausesValidation, boolean, default=true, kept in viewstate
*
Gets or sets a value indicating whether validation is performed when the TLinkButton component is clicked.
* - CommandName, string, kept in viewstate
*
Gets or sets the command name associated with the TLinkButton component that is passed to
* the OnCommand event.
* - CommandParameter, string, kept in viewstate
*
Gets or sets an optional parameter passed to the OnCommand event along with
* the associated CommandName.
*
* Events
* - OnClick Occurs when the TLinkButton component is clicked.
* - OnCommand Occurs when the TLinkButton component is clicked.
*
* @author Qiang Xue
* @version $Revision: $ $Date: $
* @package System.Web.UI.WebControls
* @since 3.0
*/
class TLinkButton extends TWebControl implements IPostBackEventHandler
{
/**
* @return string tag name of the button
*/
protected function getTagName()
{
return 'a';
}
/**
* Adds attribute name-value pairs to renderer.
* This overrides the parent implementation with additional button specific attributes.
* @param THtmlWriter the writer used for the rendering purpose
*/
protected function addAttributesToRender($writer)
{
$page=$this->getPage();
$page->ensureRenderInForm($this);
$onclick=$this->hasAttribute('onclick')?$this->getAttributes()->remove('onclick'):'';
$onclick=THttpUtility::trimJavaScriptString($onclick).THttpUtility::trimJavaScriptString($this->getOnClientClick());
if(!empty($onclick))
$writer->addAttribute('onclick',$onclick);
// We call parent implementation here because some attributes
// may be overwritten in the following
parent::addAttributesToRender($writer);
if($this->getEnabled(true))
{
if(($options=$this->getPostBackOptions())===null)
$href='javascript:void(0)';
else
$href=$page->getClientScript()->getPostBackEventReference($this,'',$options,true);
$writer->addAttribute('href',$href);
}
else if($this->getEnabled()) // in this case, parent will not render 'disabled'
$writer->addAttribute('disabled','disabled');
}
/**
* Returns postback specifications for the button.
* This method is used by framework and control developers.
* @return TPostBackOptions parameters about how the button defines its postback behavior.
*/
protected function getPostBackOptions()
{
$options=new TPostBackOptions();
$options->ClientSubmit=true;
$page=$this->getPage();
if($this->getCausesValidation() && $page->getValidators($this->getValidationGroup())->getCount()>0)
{
$options->PerformValidation=true;
$options->ValidationGroup=$this->getValidationGroup();
}
if($this->getPostBackUrl()!=='')
$options->ActionUrl=THttpUtility::quoteJavaScriptString($this->getPostBackUrl());
return $options;
}
/**
* Renders the body content enclosed between the control tag.
* If {@link getText Text} is not empty, it will be rendered. Otherwise,
* the body content enclosed in the control tag will be rendered.
* @param THtmlWriter the writer used for the rendering purpose
*/
protected function renderContents($writer)
{
if(($text=$this->getText())==='')
parent::renderContents($writer);
else
$writer->write($text);
}
/**
* @return string the text caption of the button
*/
public function getText()
{
return $this->getViewState('Text','');
}
/**
* Sets the text caption of the button.
* @param string the text caption to be set
*/
public function setText($value)
{
$this->setViewState('Text',$value,'');
}
/**
* @return string the command name associated with the OnCommand event.
*/
public function getCommandName()
{
return $this->getViewState('CommandName','');
}
/**
* Sets the command name associated with the OnCommand event.
* @param string the text caption to be set
*/
public function setCommandName($value)
{
$this->setViewState('CommandName',$value,'');
}
/**
* @return string the parameter associated with the OnCommand event
*/
public function getCommandParameter()
{
return $this->getViewState('CommandParameter','');
}
/**
* Sets the parameter associated with the OnCommand event.
* @param string the text caption to be set
*/
public function setCommandParameter($value)
{
$this->setViewState('CommandParameter',$value,'');
}
/**
* @return string the javascript to be executed when the button is clicked
*/
public function getOnClientClick()
{
return $this->getViewState('OnClientClick','');
}
/**
* @param string the javascript to be executed when the button is clicked. Do not prefix it with "javascript:".
*/
public function setOnClientClick($value)
{
$this->setViewState('OnClientClick',$value,'');
}
/**
* @return string the URL of the page to post to when the button is clicked, default is empty meaning post to the current page itself
*/
public function getPostBackUrl()
{
return $this->getViewState('PostBackUrl','');
}
/**
* @param string the URL of the page to post to from the current page when the button is clicked, empty if post to the current page itself
*/
public function setPostBackUrl($value)
{
$this->setViewState('PostBackUrl',$value,'');
}
/**
* @return boolean whether postback event trigger by this button will cause input validation
*/
public function getCausesValidation()
{
return $this->getViewState('CausesValidation',true);
}
/**
* Sets the value indicating whether postback event trigger by this button will cause input validation.
* @param string the text caption to be set
*/
public function setCausesValidation($value)
{
$this->setViewState('CausesValidation',$value,true);
}
/**
* @return string the group of validators which the button causes validation upon postback
*/
public function getValidationGroup()
{
return $this->getViewState('ValidationGroup','');
}
/**
* @param string the group of validators which the button causes validation upon postback
*/
public function setValidationGroup($value)
{
$this->setViewState('ValidationGroup',$value,'');
}
/**
* Raises postback event.
* The implementation of this function should raise appropriate event(s) (e.g. OnClick, OnCommand)
* indicating the component is responsible for the postback event.
* This method is primarily used by framework developers.
* @param string the parameter associated with the postback event
*/
public function raisePostBackEvent($param)
{
$this->onClick(new TEventParameter);
$cmdParam=new TCommandEventParameter;
$cmdParam->name=$this->getCommandName();
$cmdParam->parameter=$this->getCommandParameter();
$this->onCommand($cmdParam);
}
/**
* This method is invoked when the component is clicked.
* The method raises 'OnClick' event to fire up the event delegates.
* If you override this method, be sure to call the parent implementation
* so that the event delegates can be invoked.
* @param TEventParameter event parameter to be passed to the event handlers
*/
public function onClick($param)
{
$this->raiseEvent('Click',$this,$param);
}
/**
* This method is invoked when the component is clicked.
* The method raises 'OnCommand' event to fire up the event delegates.
* If you override this method, be sure to call the parent implementation
* so that the event delegates can be invoked.
* @param TCommandEventParameter event parameter to be passed to the event handlers
*/
public function onCommand($param)
{
$this->raiseEvent('Command',$this,$param);
$this->raiseBubbleEvent($this,$param);
}
/**
* This overrides the parent implementation by rendering more TLinkButton-specific attributes.
* @return ArrayObject the attributes to be rendered
*/
protected function getAttributesToRender()
{
$attr=parent::getAttributesToRender();
if($this->isEnabled())
{
$page=$this->getPage();
$postBack=$page->getPostBackClientEvent($this,'');
if($this->causesValidation() && $this->Page->isEndScriptRegistered('TValidator'))
{
$group = $this->getValidationGroup();
$group = strlen($group) ? ",'".$group."'" : '';
$script = "Prado.Validation.AddTarget('{$this->ClientID}' {$group});";
$this->Page->registerEndScript($this->ClientID.'target', $script);
}
$attr['href']="javascript:{$postBack}";
}
return $attr;
}
/**
* This overrides the parent implementation by rendering either Text or the body contents.
* @return string the rendering result
*/
protected function renderBody()
{
$text=$this->isEncodeText()?pradoEncodeData($this->getText()):$this->getText();
return strlen($text)?$text:parent::renderBody();
}
}
?>