Wie wird ein Zeittypfeld programmgesteuert festgelegt?

8

Ich erstelle einen benutzerdefinierten Inhaltsentitätstyp.

Ich möchte ein Feld für die Ereigniszeit.

Da es kein Zeitfeld, sondern einen dataTime_type gibt, erstelle ich ein Plugin für ein benutzerdefiniertes Feld:

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

    );
  }

Ich versuche, den Typ in time (für mysql) zu ändern, aber mysql error gibt mir eine Null für den Typ zurück. Also benutze ich int für die Speicherzeit in Sekunden.

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

Meine Entität:

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

Alles funktioniert , außer einer Sache, die HTML5 input type Zeit

Drupal kennt einige Eingaben in HTML5, aber nicht alle ... Typ Tel, E-Mail, Nummer, Bereich, Farbe, Datum, Datum / Uhrzeit ist in Ordnung, aber nicht die Zeit allein.

Also hatte ich gehofft, es mit einem benutzerdefinierten Plugin zu bekommen, aber nein ...

Bearbeiten 1

Die einzige Möglichkeit, die ich gefunden habe, besteht darin, 2 Auswahlen für diesen Typ zu erstellen:

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

Irgendeine Idee dazu?

Kevin
quelle
Ich brauche einen Feldtyp wie diesen. Kannst du deinen Code in Github oder an einem anderen Ort teilen?
Adrian Cid Almaguer
Sie können das Modul drupal.org/project/time_field verwenden .
Verlor Koder

Antworten:

12

Die Eigenschaft form element #typebezieht sich auf einen Elementtyp, nicht auf ein HTML-Element. Es ist in Ordnung, eigene Elementtypen (oder Thementypen) zu definieren, und Sie können Ihr eigenes Markup dafür bereitstellen. Dies kann durch Implementierung eines RenderElement- Plugins erfolgen.

Aktualisieren:

Sie können auch das datetimeRenderelement verwenden und den Datumsteil deaktivieren.

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

Update 2:

Das Kommentarformular enthält ein Beispiel für ein Render-Array, das den datetimeTyp verwendet. So gegeben, dass als Richtlinie,

  $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',
  );
mradcliffe
quelle
2
Ich erinnerte mich auch an etwas über das Datum / Uhrzeit-Element. Sie sollten in der Lage sein, noneden Datumsbereich festzulegen und nur den Zeitabschnitt zurückzugewinnen.
mradcliffe
@mradcliffe Könnten Sie diesem Neuling detaillierte Anweisungen geben? Wenn ich es zum Laufen bringen kann, würde ich nicht zögern, Ihnen das Kopfgeld zu geben! Vielen Dank!
Chris Happy
Gibt es etwas Besonderes, an dem du festhältst? Es ist wahrscheinlich schwierig, Code in einem Kommentar zu veröffentlichen, aber ich würde sicherstellen, dass in Ihrem Formulararray die entsprechenden Elementeigenschaften (Schlüssel mit '#') festgelegt sind. Ich werde die Antwort mit einigen Beispielen von api.drupal.org in Kürze aktualisieren.
mradcliffe
1
Er hat hier eine weitere Frage erstellt: drupal.stackexchange.com/questions/227029/… , da seine Frage spezifischer für das Feld-Widget als für Formular-API-Elemente war.
mradcliffe
1
@AdrianCidAlmaguer Ja, ich habe den Code hier geteilt . Ich werde darüber nachdenken, es in Github umzuwandeln. Ich hoffe es hilft!
Chris Happy