$model не передается полностью в post

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
rockstardavid
Сообщения: 12
Зарегистрирован: 2016.10.03, 19:06

$model не передается полностью в post

Сообщение rockstardavid »

Добрый вечер!
У меня есть active form

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

<?php $form = ActiveForm::begin([
                'action' => ['messages/send']
            ]); ?>
            <span class="w3-xlarge"><?= Html::encode($model->user_to) ?></span>
            <?= Html::activeTextInput($model, 'message',['class' => 'w3-input w3-border w3-round']); ?>
                <?= Html::activeTextInput($model, 'user_from'); ?>
                <?= Html::activeTextInput($model, 'user_to'); ?>
                <div class="form-group">
                    <?= Html::submitButton('Create', ['class' => 'btn btn-primary']) ?>
                </div>
                <span class="w3-xlarge"><?= Html::encode($model->user_to) ?></span>
            <?php ActiveForm::end(); ?>
вот экшн, куда направляется post запрос,

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

public function actionSend() {
        $model = new Messages();
        if($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->render('dialog',['id' => $model->user_to]);
        }
        return $this->render('dialog',['id' => $model->user_to]);
    } 
Вопрос вот в чем, модель, которую я в форме заполняю, я предварительно заполняю некоторые поля, которые мне не нужно получать из формы:

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

<?php
$model = new Messages();
$model->setUser_from($user->getId());
$model->setUser_to($id);
?>
Но почему-то экшн эти данные не получает, он получает только поля, которые были заполнены в эктив форме. Для примера я добавил эти два поля в эктив форму, и тогда у меня экшн получил эти поля. Расскажите пожалуйста в чем дело

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

<?= Html::activeTextInput($model, 'user_from'); ?>
                <?= Html::activeTextInput($model, 'user_to'); ?>
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: $model не передается полностью в post

Сообщение Onotole »

В rules эти свойства объявлены?
caHek2x
Сообщения: 1243
Зарегистрирован: 2016.04.12, 20:41

Re: $model не передается полностью в post

Сообщение caHek2x »

Но почему-то экшн эти данные не получает
экшн не получает или load не загружает ?
сделайте

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

if (Yii::$app->request->isPost) {
    print_r(Yii::$app->request->post());
    die();
}
ну или в дебаг панели посмотрите что приходит ... и если все таки все приходит и load не отрабатывает то тогда как вам подсказали выше смотрите rules
rockstardavid
Сообщения: 12
Зарегистрирован: 2016.10.03, 19:06

Re: $model не передается полностью в post

Сообщение rockstardavid »

в rules есть эти свойства(генерировалось через gii)

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

    
            [['user_from'], 'exist', 'skipOnError' => true, 'targetClass' => Users::className(), 'targetAttribute' => ['user_from' => 'id']],
            [['user_to'], 'exist', 'skipOnError' => true, 'targetClass' => Users::className(), 'targetAttribute' => ['user_to' => 'id']],
 
в дебаггере в POST отсутствуют эти поля, но если добавить во эктив форм эти строки(ниже), то они передаются. Во вьюхе в модель они точно корректно присваиваются, так как выводил, проверял. Также все input поля корректно отправляются POST запросом

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

     <?= Html::activeTextInput($model, 'user_from'); ?>
                <?= Html::activeTextInput($model, 'user_to'); ?>
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: $model не передается полностью в post

Сообщение ElisDN »

Присваивайте в контроллере, а не во вьюхе.
rockstardavid
Сообщения: 12
Зарегистрирован: 2016.10.03, 19:06

Re: $model не передается полностью в post

Сообщение rockstardavid »

Разобрался, спасибо
rockstardavid
Сообщения: 12
Зарегистрирован: 2016.10.03, 19:06

Re: $model не передается полностью в post

Сообщение rockstardavid »

Запутался, подскажите пожалуйста
Есть вьюшка, в которую передалась модель, в этой вьюшке есть инпут поля для этой модели, заполняю в эктив форме, через сабмит-баттон мне надо переслать в другой экшн те данные, которые были изначально отправлены в эту вьюшку, и плюс те, которые были добавлены в эктив форме, но старые данные модели пропадают. Пробовал через Html::a, но как передать инпут поля из эктив формы через html::a? можно ли привязать html::a как сабмит-баттон для эктив формы, чтобы не потерять загруженную в эту вьюшку модель, при этом отправить еще input поля
Restlin
Сообщения: 139
Зарегистрирован: 2011.09.09, 18:12

