Je crée un type d'entité de contenu personnalisé.
Je veux un champ pour l'heure de l'événement.
Puisqu'il n'y a pas de champ horaire, mais un dataTime_type, je crée un plugin pour un champ personnalisé:
FieldType: TimeItem.php
/**
* Plugin implementation of the 'time' field type.
*
* @FieldType(
* id = "time",
* label = @Translation("Time Field"),
* description = @Translation("Permet la creation d'un champ de type time"),
* default_widget = "time_widget",
* default_formatter = "time_formatter"
* )
*/
/**
* {@inheritdoc}
*/
public static function schema(FieldStorageDefinitionInterface $field_definition) {
return array(
'columns' => array(
'value' => array(
'description' => 'The time value.',
'type' => 'int',
'length' => 6,
),
),
);
}
J'essaye de changer le type en temps (pour mysql) mais l'erreur mysql me renvoie un null pour le type. J'utilise donc int pour stocker le temps en seconde.
FieldWidget: TimeWIdget.php
/**
* {@inheritdoc}
*/
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$value = isset($items[$delta]->value) ? $items[$delta]->value : '';
$element += array(
'#type' => 'time', //HTML5 input
'#default_value' => $value,
'#size' => 4,
'#element_validate' => array(
array($this, 'validate'),
),
);
return $element;
}
Mon entité:
$fields['heure_evenement'] = BaseFieldDefinition::create('time')
->setLabel(t('test'))
->setDescription(t('test'))
->setRequired(TRUE)
->setDefaultValue('')
->setDisplayOptions('view', array(
'label' => 'above',
'type' => 'string',
'weight' => 3,
))
->setDisplayOptions('form', array(
'weight' => 3,
))
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
Tout fonctionne sauf une chose, l' heure du type d'entrée HTML5
Drupal connaît certaines entrées en html5 mais pas toutes ... le type tel, email, numéro, plage, couleur, date, datetime est correct mais pas le type heure seul.
J'espérais donc l'obtenir avec un plugin personnalisé, mais non ...
Modifier 1
La seule façon que j'ai trouvée est de créer 2 select pour ce type:
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$value = isset($items[$delta]->value) ? $items[$delta]->value : '';
//heure
for($i=0;$i<=24;$i++){
$hour[]=$i;
}
//minutes
for($i=0;$i<=59;$i++){
$minutes[]=$i;
}
$element += array('hour'=>array(
'#title'=>t('Hour'),
'#type' => 'select',
'#options'=>$hour,
'#default_value' => $value,
'#element_validate' => array(
array($this, 'validate'),
),
)
);
$element += array('minutes'=>array(
'#title'=>t('Minutes'),
'#type' => 'select',
'#options'=>$minutes,
'#default_value' => $value,
'#element_validate' => array(
array($this, 'validate'),
),
)
);
return $element;
}
Une idée à ce sujet?
Réponses:
La propriété d'élément de formulaire
#type
fait référence à un type d'élément, pas à un élément HTML. Il est correct de définir vos propres types d'éléments (ou types de thèmes), et vous pouvez fournir votre propre balisage pour cela. Cela peut être fait en implémentant un plugin RenderElement .Mise à jour:
Vous pouvez également utiliser l'
datetime
élément de rendu et désactiver la partie date.$element['#date_date_element'] = 'none';
Mise à jour 2:
Le formulaire de commentaire contient un exemple de tableau de rendu qui utilise le
datetime
type. Donc, étant donné que comme ligne directrice,la source
none
la partie date et récupérer uniquement la partie heure.