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?
Antworten:
Die Eigenschaft form element
#type
bezieht 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
datetime
Renderelement 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
datetime
Typ verwendet. So gegeben, dass als Richtlinie,quelle
none
den Datumsbereich festzulegen und nur den Zeitabschnitt zurückzugewinnen.