summaryrefslogtreecommitdiff
path: root/framework/Web/UI/WebControls
diff options
context:
space:
mode:
Diffstat (limited to 'framework/Web/UI/WebControls')
-rw-r--r--framework/Web/UI/WebControls/TBaseValidator.php76
-rw-r--r--framework/Web/UI/WebControls/TDatePicker.php30
-rw-r--r--framework/Web/UI/WebControls/TListControl.php39
3 files changed, 112 insertions, 33 deletions
diff --git a/framework/Web/UI/WebControls/TBaseValidator.php b/framework/Web/UI/WebControls/TBaseValidator.php
index ffdfd057..3c76db30 100644
--- a/framework/Web/UI/WebControls/TBaseValidator.php
+++ b/framework/Web/UI/WebControls/TBaseValidator.php
@@ -83,6 +83,12 @@ abstract class TBaseValidator extends TLabel implements IValidator
* @var TClientSideValidatorOptions validator client-script options.
*/
private $_clientSide;
+ /**
+ * Controls for which the client-side validation3.js file needs to handle
+ * them specially.
+ * @var array list of control class names
+ */
+ private static $_clientClass = array('THtmlArea', 'TDatePicker');
/**
* Constructor.
@@ -152,28 +158,44 @@ abstract class TBaseValidator extends TLabel implements IValidator
$options['ValidationGroup'] = $this->getValidationGroup();
$options['ControlToValidate'] = $control->getClientID();
$options['ControlCssClass'] = $this->getControlCssClass();
- $options['ControlType'] = get_class($control);
-
+
+ $options['ControlType'] = $this->getClientControlClass($control);
+
if(!is_null($this->_clientSide))
$options = array_merge($options,$this->_clientSide->getOptions()->toArray());
-
+
return $options;
}
-
+
+ /**
+ * Gets the Control type for client-side validation. If new cases exists in
+ * TBaseValidator::$_clientClass, be sure to update the corresponding
+ * "Javascript/validation3.js" file as well.
+ * @param TControl control to validate.
+ * @return string control type for client-side validation.
+ */
+ private function getClientControlClass($control)
+ {
+ foreach(self::$_clientClass as $type)
+ if($control instanceof $type)
+ return $type;
+ return get_class($control);
+ }
+
/**
* Gets the TClientSideValidatorOptions that allows modification of the client-
- * side validator events.
- *
+ * side validator events.
+ *
* The client-side validator supports the following events.
* # <tt>OnValidate</tt> -- raised before client-side validation is
- * executed.
+ * executed.
* # <tt>OnSuccess</tt> -- raised after client-side validation is completed
* and is successfull, overrides default validator error messages updates.
* # <tt>OnError</tt> -- raised after client-side validation is completed
- * and failed, overrides default validator error message updates.
- *
+ * and failed, overrides default validator error message updates.
+ *
* You can attach custom javascript code to each of these events
- *
+ *
* @return TClientSideValidatorOptions javascript validator event options.
*/
public function getClientSide()
@@ -182,7 +204,7 @@ abstract class TBaseValidator extends TLabel implements IValidator
$this->_clientSide = $this->createClientSideOptions();
return $this->_clientSide;
}
-
+
/**
* @return TClientSideValidatorOptions javascript validator event options.
*/
@@ -206,7 +228,7 @@ abstract class TBaseValidator extends TLabel implements IValidator
if($this->getEnableClientScript() && !$scripts->isEndScriptRegistered($scriptKey))
{
$manager['FormID'] = $formID;
- $options = TJavaScript::encode($manager);
+ $options = TJavaScript::encode($manager);
$scripts->registerPradoScript('validator');
$scripts->registerEndScript($scriptKey, "new Prado.ValidationManager({$options});");
}
@@ -493,22 +515,22 @@ abstract class TBaseValidator extends TLabel implements IValidator
/**
* TClientSideValidatorOptions class.
- *
+ *
* Client-side validator events can be modified through the {@link
* TBaseValidator::getClientSide ClientSide} property of a validator. The
* subproperties of ClientSide are those of the TClientSideValidatorOptions
* properties. The client-side validator supports the following events.
- *
+ *
* The <tt>OnValidate</tt> event is raise before the validator validation
* functions are called.
- *
+ *
* The <tt>OnSuccess</tt> event is raised after the validator has successfully
* validate the control.
- *
+ *
* The <tt>OnError</tt> event is raised after the validator fails validation.
- *
+ *
* See the quickstart documentation for further details.
- *
+ *
* @author Wei Zhuo <weizhuo[at]gmail[dot]com>
* @version $Revision: $ $Date: $
* @package System.Web.UI.WebControls
@@ -521,19 +543,19 @@ class TClientSideValidatorOptions extends TClientSideOptions
*/
public function getOnValidate()
{
- return $this->getOption('OnValidate');
+ return $this->getOption('OnValidate');
}
-
+
/**
* Client-side OnValidate validator event is raise before the validators
- * validation functions are called.
+ * validation functions are called.
* @param string javascript code for client-side OnValidate event.
*/
public function setOnValidate($javascript)
{
$this->setFunction('OnValidate', $javascript);
}
-
+
/**
* Client-side OnSuccess event is raise after validation is successfull.
* This will override the default client-side validator behaviour.
@@ -543,7 +565,7 @@ class TClientSideValidatorOptions extends TClientSideOptions
{
$this->setFunction('OnSuccess', $javascript);
}
-
+
/**
* @return string javascript code for client-side OnSuccess event.
*/
@@ -551,7 +573,7 @@ class TClientSideValidatorOptions extends TClientSideOptions
{
return $this->getOption('OnSuccess');
}
-
+
/**
* Client-side OnError event is raised after validation failure.
* This will override the default client-side validator behaviour.
@@ -561,7 +583,7 @@ class TClientSideValidatorOptions extends TClientSideOptions
{
$this->setFunction('OnError', $javascript);
}
-
+
/**
* @return string javascript code for client-side OnError event.
*/
@@ -569,7 +591,7 @@ class TClientSideValidatorOptions extends TClientSideOptions
{
return $this->getOption('OnError');
}
-
+
/**
* Ensure the string is a valid javascript function. If the string begins
* with "javascript:" valid javascript function is assumed, otherwise the
@@ -583,4 +605,4 @@ class TClientSideValidatorOptions extends TClientSideOptions
}
}
-?> \ No newline at end of file
+?>
diff --git a/framework/Web/UI/WebControls/TDatePicker.php b/framework/Web/UI/WebControls/TDatePicker.php
index 59a71c90..a746437b 100644
--- a/framework/Web/UI/WebControls/TDatePicker.php
+++ b/framework/Web/UI/WebControls/TDatePicker.php
@@ -681,6 +681,18 @@ class TDatePicker extends TTextBox
else
throw new TConfigurationException('datepicker_calendarstyle_invalid',$style);
}
+
+ /**
+ * Publish the spacer.gif for IE iframe source.
+ * @return string the URL for the spacer.gif.
+ */
+ protected function publishIFrameSpacer()
+ {
+ $cs = $this->getPage()->getClientScript();
+ $spacer = 'System.Web.Javascripts.datepicker.spacer';
+ if(($file = Prado::getPathOfNamespace($spacer,'.gif')) != null)
+ return $this->publishFilePath($file);
+ }
/**
* Add the client id to the input textbox, and register the client scripts.
@@ -696,18 +708,24 @@ class TDatePicker extends TTextBox
/**
* Registers the javascript code to initialize the date picker.
- * Must use "Event.OnLoad" to initialize the date picker when the
- * full page is loaded, otherwise IE will throw an error.
*/
protected function registerCalendarClientScript()
{
if($this->getShowCalendar())
{
- $scripts = $this->getPage()->getClientScript();
- $scripts->registerPradoScript("datepicker");
+ $cs = $this->getPage()->getClientScript();
+ $cs->registerPradoScript("datepicker");
+
+ if(!$cs->isEndScriptRegistered('TDatePicker.spacer'))
+ {
+ $spacer = $this->publishIFrameSpacer();
+ $code = "Prado.WebUI.TDatePicker.spacer = '$spacer';";
+ $cs->registerEndScript('TDatePicker.spacer', $code);
+ }
+
$options = TJavaScript::encode($this->getDatePickerOptions());
- $code = "Event.OnLoad(function(){ new Prado.WebUI.TDatePicker($options); });";
- $scripts->registerEndScript("prado:".$this->getClientID(), $code);
+ $code = "new Prado.WebUI.TDatePicker($options);";
+ $cs->registerEndScript("prado:".$this->getClientID(), $code);
}
}
}
diff --git a/framework/Web/UI/WebControls/TListControl.php b/framework/Web/UI/WebControls/TListControl.php
index 57d8563a..42f09aad 100644
--- a/framework/Web/UI/WebControls/TListControl.php
+++ b/framework/Web/UI/WebControls/TListControl.php
@@ -502,6 +502,45 @@ abstract class TListControl extends TDataBoundControl
$this->_cachedSelectedValue=$value;
}
+
+ /**
+ * @return array list of the selected item values (strings)
+ */
+ public function getSelectedValues()
+ {
+ $values=array();
+ if($this->_items)
+ {
+ foreach($this->_items as $item)
+ {
+ if($item->getSelected())
+ $values[]=$item->getValue();
+ }
+ }
+ return $values;
+ }
+
+ /**
+ * @param array list of the selected item values
+ */
+ public function setSelectedValues($values)
+ {
+ if($this->_items)
+ {
+ $this->clearSelection();
+ $lookup=array();
+ foreach($this->_items as $item)
+ $lookup[$item->getValue()]=$item;
+ foreach($values as $value)
+ {
+ if(isset($lookup["$value"]))
+ $lookup["$value"]->setSelected(true);
+ else
+ throw new TInvalidDataValueException('listcontrol_selectedvalue_invalid',get_class($this),$value);
+ }
+ }
+ }
+
/**
* @return string selected value
*/