Проблемы с getModels
Проблемы с getModels
getModels() выдает пустые модели. Я не работаю ни с sql базами, ни с sql запросами. Я создала свой dataprovider для заполнения models[].
Мой dataprovider похож на ArrayDataProvider, но я по-другому заполняю models[].
Мой dataprovider похож на ArrayDataProvider, но я по-другому заполняю models[].
- Dominus
- Сообщения: 892
- Зарегистрирован: 2013.03.14, 21:27
- Откуда: Россия, Иваново
- Контактная информация:
Re: Проблемы с getModels
Трудно что то сказать, мало информации, код бы глянуть.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Re: Проблемы с getModels
Вот три функции показываю: Когда вызываю getModels, он возвращает пустые модели. Значения modl и id1 пусты.
public function actionIndex()
{
$this->FormArrayFromTable_1();
$this->FormDataProvider();
$rows = $this->dataProvider->getModels();
foreach($this->row as $model)
{
$modl = $model->name;
$id1 = $model->id;
}
return $this->render('index', [
'model' => $model, 'dataProvider' => $this->dataProvider, ,
]);
}
public function FormArrayFromTable_1()
{
ArrayHelper::setValue($this->data, '1', ['id' => '100', 'name' => 'admin']);
ArrayHelper::setValue($this->data, '2', ['id' => '200', 'name' => 'demo']);
ArrayHelper::setValue($this->data, '3', ['id' => '300', 'name' => 'demo']);
ArrayHelper::setValue($this->data, '4', ['id' => '400', 'name' => 'demo']);
ArrayHelper::setValue($this->data, '5', ['id' => '500', 'name' => 'demo']);
}
public function FormDataProvider()
{
$this->dataProvider = new ArrayDataProvider
([
'allModels' => $this->data,
'key' => 'id',
'pagination' => [
// 'pageSize' => 3,
],
'sort' => [
// 'attributes' => ['id', 'name'],
],
]);
$this->row = $this->dataProvider->getModels();
$this->cnt = $this->dataProvider->getTotalCount();
}
public function actionIndex()
{
$this->FormArrayFromTable_1();
$this->FormDataProvider();
$rows = $this->dataProvider->getModels();
foreach($this->row as $model)
{
$modl = $model->name;
$id1 = $model->id;
}
return $this->render('index', [
'model' => $model, 'dataProvider' => $this->dataProvider, ,
]);
}
public function FormArrayFromTable_1()
{
ArrayHelper::setValue($this->data, '1', ['id' => '100', 'name' => 'admin']);
ArrayHelper::setValue($this->data, '2', ['id' => '200', 'name' => 'demo']);
ArrayHelper::setValue($this->data, '3', ['id' => '300', 'name' => 'demo']);
ArrayHelper::setValue($this->data, '4', ['id' => '400', 'name' => 'demo']);
ArrayHelper::setValue($this->data, '5', ['id' => '500', 'name' => 'demo']);
}
public function FormDataProvider()
{
$this->dataProvider = new ArrayDataProvider
([
'allModels' => $this->data,
'key' => 'id',
'pagination' => [
// 'pageSize' => 3,
],
'sort' => [
// 'attributes' => ['id', 'name'],
],
]);
$this->row = $this->dataProvider->getModels();
$this->cnt = $this->dataProvider->getTotalCount();
}
- Dominus
- Сообщения: 892
- Зарегистрирован: 2013.03.14, 21:27
- Откуда: Россия, Иваново
- Контактная информация:
Re: Проблемы с getModels
Код: Выделить всё
public $dataProvider;
public $row;
public $cnt;
private $data = [];
/**
* Renders the index view for the module
* @return string
*/
public function actionIndex()
{
$this->FormDataProvider();
$result = [];
foreach ($this->row as $key => $model) {
//VarDumper::dump($model['id'], 10, 1);
//VarDumper::dump($model['name'], 10, 1);
$result[$key]['name'] = $model['name'];
$result[$key]['id'] = $model['id'];
}
return $this->render('index', [
'model' => $result, // $this->row
'dataProvider' => $this->dataProvider
]);
}
public function FormArrayFromTable_1()
{
ArrayHelper::setValue($this->data, '1', ['id' => '100', 'name' => 'admin']);
ArrayHelper::setValue($this->data, '2', ['id' => '200', 'name' => 'demo']);
ArrayHelper::setValue($this->data, '3', ['id' => '300', 'name' => 'demo']);
ArrayHelper::setValue($this->data, '4', ['id' => '400', 'name' => 'demo']);
ArrayHelper::setValue($this->data, '5', ['id' => '500', 'name' => 'demo']);
}
public function FormDataProvider()
{
$this->FormArrayFromTable_1();
$this->dataProvider = new ArrayDataProvider
([
'allModels' => $this->data,
'key' => 'id',
'pagination' => [
//'pageSize' => 3,
],
'sort' => [
//'attributes' => ['id', 'name'],
],
]);
$this->row = $this->dataProvider->getModels();
$this->cnt = $this->dataProvider->getTotalCount();
}
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Re: Проблемы с getModels
Огромное спасибо, Dominus ! Получилось.
Можно я задам еще вопрос ? Контроллер передает в actionUpdate $id. Это индекс модели в массиве моделей ? И как тогда вытащить необходимую модель ? Она должна быть в массиве моделей или ее надо где-то хранить ?
Извини, может задаю глупые вопросы, но я только учусь.
Будет возможность, ответь, пожалуйста.
Можно я задам еще вопрос ? Контроллер передает в actionUpdate $id. Это индекс модели в массиве моделей ? И как тогда вытащить необходимую модель ? Она должна быть в массиве моделей или ее надо где-то хранить ?
Извини, может задаю глупые вопросы, но я только учусь.
Будет возможность, ответь, пожалуйста.
- Dominus
- Сообщения: 892
- Зарегистрирован: 2013.03.14, 21:27
- Откуда: Россия, Иваново
- Контактная информация:
Re: Проблемы с getModels
Я не вижу у вас модели, в примере выше это работа с массивом. А так, сперва нужно создать модель, в ней работать с данными и далее уже как с обычной моделью.
https://www.yiiframework.com/doc/guide/ ... ure-models
https://www.yiiframework.com/doc/guide/ ... ure-models
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Re: Проблемы с getModels
Вот actionUpdate:
public function actionUpdate($id)
{
// получить модель по id
if ($model->load(Yii::$app->request->post()))
{
// обновить запись в базе
return $this->redirect(['index']);
}
else
{
return $this->render('update', [
'model' => $model,
]);
}
}
Что такое $id ? Как мне получить model ?
public function actionUpdate($id)
{
// получить модель по id
if ($model->load(Yii::$app->request->post()))
{
// обновить запись в базе
return $this->redirect(['index']);
}
else
{
return $this->render('update', [
'model' => $model,
]);
}
}
Что такое $id ? Как мне получить model ?
- Dominus
- Сообщения: 892
- Зарегистрирован: 2013.03.14, 21:27
- Откуда: Россия, Иваново
- Контактная информация:
Re: Проблемы с getModels
Ну на пример:
Model:
Controller:
View:
Index.php
view.php
С редактированием так же как и с actionView, получаете данные, обрабатываете и записываете.
Model:
Код: Выделить всё
<?php
namespace modules\blog\models;
use Yii;
use yii\base\Model;
use yii\data\ArrayDataProvider;
/**
* Class MyModel
* @package modules\blog\models
*/
class MyModel extends Model
{
public $id;
public $name;
/**
* @inheritdoc
* @return array
*/
public function rules()
{
return [
[['id', 'name'], 'safe'],
];
}
/**
* @inheritdoc
* @return array
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'name' => 'Name',
];
}
/**
* @param array $array
* @return ArrayDataProvider
*/
public function getDataProvider($array = [])
{
return new ArrayDataProvider([
'allModels' => $array,
'key' => 'id',
'pagination' => [
//'pageSize' => 3,
],
'sort' => [
//'attributes' => ['id', 'name'],
],
]);
}
/**
* Массив данных
* @return array
*/
public function getDataArray()
{
return [
['id' => '100', 'name' => 'admin'],
['id' => '200', 'name' => 'demo1'],
['id' => '300', 'name' => 'demo2'],
['id' => '400', 'name' => 'demo3'],
['id' => '500', 'name' => 'demo4'],
];
}
/**
* Возвращает модель по id
* @param string|integer $id
* @return $this MyModel
*/
public function getOneData($id = '')
{
foreach ($this->getDataArray() as $item) {
if ($item['id'] == $id) {
$this->name = $item['name'];
$this->id = $item['id'];
}
}
return $this;
}
}
Код: Выделить всё
<?php
namespace modules\blog\controllers\frontend;
use yii\web\Controller;
use modules\blog\models\MyModel;
/**
* Class DevController
* @package modules\blog\controllers\frontend
*/
class DevController extends Controller
{
/**
* Renders the index view for the module
* @return string
*/
public function actionIndex()
{
$model = new MyModel();
return $this->render('index', [
'dataProvider' => $model->getDataProvider($model->getDataArray())
]);
}
/**
* @param $id
* @return string
*/
public function actionView($id)
{
$model = new MyModel();
return $this->render('view', [
'model' => $model->getOneData($id)
]);
}
}
Index.php
Код: Выделить всё
<?php
use yii\helpers\VarDumper;
?>
<div class="blog-frontend-dev-index">
<?php
VarDumper::dump($dataProvider, 10, 1);
?>
</div>
Код: Выделить всё
<?php
use yii\helpers\VarDumper;
?>
<div class="blog-frontend-dev-view">
<?php
VarDumper::dump($model->name, 10, 1);
?>
</div>
Последний раз редактировалось Dominus 2018.04.22, 20:11, всего редактировалось 3 раза.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Re: Проблемы с getModels
Спасибо большое. Сейчас попробую. Идея понятна.
Re: Проблемы с getModels
Хотела бы переспросить. Получается, если я хочу просмотреть/редактировать/удалить запись, мне все равно надо создавать экземпляр модели и затем передавать ее полям найденные по id значения ?
- Dominus
- Сообщения: 892
- Зарегистрирован: 2013.03.14, 21:27
- Откуда: Россия, Иваново
- Контактная информация:
Re: Проблемы с getModels
Controller:
Model:
Как то так.
Код: Выделить всё
/**
* @return string
*/
public function actionIndex()
{
$model = new MyModel();
return $this->render('index', [
'dataProvider' => $model->getDataProvider($model->getDataArray())
]);
}
/**
* @param $id
* @return string
* @throws \yii\web\NotFoundHttpException
*/
public function actionView($id)
{
return $this->render('view', [
'model' => $this->findModel($id)
]);
}
/**
* @param $id
* @return string|\yii\web\Response
* @throws \yii\web\NotFoundHttpException
*/
public function actionUpdate($id)
{
$model = $this->findModel($id);
if ($model->load(\Yii::$app->request->post())) {
if ($model->validate() && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
}
}
return $this->render('update', [
'model' => $model,
]);
}
/**
* @param $id
* @return MyModel
* @throws \yii\web\NotFoundHttpException
*/
protected function findModel($id)
{
$model = new MyModel();
if ($model->getOneData($id) !== null) {
return $model;
}
throw new \yii\web\NotFoundHttpException('The requested page does not exist.');
}
Код: Выделить всё
/**
* Возвращает модель по id
* @param string|integer $id
* @return $this MyModel
*/
public function getOneData($id = '')
{
foreach ($this->getDataArray() as $item) {
if ($item['id'] == $id) {
$this->name = $item['name'];
$this->id = $item['id'];
return $this;
}
}
return null;
}
/**
* Метод сохранения
*/
public function save()
{
// Тут пишем в файл или куда там
}
Последний раз редактировалось Dominus 2018.04.22, 21:34, всего редактировалось 1 раз.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
- Dominus
- Сообщения: 892
- Зарегистрирован: 2013.03.14, 21:27
- Откуда: Россия, Иваново
- Контактная информация:
Re: Проблемы с getModels
Ну модель же надо как то заполнить данными)
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!