Question

I'm tying to figure out how to save, for example 4 days of schedule in one view, and have each field validation message show if validation fails.

My approach was at first to use $this->SomeModel->saveAll() but couldn't save so I tried another way using foreach and all data is saved (pass validation) but no validation message is shown. if you guys know better way to do this I'm open for any suggestions.

Model

public $validate = array(
    'hour_from'=>array(
        'some mgs' => array(
            'rule'    => 'good_hours',
        ),
    ),
);
public function good_hours($data) {
    //throw new Exception(($data['hour_from'] >= $this->data['Hour']['hour_to']));
    if ($data['hour_from'] >= $this->data['Hour']['hour_to']) {
        return false;
    }
    return true;
}

Controller:

if ($this->request->is('post')) {
        $all_good = true;
        foreach ($this->request->data['Hour'] as $day){

            if ($this->Hour->save($day)){

            }else {
                $all_good = false;
                $this->Session->setFlash('hours not saved');
            }
        }
        //if all saves are correct rediredt to index 
        if ($all_good) {
            $this->Session->setFlash(__('Hours saved'));
            return $this->redirect(array('action' => 'index'));
        }
    }

View

    foreach ($days as $count => $day):
$form_model ='Hour.'.$count. '.';
?>
<fieldset>
    <legend><?php
    $day_array = (array) $day;
    $day = $day_array['date'];
    echo $day;
    ?></legend>
<?php
    echo $this->Form->input($form_model.'type_holiday_id', array(
    'label'=> 'Typ urlopu',
    'type'    => 'select',
    'options' => $type_holidays,
    'empty'   => true
    ));
    echo $this->Form->input($form_model.'hour_from', array('label' => 'od'));
    echo $this->Form->input($form_model.'hour_to', array('label' => 'do'));
    echo $this->Form->input($form_model.'date', array('type' => 'hidden', 'value' => $day));
    echo $this->Form->input($form_model.'subordinate_id', array('type' => 'hidden', 'value' => $user['User']['id']));
    echo $this->Form->input($form_model.'supervisor_id', array('type' => 'hidden', 'value' => $current_user['id']));

?>
</fieldset>

Request->data array

Hour(array)
0(array)
   type_holiday_id
   hour_from 8
   hour_to 15
   date 2014-01-20
   subordinate_id 193
   supervisor_id 557
1(array)
   type_holiday_id
   hour_from 7
   hour_to 14
   date 2014-01-21
   subordinate_id 193
   supervisor_id 557
Was it helpful?

Solution

Ok i found solution, and everything works perfectly now in controller i needed to change save to saveAll, function add in Controller should look like this:

if ($this->request->is('post')) {
        if ($this->Hour->saveAll($this->request->data['Hour'], Array('validate' => 'first', 'deep' => true))){ <--- most important is that data['Hour']
            $this->Session->setFlash(__('Godziny robocze zapisane')); 
            return $this->redirect(array('action' => 'index'));
        } else{
            $this->Session->setFlash('Godziny robocze nie zostały zapisane.');
        }
    }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top