web-dev-qa-db-fra.com

Comment définir un champ de type de temps par programme?

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, le type d'entrée HTML5 time

Drupal connaît certaines entrées en html5 mais pas toutes ... tapez tel, email, numéro, plage, couleur, date, datetime est ok mais pas le type time 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?

8
Kevin

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'élément de rendu datetime et désactiver la partie date.

$element['#date_date_element'] = 'none';

Mise à jour 2:

formulaire de commentaire a un exemple de tableau de rendu qui utilise le type datetime. Donc, étant donné que comme ligne directrice,

  $form['time_without_date'] = array(
    '#type' => 'datetime',
    '#title' => $this->t('Time without date'),
    // HTML 5 time element format can be H:i
    '#default_value' => DrupalDateTime::createFromFormat('Y-m-d H:i:s', '1970-01-01 20:00', 'UTC'),
    '#size' => 20,
    '#date_date_element' => 'none',
    // This sets html 5 time element use explicitly, probably not necessary.
    '#date_time_element' => 'time',
  );
12
mradcliffe