Задать вопрос

Yii2, как обработать с формы post массив данных для сохранения в бд?

Всем доброй ночи!

Я раскладываю foreach, и получается что для каждого дня есть свое время и перерыв field($model, '[$k]work_start'), вот только я не могу понять как получить сам массив что бы сохранить в бд [$k]work_start - ПН|09:00, принимаю в контроллере и в модели происходит сам updateProfile.

во VIEW есть форма

это как пример, тут не полностью все поля!

<?php foreach ($weeks as $k => $v) : ?>
        <?php $form = ActiveForm::begin(); ?>

<?= $form->field($model, "[$k]work_start")->widget(TimePicker::classname(),
                            [
                                'value' => '00:00',
                                'pluginOptions' => [
                                    'showMeridian' => false,
                                ]
                            ])->label('');
                        ?>

<?= $form->field($model, "[$k]break_start")->widget(TimePicker::classname(),
                                [
                                    'value' => '00:00',
                                    'pluginOptions' => [
                                        'showMeridian' => false,
                                    ]
                                ])->label('');
                            ?>

        <?php $form = ActiveForm::end() ?>
    <?php endforeach; ?>
</table>


Модель + у меня связь с таблицами.
Есть такая таблица work_schedule, есть такие поля (внизу таблица), с формы я принимаю данные они должны записаться в work_schedule, и id от work_schedule должно записаться в в таблицу profile -> schedule_id. И я не могу понять как мне обработать саму форму, что бы принять Дни недели и время???

пример бд
'id' => 1,
'week' => 'ПН',
'start_time' => '08.00',
'end_time' => '17.00',
'break_start' => '12.00',
'break_start' => '13.00',
is_weekend' => false,


class Profile extends ActiveRecord
{
    public $status_week;
    public $times;
    public $has_break;
    public $work_start;
    public $work_end;
    public $break_start;
    public $break_end;
    public $gallery;

//.........................

    public function updateProfile()
    {
        $id = Yii::$app->user->id;
        $profile = ($profile = Profile::findOne(['user_id' => $id])) ? $profile : new Profile();

        $profile->user_id = Yii::$app->user->id;

        if ($this->validate()) {
            foreach ($this->gallery as $gallery) {
                $hasObjectFile = new HasObjectFile();

                $hasObjectFile->title = $gallery->baseName . '.' . $gallery->extension;
                $hasObjectFile->label = md5(microtime()) . '.' . $gallery->extension;
                $hasObjectFile->profile_id = $profile->id;
                $hasObjectFile->type = HasObjectFile::FILE_TYPE_GALLERY;

                $hasObjectFile->save();
                $gallery->saveAs('upload/gallery/' . $hasObjectFile->label);
                $profile->gallery_id = $hasObjectFile->profile_id;
                $profile->save(false);
            }
            return true;
        }

 //$work = new WorkSchedule();

        if (is_array($this->times) && count($this->times)) {
            foreach ($this->times as $day => $values) {
                VarDumper::dump($values,11,1);die;
            }
        }

       
        return $profile->save() ? true : false;
    }

}


Контроллер
public function actionProfile()
    {
        $id = Yii::$app->user->id;
        $model = ($model = Profile::findOne(['user_id' => $id])) ? $model : new Profile();
        $weeks = Profile::weeks();
        $workGraph = WorkSchedule::workGraph();
        $gallery = Profile::getGallery();

        if ($model->load(Yii::$app->request->post())) {
            $model->gallery = UploadedFile::getInstances($model, 'gallery');
            if ($model->updateProfile()) {
                Yii::$app->session->setFlash('success', 'Профиль изменен!');
                return $this->refresh();
            } else {
                Yii::$app->session->setFlash('error', 'Профиль не изменен!');
                Yii::error('Ошибка записи. Профиль не изменен!');
                return $this->refresh();
            }
        }

        return $this->render('profile', [
            'model' => $model,
            'weeks' => $weeks,
            'workGraph' => $workGraph,
            'gallery' => $gallery,
        ]);
    }


делаю var_dump и получаю такой массив

[
    '_csrf' => 'ajI4RHc0RUkeVgABH3kPej9CVSAaTXYgBn0VLTVlIiAhA3ocO2EfCw=='
    'Profile' => [
        'status_week' => '1'
        ПН => [
            'work_start' => '09:00'
            'work_end' => '18:00'
            'break_start' => '12:00'
            'break_end' => '13:00'
        ]
        'has_break' => '1'
    ]
]


Сама БД

'id' => 1,
'week' => 'ПН',
'start_time' => '08.00',
'end_time' => '17.00',
'break_start' => '12.00',
'break_start' => '13.00',
is_weekend' => false,
  • Вопрос задан
  • 2525 просмотров
Подписаться 2 Оценить 2 комментария
Решения вопроса 1
@miserenkov
Middle PHP Developer
Во вьюхе лучше сделать так
<?php foreach ($weeks as $k => $v) : ?>
        <?php $form = ActiveForm::begin(); ?>

<?= $form->field($model, "times[$k][work_start]")->widget(TimePicker::classname(),
                            [
                                'value' => '00:00',
                                'pluginOptions' => [
                                    'showMeridian' => false,
                                ]
                            ])->label('');
                        ?>

<?= $form->field($model, "times[$k][break_start]")->widget(TimePicker::classname(),
                                [
                                    'value' => '00:00',
                                    'pluginOptions' => [
                                        'showMeridian' => false,
                                    ]
                                ])->label('');
                            ?>

        <?php $form = ActiveForm::end() ?>
    <?php endforeach; ?>
</table>

В модели нужно добавить свойство $times
class Profile extends ActiveRecord
{
    public $times;
    // .......
}

В action контроллера
if ($model->load(Yii::$app->request->post())) {
    // .....
    if (is_array($model->times) && count($model->times)) {
        foreach ($model->times as $day => $values) {
            // .... проверяете, сохраняете в базу
        }
    }
    // ......
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы