From 4a8bd53f85b2dc0bcddd415873ce4ab49e1e099c Mon Sep 17 00:00:00 2001
From: "ctrlaltca@gmail.com" <>
Date: Sun, 5 Feb 2012 17:00:00 +0000
Subject: Make validators' FocusOnError play nice with TCheckBoxList and
 TRadioButtonList

---
 framework/TService.php                            | 164 +++++++++---------
 framework/Web/UI/WebControls/TBaseValidator.php   |  13 +-
 framework/Web/UI/WebControls/TRadioButtonList.php | 200 +++++++++++-----------
 3 files changed, 194 insertions(+), 183 deletions(-)

(limited to 'framework')

diff --git a/framework/TService.php b/framework/TService.php
index 9d1e6f84..b4c2b529 100644
--- a/framework/TService.php
+++ b/framework/TService.php
@@ -1,83 +1,83 @@
-<?php
-/**
- * TService class file.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @link http://www.pradosoft.com/
+<?php
+/**
+ * TService class file.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.pradosoft.com/
  * @copyright Copyright &copy; 2005-2011 PradoSoft
- * @license http://www.pradosoft.com/license/
- * @version $Id$
- * @package System
- */
-
-/**
- * TService class.
- *
- * TService implements the basic methods required by IService and may be
- * used as the basic class for application services.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @version $Id$
- * @package System
- * @since 3.0
- */
-abstract class TService extends TApplicationComponent implements IService
-{
-	/**
-	 * @var string service id
-	 */
-	private $_id;
-	/**
-	 * @var boolean whether the service is enabled
-	 */
-	private $_enabled=true;
-
-	/**
-	 * Initializes the service and attaches {@link run} to the RunService event of application.
-	 * This method is required by IService and is invoked by application.
-	 * @param TXmlElement module configuration
-	 */
-	public function init($config)
-	{
-	}
-
-	/**
-	 * @return string id of this service
-	 */
-	public function getID()
-	{
-		return $this->_id;
-	}
-
-	/**
-	 * @param string id of this service
-	 */
-	public function setID($value)
-	{
-		$this->_id=$value;
-	}
-
-	/**
-	 * @return boolean whether the service is enabled
-	 */
-	public function getEnabled()
-	{
-		return $this->_enabled;
-	}
-
-	/**
-	 * @param boolean whether the service is enabled
-	 */
-	public function setEnabled($value)
-	{
-		$this->_enabled=TPropertyValue::ensureBoolean($value);
-	}
-
-	/**
-	 * Runs the service.
-	 */
-	public function run()
-	{
-	}
-}
-
+ * @license http://www.pradosoft.com/license/
+ * @version $Id$
+ * @package System
+ */
+
+/**
+ * TService class.
+ *
+ * TService implements the basic methods required by IService and may be
+ * used as the basic class for application services.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @version $Id$
+ * @package System
+ * @since 3.0
+ */
+abstract class TService extends TApplicationComponent implements IService
+{
+	/**
+	 * @var string service id
+	 */
+	private $_id;
+	/**
+	 * @var boolean whether the service is enabled
+	 */
+	private $_enabled=true;
+
+	/**
+	 * Initializes the service and attaches {@link run} to the RunService event of application.
+	 * This method is required by IService and is invoked by application.
+	 * @param TXmlElement module configuration
+	 */
+	public function init($config)
+	{
+	}
+
+	/**
+	 * @return string id of this service
+	 */
+	public function getID()
+	{
+		return $this->_id;
+	}
+
+	/**
+	 * @param string id of this service
+	 */
+	public function setID($value)
+	{
+		$this->_id=$value;
+	}
+
+	/**
+	 * @return boolean whether the service is enabled
+	 */
+	public function getEnabled()
+	{
+		return $this->_enabled;
+	}
+
+	/**
+	 * @param boolean whether the service is enabled
+	 */
+	public function setEnabled($value)
+	{
+		$this->_enabled=TPropertyValue::ensureBoolean($value);
+	}
+
+	/**
+	 * Runs the service.
+	 */
+	public function run()
+	{
+	}
+}
+
diff --git a/framework/Web/UI/WebControls/TBaseValidator.php b/framework/Web/UI/WebControls/TBaseValidator.php
index 6e4e8f71..30320c5f 100644
--- a/framework/Web/UI/WebControls/TBaseValidator.php
+++ b/framework/Web/UI/WebControls/TBaseValidator.php
@@ -416,7 +416,18 @@ abstract class TBaseValidator extends TLabel implements IValidator
 	public function getFocusElementID()
 	{
 		if(($id=$this->getViewState('FocusElementID',''))==='')
-			$id=$this->getValidationTarget()->getClientID();
+		{
+			$target=$this->getValidationTarget();
+			/* Workaround: TCheckBoxList and TRadioButtonList nests the actual
+			 * inputs inside a table; we ensure the first input gets focused
+			 */
+			if($target instanceof TCheckBoxList && $target->getItemCount()>0)
+			{
+				$id=$target->getClientID().'_c0';
+			} else {
+				$id=$target->getClientID();
+			}
+		}
 		return $id;
 	}
 
