Проблемы с getModels

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Татьна
Сообщения: 96
Зарегистрирован: 2018.04.22, 00:17

Проблемы с getModels

Сообщение Татьна »

getModels() выдает пустые модели. Я не работаю ни с sql базами, ни с sql запросами. Я создала свой dataprovider для заполнения models[].
Мой dataprovider похож на ArrayDataProvider, но я по-другому заполняю models[].
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Проблемы с getModels

Сообщение Dominus »

Трудно что то сказать, мало информации, код бы глянуть.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Татьна
Сообщения: 96
Зарегистрирован: 2018.04.22, 00:17

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();
}
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Проблемы с getModels

Сообщение Dominus »

Код: Выделить всё

    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();
    }
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Татьна
Сообщения: 96
Зарегистрирован: 2018.04.22, 00:17

Re: Проблемы с getModels

Сообщение Татьна »

Огромное спасибо, Dominus ! Получилось.
Можно я задам еще вопрос ? Контроллер передает в actionUpdate $id. Это индекс модели в массиве моделей ? И как тогда вытащить необходимую модель ? Она должна быть в массиве моделей или ее надо где-то хранить ?
Извини, может задаю глупые вопросы, но я только учусь.
Будет возможность, ответь, пожалуйста.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Проблемы с getModels

Сообщение Dominus »

Я не вижу у вас модели, в примере выше это работа с массивом. А так, сперва нужно создать модель, в ней работать с данными и далее уже как с обычной моделью.
https://www.yiiframework.com/doc/guide/ ... ure-models
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Татьна
Сообщения: 96
Зарегистрирован: 2018.04.22, 00:17

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 ?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Проблемы с getModels

Сообщение Dominus »

Ну на пример:
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;
    }
}
Controller:

Код: Выделить всё

<?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)
        ]);
    }
}
View:
Index.php

Код: Выделить всё

<?php
use yii\helpers\VarDumper;
?>
<div class="blog-frontend-dev-index">
   <?php
   VarDumper::dump($dataProvider, 10, 1);
   ?>
</div>
view.php

Код: Выделить всё

<?php
use yii\helpers\VarDumper;
?>
<div class="blog-frontend-dev-view">
    <?php
    VarDumper::dump($model->name, 10, 1);
    ?>
</div>
С редактированием так же как и с actionView, получаете данные, обрабатываете и записываете.
Последний раз редактировалось Dominus 2018.04.22, 20:11, всего редактировалось 3 раза.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Татьна
Сообщения: 96
Зарегистрирован: 2018.04.22, 00:17

Re: Проблемы с getModels

Сообщение Татьна »

Спасибо большое. Сейчас попробую. Идея понятна.
Татьна
Сообщения: 96
Зарегистрирован: 2018.04.22, 00:17

Re: Проблемы с getModels

Сообщение Татьна »

Хотела бы переспросить. Получается, если я хочу просмотреть/редактировать/удалить запись, мне все равно надо создавать экземпляр модели и затем передавать ее полям найденные по id значения ?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Проблемы с getModels

Сообщение Dominus »

Controller:

Код: Выделить всё

    /**
     * @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.');
    }
Model:

Код: Выделить всё

    /**
     * Возвращает модель по 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

Сообщение Dominus »

Татьна писал(а): 2018.04.22, 20:16 Хотела бы переспросить. Получается, если я хочу просмотреть/редактировать/удалить запись, мне все равно надо создавать экземпляр модели и затем передавать ее полям найденные по id значения ?
Ну модель же надо как то заполнить данными)
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Ответить