Active Record пишет NULL в базу + непонятки с капчей.

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
New_Wind
Сообщения: 55
Зарегистрирован: 2015.03.09, 15:15
Контактная информация:

Active Record пишет NULL в базу + непонятки с капчей.

Сообщение New_Wind »

Всем привет.
Только начинаю ковырять Yii2.
Хочу сделать простую контактную форму. По субмиту которой копия сообщения отправлялась бы по мылу и копия ложилась в базу.

Мой view:

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

<?php $form = ActiveForm::begin([
            'options' => [
                    'class' => 'form-horizontal'
            ],
            'fieldConfig' => [
                'template' => '{label}<div class="col-sm-8">{input}{error}</div>',
                'labelOptions' => ['class' => 'col-sm-4 control-label'],
            ],
        ]); ?>
<?= $form->field($model, 'name')->textInput(['class' => 'form-control']) ?>
<?= $form->field($model, 'email') ?>
<?= $form->field($model, 'subject') ?>
<?= $form->field($model, 'body')->textArea(['rows' => 6]) ?>
                
                <?php 
//                $form->field($model, 'verifyCode')->widget(Captcha::className(), [
//                    'template' => '<div class="col-sm-4">{image}</div><div class="col-sm-4">{input}</div>',
//                ]) 
                ?>

<div class="form-group field-contactform-body required">
<div class="col-sm-4"></div><div class="col-sm-8">
<?= Html::submitButton('Отправить', ['class' => 'btn btn-primary', 'name' => 'contact-button']) ?>
</div>
</div>                
<?php ActiveForm::end(); ?>
Controller:

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

    public function actionContact()
    {
        $model = new ContactForm();

        if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail']) && $model->save()) {
            Yii::$app->session->setFlash('contactFormSubmitted');
            return $this->refresh();
        } else {        
            return $this->render('contact', array(
                'model' => $model
            ));
        }
    }
 
Model:

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

<?php
namespace app\models;

use Yii;
//use yii\base\Model;

class ContactForm extends \yii\db\ActiveRecord
{
    public $name;
    public $email;
    public $subject;
    public $body;
    public $verifyCode;
    
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return '{{%questions}}';
    }
    
    public function rules()
    {
        return [
            // the name, email, subject and body attributes are required
            [['name', 'email', 'subject', 'body'], 'required'],

            // the email attribute should be a valid email address
            ['email', 'email'],
            
            // verifyCode needs to be entered correctly
//            ['verifyCode', 'captcha'],                
        ];
    }
    public function attributeLabels()
    {
        return array(
                'name' => 'Ваше имя',
                'email' => 'Ваш адрес электронной почты',
                'subject' => 'Тема сообщения',
                'body' => 'Сообщение',
//                'verifyCode' => 'Проверочный код',
        );
    }    
    
    /**
     * Sends an email to the specified email address using the information collected by this model.
     * @param  string  $email the target email address
     * @return boolean whether the model passes validation
     */
    public function contact($email)
    {
        if ($this->validate()) {
            Yii::$app->mailer->compose()
            ->setTo($email)
            ->setFrom([$this->email => $this->name])
            ->setSubject($this->subject)
            ->setTextBody($this->body)
            ->send();
    
            return true;
        } else {
            return false;
        }
    }    
} 
В итоге, по субмиту формы, в базу ложится запись, все поля которой (кроме PK) равны NULL.
Почему так? Что делаю не так?



Кстати, попутный вопрос. Почему капча не дружит с ActiveRecord? Если делаю форму с проверкой капчи просто с отправкой на мыло, то капча нормально проходит валидацию, сообщение отправляется. А если подключаю ActiveRecord, то капча не проходит валидацию, и меня заново перекидывает на этап заполнения формы, где генерируется уже новая капча.
Последний раз редактировалось New_Wind 2015.04.01, 19:09, всего редактировалось 1 раз.
aquy
Сообщения: 48
Зарегистрирован: 2014.08.21, 09:35

Re: Active Record пишет NULL в базу.

Сообщение aquy »

метод contact в условии не совсем хорошо, так как отправка письма может не быстро выполниться.

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

public $name;
public $
public $subject;
public $body;
 
лучше уж определиться либо у вас это переменные, либо это у вас элементы БД, почему-то подозреваю, что метод load у вас как раз загружает в переменные и поэтому проходит валидация и метод save

Кстати мыло администратора лучше уж тоже в методе contact подставить, а не передавать6 я бы сделал что-то вроде:

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

if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        $model->contact();
        $model->save();
            Yii::$app->session->setFlash('contactFormSubmitted');
            return $this->refresh();
        } else {        
            return $this->render('contact', array(
                'model' => $model
            ));
        }
 
ну и в методе contact валидацию можно убрать
Аватара пользователя
New_Wind
Сообщения: 55
Зарегистрирован: 2015.03.09, 15:15
Контактная информация:

Re: Active Record пишет NULL в базу.

Сообщение New_Wind »

метод contact в условии не совсем хорошо, так как отправка письма может не быстро выполниться.
Спасибо, хороший совет.
лучше уж определиться либо у вас это переменные, либо это у вас элементы БД
Точно, проблема в этом была. Спасибо!
Аватара пользователя
New_Wind
Сообщения: 55
Зарегистрирован: 2015.03.09, 15:15
Контактная информация:

Re: Active Record пишет NULL в базу.

Сообщение New_Wind »

Вопрос по поводу капчи остается.

Почему как только в модель добавляю правило валидации:

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

['verifyCode', 'captcha'],
Форма проходит валидацию, но данные не сохраняются в базу. Если это правило валидации убираю, то форма нормально сохраняется в базу (при этом капча не проверяется).
Dodger_
Сообщения: 3
Зарегистрирован: 2015.04.29, 23:12

Re: Active Record пишет NULL в базу + непонятки с капчей.

Сообщение Dodger_ »

Форма проходит валидацию, но данные не сохраняются в базу. Если это правило валидации убираю, то форма нормально сохраняется в базу (при этом капча не проверяется).
Я тоже сегодня долго мучился с таким косяком. Нашел решение в похожих темах. Косяк в повторной validate(). происходит первый раз методе contact а второй раз при $model->save(). И второй раз уже вернет false. Так должно работать.

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

if ($model->load(Yii::$app->request->post()) && $model->save()) 
{
  $model->contact(Yii::$app->params['adminEmail'])
  ......
}
 
а в методе contact убрать проверку $this->validate()
lgXenos
Сообщения: 243
Зарегистрирован: 2015.11.30, 15:42

Re: Active Record пишет NULL в базу + непонятки с капчей.

Сообщение lgXenos »

Еще перефразирую предыдущего оратора примером кода (т.к. парит смотреть листинги в поисках того метода contact....):

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

$model = new Client();
$isLoaded = $model->load(Yii::$app->request->post());
$isValidated = $model->validate();
$isValidated2 = $model->validate();
var_dump($isLoaded, $isValidated, $isValidated2, $model->errors);
 
Выведет:
boolean true
boolean true
boolean false <==== повторная валидация зафейлилась, т.к. капча стерла сессионную переменную
array (size=1)
  'verifyCode' => 
    array (size=1)
      0 => string 'Неправильный проверочный код.' (length=55)
Поэтому, чтоб сохранить после ручной валидации используем или

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

$model->save(false)
Или только $model->save() без пред-валидации.
Ответить