Программно устанавливаемые поля даты в Drupal 7: дата, дата (формат ISO) и дата (метка времени Unix)


11

Используя API форм и hook_form_alter () , как я могу вручную установить (принудительно) значения для каждого из типов полей даты в Drupal 7, используя действительную метку времени Unix?

Когда форма наконец отправляется, типы field_date всегда являются пустыми массивами. Ниже приведен неработающий код, с которого я работаю.

hook_form_alter(&$form, &$form_state, $form_id) {

    // http://drupal.org/node/1455576 - Date
    $form['field_date'][LANGUAGE_NONE][0]['value'] = time();

    // http://drupal.org/node/1455576 - Date (ISO Format)
    $form['field_date_iso_format'][LANGUAGE_NONE][0]['value'] = time();

    // http://drupal.org/node/1455576 - Date (Unix Timestamp)
    $form['field_date_unix_timestamp'][LANGUAGE_NONE][0]['value'] =time();
}

Я должен упомянуть, что виджет полей установлен в текст и имеет формат «Ymd H: i: s»

Я также попытался date('Y-m-d H:i:s', time())вместо time().

Пример вывода dpm ().

Пример вывода dpm ()

Я также должен отметить, что в качестве обходного пути я могу установить поле, если я изменю его в hook_node_presave (). Для этого я $node->field_date['und'][0]['value'] = date('Y-m-d H:i:s', $my_unix_timestamp);хотел бы понять, как это сделать, используя вместо этого hook_form_alter.


Как этот код нарушен?
Countzero

date ('Ym-d', strtotime ('31 May 2011 ')) и time () всегда пусты. Я начинаю думать, что я использую неправильный массив для дат. $ form ['date_field'] ['und'] [0] ['value'] может быть неверным? Вернуться к документам это.
Citricguy

Когда форма наконец отправляется, типы field_date всегда являются пустыми массивами.
Citricguy

Вы пытались установить $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']?
Countzero

Не могли бы вы попробовать удалить любой пользовательский код и отправить форму из пользовательского интерфейса, чтобы проверить формат, сохраненный изначально из поля?
WestieUK

Ответы:


14

Вот код, который обрабатывает часовой пояс сайта для меня:

 $node->field_date[LANGUAGE_NONE][0] = array(
    'value' => format_date(strtotime('now'), 'custom', 'Y-m-d H:i:s', 'UTC'),
    'timezone' => 'UTC',  
    'timezone_db' => 'UTC',
  );

1
5 лет спустя это все еще хороший ответ. Разве не имеет смысла использовать 'timezone' => variable_get('date_default_timezone', 'UTC'),?
Marcvangend

6

Каждый тип поля даты ожидает метку времени с различным форматированием (в зависимости от того, как она хранится в базе данных):

// For datetime
$node->field_datetest[$node->language][0]['value'] = "2011-05-25 10:35:58";

// For date
$node->field_datetest[$node->language][0]['value'] = "2011-05-25T10:35:58";

// For datestamp
$node->field_datetest[$node->language][0]['value'] = strtotime("2011-05-25 10:35:58");

Обратите внимание, что вам не нужно указывать полную дату; для даты и времени вы можете просто заполнить нулями, например, «2011-05-00 00:00:00» (datetime), «2011-00-00T00: 00: 00» (date) и т. д. Для datestamp вы можете просто например, strtotime ("2011-05-25").

Важное замечание : Также обратите внимание, что хотя указанное вами значение будет храниться в базе данных, фактическое время, отображаемое на сайте, может отличаться в зависимости от настроек часового пояса. Когда вы создаете новое поле datetime / date / datetamp, вы можете выбрать один из пяти различных методов обработки часового пояса. По умолчанию используется часовой пояс сайта:

При вводе данных в поле предполагается, что введенные данные находятся в часовом поясе сайта. Когда данные сохраняются в базе данных, они преобразуются в UTC. Однако, если вы установите поле даты программно, как в примере выше, преобразование не будет выполнено, поэтому убедитесь, что вы учитываете настройки часового пояса поля. Или, другими словами, если вы используете «часовой пояс сайта», убедитесь, что время указано в UTC.

На эту информацию ссылались из раздела « Поле даты» (datetime, date, datetamp) в блоге fooninja.

Это также отличный общий ресурс для создания программных узлов в Drupal 7.


Вам нужны кавычки вокруг ключей значения
masterchief

Спасибо, мастер! Обновлено, чтобы отразить ваше улучшение.
MD3

5

Это сработало для меня.

$node->field_date[LANGUAGE_NONE][0] = array(
      'value' => date('Y-m-d H:i:s', strtotime('now')),
      'timezone' => 'UTC',
      'timezone_db' => 'UTC',
);

2

time()Значение не будет работать на этом уровне.

Вы должны использовать что-то вроде:

$mydate = date('Y-m-d', strtotime('31 May 2011'));

Это работает для меня в hook_node_presave, но не в hook_form_alter.
Citricguy

Вы пытались установить, $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']как указано выше?
Countzero

Обнаружено, что узел предварительно сохранен в $ node-> field_date [LANGUAGE_NONE] [0]
Citricguy

Не работает с hook_form_alter ... любая помощь?
Раджеш Вишвакарма

2

Для материала Date мы могли бы написать js для получения текущей даты ...

jQuery(document).ready(function() {

    var fullDate = new Date()
    var HR_fullDate = fullDate.toDateString().toString().substring(4,15);
    jQuery('strong.date').contents().replaceWith(HR_fullDate);

});

1

Если вы используете тип поля, Date (ISO format)используйте:

$node->field_datetest[$node->language][0][value] = "2011-05-25T10:35";

1

Попробуй это:

$now = date_now('UTC');
$now = date_format($now, "Y-m-d H:i:s");

1

Для тех, кто имеет дело с $ form_state и всплывающим виджетом:

// The date format in this sample is dd/mm/yyyy
$form_state['values']['field_my_date_field']['und'][0]['value']['date'] = '14/05/2014';

1

Чтобы установить значение в поле даты, следуйте приведенным ниже кодам.

Использование hook_form_alter

$ form ["field_date"] ["und"] [0] ['# default_value'] ['value'] = $ new_date;

Использование hook_node_submit или hook_node_presave (сохранение значения в базе данных)

 function MY_MODULE_node_presave($node) 
  {
      $node->field_date['und'][0]['value'] =  '2014-09-23 00:00:00';
  }

Или, если вам нужно сохранить значение одного настраиваемого поля (определенного в hook_form_alter) в другое, см. Коды ниже.

function MY_MODULE_node_submit($node, $form, &$form_state) {
  if($node->type == 'my_node_type') {
    $test_date =  $form['test_date ']['#value'];
    //Ensure that $test_date format is '2014-09-23 00:00:00'
    $node->field_date['und'][0]['value'] =  $test_date ;
   }
}

0

Принятый ответ дал мне исключение PDO. Только простой вызов time () работал для поля "datetamp"!

        $entity->field_upload_time["und"][0]["value"] = time();

-1

использовал время () и работал нормально ....

$ Fc_item_wrapper-> field_data_pedido-> набор (время ());

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.