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


11

Використовуючи API форми та пристосунок_форма_алтер () , як я можу вручну встановити (примусити) значення для кожного типу полів дати Друпалу 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 () виводу

Я також повинен зазначити, що в якості вирішення я можу встановити поле, якщо я модифікую його в mook_node_presave (). Для цього я $node->field_date['und'][0]['value'] = date('Y-m-d H:i:s', $my_unix_timestamp);все-таки хотів би зрозуміти, як це зробити, використовуючи замість гака_форма_алтер.


Яким чином цей код порушений?
Графзеро

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

Коли форма остаточно подає типи field_date - це завжди порожні масиви.
Citricguy

Ви намагалися встановити $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']?
Графзеро

Не можете ви спробувати видалити будь-який спеціальний код і надіслати форму з інтерфейсу, щоб перевірити формат, збережений з поля?
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" (дата), "2011-00-00T00: 00: 00" (дата) тощо. Для мітки дати ви могли просто зробіть, наприклад, strtotime ("2011-05-25").

Важливо: Також зауважте, що хоча вказане вами точне значення зберігатиметься в базі даних, фактичний час, який відображається на сайті, може відрізнятися залежно від налаштувань часового поясу. Коли ви створюєте нове поле дата / дата / дата, ви можете вибрати між п'ятьма різними способами обробки часового поясу. За замовчуванням - "часовий пояс сайту":

При введенні даних у поле вважається, що введені дані знаходяться у часовому поясі сайту. Коли дані зберігаються в базі даних, вони перетворюються на UTC. Однак якщо ви встановили поле дати програмно, як у наведеному вище прикладі, тоді не відбувається перетворення, тому переконайтеся, що ви враховуєте налаштування часового поясу поля. Або іншими словами, якщо ви використовуєте "часовий пояс сайту", переконайтеся, що час у UTC.

На цю інформацію посилався розділ, позначений полем Дата (дата, дата, марка дати) в блозі fooninja.

Це також чудовий загальний ресурс для створення програмних вузлів у Drupal 7.


Вам потрібні цитати навколо
значущих

Дякую майстерні! Оновлено, щоб відобразити ваше вдосконалення.
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'));

Це працює для мене на гачку_node_presave, але не в гачку_форма_алтер.
Citricguy

Ви намагалися встановити, $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']як було сказано вище?
Графзеро

Знайдено, що вузол попередньо зберег у $ node-> field_date [LANGUAGE_NONE] [0]
Citricguy

Не працює з гаком_форма_алтер ... будь-яка допомога?
Rajesh Vishwakarma

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

Щоб встановити значення поля дати, виконайте наведені нижче коди.

Використання гачок_форма_алтер

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

Використання прив'язки_node_submit або kuka_node_presave (Збереження значення в базі даних)

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

Або якщо вам потрібно зберегти значення одного користувальницького поля (визначеного в mock_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. Лише простий час () дзвінок працював для поля "дата-марка"!

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

-1

використовував час () і працював нормально ....

$ fc_item_wrapper-> field_data_pedido-> set (time ());

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.