web-dev-qa-db-fra.com

Définir la valeur par défaut du champ d'horodatage vide

J'ai créé le type de champ "Horodatage" dans mon nœud Drupal 8. Le champ n'est pas obligatoire. Dans les paramètres par défaut, il existe un sélecteur de date et d'heure HTML 5, dans lequel vous pouvez sélectionner la date/l'heure par défaut ou laissez les valeurs comme sur l'image:

enter image description here

Mais le comportement Drupal semble être un peu étrange - lorsque vous sélectionnez la date par défaut, cette valeur est définie lors de la sauvegarde du nœud (c'est correct). Lorsque vous laissez le champ vide (valeurs comme sur l'image) il enregistre le champ avec l'heure de soumission du formulaire (il est indiqué dans le commentaire du champ, donc ce n'est pas un bug) ... Mais comment désactiver la valeur par défaut, quand vous voulez juste laisser le champ vide comme c'est possible avec tous les autres champs ( par exemple, texte, nombre, ...)? Je ne vois aucun paramètre pour cela dans cette configuration de champ. Ce n'est pas non plus logique, beucase lorsque vous laissez d'autres champs vides, ils sont vraiment vides. Lorsque vous laissez ce type de champ vide, il enregistre toujours la valeur (une case à cocher supplémentaire sera plus logique)?

Merci

6
Juraj Nemec

Il y a une trame de fond qui est un peu compliquée.

Le type de champ Horodatage a été ajouté de retour dans Drupal 8.2.0 core en tant que " Champ d'interface utilisateur ". Le type de champ a toujours été là, tout comme un champ en arrière-plan, et utilisé comme champ de base pour CreatedItem et ChangedItem pour les horodatages d'entité (qui sont tous deux non -Types de champs UI).

Si ce champ est affiché avec le widget approprié sur la page d'édition (voir bug ), vous finissez par utiliser TimestampDatetimeWidget. Ce widget a une méthode ::massageFormValues() , qui applique l'heure actuelle utilisée (lors de la sauvegarde) comme valeur de champ si l'élément est vide.

Ainsi, le comportement que vous voyez est par conception. Le widget était initialement prév pour les pages d'édition d'entité, où les horodatages créés et modifiés n'ont jamais de valeurs vides après l'enregistrement de l'entité. Lorsque ce champ a été ajouté en tant que champ d'interface utilisateur, il a hérité du widget et de son comportement.

Si vous voulez vraiment un horodatage et que vous ne voulez pas de ce comportement, vous devez créer un module personnalisé et créer votre propre widget. Vous devriez juste pouvoir copier TimestampDatetimeWidget dans le module, le renommer, mettre à jour l'annotation et mettre à jour la méthode ::massageFormValues():

  • supprimez la branche else contenant $date = new DrupalDateTime(); - cela ne définira pas la date/heure par défaut
  • gérer la variable $date non définie, exemple: $item['value'] = !empty($date) ? $date->getTimestamp() : NULL;

Cela devrait vous permettre d'avoir des horodatages vides.

Personnellement, je n'utiliserais pas les champs Timestamp . J'utiliserais les champs Date , qui peuvent avoir des valeurs vides ou des valeurs par défaut, et de meilleurs widgets et formateurs en général.

7
mpdonadio