Re: $model не передается полностью в post

Сообщение Restlin »

Несколько раз прочел ваш вопрос, если честно так до конца не уверен, что понял его правильно.
Но общая мысль такая:
если вы из формы загружаете дополнительные поля в модель, то сперва сохраните модель в контроллере, а затем с помощью редиректа передайте id модели на новый action, где уже по id загружаете модель из базы и обрабатываете как старые, так и новые поля модели.
rockstardavid
Сообщения: 12
Зарегистрирован: 2016.10.03, 19:06

Re: $model не передается полностью в post

Сообщение rockstardavid »

можно мне простой пример пожалуйста, я что-то догнать не могу

Есть модель таблицы БД, которая имеет следующие поля:

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

class Test extends \yii\db\ActiveRecord {
public function rules()
    {
        return [
            [['test1','test2'], 'string'],
} 
есть у меня первая вью, где есть кнопка, которая при нажатии отправляет $id другому экшену

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

<?= Html::a('actionTest'',Yii::$app->urlManager->createUrl(["test/actionOne","$id"=>$id]), ['class'=>'w3-closebtn w3-padding w3-margin-right w3-medium']) ?>
этот экшн получает этот айдишник и рендерит вторую вьюшку и отправляет туда сформированную модель

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

public function actionOne($id) {
$model = Test::findOne(['id' => $id]);
$model->test1 = 'test';
return $this->render('view2',
            [
                'model' => $model,
            ]);
}
 
во второй вьюшке у меня есть эктив форма, которая апдейтит некоторые поля модели

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

<?php $form = ActiveForm::begin(
                [
                    'method' => 'get',
                    'action' => ['test/actionTwo'],
                ]
            ); ?>
                <?= Html::activeTextInput($model, 'testField',['class' => 'form-field']); ?>
                <div class="form-group">
                    <?= Html::submitButton('test2', ['class' => 'submit-button']) ?>
                </div>
                <?php ActiveForm::end(); ?>
Мне нужно, чтобы при отправке get/post запроса во второй экшн, модель $model не потеряла значение поля $model->test1 и также была отправлена post/get запросом. Извините, если я как-то некорректно выражаюсь
Tokha
Сообщения: 23
Зарегистрирован: 2013.05.31, 08:48

Re: $model не передается полностью в post

Сообщение Tokha »

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

public function actionOne($id) {
$model = Test::findOne(['id' => $id]);
$model->test1 = 'test';

// Записали модель, чтобы не потерять значение поля
$model->save();
...

 
rockstardavid
Сообщения: 12
Зарегистрирован: 2016.10.03, 19:06

Re: $model не передается полностью в post

Сообщение rockstardavid »

этот сейв сохранит модель в бд в первом экшене, а мне надо, чтобы сохранение модели в бд произошло во втором экшене
rockstardavid
Сообщения: 12
Зарегистрирован: 2016.10.03, 19:06

Re: $model не передается полностью в post

Сообщение rockstardavid »

вот я отправил модель во вторую вьюшку, я могу что угодно с этой моделью делать, менять значения полей этой модели, выводить, но как мне перенаправить эту модель в другой экшн, после того как я поменял например в эктив форме некоторые ее поля? у меня кнопка сабмит в эктив форме отправляет только те поля модели, которые были вызваны в эктив форме, а у меня в модели есть поля, которые не надо менять, но при этом их надо отправить во второй экшн при кнопке сабмит
Tokha
Сообщения: 23
Зарегистрирован: 2013.05.31, 08:48

Re: $model не передается полностью в post

Сообщение Tokha »

этот сейв сохранит модель в бд в первом экшене, а мне надо, чтобы сохранение модели в бд произошло во втором экшене
Вы сами себе противоречите:
этот экшн получает этот айдишник и рендерит вторую вьюшку и отправляет туда сформированную модель

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

public function actionOne($id) {
$model = Test::findOne(['id' => $id]);
$model->test1 = 'test';
return $this->render('view2',
            [
                'model' => $model,
            ]);
} 
Хорошо. Не сохраняйте в первом экшене, сохраняйте во втором, в который перейдете из формы. Я, видимо, не знаю какой-то страшной тайны, и это мешает уловить суть проблемы?
Tokha
Сообщения: 23
Зарегистрирован: 2013.05.31, 08:48

Re: $model не передается полностью в post

Сообщение Tokha »

а у меня в модели есть поля, которые не надо менять, но при этом их надо отправить во второй экшн при кнопке сабмит
Как вариант, сделать hidden-поля с "константами".
Tokha
Сообщения: 23
Зарегистрирован: 2013.05.31, 08:48

Re: $model не передается полностью в post

Сообщение Tokha »

Либо сделать поле "modelid", в котором будет передаваться id сохраненной ранее модели и в обработчике формы Вы просто сделаете findOne и зададите только изменившиеся поля.
rockstardavid
Сообщения: 12
Зарегистрирован: 2016.10.03, 19:06

Re: $model не передается полностью в post

Сообщение rockstardavid »

Да, вы правы, я неправильно выразился. Модель не полностью сформированная, а только некоторые поля. Просто я не могу сохранить во втором экшене, так как из второй вьюшку туда раннее сформированные поля не передаются, если только явно их в эктив форме не вызвать. Вы меня правильно поняли, для меня добавление hidden полей кажется костылем, хотя если честно, весь проект, который я пытаюсь сделать для себя мне уже кажется одним большим костылем) Вообще при правильном подходе, бывают ли ситуации, когда нужно так модели туда сюда передавать, или это из-за неопытности возникают такие ситуации?
rockstardavid
Сообщения: 12
Зарегистрирован: 2016.10.03, 19:06

Re: $model не передается полностью в post

Сообщение rockstardavid »

можете пожалуйста совсем простенький пример с обработчиком формы дать. То есть в обработчик можно загрузить модель а менять только некоторые поля?
Tokha
Сообщения: 23
Зарегистрирован: 2013.05.31, 08:48

Re: $model не передается полностью в post

Сообщение Tokha »

Вроде, разжевал уже:
[qoute]сделать поле "modelid", в котором будет передаваться id сохраненной ранее модели и в обработчике формы Вы просто сделаете findOne и зададите только изменившиеся поля[/quote]

Придется, видимо, в рот положить:

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

// Первый Action
public function actionOne($id) {
$model = Test::findOne(['id' => $id]);
$model->test1 = 'test';

// Добавили сохранение
$model->save();

return $this->render('view2',
            [
                'model' => $model,
            ]);
}

// Форма
<?php $form = ActiveForm::begin(
                [
                    'method' => 'get',
                    'action' => ['test/actionTwo'],
                ]
); ?>
// Не хотите hidden, сделайте полем ввода, обзовите, например, "Номер по порядку", можно сделать readonly
<?= Html::activeTextInput($model, 'id',['class' => 'form-field']); ?>
<?= Html::activeTextInput($model, 'testField',['class' => 'form-field']); ?>
<div class="form-group">
   <?= Html::submitButton('test2', ['class' => 'submit-button']) ?>
</div>
<?php ActiveForm::end(); ?>

// Второй Action
$model = Test::findOne(['id' => Yii::$app->request->post('id')]);
if ($model->load(Yii::$app->request->post('id')))
{
 ...
 $model->save();
}
То ли тег code глюкнул, то ли я скобку где-то не закрыл...
Restlin
Сообщения: 139
Зарегистрирован: 2011.09.09, 18:12

Re: $model не передается полностью в post

Сообщение Restlin »

Я так понимаю топик стартера, что он не хочет сохранять модель между action1 и action2, потому что иначе проблемы совершенно нет.
Но вот почему нельзя сохранить модель после action1 с неполными полями - для меня загадка
rockstardavid
Сообщения: 12
Зарегистрирован: 2016.10.03, 19:06

Re: $model не передается полностью в post

Сообщение rockstardavid »

Tolkha, я думал вы имеете ввиду что-то вроде опции эктив формы, а то что можно явно вызвать поле, а затем получить модель во втором экшене, это и так понятно было, спасибо

Restlin, завел себя в такую ситуацию, где запись в бд имеет смысл только после второго экшена
Ответить