From 0f380cd025dd9530b8faee7061d1957c5fd6cd9c Mon Sep 17 00:00:00 2001
From: xue <>
Date: Sat, 15 Apr 2006 12:20:50 +0000
Subject: Added TRepeater.DataKeys and TRepeater.DataKeyField

---
 HISTORY                                            |  5 +++
 .../protected/pages/Fundamentals/Modules.page      |  2 +-
 framework/Web/UI/WebControls/TRepeater.php         | 52 ++++++++++++++++++++++
 3 files changed, 58 insertions(+), 1 deletion(-)

diff --git a/HISTORY b/HISTORY
index 0dc6d25a..3fb5995b 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1,12 +1,17 @@
 Version 3.0RC2 April 16, 2006
 =============================
+BUG: Ticket#54 - recursive reverse() definition (Wei)
+BUG: Ticket#93 - ValidationGroup not working in TImageMap for js validator (Wei)
+BUG: Ticket#97 - Invalid return type value for TSimpleDateFormatter::parse (Wei)
 BUG: Ticket#118 - Variables that may not have been initialized (Qiang)
+BUG: Ticket#121 - OnClick don't fire with TImageButton and TRequiredFieldValidator (Wei)
 BUG: Ticket#129 - TRadioButtonList in TWizard step does not postback correctly (Qiang)
 CHG: Moved localize() into PradoBase (Qiang)
 CHG: List controls now use array keys as list item values even if the array is integer-indexed (Qiang)
 CHG: THttpUtility::htmlEncode and htmlDecode now do not deal with & (Qiang)
 ENH: Optimized the representation and evaluation of template expressions (Qiang)
 ENH: Added Raw layout to TDataList (Qiang)
+ENH: Added TRepeater.DataKeys and TRepeater.DataKeyField (Qiang)
 
 Version 3.0RC1 April 5, 2006
 ============================
diff --git a/demos/quickstart/protected/pages/Fundamentals/Modules.page b/demos/quickstart/protected/pages/Fundamentals/Modules.page
index ebf4ac53..782ebb8c 100644
--- a/demos/quickstart/protected/pages/Fundamentals/Modules.page
+++ b/demos/quickstart/protected/pages/Fundamentals/Modules.page
@@ -41,7 +41,7 @@ Error handler module is used to capture and process all error conditions in an a
 PRADO is released with a few more modules besides the core ones. They include caching modules (<tt>TSqliteCache</tt> and <tt>TMemCache</tt>), user management module (<tt>TUserManager</tt>), authentication and authorization module (<tt>TAuthManager</tt>), etc.
 </p>
 <p>
-When <tt>TPageService</tt> is requested, it also loads modules specific for page service, including asset manager (<tt>TAssetManager</tt>), template manager (<tt>TTemplateManager</tt>), theme/skin manager (<tt>TThemeManager</tt>), and page state persister (<tt>TPageStatePersister</tt>).
+When <tt>TPageService</tt> is requested, it also loads modules specific for page service, including asset manager (<tt>TAssetManager</tt>), template manager (<tt>TTemplateManager</tt>), theme/skin manager (<tt>TThemeManager</tt>).
 </p>
 <p>
 Custom modules and core modules are all configurable via <a href="?page=Configurations.Overview">configurations</a>.
diff --git a/framework/Web/UI/WebControls/TRepeater.php b/framework/Web/UI/WebControls/TRepeater.php
index 3d57fbd5..1acdc766 100644
--- a/framework/Web/UI/WebControls/TRepeater.php
+++ b/framework/Web/UI/WebControls/TRepeater.php
@@ -258,6 +258,35 @@ class TRepeater extends TDataBoundControl implements INamingContainer
 		return $this->_items;
 	}
 
+	/**
+	 * @return string the field of the data source that provides the keys of the list items.
+	 */
+	public function getDataKeyField()
+	{
+		return $this->getViewState('DataKeyField','');
+	}
+
+	/**
+	 * @param string the field of the data source that provides the keys of the list items.
+	 */
+	public function setDataKeyField($value)
+	{
+		$this->setViewState('DataKeyField',$value,'');
+	}
+
+	/**
+	 * @return TList the keys used in the data listing control.
+	 */
+	public function getDataKeys()
+	{
+		if(($dataKeys=$this->getViewState('DataKeys',null))===null)
+		{
+			$dataKeys=new TList;
+			$this->setViewState('DataKeys',$dataKeys,null);
+		}
+		return $dataKeys;
+	}
+
 	/**
 	 * Creates a repeater item instance based on the item type and index.
 	 * @param integer zero-based item index
@@ -405,11 +434,18 @@ class TRepeater extends TDataBoundControl implements INamingContainer
 	protected function performDataBinding($data)
 	{
 		$this->reset();
+
+		$keys=$this->getDataKeys();
+		$keys->clear();
+		$keyField=$this->getDataKeyField();
+
 		$items=$this->getItems();
 		$itemIndex=0;
 		$hasSeparator=$this->_separatorTemplate!==null;
 		foreach($data as $dataItem)
 		{
+			if($keyField!=='')
+				$keys->add($this->getDataFieldValue($dataItem,$keyField));
 			if($itemIndex===0 && $this->_headerTemplate!==null)
 				$this->_header=$this->createItemInternal(-1,self::IT_HEADER,true,null);
 			if($hasSeparator && $itemIndex>0)
@@ -493,6 +529,22 @@ class TRepeater extends TDataBoundControl implements INamingContainer
 	{
 		$this->raiseEvent('OnItemCommand',$this,$param);
 	}
+
+	/**
+	 * Returns the value of the data at the specified field.
+	 * If data is an array, TMap or TList, the value will be returned at the index
+	 * of the specified field. If the data is a component with a property named
+	 * as the field name, the property value will be returned.
+	 * Otherwise, an exception will be raised.
+	 * @param mixed data item
+	 * @param mixed field name
+	 * @return mixed data value at the specified field
+	 * @throws TInvalidDataValueException if the data is invalid
+	 */
+	protected function getDataFieldValue($data,$field)
+	{
+		return TDataFieldAccessor::getDataFieldValue($data,$field);
+	}
 }
 
 /**
-- 
cgit v1.2.3