Как сохранить данные в БД

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

Как сохранить данные в БД

Сообщение waterhero »

Хочу сохранить данные в БД,пару текстовых инпутов,значений пару инбоксов и несколько картинок(до 5). Проблема в том, что вроде бы(понятно что нет) все сделал правильно,а данных не сохраняются в БД.
Вьюшка:

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

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use dosamigos\fileupload\FileUploadUI;
?>
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<?php $form = ActiveForm::begin([
        'id' => 'my-form',
        'options' => ['enctype' => 'multipart/form-data']
    ]); ?>
    <div class="row">
        <div class="col-lg-6">
            <?= $form->field($entryForm, 'name')->textInput(['class'=>'name_class'])->input('name',['placeholder' => "Имя"])->label(false); ?>
        </div>
        <div class="col-lg-6">
            <?= $form->field($entryForm, 'email')->textInput()->input('email',['placeholder' => "E-mail"])->label(false); ?>
        </div>
    </div>
    <div class="row">
        <div class="col-lg-6">
            <?= $form->field($entryForm, 'age')->textInput()->input('age',['placeholder' => "Возраст(полных лет)"])->label(false); ?>
        </div>
        <div class="col-lg-6">
            <?= $form->field($entryForm, 'height')->textInput()->input('height',['placeholder' => "Рост"])->label(false); ?>
        </div>
    </div>
    <div class="row">
        <div class="col-lg-6">
            <?= $form->field($entryForm, 'weight')->textInput()->input('weight',['placeholder' => "Вес"])->label(false); ?>
        </div>
        <div class="col-lg-6">
            <?= $form->field($entryForm, 'city')->textInput()->input('city',['placeholder' => "Город проживания"])->label(false); ?>
        </div>
    </div>
    <div class="row">
        <div class="col-lg-3">
            <p><img class="describe_images" src="computer.png"></img>Нужна ли техника в аренду</p>
        </div>
        <?= $form->field($entryForm, 'techies')->checkboxList(['no'=>'Нет', 'yes_camera'=>'Да,только камера', 'yes_both'=>'да,компьютер и камера'])->label(false) ?>
    </div>
    <div class="row">
        <div class="col-lg-3">
            <p><img class="describe_images" src="English.png"></img>Знание английского</p>
        </div>

        <?= $form->field($entryForm, 'english_level')->checkboxList(['starter'=>'Без знания', 'elementary'=>'Базовый', 'intermediate'=>'Средний','up-intermediate'=>'Высокий','advanced'=>'Превосходный'])->label(false) ?>
    </div>
        <script>
        $('#my-form').submit( function(e) {
        e.preventDefault();

        var data = new FormData(this); // <-- 'this' is your form element

        $.ajax({
                url: 'index.php/form',
                data: data,
                cache: false,
                contentType: false,
                processData: false,
                type: 'POST',
                success: function(data){
                    alert(data);
                },
                error: function(){
            alert('ERROR at PHP side!!');
        }
    });
    });

        </script>
        <script>
        $(function() {
        // Multiple images preview in browser
        var imagesPreview = function(input, placetoinsert) {

            if (input.files) {
                var filesAmount = input.files.length;

                for (i = 0; i < filesAmount; i++) {
                    var reader = new FileReader();

                    reader.onload = function(event) {
                        $($.parseHTML('<img>')).attr('src', event.target.result).appendTo('.preview');
                    }

                    reader.readAsDataURL(input.files[i]);
                }
            }

        };

        $('#gallery-photo-add').on('change', function() {
            imagesPreview(this, 'div.gallery');
        });
    });
    </script>
    <div class="row">
        <div class="col-lg-6">
<div class="col-lg-6">
            <p class="add_photo"><img class="describe_images" src="photo.png"></img>Добавить фото(до 5 штук)</p>

   </div>
   <div class="col-lg-6">
 <?= $form->field($entryForm, 'images[]')->fileInput(['multiple' => true, 'accept' => 'image/*','id'=>'gallery-photo-add'])->label(false) ?>
   </div>


        </div>

        <div class="col-lg-6 pixels-line">
            <div class="preview"></div>
        </div>
    </div>
    <div class="form-group">
        <?= Html::submitButton('Отправить', ['class' => 'btn btn-primary']) ?>
    </div>
<?php ActiveForm::end() ?>
Моя модель,спроектированна с помощтью gii

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

<?php

namespace app\models;

use Yii;

use yii\db\ActiveRecord;
/**
 * This is the model class for table "form".
 *
 * @property integer $id
 * @property string $name
 * @property string $email
 * @property integer $age
 * @property integer $height
 * @property integer $weight
 * @property string $city
 * @property string $techies
 * @property string $english_level
 * @property resource $images
 * @property resource $photo_1
 * @property resource $photo_2
 * @property resource $photo_3
 * @property resource $photo_4
 * @property resource $photo_5
 */
class EntryForm extends \yii\db\ActiveRecord
{

