Yii дата, час, минута -> строка даты и времени -> дата и время MySQL - PullRequest
1 голос
/ 28 февраля 2011

Я использую Yii для создания веб-приложения. Одна из моих форм ввода имеет CJuiDatePicker для даты. У меня есть два выпадающих списка, один для часов и один для минут.

Моя проблема в модели данных, где я пытаюсь преобразовать дату, часы и минуты из формы в строку даты и времени MySQL. Я должен создать строку даты и времени, которая выглядит следующим образом - 2011-02-27 20:11:56, поэтому Yii может преобразовать строку в дату и время MySQL и вставить значение в строку.

В модели у меня есть правило, которое выглядит так:

array('event_datetime_from', 'createDatetime', 
    'date'=>'event_date_from', 'hour'=>'event_hour_from',
    'minute'=>'event_minute_from'),

Функция валидатора createDateTime выглядит следующим образом:

public function createDatetime($attribute, $params) {
    if (!$this->hasErrors()) {      
        $date = $this->$params['date'];
        $hour = $this->$params['hour'];
        $minute = $this->$params['minute'];

        if (trim($date) === '') {
            $this->$attribute = null;
        } else {
            $parse = CDateTimeParser::parse(
                $date.' '.$hour.':'.$minute,
                'MM/dd/yyyy hh:mm');
            $this->$attribute = date('Y-m-d H:i:s', $parse);
        }
    }
}

Теперь я не разработчик PHP. Однако мне кажется, что $params['date'] возвращает строковое значение event_date_from, а не значение event_date_from.

Мой вопрос по PHP, как мне получить значение event_date_from внутри функции валидатора createDateTime?

Мои извинения, если я пропустил ответ где-нибудь в документации Yii. Я не смог найти много примеров функций валидатора. У классов валидаторов Yii сигнатура параметров отличается от функций валидатора.

Отредактировано на основе ответа thaddeusmt:

Я попытался расширить CActiveRecord и кодировать метод afterValidate, но не смог найти место для определения моей рабочей даты, часовых и минутных переменных. Я определил их в расширенном методе, а метод afterValidate не смог их увидеть. Я получил ошибку неопределенной переменной PHP в методе afterValidate.

В контроллере я кодировал следующую функцию:

protected function createDateTime($dateString, $hour, $minute) {
    if (trim($dateString) == '') {
        return null;
    } else {
        $timeString = $dateString.' '.$hour.':'.$minute;
        return date('Y-m-d H:i:s', strtotime($timeString));
    }
}

Это должно быть легко для вызова функции в PHP, верно?

Я попробовал оба этих вызова в функции actionCreate ():

$model->event_datetime_from = 
            createDateTime($_POST['event_date_from'],
            $_POST['event_hour_from'],
            $_POST['event_minute_from']
            );

и

$model->event_datetime_from = 
            createDateTime($model->event_date_from,
            $model->event_hour_from,
            $model->event_minute_from
            );

Мой код контроллера умирает при любом из этих вызовов, и я получаю пустую (без HTML) страницу ответа.

Я думал, что то, что я хотел сделать, было довольно просто. Я хочу взять строку даты, часа и минуты и преобразовать конкатенацию в строку даты и времени. Чего мне не хватает?

Ответы [ 3 ]

3 голосов
/ 28 февраля 2011

Что я делаю, так это в действии POST в Контроллере (где назначаются переменные POST), я преобразую опубликованные значения даты и времени в MySQL datetime с функциями date () и mktime (), затем проверяю /спасти.Итак, вот пример действия post:

public function actionUpdate() {
  $model=$this->loadModel();
  if(isset($_POST['Model'])) {
    $model->attributes = $_POST['Model']; // assign the rest of the POST vars here
    $model->event_datetime_from = date(
      'Y-m-d H:i:s', // convert the timestamp to the mySQL format
      mktime(        // create the timestamp from the posted date and time vars
        $_POST['my-hour-var'], // set the hour
        $_POST['my-minute-var'], // set the min
        $_POST['my-second-var'], // set the sec
        date("m"), // set the month
        date("d"), // set the day
        date("Y") // set the year
      )
    ); // create a MySQL Y-m-d H:i:s format date from the POST vars
    $model->save(); // this run the validation rules, naturally
  }
}

(Предполагается, что модель называется «Модель», POSTed час, минута и секунда переменные, называемые my-hour-var, my-minute-var иmy-second-var соответственно и то, что вы устанавливаете часть DATE на сегодняшний день.)

А вот пример правила проверки в модели модели с использованием CTypeValidator :

public function rules() {
  return array(
    array('event_datetime_from', 'type', 'type'=>'datetime', 'datetimeFormat'=>'yyyy-MM-dd hh:mm:ss', 'message' => '{attribute} is not a date and time!'),
}

Надеюсь, это поможет!

2 голосов
/ 01 марта 2011

Я бы настоятельно рекомендовал проверить это расширение: http://www.yiiframework.com/extension/i18n-datetime-behavior/

Некоторые из этих действий выполняются автоматически.Возможно, вам придется немного обновить его в зависимости от того, как вы ожидаете, что ваши входные даты будут выглядеть.Один из способов - всегда запускать свойство через strtotime () (встроенную функцию парсинга даты в php) вместо конкретного анализатора даты в расширении.

0 голосов
/ 28 февраля 2011

Я наконец-то получил строки даты, часа и минуты для преобразования в строку даты и времени.

Вот код, который я вставил в метод actionCreate и метод actionUpdate CalendarEventController:

        $model->attributes=$_POST['CalendarEvent'];

        // new code
        $timeString = $_POST['CalendarEvent']['event_date_from'].' '.
            $_POST['CalendarEvent']['event_hour_from'].':'.
            $_POST['CalendarEvent']['event_minute_from'];
        $model->event_datetime_from = 
            date('Y-m-d H:i:s', strtotime($timeString));

        if (trim($_POST['CalendarEvent']['event_date_to']) === '') {
            $model->event_datetime_to = null;
        } else {
            $timeString = $_POST['CalendarEvent']['event_date_to'].' '.
                $_POST['CalendarEvent']['event_hour_to'].':'.
                $_POST['CalendarEvent']['event_minute_to'];
            $model->event_datetime_to = 
                date('Y-m-d H:i:s', strtotime($timeString));
        }

В этой модели у меня было два поля даты и времени, второе поле необязательно. Этот код не работал, когда я поместил его в функцию. Это сработало только тогда, когда я вставил код в два метода действия.

Полагаю, я не понимаю вызовов функций PHP. Но, если кто-то еще сталкивается с этим вопросом, вот ответ, который работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...