From d2f675e58b1c42c8960907ee20490a391aec0ecc Mon Sep 17 00:00:00 2001
From: xue <>
Date: Wed, 7 Dec 2005 03:31:08 +0000
Subject:
---
demos/controls/protected/pages/HomePage.tpl | 2 +-
framework/Web/Javascripts/base/prado.js | 36 +++++++-
framework/Web/Javascripts/js/base.js | 34 ++++++-
framework/Web/UI/TClientScriptManager.php | 37 ++++----
framework/Web/UI/TControl.php | 5 +-
framework/Web/UI/WebControls/TButton.php | 3 +-
framework/Web/UI/WebControls/TImageButton.php | 3 +-
framework/Web/UI/WebControls/TLinkButton.php | 2 +-
framework/Web/UI/WebControls/TTextBox.php | 126 ++++++++++++--------------
9 files changed, 146 insertions(+), 102 deletions(-)
diff --git a/demos/controls/protected/pages/HomePage.tpl b/demos/controls/protected/pages/HomePage.tpl
index d3cc53df..7a296eae 100644
--- a/demos/controls/protected/pages/HomePage.tpl
+++ b/demos/controls/protected/pages/HomePage.tpl
@@ -5,7 +5,7 @@
Welcome! <%=$this->User->Name %>
-
+
(requires membership)
diff --git a/framework/Web/Javascripts/base/prado.js b/framework/Web/Javascripts/base/prado.js
index b1e87634..2174908f 100644
--- a/framework/Web/Javascripts/base/prado.js
+++ b/framework/Web/Javascripts/base/prado.js
@@ -2,17 +2,17 @@ Prado = Class.create();
Prado.version = '3.0a';
-Prado.DefaultButton = Class.create();
+Prado.Button = Class.create();
-Prado.DefaultButton.buttonFired = false;
-Prado.DefaultButton.fire = function(event, target)
+Prado.Button.buttonFired = false;
+Prado.Button.fireButton = function(event, target)
{
- if (!Prado.DefaultButton.buttonFired && event.keyCode == 13 && !(event.srcElement && (event.srcElement.tagName.toLowerCase() == "textarea")))
+ if (!Prado.Button.buttonFired && event.keyCode == 13 && !(event.srcElement && (event.srcElement.tagName.toLowerCase() == "textarea")))
{
var defaultButton = document.getElementById ? document.getElementById(target) : document.all[target];
if (defaultButton && typeof(defaultButton.click) != "undefined")
{
- Prado.DefaultButton.buttonFired = true;
+ Prado.Button.buttonFired = true;
defaultButton.click();
event.cancelBubble = true;
if (event.stopPropagation)
@@ -22,3 +22,29 @@ Prado.DefaultButton.fire = function(event, target)
}
return true;
}
+
+Prado.TextBox = Class.create();
+
+Prado.TextBox.handleReturnKey = function(event)
+{
+ if (event.keyCode == 13)
+ {
+ var target;
+ if(typeof(event.target)!="undefined")
+ target=event.target;
+ else if(typeof(event.srcElement)!="undefined")
+ target=event.srcElement;
+ if((typeof(target)!="undefined") && (target!=null))
+ {
+ if(typeof(target.onchange)!="undefined")
+ {
+ target.onchange();
+ event.cancelBubble=true;
+ if(event.stopPropagation)
+ event.stopPropagation();
+ return false;
+ }
+ }
+ }
+ return true;
+}
\ No newline at end of file
diff --git a/framework/Web/Javascripts/js/base.js b/framework/Web/Javascripts/js/base.js
index 1f86b1c1..276c17bd 100644
--- a/framework/Web/Javascripts/js/base.js
+++ b/framework/Web/Javascripts/js/base.js
@@ -841,13 +841,13 @@ return _7;
Prado=Class.create();
Prado.version="3.0a";
-Prado.DefaultButton=Class.create();
-Prado.DefaultButton.buttonFired=false;
-Prado.DefaultButton.fire=function(_1,_2){
-if(!Prado.DefaultButton.buttonFired&&_1.keyCode==13&&!(_1.srcElement&&(_1.srcElement.tagName.toLowerCase()=="textarea"))){
+Prado.Button=Class.create();
+Prado.Button.buttonFired=false;
+Prado.Button.fireButton=function(_1,_2){
+if(!Prado.Button.buttonFired&&_1.keyCode==13&&!(_1.srcElement&&(_1.srcElement.tagName.toLowerCase()=="textarea"))){
var _3=document.getElementById?document.getElementById(_2):document.all[_2];
if(_3&&typeof (_3.click)!="undefined"){
-Prado.DefaultButton.buttonFired=true;
+Prado.Button.buttonFired=true;
_3.click();
_1.cancelBubble=true;
if(_1.stopPropagation){
@@ -858,6 +858,30 @@ return false;
}
return true;
};
+Prado.TextBox=Class.create();
+Prado.TextBox.handleReturnKey=function(_4){
+if(_4.keyCode==13){
+var _5;
+if(typeof (_4.target)!="undefined"){
+_5=_4.target;
+}else{
+if(typeof (_4.srcElement)!="undefined"){
+_5=_4.srcElement;
+}
+}
+if((typeof (_5)!="undefined")&&(_5!=null)){
+if(typeof (_5.onchange)!="undefined"){
+_5.onchange();
+_4.cancelBubble=true;
+if(_4.stopPropagation){
+_4.stopPropagation();
+}
+return false;
+}
+}
+}
+return true;
+};
Prado.doPostBack=function(_1,_2,_3,_4,_5,_6,_7,_8){
if(typeof (_4)=="undefined"){
diff --git a/framework/Web/UI/TClientScriptManager.php b/framework/Web/UI/TClientScriptManager.php
index ace11064..c42e664d 100644
--- a/framework/Web/UI/TClientScriptManager.php
+++ b/framework/Web/UI/TClientScriptManager.php
@@ -119,7 +119,7 @@ class TClientScriptManager extends TComponent
$opt.='"'.$options->getValidationGroup().'",';
}
else
- $opt.='"",';
+ $opt.='\'\',';
if($options->getActionUrl()!=='')
{
$flag=true;
@@ -139,10 +139,10 @@ class TClientScriptManager extends TComponent
if($options->getClientSubmit())
{
$flag=true;
- $opt.='true)';
+ $opt.='true';
}
else
- $opt.='false)';
+ $opt.='false';
if(!$flag)
return '';
$this->registerPostBackScript();
@@ -153,25 +153,28 @@ class TClientScriptManager extends TComponent
return $javascriptPrefix?'javascript:'.$postback:$postback;
}
- protected function registerPostBackScript()
+ public function registerPradoScript($scriptFile)
{
- if(!$this->_postBackScriptRegistered)
+ if(isset($this->_publishedScriptFiles[$scriptFile]))
+ $url=$this->_publishedScriptFiles[$scriptFile];
+ else
{
- $this->_postBackScriptRegistered=true;
- $this->registerHiddenField(TPage::FIELD_POSTBACK_TARGET,'');
- $this->registerHiddenField(TPage::FIELD_POSTBACK_PARAMETER,'');
- $this->registerScriptInclude('prado:base',$this->publishScriptFile('base.js'));
+ $url=$this->_page->getService()->getAssetManager()->publishFilePath(Prado::getFrameworkPath().'/'.self::SCRIPT_DIR.'/'.$scriptFile);
+ $this->_publishedScriptFiles[$scriptFile]=$url;
+ $this->registerScriptInclude('prado:'.$scriptFile,$url);
}
+ return $url;
}
- private function publishScriptFile($jsFile)
+ protected function registerPostBackScript()
{
- if(!isset($this->_publishedScriptFiles[$jsFile]))
+ if(!$this->_postBackScriptRegistered)
{
- $am=$this->_page->getService()->getAssetManager();
- $this->_publishedScriptFiles[$jsFile]=$am->publishFilePath(Prado::getFrameworkPath().'/'.self::SCRIPT_DIR.'/'.$jsFile);
+ $this->_postBackScriptRegistered=true;
+ $this->registerHiddenField(TPage::FIELD_POSTBACK_TARGET,'');
+ $this->registerHiddenField(TPage::FIELD_POSTBACK_PARAMETER,'');
+ $this->registerPradoScript('base.js');
}
- return $this->_publishedScriptFiles[$jsFile];
}
public function registerFocusScript($target)
@@ -179,7 +182,7 @@ class TClientScriptManager extends TComponent
if(!$this->_focusScriptRegistered)
{
$this->_focusScriptRegistered=true;
- $this->registerScriptInclude('prado:base',$this->publishScriptFile('base.js'));
+ $this->registerPradoScript('base.js');
$this->registerEndScript('prado:focus','Prado.Focus.setFocus("'.THttpUtility::quoteJavaScriptString($target).'");');
}
}
@@ -197,8 +200,8 @@ class TClientScriptManager extends TComponent
public function registerDefaultButtonScript($button)
{
- $this->registerScriptInclude('prado:base',$this->publishScriptFile('base.js'));
- return 'return Prado.DefaultButton.fire(event,\''.$button->getClientID().'\')';
+ $this->registerPradoScript('base.js');
+ return 'return Prado.Button.fireButton(event,\''.$button->getClientID().'\')';
}
public function registerValidationScript()
diff --git a/framework/Web/UI/TControl.php b/framework/Web/UI/TControl.php
index e568df65..ce343925 100644
--- a/framework/Web/UI/TControl.php
+++ b/framework/Web/UI/TControl.php
@@ -576,11 +576,14 @@ class TControl extends TComponent
/**
* Removes the named attribute.
* @param string the name of the attribute to be removed.
+ * @return string attribute value removed, empty string if attribute does not exist.
*/
public function removeAttribute($name)
{
if($attributes=$this->getViewState('Attributes',null))
- $attributes->remove($name);
+ return $attributes->remove($name);
+ else
+ return '';
}
/**
diff --git a/framework/Web/UI/WebControls/TButton.php b/framework/Web/UI/WebControls/TButton.php
index a9eac8ac..e7c40a75 100644
--- a/framework/Web/UI/WebControls/TButton.php
+++ b/framework/Web/UI/WebControls/TButton.php
@@ -81,8 +81,7 @@ class TButton extends TWebControl implements IPostBackEventHandler
if($this->getEnabled(true))
{
- $onclick='';
- $onclick=$this->hasAttribute('onclick')?$this->getAttributes()->remove('onclick'):'';
+ $onclick=$this->removeAttribute('onclick');
$onclick=THttpUtility::trimJavaScriptString($onclick).THttpUtility::trimJavaScriptString($this->getOnClientClick());
$onclick.=$page->getClientScript()->getPostBackEventReference($this,'',$this->getPostBackOptions(),false);
if(!empty($onclick))
diff --git a/framework/Web/UI/WebControls/TImageButton.php b/framework/Web/UI/WebControls/TImageButton.php
index 669e517e..33dfde75 100644
--- a/framework/Web/UI/WebControls/TImageButton.php
+++ b/framework/Web/UI/WebControls/TImageButton.php
@@ -96,8 +96,7 @@ class TImageButton extends TImage implements IPostBackDataHandler, IPostBackEven
if($this->getEnabled(true))
{
- $onclick='';
- $onclick=$this->hasAttribute('onclick')?$this->getAttributes()->remove('onclick'):'';
+ $onclick=$this->removeAttribute('onclick');
$onclick=THttpUtility::trimJavaScriptString($onclick).THttpUtility::trimJavaScriptString($this->getOnClientClick());
$onclick.=$page->getClientScript()->getPostBackEventReference($this,'',$this->getPostBackOptions(),false);
if(!empty($onclick))
diff --git a/framework/Web/UI/WebControls/TLinkButton.php b/framework/Web/UI/WebControls/TLinkButton.php
index d3be1ade..dd2d8cb7 100644
--- a/framework/Web/UI/WebControls/TLinkButton.php
+++ b/framework/Web/UI/WebControls/TLinkButton.php
@@ -79,7 +79,7 @@ class TLinkButton extends TWebControl implements IPostBackEventHandler
{
$page=$this->getPage();
$page->ensureRenderInForm($this);
- $onclick=$this->hasAttribute('onclick')?$this->getAttributes()->remove('onclick'):'';
+ $onclick=$this->removeAttribute('onclick');
$onclick=THttpUtility::trimJavaScriptString($onclick).THttpUtility::trimJavaScriptString($this->getOnClientClick());
if(!empty($onclick))
$writer->addAttribute('onclick','javascript:'.$onclick);
diff --git a/framework/Web/UI/WebControls/TTextBox.php b/framework/Web/UI/WebControls/TTextBox.php
index 4d4fcff6..3e5f0107 100644
--- a/framework/Web/UI/WebControls/TTextBox.php
+++ b/framework/Web/UI/WebControls/TTextBox.php
@@ -14,22 +14,26 @@
* TTextBox class
*
* TTextBox displays a text box on the Web page for user input.
- * The text displayed in the TTextBox control is determined by the Text property.
- * You can create a SingleLine, a MultiLine, or a Password text box
- * by setting the TextMode property.
- * If the TTextBox control is a multiline text box, the number of rows
- * it displays is determined by the Rows property, and the Wrap property
+ * The text displayed in the TTextBox control is determined by the
+ * {@link setText Text} property. You can create a SingleLine,
+ * a MultiLine, or a Password text box by setting
+ * the {@link setTextMode TextMode} property. If the TTextBox control
+ * is a multiline text box, the number of rows it displays is determined
+ * by the {@link setRows Rows} property, and the {@link setWrap Wrap} property
* can be used to determine whether to wrap the text in the component.
*
- * To specify the display width of the text box, in characters, set the Columns property.
- * To prevent the text displayed in the component from being modified,
- * set the ReadOnly property to true. If you want to limit the user input
- * to a specified number of characters, set the MaxLength property. To use AutoComplete
- * feature, set the AutoCompleteType property.
+ * To specify the display width of the text box, in characters, set
+ * the {@link setColumns Columns} property. To prevent the text displayed
+ * in the component from being modified, set the {@link setReadOnly ReadOnly}
+ * property to true. If you want to limit the user input to a specified number
+ * of characters, set the {@link setMaxLength MaxLength} property.
+ * To use AutoComplete feature, set the {@link setAutoCompleteType AutoCompleteType} property.
*
- * If AutoPostBack is set true, updating the text box and then changing the focus out of it
- * will cause postback action. And if CausesValidation is true, validation will also
- * be processed, which can be further restricted within a ValidationGroup.
+ * If {@link setAutoPostBack AutoPostBack} is set true, updating the text box
+ * and then changing the focus out of it will cause postback action.
+ * And if {@link setCausesValidation CausesValidation} is true, validation will
+ * also be processed, which can be further restricted within
+ * a {@link setValidationGroup ValidationGroup}.
*
* @author Qiang Xue
* @version $Revision: $ $Date: $
@@ -38,6 +42,11 @@
*/
class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable
{
+ /**
+ * @var array list of auto complete types
+ */
+ private static $_autoCompleteTypes=array('BusinessCity','BusinessCountryRegion','BusinessFax','BusinessPhone','BusinessState','BusinessStreetAddress','BusinessUrl','BusinessZipCode','Cellular','Company','Department','Disabled','DisplayName','Email','FirstName','Gender','HomeCity','HomeCountryRegion','HomeFax','Homepage','HomePhone','HomeState','HomeStreetAddress','HomeZipCode','JobTitle','LastName','MiddleName','None','Notes','Office','Pager','Search');
+
/**
* @return string tag name of the textbox
*/
@@ -48,7 +57,7 @@ class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable
/**
* Adds attribute name-value pairs to renderer.
- * This overrides the parent implementation with additional textbox specific attributes.
+ * This method overrides the parent implementation with additional textbox specific attributes.
* @param THtmlWriter the writer used for the rendering purpose
*/
protected function addAttributesToRender($writer)
@@ -59,10 +68,12 @@ class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable
$writer->addAttribute('name',$uid);
if(($textMode=$this->getTextMode())==='MultiLine')
{
- if(($rows=$this->getRows())>0)
- $writer->addAttribute('rows',$rows);
- if(($cols=$this->getColumns())>0)
- $writer->addAttribute('cols',$cols);
+ if(($rows=$this->getRows())<=0)
+ $rows=2;
+ if(($cols=$this->getColumns())<=0)
+ $cols=20;
+ $writer->addAttribute('rows',"$rows");
+ $writer->addAttribute('cols',"$cols");
if(!$this->getWrap())
$writer->addAttribute('wrap','off');
}
@@ -98,9 +109,9 @@ class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable
$writer->addAttribute('type','password');
}
if(($cols=$this->getColumns())>0)
- $writer->addAttribute('size',$cols);
+ $writer->addAttribute('size',"$cols");
if(($maxLength=$this->getMaxLength())>0)
- $writer->addAttribute('maxlength',$maxLength);
+ $writer->addAttribute('maxlength',"$maxLength");
}
if($this->getReadOnly())
$writer->addAttribute('readonly','readonly');
@@ -108,30 +119,25 @@ class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable
$writer->addAttribute('disabled','disabled');
if($this->getAutoPostBack() && $page->getClientSupportsJavaScript())
{
- $onchange='';
- $onkeypress='if (WebForm_TextBoxKeyHandler() == false) return false;';
- if($this->getHasAttributes())
+ $option=new TPostBackOptions();
+ if($this->getCausesValidation() && $page->getValidators($this->getValidationGroup())->getCount()>0)
{
- $attributes=$this->getAttributes();
- $onchange=$attributes->itemAt('onchange');
- if($onchange!=='')
- $onchange=rtrim($onchange,';').';';
- $attributes->remove('onchange');
- $onkeypress.=$attributes->itemAt('onkeypress');
- $attributes->remove('onkeypress');
+ $option->setPerformValidation(true);
+ $option->setValidationGroup($this->getValidationGroup());
}
+ $option->setAutoPostBack(true);
+ $onchange=$this->removeAttribute('onchange');
+ $onchange.=THttpUtility::trimJavaScriptString($onchange).$page->getClientScript()->getPostBackEventReference($this,'',$option,false);
+ $writer->addAttribute('onchange','javascript:'.$onchange);
- $option=new TPostBackOptions($this);
- if($this->getCausesValidation())
+ if($textMode!=='MultiLine')
{
- $option->PerformValidation=true;
- $option->ValidationGroup=$this->getValidationGroup();
+ // note, Prado.TextBox.handleReturnKey is defined in base.js,
+ // which is included when AutoPostBack is true for textbox.
+ $onkeypress='javascript:if(Prado.TextBox.handleReturnKey(event)==false) return false;';
+ $onkeypress.=THttpUtility::trimJavaScriptString($this->removeAttribute('onkeypress'));
+ $writer->addAttribute('onkeypress',$onkeypress);
}
- if($page->getForm())
- $option->AutoPostBack=true;
- $onchange.=$page->getClientScript()->getPostBackEventReference($option);
- $writer->addAttribute('onchange',$onchange);
- $writer->addAttribute('onkeypress',$onkeypress);
}
parent::addAttributesToRender($writer);
}
@@ -155,23 +161,6 @@ class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable
return false;
}
- protected function onPreRender($param)
- {
- parent::onPreRender($param);
- if(($page=$this->getPage()) && $this->getEnabled(true))
- {
- // TODO
- //if($this->getTextMode()==='Password' || ($this->hasEventHandler('TextChanged') && $this->getVisible()))
- // $page->registerEnabledControl($this);
- if($this->getAutoPostBack())
- {
- $page->registerWebFormsScript();
- $page->registerPostBackScript();
- $page->registerFocusScript();
- }
- }
- }
-
/**
* Returns the value to be validated.
* This methid is required by IValidatable interface.
@@ -183,8 +172,8 @@ class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable
}
/**
- * This method is invoked when the value of the Text property changes on postback.
- * The method raises 'TextChanged' event.
+ * This method is invoked when the value of the {@link getText Text}
+ * property changes on postback. The method raises TextChanged event.
* If you override this method, be sure to call the parent implementation to ensure
* the invocation of the attached event handlers.
* @param TEventParameter event parameter to be passed to the event handlers
@@ -196,8 +185,9 @@ class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable
/**
* Raises postdata changed event.
- * This method is required by IPostBackDataHandler interface.
- * It is invoked by the framework when Text property is changed on postback.
+ * This method is required by {@link IPostBackDataHandler} interface.
+ * It is invoked by the framework when {@link getText Text} property
+ * is changed on postback.
* This method is primarly used by framework developers.
*/
public function raisePostDataChangedEvent()
@@ -209,7 +199,7 @@ class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable
if($this->getCausesValidation())
$page->validate($this->getValidationGroup());
}
- $this->onTextChanged(new TEventParameter);
+ $this->onTextChanged(null);
}
/**
@@ -243,13 +233,13 @@ class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable
*/
public function setAutoCompleteType($value)
{
- $this->setViewState('AutoCompleteType',TPropertyValue::ensureEnum($value,array('BusinessCity','BusinessCountryRegion','BusinessFax','BusinessPhone','BusinessState','BusinessStreetAddress','BusinessUrl','BusinessZipCode','Cellular','Company','Department','Disabled','DisplayName','Email','FirstName','Gender','HomeCity','HomeCountryRegion','HomeFax','Homepage','HomePhone','HomeState','HomeStreetAddress','HomeZipCode','JobTitle','LastName','MiddleName','None','Notes','Office','Pager','Search')),'None');
+ $this->setViewState('AutoCompleteType',TPropertyValue::ensureEnum($value,self::$_autoCompleteTypes),'None');
}
/**
* @return boolean a value indicating whether an automatic postback to the server
* will occur whenever the user modifies the text in the TTextBox control and
- * then tabs out of the component.
+ * then tabs out of the component. Defaults to false.
*/
public function getAutoPostBack()
{
@@ -319,7 +309,7 @@ class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable
}
/**
- * @return boolean whether the textbox is read only, default is false
+ * @return boolean whether the textbox is read only, default is false.
*/
public function getReadOnly()
{
@@ -339,7 +329,7 @@ class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable
*/
public function getRows()
{
- return $this->getViewState('Rows',4);
+ return $this->getViewState('Rows',0);
}
/**
@@ -348,7 +338,7 @@ class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable
*/
public function setRows($value)
{
- $this->setViewState('Rows',TPropertyValue::ensureInteger($value),4);
+ $this->setViewState('Rows',TPropertyValue::ensureInteger($value),0);
}
/**
@@ -369,7 +359,7 @@ class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable
}
/**
- * @return string the behavior mode (SingleLine, MultiLine, or Password) of the TTextBox component.
+ * @return string the behavior mode (SingleLine, MultiLine, or Password) of the TTextBox component. Defaults to SingleLine.
*/
public function getTextMode()
{
@@ -403,7 +393,7 @@ class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable
}
/**
- * @return boolean whether the text content wraps within a multiline text box.
+ * @return boolean whether the text content wraps within a multiline text box. Defaults to true.
*/
public function getWrap()
{
--
cgit v1.2.3