php - CakePHP HABTM data not saving to database -
i have model genform has habtm relationship model pdffile. use generate list of checkboxes in genform index view. in genform model, added:
public $hasandbelongstomany = array( 'pdffile' => array( 'classname' => 'pdffile', 'jointable' => 'gen_forms_x_pdf_files' ) here's fragment genform index.ctp view:
<?php echo $this->form->input( 'pdffile', array('label' => 'select pdf files', 'multiple' => 'checkbox') ); echo $this->form->input( 'first_name' ); echo $this->form->input( 'last_name' ); ?> in controller, have basic save:
if ($this->request->is('post')) { // form submitted $this->genform->create(); if ($this->genform->save($this->request->data)) { return $this->redirect(array('action' => 'generate', $this->genform->id)); // assemble pdf record } else { $this->session->setflash(__('log entry not saved.')); } } now $this->data looks when debug() it:
array( 'pdffile' => array( 'pdffile' => array( (int) 0 => '1', (int) 1 => '5' ) ), 'genform' => array( 'first_name' => 'xxx', 'last_name' => 'xxx', 'association_id' => '1', 'email' => '' ) ) everything works perfectly, couldn't validate checkboxes (at least 1 must checked). so, per this answer, made changes.
the index.ctp view became:
<?php echo $this->form->input( 'genform.pdffile', array('label' => 'select pdf files', 'multiple' => 'checkbox') ); echo $this->form->input( 'first_name' ); echo $this->form->input( 'last_name' ); ?> here's validation rule:
public $validate = array( 'pdffile' => array( 'rule' => array( 'multiple', array('min' => 1) ), 'message' => 'please select 1 or more pdfs' ) ) this $this->data looks now:
array( 'genform' => array( 'pdffile' => array( (int) 0 => '1', (int) 1 => '5' ), 'first_name' => 'xxx', 'last_name' => 'xxx', 'association_id' => '1', 'email' => '' ) ) now checkboxes pdffile validate, pdffile data isn't saved -- although other fields genform saved correctly own table.
can tell me i'm missing pdffile saves automatically and gets validated?
the first form right
stating obvious, form worked form use i.e.:
echo $this->form->input('pdffile', array( 'label' => 'select pdf files', 'multiple' => 'checkbox' )); changing form have "field" named 'pdffile' not work - model layer remove data fields don't exist - , in form check gen_forms.pdffile, find there no field , ignore data.
validation
to take care of validation errors - use validation rule running on model checks number of habtm records saved. doesn't matter name of field used validation e.g.:
<?php class genform extends appmodel { public $validate = array( 'dummy' => array( // <- name whatever 'atleastone' => array( 'required' => true, // run 'rule' => array('validateatleastone') ) ) ); function validateatleastone() { if (!isset($this->data['pdffile'])) { // there no pdf data @ all, ignore rule // allow other save operations work return true; } $return = count(array_filter($this->data['pdffile']['pdffile'])); if (!$return) { $this->pdffile->invalidate('pdffile', 'please upload file'); } return $return; } } because validation rule returns false if there no records halt save. calling invalidate on habtm association same "field" name form helper - error message displayed.
alternatively
you can use second approach in question:
echo $this->form->input('genform.pdffile', array( 'label' => 'select pdf files', 'multiple' => 'checkbox' )); in full knowledge not how cake expects receive data , manipulate right format in beforevalidate:
<?php class genform extends appmodel { public $validate = array( 'pdffile' => array( // existing rule ... ) ); function beforevalidate() { if (isset($this->data[$this->alias]['pdffile'])) { // keep existing data that's validation check against // copy right location cake process $this->data['pdffile']['pdffile'] = $this->data[$this->alias]['pdffile']; } return true; } ... }
Comments
Post a Comment