cakephp Сообщение об ошибке проверки модели не отображается в ассоциации hasOne - PullRequest
0 голосов
/ 01 июля 2018

Я хочу сделать model проверку с помощью association в одной форме. У меня есть две таблицы users (родительская таблица) и user_details (дочерняя таблица). Теперь проверка модели работает только для пользовательских таблиц. Я хочу ее и для таблицы userDetails. отношение между ними hasOne.

проверка работает только для таблицы пользователей, потому что я создал newEntity только для таблицы пользователей.

usersController.php (код контроллера)

 public function add() {
        $user = $this->Users->newEntity();
        $userDetail = $this->UserDetails->newEntity();
        if ($this->request->is('post')) {
            $user = $this->Users->patchEntity($user, $this->request->getData());
            if ($this->Users->save($user)) {
                $userDetail = $this->UserDetails->patchEntity($userDetail, $this->request->getData());
                $userDetail->user_id = $user->id;
                if ($this->UserDetails->save($userDetail)) {
                    $this->Flash->success(__('The user has been saved.'));
                } else {
                    $this->Flash->error(__('The user could not be saved. Please, try again.'));
                }
                $this->redirect($this->referer());
            } else {
                $this->Flash->error(__('The user could not be saved. Please, try again.'));
            }
        }
        $this->set(compact('user','userDetail'));
    }

UsersTable.php (родительская модель)

 public function validationDefault(Validator $validator) {
        $validator
                ->integer('id')
                ->allowEmpty('id', 'create');

        $validator
                ->email('email')
                ->requirePresence('email', 'create')
                ->notEmpty('email');


        $validator
                ->scalar('mobile')
                ->maxLength('mobile', 10,'Maximum length should be 10 digits')
                ->minLength('mobile', 10,'Minimum length should be 10 digits')
                ->requirePresence('mobile', 'create')
                ->notEmpty('mobile');

        $validator
                ->scalar('password')
                ->maxLength('password', 20,'Minimum length should be 20 digits')
                ->minLength('password', 4,'Minimum length should be 4 digits')
                ->requirePresence('password', 'create')
                ->notEmpty('password');


        return $validator;
    }

UserDetailsTable.php (дочерняя модель)

 public function validationDefault(Validator $validator)
    {
        $validator
            ->integer('id')
            ->allowEmpty('id', 'create');

        $validator
            ->scalar('name')
            ->maxLength('name', 50)
            ->requirePresence('name', 'create')
            ->notEmpty('name');

        $validator
            ->scalar('pin')
            ->maxLength('pin', 6)
            ->requirePresence('pin', 'create')
            ->notEmpty('pin');

        $validator
            ->scalar('address')
            ->maxLength('address', 4294967295)
            ->requirePresence('address', 'create')
            ->notEmpty('address');

        return $validator;
    }

add.ctp

