У меня есть модель GenForm
которой есть связь HABTM с другой моделью PdfFile
. Я использую это для создания списка GenForm
в моем GenForm
индекса GenForm
. В модели GenForm
я добавил:
public $hasAndBelongsToMany = array( 'PdfFile' => array( 'className' => 'PdfFile', 'joinTable' => 'gen_forms_x_pdf_files' )
Вот фрагмент моего представления GenForm
index.ctp
:
<?php echo $this->Form->input( 'PdfFile', array('label' => 'Select some PDF files', 'multiple' => 'checkbox') ); echo $this->Form->input( 'first_name' ); echo $this->Form->input( 'last_name' ); ?>
В контроллере у меня есть базовое сохранение:
if ($this->request->is('post')) { // form was submitted $this->GenForm->create(); if ($this->GenForm->save($this->request->data)) { return $this->redirect(array('action' => 'generate', $this->GenForm->id)); // assemble the PDF for this record } else { $this->Session->setFlash(__('Log entry not saved.')); } }
Теперь $this->data
выглядит примерно так, когда я debug()
это:
array( 'PdfFile' => array( 'PdfFile' => array( (int) 0 => '1', (int) 1 => '5' ) ), 'GenForm' => array( 'first_name' => 'xxx', 'last_name' => 'xxx', 'association_id' => '1', 'email' => '' ) )
Все работает отлично, но я не могу проверить флажки (по крайней мере один должен быть проверен). Итак, в соответствии с этим ответом я внес некоторые изменения.
Представление index.ctp
стало:
<?php echo $this->Form->input( 'GenForm.PdfFile', array('label' => 'Select some PDF files', 'multiple' => 'checkbox') ); echo $this->Form->input( 'first_name' ); echo $this->Form->input( 'last_name' ); ?>
Вот мое правило проверки:
public $validate = array( 'PdfFile' => array( 'rule' => array( 'multiple', array('min' => 1) ), 'message' => 'Please select one or more PDFs' ) )
Это то, что $this->data
выглядит сейчас:
array( 'GenForm' => array( 'PdfFile' => array( (int) 0 => '1', (int) 1 => '5' ), 'first_name' => 'xxx', 'last_name' => 'xxx', 'association_id' => '1', 'email' => '' ) )
Теперь флажки для PdfFile
проверяются, но данные PdfFile
не сохраняются, хотя другие поля для GenForm
корректно сохраняются в их собственной таблице.
Может ли кто-нибудь сказать мне, что мне не хватает, чтобы PdfFile
автоматически PdfFile
и получил подтверждение?
Указание очевидного, но форма, которая сработала, – это форма использования, то есть:
echo $this->Form->input('PdfFile', array( 'label' => 'Select some PDF files', 'multiple' => 'checkbox' ));
Изменение формы для «поля» под названием «PdfFile» просто не сработает – поскольку слой модели удалит любые данные для полей, которые не существуют, и в этой форме он проверит gen_forms.PdfFile
, найдет, что нет поле и игнорировать данные.
Чтобы позаботиться об ошибках проверки, используйте правило проверки, запущенное на модели, которая проверяет количество записей habtm, которые будут сохранены. Не имеет значения, какое имя поля используется для проверки, например:
<?php class GenForm extends AppModel { public $validate = array( 'dummy' => array( // <- name this whatever you like 'atLeastOne' => array( 'required' => true, // run always 'rule' => array('validateAtLeastOne') ) ) ); function validateAtLeastOne() { if (!isset($this->data['PdfFile'])) { // there is no pdf data at all, ignore this rule // allow other save operations to work return true; } $return = count(array_filter($this->data['PdfFile']['PdfFile'])); if (!$return) { $this->PdfFile->invalidate('PdfFile', 'Please upload a file'); } return $return; } }
Поскольку правило проверки возвращает false, если нет записей, оно остановит сохранение. Вызвав invalidate в ассоциации HABTM с тем же именем поля, которое будет искать хелпер формы, появится сообщение об ошибке.
Вы можете использовать второй подход в вопросе:
echo $this->Form->input('GenForm.PdfFile', array( 'label' => 'Select some PDF files', 'multiple' => 'checkbox' ));
В полном понимании, что это не то, как торт ожидает получения данных, а затем манипулирует им как правильный формат в beforeValidate:
<?php class GenForm extends AppModel { public $validate = array( 'PdfFile' => array( // existing rule ... ) ); function beforeValidate() { if (isset($this->data[$this->alias]['PdfFile'])) { // keep the existing data as that's what validation will check against // copy to the right location so Cake will process it $this->data['PdfFile']['PdfFile'] = $this->data[$this->alias]['PdfFile']; } return true; } ... }
Если я правильно помню, из руководства по тортам, вероятно, вы неправильно форматируете данные.
Попробуйте, чтобы данные $this->data
выглядели следующим образом:
array( 'GenForm' => array( 'first_name' => 'xxx', 'last_name' => 'xxx', 'association_id' => '1', 'email' => '' ), 'PdfFile' => array( (int) 0 => '1', (int) 1 => '5' ), )