| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 | <?php/** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */namespace yii\data;use yii\helpers\ArrayHelper;/** * ArrayDataProvider implements a data provider based on a data array. * * The [[allModels]] property contains all data models that may be sorted and/or paginated. * ArrayDataProvider will provide the data after sorting and/or pagination. * You may configure the [[sort]] and [[pagination]] properties to * customize the sorting and pagination behaviors. * * Elements in the [[allModels]] array may be either objects (e.g. model objects) * or associative arrays (e.g. query results of DAO). * 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. * * Compared to [[ActiveDataProvider]], ArrayDataProvider could be less efficient * because it needs to have [[allModels]] ready. * * ArrayDataProvider may be used in the following way: * * ```php * $query = new Query; * $provider = new ArrayDataProvider([ *     'allModels' => $query->from('post')->all(), *     'sort' => [ *         'attributes' => ['id', 'username', 'email'], *     ], *     'pagination' => [ *         'pageSize' => 10, *     ], * ]); * // get the posts in the current page * $posts = $provider->getModels(); * ``` * * Note: if you want to use the sorting feature, you must configure the [[sort]] property * so that the provider knows which columns can be sorted. * * For more details and usage information on ArrayDataProvider, see the [guide article on data providers](guide:output-data-providers). * * @author Qiang Xue <qiang.xue@gmail.com> * @since 2.0 */class ArrayDataProvider extends BaseDataProvider{    /**     * @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 model.     * If this is not set, the index of the [[models]] array will be used.     * @see getKeys()     */    public $key;    /**     * @var array the data that is not paginated or sorted. When pagination is enabled,     * this property usually contains more elements than [[models]].     * The array elements must use zero-based integer keys.     */    public $allModels;    /**     * @var string the name of the [[\yii\base\Model|Model]] class that will be represented.     * This property is used to get columns' names.     * @since 2.0.9     */    public $modelClass;    /**     * {@inheritdoc}     */    protected function prepareModels()    {        if (($models = $this->allModels) === null) {            return [];        }        if (($sort = $this->getSort()) !== false) {            $models = $this->sortModels($models, $sort);        }        if (($pagination = $this->getPagination()) !== false) {            $pagination->totalCount = $this->getTotalCount();            if ($pagination->getPageSize() > 0) {                $models = array_slice($models, $pagination->getOffset(), $pagination->getLimit(), true);            }        }        return $models;    }    /**     * {@inheritdoc}     */    protected function prepareKeys($models)    {        if ($this->key !== null) {            $keys = [];            foreach ($models as $model) {                if (is_string($this->key)) {                    $keys[] = $model[$this->key];                } else {                    $keys[] = call_user_func($this->key, $model);                }            }            return $keys;        }        return array_keys($models);    }    /**     * {@inheritdoc}     */    protected function prepareTotalCount()    {        return is_array($this->allModels) ? count($this->allModels) : 0;    }    /**     * Sorts the data models according to the given sort definition.     * @param array $models the models to be sorted     * @param Sort $sort the sort definition     * @return array the sorted data models     */    protected function sortModels($models, $sort)    {        $orders = $sort->getOrders();        if (!empty($orders)) {            ArrayHelper::multisort($models, array_keys($orders), array_values($orders));        }        return $models;    }}
 |