Eu crio um tipo de entidade de conteúdo personalizado.
Eu quero um campo para o horário do evento.
Como não há campo de tempo, mas sim um dataTime_type, crio um plug-in para um campo personalizado:
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,
),
),
);
}
Eu tento alterar o tipo para o tempo (para o mysql), mas o erro do mysql me retorna um nulo para o tipo. Então, eu uso int para armazenar tempo em segundo lugar.
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;
}
Minha entidade:
$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);
Tudo está funcionando, exceto uma coisa, a hora do tipo de entrada HTML5
O Drupal conhece alguma entrada em html5, mas nem todos ... digite tel, email, número, faixa, cor, data, data e hora está ok, mas não o tipo hora sozinho.
Então, eu esperava obtê-lo com um plugin personalizado, mas não ...
Editar 1
A única maneira que encontrei é criar 2 seleções para este 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;
}
Alguma idéia sobre isso?
Respostas:
A propriedade do elemento do formulário
#type
refere-se a um tipo de elemento, não a um elemento HTML. Não há problema em definir seus próprios tipos de elementos (ou tipos de temas), e você pode fornecer sua própria marcação para isso. Isso pode ser feito implementando um plugin RenderElement .Atualizar:
Você também pode usar o
datetime
elemento render e desativar a parte da data.$element['#date_date_element'] = 'none';
Atualização 2:
O formulário de comentário tem um exemplo de uma matriz de renderização que usa o
datetime
tipo Portanto, como orientação,fonte
none
a parte da data e recuperar apenas a parte da hora.