summaryrefslogtreecommitdiff
path: root/framework/Data/ActiveRecord/Scaffold/TScaffoldSearch.php
blob: 30c3e7f897d17c89ceb0e9dda8b8589fa1837500 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
<?php
/**
 * TScaffoldSearch class file.
 *
 * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
 * @link https://github.com/pradosoft/prado
 * @copyright Copyright &copy; 2005-2016 The PRADO Group
 * @license https://github.com/pradosoft/prado/blob/master/COPYRIGHT
 * @version $Id$
 * @package System.Data.ActiveRecord.Scaffold
 */

/**
 * Import the scaffold base.
 */
Prado::using('System.Data.ActiveRecord.Scaffold.TScaffoldBase');

/**
 * TScaffoldSearch provide a simple textbox and a button that is used
 * to perform search on a TScaffoldListView with ID given by {@link setListViewID ListViewID}.
 *
 * The {@link getSearchText SearchText} property is a TTextBox and the
 * {@link getSearchButton SearchButton} property is a TButton with label value "Search".
 *
 * Searchable fields of the Active Record can be restricted by specifying
 * a comma delimited string of allowable fields in the
 * {@link setSearchableFields SearchableFields} property. The default is null,
 * meaning that most text type fields are searched (the default searchable fields
 * are database dependent).
 *
 * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
 * @version $Id$
 * @package System.Data.ActiveRecord.Scaffold
 * @since 3.1
 */
class TScaffoldSearch extends TScaffoldBase
{
	/**
	 * @var TScaffoldListView the scaffold list view.
	 */
	private $_list;

	/**
	 * @return TScaffoldListView the scaffold list view this search box belongs to.
	 */
	protected function getListView()
	{
		if($this->_list===null && ($id = $this->getListViewID()) !== null)
		{
			$this->_list = $this->getParent()->findControl($id);
			if($this->_list ===null)
				throw new TConfigurationException('scaffold_unable_to_find_list_view', $id);
		}
		return $this->_list;
	}

	/**
	 * @param string ID of the TScaffoldListView this search control belongs to.
	 */
	public function setListViewID($value)
	{
		$this->setViewState('ListViewID', $value);
	}

	/**
	 * @return string ID of the TScaffoldListView this search control belongs to.
	 */
	public function getListViewID()
	{
		return $this->getViewState('ListViewID');
	}

	/**
	 * Sets the SearchCondition of the TScaffoldListView as the search terms
	 * given by the text of the search text box.
	 */
	public function bubbleEvent($sender, $param)
	{
		if(strtolower($param->getCommandName())==='search')
		{
			if(($list = $this->getListView()) !== null)
			{
				$list->setSearchCondition($this->createSearchCondition());
				return false;
			}
		}
		$this->raiseBubbleEvent($this, $param);
		return true;
	}

	/**
	 * @return string the search criteria for the search terms in the search text box.
	 */
	protected function createSearchCondition()
	{
		$table = $this->getTableInfo();
		if(strlen($str=$this->getSearchText()->getText()) > 0)
		{
			$builder = $table->createCommandBuilder($this->getRecordFinder()->getDbConnection());
			return $builder->getSearchExpression($this->getFields(), $str);
		}
	}

	/**
	 * @return array list of fields to be searched.
	 */
	protected function getFields()
	{
		if(strlen(trim($str=$this->getSearchableFields()))>0)
			$fields = preg_split('/\s*,\s*/', $str);
		else
			$fields = $this->getTableInfo()->getColumns()->getKeys();
		return $fields;
	}

	/**
	 * @return string comma delimited list of fields that may be searched.
	 */
	public function getSearchableFields()
	{
		return $this->getViewState('SearchableFields','');
	}

	/**
	 * @param string comma delimited list of fields that may be searched.
	 */
	public function setSearchableFields($value)
	{
		$this->setViewState('SearchableFields', $value, '');
	}

	/**
	 * @return TButton button with default label "Search".
	 */
	public function getSearchButton()
	{
		$this->ensureChildControls();
		return $this->getRegisteredObject('_search');
	}

	/**
	 * @return TTextBox search text box.
	 */
	public function getSearchText()
	{
		$this->ensureChildControls();
		return $this->getRegisteredObject('_textbox');
	}
}