<?= $this->Form->create($user, ['url' => ['controller' => 'Users', 'action' => 'add'], 'class' => 'form-horizontal', 'id' => 'add-user']); ?>

        <div class="box-body">
            <div class="form-group">
                <label for="name" class="col-sm-2 control-label">Name <label class="text-danger">*</label></label>
                <div class="col-sm-3">
                    <?= $this->Form->control('user_detail.name', ['class' => 'form-control', 'id' => 'name', 'placeholder' => 'Name', 'type' => 'text', 'label' => false]); ?>
                </div>
                <label for="email" class="col-sm-2 control-label">Email <label class="text-danger">*</label></label>
                <div class="col-sm-3">
                    <?= $this->Form->control('email', ['class' => 'form-control', 'id' => 'email', 'placeholder' => 'Email', 'type' => 'email', 'label' => false]); ?>
                </div>
            </div>
            <div class="form-group">
                <label for="mobile" class="col-sm-2 control-label">Mobile <label class="text-danger">*</label></label>
                <div class="col-sm-3">
                    <?= $this->Form->control('mobile', ['class' => 'form-control', 'id' => 'mobile', 'placeholder' => 'Mobile', 'type' => 'text', 'label' => false]); ?>
                </div>
                <label for="password" class="col-sm-2 control-label ">Password <label class="text-danger">*</label></label>
                <div class="col-sm-3">
                    <?= $this->Form->control('password', ['class' => 'form-control', 'id' => 'password', 'placeholder' => 'Password', 'type' => 'text', 'label' => false]); ?>
                </div>
                <div class="col-sm-2">
                    <button type="button" class="btn btn-default"><i class="fa fa-refresh"></i> Generate</button>
                </div>
            </div>
            <div class="form-group">
                <label for="state" class="col-sm-2 control-label">State</label>
                <div class="col-sm-3">
                    <?= $this->Form->select('user_detail.state', ['Odisha', 'Hyderbad'], ['class' => 'form-control', 'id' => 'state', 'label' => false]); ?>

                </div>
                <label for="city" class="col-sm-2 control-label">City</label>
                <div class="col-sm-3">
                    <?= $this->Form->select('user_detail.city', ['Bhubaneswar', 'Cuttack'], ['class' => 'form-control', 'id' => 'city', 'label' => false]); ?>
                </div>
            </div>
            <div class="form-group">
                <label for="inputEmail3" class="col-sm-2 control-label">Address</label>
                <div class="col-sm-3">
                    <?= $this->Form->control('user_detail.address', ['class' => 'form-control', 'id' => 'address', 'type' => 'textarea', 'rows' => 2, 'label' => false]); ?>
                </div>
                <label for="pin" class="col-sm-2 control-label">Pin</label>
                <div class="col-sm-3">
                    <?= $this->Form->control('user_detail.pin', ['class' => 'form-control', 'id' => 'pin', 'placeholder' => 'Pin', 'type' => 'text', 'label' => false]); ?>
                </div>
            </div>
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <button type="button" class="btn btn-default">Cancel</button>
                    <?= $this->Form->control('Save', ['class' => 'btn btn-primary', 'id' => 'submit', 'type' => 'submit', 'label' => false, 'div' => false, 'templates' => ['submitContainer' => '{{content}}']]); ?>

                </div>
            </div>
        </div>

        <?= $this->Form->end(); ?>

вот изображение для справки

enter image description here

на этом изображении все поля обязательны для заполнения все поля взяты из таблицы пользователей ... только поле адреса взято из таблицы user_details. теперь вы можете увидеть сообщение об ошибке, отображаемое для поля имени, но сообщение об ошибке не отображается для поля адреса. Проверка работает для поля адреса, но не знаю, почему сообщение об ошибке не отображается.

имя из таблицы пользователей и адрес из таблицы user_details

заранее спасибо

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вы пытаетесь исправить данные вашей сущности неверными данными ($this->request->getData()). Но на самом деле нет необходимости создавать, исправлять и сохранять отдельную сущность в вашей функции add, потому что первый уровень ассоциаций будет обрабатываться прозрачно для вас. Это должно работать просто отлично:

public function add() {
    $user = $this->Users->newEntity();
    if ($this->request->is('post')) {
        $user = $this->Users->patchEntity($user, $this->request->getData());
        if ($this->Users->save($user)) {
            $this->Flash->success(__('The user has been saved.'));
            return $this->redirect($this->referer());
        } else {
            $this->Flash->error(__('The user could not be saved. Please, try again.'));
        }
    }
    $this->set(compact('user'));
}

Или, по крайней мере, следует, как только вы исправите имена полей из объекта подробностей, чтобы включить "user_detail.", Как сказал @ndm; ваш HTML выше все еще показывает $this->Form->control('address',...) вместо $this->Form->control('user_detail.address',...), хотя он также включает поля для города и штата, которых нет на вашем снимке экрана, поэтому неясно, как может выглядеть ваша текущая версия.

0 голосов
/ 01 июля 2018

проверка работает только для таблицы пользователей, потому что я создал newEntity только для таблицы пользователей.

Это не имеет к этому никакого отношения. Проблема в том, что вы не соблюдаете правила именования.

Имена файлов должны совпадать с именами классов, поэтому это UserDetailsTable.php, а не UserDetails.php, UsersTable.php, не usersTable.php и т. Д.

И правильное имя свойства для hasOne ассоциации - это выделенный, подчеркнутый вариант имени ассоциации, поэтому для UserDetails это будет user_detail, следовательно, имя для связанного элемента управления формы должно быть user_detail.name.

Смотри также

...