diff --git a/framework/Web/UI/WebControls/TRadioButtonList.php b/framework/Web/UI/WebControls/TRadioButtonList.php
index 88dff7dd..88d98881 100644
--- a/framework/Web/UI/WebControls/TRadioButtonList.php
+++ b/framework/Web/UI/WebControls/TRadioButtonList.php
@@ -1,101 +1,101 @@
-<?php
-/**
- * TRadioButtonList class file
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @link http://www.pradosoft.com/
+<?php
+/**
+ * TRadioButtonList class file
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.pradosoft.com/
  * @copyright Copyright &copy; 2005-2011 PradoSoft
- * @license http://www.pradosoft.com/license/
- * @version $Id$
- * @package System.Web.UI.WebControls
- */
-
-/**
- * Includes TRadioButton class
- */
-Prado::using('System.Web.UI.WebControls.TRadioButton');
-/**
- * Includes TCheckBoxList class
- */
-Prado::using('System.Web.UI.WebControls.TCheckBoxList');
-
-/**
- * TRadioButtonList class
- *
- * TRadioButtonList displays a list of radiobuttons on a Web page.
- *
- * TRadioButtonList inherits all properties and events of {@link TCheckBoxList}.
- * Each TRadioButtonList displays one group of radiobuttons, i.e., at most
- * one radiobutton can be selected at a time.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @version $Id$
- * @package System.Web.UI.WebControls
- * @since 3.0
- */
-class TRadioButtonList extends TCheckBoxList
-{
-	/**
-	 * @return boolean whether this control supports multiple selection. Always false for radiobutton list.
-	 */
-	protected function getIsMultiSelect()
-	{
-		return false;
-	}
-
-	/**
-	 * Creates a control used for repetition (used as a template).
-	 * @return TControl the control to be repeated
-	 */
-	protected function createRepeatedControl()
-	{
-		return new TRadioButton;
-	}
-
-	/**
-	 * Loads user input data.
-	 * This method is primarly used by framework developers.
-	 * @param string the key that can be used to retrieve data from the input data collection
-	 * @param array the input data collection
-	 * @return boolean whether the data of the control has been changed
-	 */
-	public function loadPostData($key,$values)
-	{
-		$value=isset($values[$key])?$values[$key]:'';
-		$oldSelection=$this->getSelectedIndex();
-		$this->ensureDataBound();
-		foreach($this->getItems() as $index=>$item)
-		{
-			if($item->getEnabled() && $item->getValue()===$value)
-			{
-				if($index===$oldSelection)
-					return false;
-				else
-				{
-					$this->setSelectedIndex($index);
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @throws TNotSupportedException if this method is invoked
-	 */
-	public function setSelectedIndices($indices)
-	{
-		throw new TNotSupportedException('radiobuttonlist_selectedindices_unsupported');
-	}
-
-	/**
-	 * Gets the name of the javascript class responsible for performing postback for this control.
-	 * This method overrides the parent implementation.
-	 * @return string the javascript class name
-	 */
-	protected function getClientClassName()
-	{
-		return 'Prado.WebUI.TRadioButtonList';
-	}
-}
-
+ * @license http://www.pradosoft.com/license/
+ * @version $Id$
+ * @package System.Web.UI.WebControls
+ */
+
+/**
+ * Includes TRadioButton class
+ */
+Prado::using('System.Web.UI.WebControls.TRadioButton');
+/**
+ * Includes TCheckBoxList class
+ */
+Prado::using('System.Web.UI.WebControls.TCheckBoxList');
+
+/**
+ * TRadioButtonList class
+ *
+ * TRadioButtonList displays a list of radiobuttons on a Web page.
+ *
+ * TRadioButtonList inherits all properties and events of {@link TCheckBoxList}.
+ * Each TRadioButtonList displays one group of radiobuttons, i.e., at most
+ * one radiobutton can be selected at a time.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @version $Id$
+ * @package System.Web.UI.WebControls
+ * @since 3.0
+ */
+class TRadioButtonList extends TCheckBoxList
+{
+	/**
+	 * @return boolean whether this control supports multiple selection. Always false for radiobutton list.
+	 */
+	protected function getIsMultiSelect()
+	{
+		return false;
+	}
+
+	/**
+	 * Creates a control used for repetition (used as a template).
+	 * @return TControl the control to be repeated
+	 */
+	protected function createRepeatedControl()
+	{
+		return new TRadioButton;
+	}
+
+	/**
+	 * Loads user input data.
+	 * This method is primarly used by framework developers.
+	 * @param string the key that can be used to retrieve data from the input data collection
+	 * @param array the input data collection
+	 * @return boolean whether the data of the control has been changed
+	 */
+	public function loadPostData($key,$values)
+	{
+		$value=isset($values[$key])?$values[$key]:'';
+		$oldSelection=$this->getSelectedIndex();
+		$this->ensureDataBound();
+		foreach($this->getItems() as $index=>$item)
+		{
+			if($item->getEnabled() && $item->getValue()===$value)
+			{
+				if($index===$oldSelection)
+					return false;
+				else
+				{
+					$this->setSelectedIndex($index);
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * @throws TNotSupportedException if this method is invoked
+	 */
+	public function setSelectedIndices($indices)
+	{
+		throw new TNotSupportedException('radiobuttonlist_selectedindices_unsupported');
+	}
+
+	/**
+	 * Gets the name of the javascript class responsible for performing postback for this control.
+	 * This method overrides the parent implementation.
+	 * @return string the javascript class name
+	 */
+	protected function getClientClassName()
+	{
+		return 'Prado.WebUI.TRadioButtonList';
+	}
+}
+
-- 
cgit v1.2.3