Champs de date définis par programme dans Drupal 7: Date, Date (format ISO) et Date (horodatage Unix)

11

En utilisant l' API Form et hook_form_alter () , comment puis-je définir (forcer) manuellement les valeurs pour chacun des types de champs de date de Drupal 7 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 champs est défini sur texte et que son format est «Ymd H: i: s»

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

Exemple de sortie dpm ().

Exemple de sortie dpm ()

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

Citricguy
la source
De quelle manière ce code est-il cassé?
Countzero
date ('Ym-d', strtotime ('31 mai 2011 ')) et time () sont toujours vides. Je commence à penser que j'utilise le mauvais tableau pour les dates. $ form ['date_field'] ['und'] [0] ['value'] n'est peut-être pas correct? Revenons aux documents.
Citricguy
Lorsque le formulaire est finalement soumis, les types field_date sont toujours des tableaux vides.
Citricguy
Avez-vous essayé de régler $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']?
Countzero
Ne pourriez-vous pas essayer de supprimer tout code personnalisé et de soumettre le formulaire à partir de l'interface utilisateur pour vérifier le format enregistré nativement à partir du champ?
WestieUK

Réponses:

14

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',
  );
Vadym Myrgorod
la source
1
5 ans plus tard, c'est toujours une bonne réponse. Cela ne serait-il pas logique d'utiliser 'timezone' => variable_get('date_default_timezone', 'UTC'),?
marcvangend
6

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 exemple "2011-05-00 00:00:00" (heure), "2011-00-00T00: 00: 00" (date), etc. Pour l'horodatage, vous pouvez simplement faire par exemple strtotime ("2011-05-25").

Important: Notez également que bien que la valeur exacte que vous spécifiez soit 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 de 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.

MD3
la source
Vous avez besoin de guillemets autour des clés de valeur
chef
Merci chef-d'œuvre! Mis à jour pour refléter votre amélioration.
MD3
5

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',
);
Citricguy
la source
2

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

Vous devez utiliser quelque chose comme:

$mydate = date('Y-m-d', strtotime('31 May 2011'));
Countzero
la source
Cela fonctionne pour moi à hook_node_presave, mais pas dans hook_form_alter.
Citricguy
Avez-vous essayé de régler $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']comme mentionné ci-dessus?
Countzero
Trouvé noeud préenregistré à $ node-> field_date [LANGUAGE_NONE] [0]
Citricguy
Ne fonctionne pas avec hook_form_alter ... une aide?
Rajesh Vishwakarma
2

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

});
Nitesh Sethia
la source
1

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

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

Essaye ça:

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

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';
Francisco Luz
la source
1

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 ;
   }
}
Aswini K
la source
0

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();
giorgio79
la source
-1

utilisé le temps () et travaillé OK ....

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

wacto
la source