Programowo ustawiaj pola daty w Drupal 7: Data, Data (format ISO) i Data (Unix Timestamp)

11

Używając Form API i hook_form_alter () , w jaki sposób mogę ręcznie ustawić (wymusić) wartości dla każdego typu pola daty Drupala 7, używając prawidłowego znacznika czasu Unix?

Po ostatecznym przesłaniu formularza typy data_pola są zawsze pustymi tablicami. Poniżej znajduje się zepsuty kod, nad którym pracuję.

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();
}

Powinienem wspomnieć, że widget pól jest ustawiony na tekst, a jego format to „Ymd H: i: s”

Próbowałem też date('Y-m-d H:i:s', time())zamiast time().

Przykład danych wyjściowych dpm ().

Przykład danych wyjściowych dpm ()

Powinienem również zauważyć, że jako obejście problemu mogę ustawić pole, jeśli zmodyfikuję je w hook_node_presave (). Aby to zrobić, ustawiłem $node->field_date['und'][0]['value'] = date('Y-m-d H:i:s', $my_unix_timestamp);nadal chciałbym zrozumieć, jak to zrobić za pomocą hook_form_alter.

Citricguy
źródło
W jaki sposób ten kod jest uszkodzony?
Countzero
zarówno data („Ym-d”, strtotime („31 maja 2011 r.”)), jak i godzina () są zawsze puste. Zaczynam myśleć, że używam niewłaściwej tablicy dla dat. $ form ['date_field'] ['und'] [0] ['value'] może być niepoprawny? Wróć do dokumentów.
Citricguy,
Po ostatecznym przesłaniu formularza typy data_pola są zawsze pustymi tablicami.
Citricguy,
Próbowałeś ustawić $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']?
Countzero
Czy nie możesz spróbować usunąć niestandardowego kodu i przesłać formularz z interfejsu użytkownika, aby sprawdzić format zapisany natywnie z pola?
WestieUK

Odpowiedzi:

14

Oto kod, który odpowiednio dla mnie traktuje strefę czasową witryny:

 $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',
  );
Vadym Myrgorod
źródło
1
5 lat później to wciąż dobra odpowiedź. Czy nie miałoby to jednak sensu 'timezone' => variable_get('date_default_timezone', 'UTC'),?
marcvangend
6

Każdy typ pola daty oczekuje inaczej sformatowanego znacznika czasu (w zależności od tego, jak jest przechowywany w bazie danych):

// 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");

Pamiętaj, że nie musisz podawać pełnej daty; w przypadku daty i godziny można wstawić zerami, np. „2011-05-00 00:00:00” (data i godzina), „2011-00-00T00: 00: 00” (data) itp. W przypadku datestampa wystarczy do np. strtotime („2011-05-25”).

Ważne: Należy również pamiętać, że chociaż dokładna określona wartość zostanie zapisana w bazie danych, rzeczywisty czas wyświetlany na stronie może się różnić w zależności od ustawień strefy czasowej. Podczas tworzenia nowego pola data / godzina / datownik możesz wybrać jedną z pięciu różnych metod obsługi strefy czasowej. Domyślną jest „strefa czasowa witryny”:

Podczas wprowadzania danych w polu zakłada się, że wprowadzone dane znajdują się w strefie czasowej witryny. Gdy dane są zapisywane w bazie danych, są konwertowane na UTC. Jeśli jednak ustawisz pole daty programowo, jak w powyższym przykładzie, konwersja nie nastąpi, więc upewnij się, że podałeś ustawienia strefy czasowej pola. Innymi słowy, jeśli używasz „strefy czasowej witryny”, upewnij się, że czas jest w UTC.

Informacje te zostały przywołane w sekcji Data pole (data, godzina, datownik ) na blogu fooninja.

Jest to również wielki ogólny zasób do programowego tworzenia węzłów w Drupal 7.

MD3
źródło
Potrzebujesz cytatów wokół kluczy wartości
masterchief
Dzięki mistrzu! Zaktualizowano, aby odzwierciedlić Twoje ulepszenie.
MD3
5

To zadziałało dla mnie.

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

time()Wartość nie będzie działać na tym poziomie.

Musisz użyć czegoś takiego jak:

$mydate = date('Y-m-d', strtotime('31 May 2011'));
Countzero
źródło
Działa to dla mnie w hook_node_presave, ale nie w hook_form_alter.
Citricguy
Czy próbowałeś ustawić $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']jak wspomniano powyżej?
Countzero
Znaleziono: węzeł wcześniej zapisany w $ node-> field_date [LANGUAGE_NONE] [0]
Citricguy
Nie działa z hook_form_alter ... jakaś pomoc?
Rajesh Vishwakarma
2

Dla rzeczy związanych z datą moglibyśmy napisać js dla uzyskania bieżącej daty ...

jQuery(document).ready(function() {

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

});
Nitesh Sethia
źródło
1

Jeśli używasz typu pola, Date (ISO format)użyj:

$node->field_datetest[$node->language][0][value] = "2011-05-25T10:35";
Abid Ali
źródło
1

Spróbuj tego:

$now = date_now('UTC');
$now = date_format($now, "Y-m-d H:i:s");
rodpal
źródło
1

Dla osób zajmujących się $ form_state i widgetem popup:

// The date format in this sample is dd/mm/yyyy
$form_state['values']['field_my_date_field']['und'][0]['value']['date'] = '14/05/2014';
Francisco Luz
źródło
1

Aby ustawić wartość w polu daty, postępuj zgodnie z poniższymi kodami.

Korzystanie z hook_form_alter

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

Korzystanie z hook_node_submit lub hook_node_presave (Zapisywanie wartości w bazie danych)

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

Lub jeśli chcesz zapisać wartość jednego niestandardowego pola (zdefiniowanego w hook_form_alter) w innym, zobacz poniższe kody.

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 ;
   }
}
Aswini K.
źródło
0

Przyjęta odpowiedź dawała mi wyjątek od ChNP. Tylko proste wywołanie time () działało dla pola „datestamp”!

        $entity->field_upload_time["und"][0]["value"] = time();
giorgio79
źródło
-1

użyłem czasu () i pracowałem OK ....

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

wacto
źródło