Come impostare un campo del tipo di orario a livello di codice?


8

Creo un tipo di entità di contenuto personalizzato.

Voglio un campo per l'ora dell'evento.

Poiché non esiste un campo orario, ma un tipo dataTime, creo un plug-in per un campo personalizzato:

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

    );
  }

Provo a cambiare il tipo in time (per mysql) ma l'errore mysql mi restituisce un valore null per il tipo. Quindi uso int per il tempo di archiviazione in 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;
}

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

Tutto funziona tranne una cosa, l' ora del tipo di input HTML5

Drupal conosce alcuni input in html5 ma non tutti ... digita tel, email, numero, intervallo, colore, data, datetime è ok ma non solo il tipo di ora.

Quindi speravo di ottenerlo con un plug-in personalizzato, ma no ...

Modifica 1

L'unico modo che ho trovato è creare 2 selezionare per questo tipo:

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

Qualche idea su questo?


Ho bisogno di un tipo di campo come questo, puoi condividere il tuo codice in github o in un altro posto?
Adrian Cid Almaguer,

Risposte:


12

La proprietà dell'elemento form si #typeriferisce a un tipo di elemento, non a un elemento HTML. È possibile definire i propri tipi di elementi (o tipi di temi) e è possibile fornire il proprio markup. Questo può essere fatto implementando un plug-in RenderElement .

Aggiornare:

È inoltre possibile utilizzare l' datetimeelemento di rendering e disabilitare la parte della data.

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

Aggiornamento 2:

Il modulo di commento ha un esempio di un array di rendering che utilizza il datetimetipo. Quindi dato che come linea guida,

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

2
Ho anche ricordato qualcosa sull'elemento datetime. Dovresti essere in grado di impostare noneper la parte della data e recuperare solo la parte dell'ora.
mradcliffe,

@mradcliffe Potresti fornire istruzioni dettagliate per questo principiante? Se riesco a farlo funzionare, non esiterei a darti la grazia! Grazie!
Chris Happy,

C'è qualcosa di particolare su cui sei bloccato? Probabilmente è difficile pubblicare codice in un commento, ma vorrei assicurarmi che nel tuo array di moduli siano impostate le proprietà appropriate dell'elemento (chiavi con '#'). Aggiornerò la risposta con alcuni esempi di api.drupal.org tra poco.
mradcliffe,

1
Ha creato un'altra domanda qui: drupal.stackexchange.com/questions/227029/… , poiché la sua domanda era più specifica per il widget di campo piuttosto che per gli elementi dell'API.
mradcliffe,

1
@AdrianCidAlmaguer Sì, ho condiviso il codice qui . Prenderò in considerazione di trasformarlo in Github. Spero che sia d'aiuto!
Chris Happy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.