    public function rules()
    {
        return [
            [['name', 'email','age','height','weight','city','checkboxList','checkboxList1'], 'required'],
            [['imageFiles'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg','maxFiles' => 5],
            ['email', 'email'],
        ];
    }
    /**
     * @return string the name of the table associated with this ActiveRecord class.
     */
    public static function tableName()
    {
    return 'form';
    }
    public function attributeLabels()
   {
       return [
           'id' => 'ID',
           'name' => 'Name',
           'email' => 'Email',
           'age' => 'Age',
           'height' => 'Height',
           'weight' => 'Weight',
           'city' => 'City',
           'techies' => 'Techies',
           'english_level' => 'English Level',
           'images' => 'Images',
           'photo_1' => 'Photo 1',
           'photo_2' => 'Photo 2',
           'photo_3' => 'Photo 3',
           'photo_4' => 'Photo 4',
           'photo_5' => 'Photo 5',
       ];
   }
   

    }
акшионы в моем контроллере:

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

public function actionIndex()
    {
        $entryForm = new EntryForm();
        return $this->render('form',array(
                 'entryForm' => $entryForm,
                 ));
    }
public function actionForm()
{
     $entryForm = new EntryForm();
     if(isset($_POST['form']))
         {
             var_dump($_POST['form']);
             $entryForm->attributes = Yii::$app->request->post('form');
             if($entryForm->validate())
             {
                 var_dump($entryForm);
             }
         }else {
             var_dump("ERROR");
         }

}
При нажатии на кнопку во вьюшке "Отправить" страница просто обновляется,но записи в БД не добавляются. Что это может быть?
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Как сохранить данные в БД

Сообщение caHek2x »

заглядывали в дебаг ? что там приходит ? разве form а не EntryForm ?
$entryForm->attributes = Yii::$app->request->post('form');
есть метод load ...
url: 'index.php/form',
используйте лучше Url::toRoute ... ибо потом измените urlManager и прийдется везде ссылки править ...
waterhero
Сообщения: 6
Зарегистрирован: 2017.02.15, 12:09

Re: Как сохранить данные в БД

Сообщение waterhero »

Хорошо,спасибо. А как продебажить? В консоле ничего не выводится(
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Как сохранить данные в БД

Сообщение caHek2x »

waterhero писал(а): 2017.02.16, 19:21 Хорошо,спасибо. А как продебажить? В консоле ничего не выводится(
эм ... js ? console.log(....)
Yii>php ? ваш.сайт/debug
waterhero
Сообщения: 6
Зарегистрирован: 2017.02.15, 12:09

Re: Как сохранить данные в БД

Сообщение waterhero »

caHek2x писал(а): 2017.02.16, 19:46
waterhero писал(а): 2017.02.16, 19:21 Хорошо,спасибо. А как продебажить? В консоле ничего не выводится(
эм ... js ? console.log(....)
Yii>php ? ваш.сайт/debug
Проверил с помощью yii2 дебагера, request со всеми данными приходит,не пойму куда они деваются.
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Как сохранить данные в БД

Сообщение caHek2x »

с чего вы взяли что они кудато деваются ...
caHek2x писал(а): 2017.02.16, 19:13 заглядывали в дебаг ? что там приходит ? разве form а не EntryForm ?
waterhero
Сообщения: 6
Зарегистрирован: 2017.02.15, 12:09

Re: Как сохранить данные в БД

Сообщение waterhero »

caHek2x писал(а): 2017.02.16, 21:04 с чего вы взяли что они кудато деваются ...
caHek2x писал(а): 2017.02.16, 19:13 заглядывали в дебаг ? что там приходит ? разве form а не EntryForm ?
в дебаггере происходит вот это:

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

Routing
Name	Value
Route	'site/index'
Action	'app\\controllers\\SiteController::actionIndex()'
Parameters	[]
$_GET
Empty.

$_POST
Name	Value
_csrf	'YU1Kb2pqUlA1ICwVPiUbM1R0eBsdWB8.AwsBHx87IiELFCErWlpnYg=='
Form	[
    'name' => 'Rost'
    'email' => 'ppbesta@mail.ru'
    'age' => '22'
    'height' => '175'
    'weight' => '75'
    'city' => 'Kyiv'
    'techies' => [
        0 => 'yes_camera'
    ]
    'english_level' => [
        0 => 'elementary'
    ]
    'images' => [
        0 => ''
    ]
]
$_FILES
Name	Value
Form	[
    'name' => [
        'images' => [
            0 => ''
        ]
    ]
    'type' => [
        'images' => [
            0 => ''
        ]
    ]
    'tmp_name' => [
        'images' => [
            0 => ''
        ]
    ]
    'error' => [
        'images' => [
            0 => 4
        ]
    ]
    'size' => [
        'images' => [
            0 => 0
        ]
    ]
]
$_COOKIE
Name	Value
Phpstorm-b0412478	'63e8918e-ac29-43de-9816-571b71512aad'
Phpstorm-18225157	'843d4bb7-1456-4d24-983c-3b4322d250f4'
_csrf	'80f0cbf5e4e263f55cbda84d86cc4f8c2db345de8fea190c4bf8ec2743ddd204a:2:{i:0;s:5:\"_csrf\";i:1;s:32:\"TmfzTOIc592tw2MnbFKpuQpqjYkD0052\";}'
Request Body
Empty.
у меня есть модель и Form, я просто ее через gii создавал а FormEntry сам,думал может в этом проблема,оказалаось что нет.
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Как сохранить данные в БД

Сообщение caHek2x »

окей, "Form" и "form" найдите одно отличие
olegtmb
Сообщения: 18
Зарегистрирован: 2013.08.06, 20:27

Re: Как сохранить данные в БД

Сообщение olegtmb »

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

 if($entryForm->validate())
 {
      var_dump($entryForm);
 }
После $entryForm->validate() надо данные сохранить: $entryForm->save()
Ответить