|  |  | @ -13,25 +13,25 @@ use yii\helpers\ArrayHelper; | 
			
		
	
		
		
			
				
					
					|  |  |  | /** |  |  |  | /** | 
			
		
	
		
		
			
				
					
					|  |  |  |  * ArrayDataProvider implements a data provider based on a data array. |  |  |  |  * ArrayDataProvider implements a data provider based on a data array. | 
			
		
	
		
		
			
				
					
					|  |  |  |  * |  |  |  |  * | 
			
		
	
		
		
			
				
					
					|  |  |  |  * The [[allItems]] property contains all data items that may be sorted and/or paginated. |  |  |  |  * The [[allModels]] property contains all data models that may be sorted and/or paginated. | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  * ArrayDataProvider will provide the data after sorting and/or pagination. |  |  |  |  * ArrayDataProvider will provide the data after sorting and/or pagination. | 
			
		
	
		
		
			
				
					
					|  |  |  |  * You may configure the [[sort]] and [[pagination]] properties to |  |  |  |  * You may configure the [[sort]] and [[pagination]] properties to | 
			
		
	
		
		
			
				
					
					|  |  |  |  * customize the sorting and pagination behaviors. |  |  |  |  * customize the sorting and pagination behaviors. | 
			
		
	
		
		
			
				
					
					|  |  |  |  * |  |  |  |  * | 
			
		
	
		
		
			
				
					
					|  |  |  |  * Elements in the [[allItems]] array may be either objects (e.g. model objects) |  |  |  |  * Elements in the [[allModels]] array may be either objects (e.g. model objects) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  * or associative arrays (e.g. query results of DAO). |  |  |  |  * or associative arrays (e.g. query results of DAO). | 
			
		
	
		
		
			
				
					
					|  |  |  |  * Make sure to set the [[key]] property to the name of the field that uniquely |  |  |  |  * Make sure to set the [[key]] property to the name of the field that uniquely | 
			
		
	
		
		
			
				
					
					|  |  |  |  * identifies a data record or false if you do not have such a field. |  |  |  |  * identifies a data record or false if you do not have such a field. | 
			
		
	
		
		
			
				
					
					|  |  |  |  * |  |  |  |  * | 
			
		
	
		
		
			
				
					
					|  |  |  |  * Compared to [[ActiveDataProvider]], ArrayDataProvider could be less efficient |  |  |  |  * Compared to [[ActiveDataProvider]], ArrayDataProvider could be less efficient | 
			
		
	
		
		
			
				
					
					|  |  |  |  * because it needs to have [[allItems]] ready. |  |  |  |  * because it needs to have [[allModels]] ready. | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  * |  |  |  |  * | 
			
		
	
		
		
			
				
					
					|  |  |  |  * ArrayDataProvider may be used in the following way: |  |  |  |  * ArrayDataProvider may be used in the following way: | 
			
		
	
		
		
			
				
					
					|  |  |  |  * |  |  |  |  * | 
			
		
	
		
		
			
				
					
					|  |  |  |  * ~~~ |  |  |  |  * ~~~ | 
			
		
	
		
		
			
				
					
					|  |  |  |  * $query = new Query; |  |  |  |  * $query = new Query; | 
			
		
	
		
		
			
				
					
					|  |  |  |  * $provider = new ArrayDataProvider(array( |  |  |  |  * $provider = new ArrayDataProvider(array( | 
			
		
	
		
		
			
				
					
					|  |  |  |  *     'allItems' => $query->from('tbl_post')->all(), |  |  |  |  *     'allModels' => $query->from('tbl_post')->all(), | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  *     'sort' => array( |  |  |  |  *     'sort' => array( | 
			
		
	
		
		
			
				
					
					|  |  |  |  *         'attributes' => array( |  |  |  |  *         'attributes' => array( | 
			
		
	
		
		
			
				
					
					|  |  |  |  *              'id', 'username', 'email', |  |  |  |  *              'id', 'username', 'email', | 
			
		
	
	
		
		
			
				
					|  |  | @ -42,7 +42,7 @@ use yii\helpers\ArrayHelper; | 
			
		
	
		
		
			
				
					
					|  |  |  |  *     ), |  |  |  |  *     ), | 
			
		
	
		
		
			
				
					
					|  |  |  |  * )); |  |  |  |  * )); | 
			
		
	
		
		
			
				
					
					|  |  |  |  * // get the posts in the current page |  |  |  |  * // get the posts in the current page | 
			
		
	
		
		
			
				
					
					|  |  |  |  * $posts = $provider->getItems(); |  |  |  |  * $posts = $provider->getModels(); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  * ~~~ |  |  |  |  * ~~~ | 
			
		
	
		
		
			
				
					
					|  |  |  |  * |  |  |  |  * | 
			
		
	
		
		
			
				
					
					|  |  |  |  * Note: if you want to use the sorting feature, you must configure the [[sort]] property |  |  |  |  * Note: if you want to use the sorting feature, you must configure the [[sort]] property | 
			
		
	
	
		
		
			
				
					|  |  | @ -54,116 +54,110 @@ use yii\helpers\ArrayHelper; | 
			
		
	
		
		
			
				
					
					|  |  |  | class ArrayDataProvider extends DataProvider |  |  |  | class ArrayDataProvider extends DataProvider | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	/** |  |  |  | 	/** | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @var string|callable the column that is used as the key of the data items. |  |  |  | 	 * @var string|callable the column that is used as the key of the data models. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * This can be either a column name, or a callable that returns the key value of a given data item. |  |  |  | 	 * This can be either a column name, or a callable that returns the key value of a given data model. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * If this is not set, the index of the [[items]] array will be used. |  |  |  | 	 * If this is not set, the index of the [[models]] array will be used. | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	 * @see getKeys() |  |  |  | 	 * @see getKeys() | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 */ |  |  |  | 	 */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 	public $key; |  |  |  | 	public $key; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	/** |  |  |  | 	/** | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @var array the data that is not paginated or sorted. When pagination is enabled, |  |  |  | 	 * @var array the data that is not paginated or sorted. When pagination is enabled, | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * this property usually contains more elements than [[items]]. |  |  |  | 	 * this property usually contains more elements than [[models]]. | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	 * The array elements must use zero-based integer keys. |  |  |  | 	 * The array elements must use zero-based integer keys. | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 */ |  |  |  | 	 */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 	public $allItems; |  |  |  | 	public $allModels; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	private $_totalCount; |  |  |  | 	private $_totalCount; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	/** |  |  |  | 	/** | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * Returns the total number of data items. |  |  |  | 	 * Returns the total number of data models. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @return integer total number of possible data items. |  |  |  | 	 * @return integer total number of possible data models. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @throws InvalidConfigException |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	 */ |  |  |  | 	 */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 	public function getTotalCount() |  |  |  | 	public function getTotalCount() | 
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  | 	{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if ($this->getPagination() === false) { |  |  |  | 		if ($this->getPagination() === false) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			return $this->getCount(); |  |  |  | 			return $this->getCount(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} elseif ($this->_totalCount === null) { |  |  |  | 		} elseif ($this->_totalCount === null) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			if ($this->allItems !== null) { |  |  |  | 			$this->_totalCount = count($this->allModels); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				$this->_totalCount = count($this->allItems); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} else { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 				throw new InvalidConfigException('Unable to determine total item count: either "allItems" or "totalCount" must be set.'); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return $this->_totalCount; |  |  |  | 		return $this->_totalCount; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	/** |  |  |  | 	/** | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * Sets the total number of data items. |  |  |  | 	 * Sets the total number of data models. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @param integer $value the total number of data items. |  |  |  | 	 * @param integer $value the total number of data models. | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	 */ |  |  |  | 	 */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 	public function setTotalCount($value) |  |  |  | 	public function setTotalCount($value) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  | 	{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 		$this->_totalCount = $value; |  |  |  | 		$this->_totalCount = $value; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	private $_items; |  |  |  | 	private $_models; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	/** |  |  |  | 	/** | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * Returns the data items in the current page. |  |  |  | 	 * Returns the data models in the current page. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @return array the list of data items in the current page. |  |  |  | 	 * @return array the list of data models in the current page. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @throws InvalidConfigException |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	 */ |  |  |  | 	 */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 	public function getItems() |  |  |  | 	public function getModels() | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  | 	{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if ($this->_items === null) { |  |  |  | 		if ($this->_models === null) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			if (($items = $this->allItems) === null) { |  |  |  | 			if (($models = $this->allModels) === null) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				throw new InvalidConfigException('Either "items" or "allItems" must be set.'); |  |  |  | 				return array(); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 			if (($sort = $this->getSort()) !== false) { |  |  |  | 			if (($sort = $this->getSort()) !== false) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 				$items = $this->sortItems($items, $sort); |  |  |  | 				$models = $this->sortModels($models, $sort); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 			if (($pagination = $this->getPagination()) !== false) { |  |  |  | 			if (($pagination = $this->getPagination()) !== false) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 				$pagination->totalCount = $this->getTotalCount(); |  |  |  | 				$pagination->totalCount = $this->getTotalCount(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 				$items = array_slice($items, $pagination->getOffset(), $pagination->getLimit()); |  |  |  | 				$models = array_slice($models, $pagination->getOffset(), $pagination->getLimit()); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 			$this->_items = $items; |  |  |  | 			$this->_models = $models; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return $this->_items; |  |  |  | 		return $this->_models; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	/** |  |  |  | 	/** | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * Sets the data items in the current page. |  |  |  | 	 * Sets the data models in the current page. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @param array $items the items in the current page |  |  |  | 	 * @param array $models the models in the current page | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	 */ |  |  |  | 	 */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 	public function setItems($items) |  |  |  | 	public function setModels($models) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  | 	{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 		$this->_items = $items; |  |  |  | 		$this->_models = $models; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	private $_keys; |  |  |  | 	private $_keys; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	/** |  |  |  | 	/** | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * Returns the key values associated with the data items. |  |  |  | 	 * Returns the key values associated with the data models. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @return array the list of key values corresponding to [[items]]. Each data item in [[items]] |  |  |  | 	 * @return array the list of key values corresponding to [[models]]. Each data model in [[models]] | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	 * is uniquely identified by the corresponding key value in this array. |  |  |  | 	 * is uniquely identified by the corresponding key value in this array. | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 */ |  |  |  | 	 */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 	public function getKeys() |  |  |  | 	public function getKeys() | 
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  | 	{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if ($this->_keys === null) { |  |  |  | 		if ($this->_keys === null) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			$this->_keys = array(); |  |  |  | 			$this->_keys = array(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 			$items = $this->getItems(); |  |  |  | 			$models = $this->getModels(); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 			if ($this->key !== null) { |  |  |  | 			if ($this->key !== null) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 				foreach ($items as $item) { |  |  |  | 				foreach ($models as $model) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 					if (is_string($this->key)) { |  |  |  | 					if (is_string($this->key)) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 						$this->_keys[] = $item[$this->key]; |  |  |  | 						$this->_keys[] = $model[$this->key]; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 					} else { |  |  |  | 					} else { | 
			
		
	
		
		
			
				
					
					|  |  |  | 						$this->_keys[] = call_user_func($this->key, $item); |  |  |  | 						$this->_keys[] = call_user_func($this->key, $model); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 					} |  |  |  | 					} | 
			
		
	
		
		
			
				
					
					|  |  |  | 				} |  |  |  | 				} | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} else { |  |  |  | 			} else { | 
			
		
	
		
		
			
				
					
					|  |  |  | 				$this->_keys = array_keys($items); |  |  |  | 				$this->_keys = array_keys($models); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return $this->_keys; |  |  |  | 		return $this->_keys; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	/** |  |  |  | 	/** | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * Sets the key values associated with the data items. |  |  |  | 	 * Sets the key values associated with the data models. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @param array $keys the list of key values corresponding to [[items]]. |  |  |  | 	 * @param array $keys the list of key values corresponding to [[models]]. | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	 */ |  |  |  | 	 */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 	public function setKeys($keys) |  |  |  | 	public function setKeys($keys) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  | 	{ | 
			
		
	
	
		
		
			
				
					|  |  | @ -171,17 +165,17 @@ class ArrayDataProvider extends DataProvider | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	/** |  |  |  | 	/** | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * Sorts the data items according to the given sort definition |  |  |  | 	 * Sorts the data models according to the given sort definition | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @param array $items the items to be sorted |  |  |  | 	 * @param array $models the models to be sorted | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	 * @param Sort $sort the sort definition |  |  |  | 	 * @param Sort $sort the sort definition | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @return array the sorted data items |  |  |  | 	 * @return array the sorted data models | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	 */ |  |  |  | 	 */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 	protected function sortItems($items, $sort) |  |  |  | 	protected function sortModels($models, $sort) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  | 	{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 		$orders = $sort->getOrders(); |  |  |  | 		$orders = $sort->getOrders(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (!empty($orders)) { |  |  |  | 		if (!empty($orders)) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			ArrayHelper::multisort($items, array_keys($orders), array_values($orders)); |  |  |  | 			ArrayHelper::multisort($models, array_keys($orders), array_values($orders)); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return $items; |  |  |  | 		return $models; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
	
		
		
			
				
					|  |  | 
 |