С помощью Yii2
Мне нужно предоставить DataProvider
с конкретными данными.
Проблема в том, что мне нужно создать единый DataProvider
с массивом данных и данных из таблицы в базе данных.
Поэтому я думаю, что я должен смешать ArrayDataProvider
и ActiveDataProvider
, Я не знаю, если Yii2
предлагает инструменты для этой ситуации или я должен создать свой собственный DataProvider
от BaseDataProvider
,
Я не могу опубликовать код, потому что это вопрос знаний.
Согласно вашему описанию, вы можете попытаться получить данные из БД в виде массива, затем объединить их с другим имеющимся массивом, а затем поместить все это в ArrayDataProvider.
Попробуйте это (не проверено):
$dbData = Model::find()->all(); //load your data from DB
$arrayData = [...]; //your other data as an array
// do the merge, with ArrayHelper::merge() or somehow manually
$data = ArrayHelper::merge($dbData, $arrayData);
$provider = new ArrayDataProvider([
'allModels' => $data
]);
Да, подход Аспеда будут Работа. Вот рабочий пример, в функции Model — в этом случае я объединяю SqlDataProvider и ActiveDataProvider, чтобы объединить данные из двух таблиц, но тот же принцип применим к объединению любой другой комбинации DataProviders (да, я тестировал другие комбинации):
/**
* @return ArrayDataProvider;
*
* Combine current Activity with Archive:
*/
public function getActivityCombined() {
# Current:
$dataProviderActivityCurrent = new SqlDataProvider([
'sql' => 'SELECT listing_id, counter_reset, impress_town, impress_county,
impress_listing, clicks_web, clicks_facebook, clicks_twitter
FROM listing WHERE listing_id = ' . $this->listing_id,
]);
# Archive:
$query = ActivityArchive::find();
$dataProviderActivityArchive = new ActiveDataProvider([
'query' => $query,
]);
$dataProviderActivityArchive->query->andWhere(['listing_id' => $this->listing_id]);
# Merge:
$dataMerge = array_merge($dataProviderActivityCurrent->getModels(), $dataProviderActivityArchive->getModels());
$dataProviderActivity = new ArrayDataProvider([
'allModels' => $dataMerge
]);
# Return combined:
return $dataProviderActivity;
}
Конечно, вам нужно включить операторы использования для трех типов DataProvider.
Функция модели затем вызывается виджетом GridView в представлении:
echo GridView::widget([
'dataProvider' => $model->getActivityCombined(),
'columns' => [
'counter_reset',
'impress_town',
'impress_county',
'impress_listing',
'clicks_web',
'clicks_facebook',
'clicks_twitter',
],
]);