From 703b3edacfbb12b57510d1ca441b6bbbb2fc16ab Mon Sep 17 00:00:00 2001 From: xue <> Date: Mon, 5 Dec 2005 13:57:49 +0000 Subject: --- framework/Web/UI/WebControls/TLinkButton.php | 338 +++++++++++++++++++++++++++ 1 file changed, 338 insertions(+) create mode 100644 framework/Web/UI/WebControls/TLinkButton.php (limited to 'framework/Web/UI/WebControls/TLinkButton.php') diff --git a/framework/Web/UI/WebControls/TLinkButton.php b/framework/Web/UI/WebControls/TLinkButton.php new file mode 100644 index 00000000..74feb9db --- /dev/null +++ b/framework/Web/UI/WebControls/TLinkButton.php @@ -0,0 +1,338 @@ + + * @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(); + } +} + +?> \ No newline at end of file -- cgit v1.2.3