web-dev-qa-db-fra.com

Définissez les champs de date par programme dans Drupal 7: Date, Date (format ISO) et Date (horodatage Unix)

À l'aide de Form API et hook_form_alter () , comment puis-je définir (forcer) manuellement les valeurs pour chacun des types de champ de date Drupal 7 de date en utilisant un horodatage Unix valide?

Lorsque le formulaire est finalement soumis, les types field_date sont toujours des tableaux vides. Voici le code cassé à partir duquel je travaille.

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

Je dois mentionner que le widget des champs est défini sur du texte et que son format est 'Y-m-d H: i: s'

J'ai également essayé date('Y-m-d H:i:s', time()) au lieu de time().

Exemple dpm () sortie.

Example dpm() output

Je dois également noter que comme solution de contournement, je peux définir le champ si je le modifie dans hook_node_presave (). Pour ce faire, j'ai défini $node->field_date['und'][0]['value'] = date('Y-m-d H:i:s', $my_unix_timestamp); Je voudrais toujours comprendre comment faire cela en utilisant hook_form_alter à la place.

11
Citricguy

Voici un code qui traite le fuseau horaire du site pour moi:

 $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',
  );
14
Vadym Myrgorod

Chaque type de champ de date attend un horodatage de format différent (en fonction de la façon dont il est stocké dans la base de données):

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

Notez que vous n'avez pas besoin de spécifier une date complète; pour l'heure et la date, vous pouvez simplement remplir avec des zéros, par ex. "2011-05-00 00:00:00" (datetime), "2011-00-00T00: 00: 00" (date), etc. Pour l'horodatage, vous pouvez simplement faire par ex. strtotime ("2011-05-25").

Important: Notez également que même si la valeur exacte que vous spécifiez sera stockée dans la base de données, l'heure réelle affichée sur le site peut être différente selon les paramètres de fuseau horaire. . Lorsque vous créez un nouveau champ datetime/date/datestamp, vous pouvez choisir entre cinq méthodes de gestion de fuseau horaire différentes. Le paramètre par défaut est "fuseau horaire du site":

Lors de la saisie de données dans le champ, les données saisies sont supposées être dans le fuseau horaire du site. Lorsque les données sont enregistrées dans la base de données, elles sont converties en UTC. Cependant, si vous définissez un champ de date par programme comme dans l'exemple ci-dessus, aucune conversion n'a lieu, alors assurez-vous de tenir compte des paramètres de fuseau horaire du champ. Ou en d'autres termes, si vous utilisez le "fuseau horaire du site", assurez-vous que l'heure est en UTC.

Ces informations ont été référencées dans la section intitulée champ Date (datetime, date, datestamp) sur le blog de fooninja.

C'est également une excellente ressource générale pour la création de nœuds programmatiques dans Drupal 7.

6
MD3

Cela a fonctionné pour moi.

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

Pour les trucs de date, nous pourrions écrire un js pour obtenir la date actuelle ...

jQuery(document).ready(function() {

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

});
2
Nitesh Sethia

La valeur time() ne fonctionnera pas à ce niveau.

Vous devez utiliser quelque chose comme:

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

Pour ceux qui traitent de $ form_state et du widget 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';
1
Francisco Luz

Pour définir une valeur sur un champ de date, suivez les codes ci-dessous.

Utilisation de hook_form_alter

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

Utilisation de hook_node_submit ou hook_node_presave (enregistrement de la valeur dans la base de données)

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

Ou si vous devez enregistrer la valeur d'un champ personnalisé (défini dans hook_form_alter) dans un autre, voir les codes ci-dessous.

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 ;
   }
}
1
Aswini K

Essaye ça:

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

Si vous utilisez le type de champ Date (ISO format), utilisez:

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

La réponse acceptée me donnait une exception AOP. Seul un simple appel time () a fonctionné pour un champ "datestamp"!

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