Bogdan Botezatu
Bogdan Botezatu

Reputation: 614

Daterangepicker date defaults to zero in CakePHP

I'm developing a small app with CakePHP and I need to save a startdate and an enddate for an event. I went with the Bootstrap Daterangepicker to let users visually input the dates.

In my add.ctp view I have two fields:

<div class="form-group">
  <?php echo $this->Form->input('start', array(
    'class' => 'form-control',
    'type' => 'text', 
    'id' => 'start',
    'name' => 'start',
    'data-mask')); ?>
</div><!-- .form-group -->
<div class="form-group">
  <?php echo $this->Form->input('end', array(
    'class' => 'form-control',
    'type' => 'text', 
    'id' => 'end', 
    'name' => 'end',
    'data-mask')); ?>
</div>

And the Javascript that controls the inputs:

<script type="text/javascript">
  $(function() {
    $('input[name="start"]').daterangepicker({
      timePicker24Hour: true,
      singleDatePicker: true,
      timePicker: false,
      timePickerIncrement: 30,
      locale: {
        format: 'YYYY-MM-DD HH:mm:ss'
      }
    });
    $('input[name="end"]').daterangepicker({
      timePicker24Hour: true,
      singleDatePicker: true,
      timePicker: false,
      timePickerIncrement: 30,
      locale: {
        format: 'YYYY-MM-DD HH:mm:ss'
      }
    });
  });
</script>

The picker works just fine, it updates the field values properly, but when I attempt to save the form, the start field gets written to the database as follows:

start 0000-00-00 00:00:00
end (null)

The form data for the start and end fields saves properly if I'm reverting to the default configuration of the fields.

Any clue as to where I'm failing would be highly appreciated.

Upvotes: 1

Views: 346

Answers (2)

Bogdan Botezatu
Bogdan Botezatu

Reputation: 614

Okay, so I was passing text to a datetime field and the save operation failed. In order to fix this I had to convert the strings to the proper type by processing it in the beforeSave() function of the model.

Here is the code that worked for me:

public function beforeSave($options = array()) {

    if (!empty($this->data['Task']['start']) && !empty($this->data['Task']['end'])) {

        $this->data['Task']['start'] = $this->dateFormatBeforeSave($this->data['Task']['start']);
        $this->data['Task']['end'] = $this->dateFormatBeforeSave($this->data['Task']['end']);
        }

        return true;
    }


public function dateFormatBeforeSave($dateString) {
    return date('Y-m-d h:m:s', strtotime($dateString));
}

Upvotes: 0

FishWave
FishWave

Reputation: 308

try something like this

$correctdate = date("Y-m-d j:h:m",strtotime($yourdate));

It's not a great peace of code, but it should help to go further in the right direction. We take this string and make a timestamp out of it. Then we change it to a proper datetime value.

Upvotes: 1

Related Questions