Mă contactez pentru că pur și simplu nu pot afla de ce câmpul meu personalizat de dată și oră nu își salvează valoarea după ce trimit.
Context:
Am creat un câmp care conține două câmpuri datetime. O voi folosi pentru a adăuga sau elimina evenimente dintr-o listă de evenimente, în funcție de faptul că au trecut sau nu (de exemplu, dacă este programat un festival în perioada 12 - 14 decembrie, evenimentul va fi eliminat după data de 14).
Evenimentele în cazul meu sunt generate de la o entitate personalizată, pot gestiona câmpurile acesteia din back office. Scopul meu este să obțin datele din câmpul meu personalizat datetime pe twig pentru a filtra ce evenimente sunt afișate.
Știu că pot adăuga doar două câmpuri Date, dar găsesc că îi lipsește eleganța pe care o caut.
Codul meu:
Așa că am creat un câmp personalizat care conține în sine două câmpuri datetime. Am urmat multe tutoriale pentru a găsi o versiune care să funcționeze pentru mine și iată codul pentru tipul meu de câmp, widgetul și formatatorul
- Tip câmp: ScheduleItem.php
clasa ScheduleItem extinde FieldItemBase {
/**
* {@inheritdoc}
*/
funcția publică este goală () {
$isEmpty =
empty($this->get('start')->getValue()) &&
empty($this->get('finish')->getValue());
return $isEmpty;
}
/**
* {@inheritdoc}
*/
funcția publică statică propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
$proprietati = [];
$properties['start'] = DataDefinition::create('datetime_iso8601')
->setLabel(t('Data publicării'));
$properties['finish'] = DataDefinition::create('datetime_iso8601')
->setLabel(t('Data suprimarii'));
returnează $proprietăți;
}
/**
* {@inheritdoc}
*/
schema funcției statice publice (FieldStorageDefinitionInterface $field_definition) {
$coloane = [
'start' => [
'type' => 'varchar',
'mysql_type' => 'datatime',
„nu nul” => FALSE,
'default' => NULL,
],
'termină' => [
'type' => 'varchar',
'mysql_type' => 'datatime',
„nu nul” => FALSE,
'default' => NULL,
],
];
întoarcere [
„valoare” => $coloane,
// @DCG Adăugați indecși aici dacă este necesar.
];
}
Nu prea multe de spus aici. Nu știu dacă există un conflict în tipurile pe care le folosesc, ca mysql_type
, tip
și DataDefinition::create
au valori diferite...
- Widget de câmp: ScheduleWidget
clasa ScheduleWidget extinde DateTimeWidgetBase {
/**
* {@inheritdoc}
*/
funcția publică formElement(
FieldItemListInterface $items,
$delta,
Matrice $element,
Matrice &$form,
FormStateInterface $formState
) {
$element += matrice(
'#delta' => $delta,
);
$element['start'] = [
'#type' => 'datatime',
'#title' => $this->t('Data publicării'),
// Setați aici valoarea curentă pentru acest câmp sau o valoare implicită (sau
// null) dacă nu există o valoare
'#default_value' => isset($items[$delta]->start) ?
$items[$delta]->start: null,
'#empty_value' => '',
];
$element['finish'] = [
'#type' => 'datatime',
'#title' => $this->t('Data suprimarii'),
'#default_value' => isset($items[$delta]->finish) ?
$items[$delta]->finish : null,
'#empty_value' => '',
];
returnează $element;
}
}
Spre deosebire de majoritatea widget-urilor de câmp personalizate, le extind DateTimeWidgetBase
si nu WidgetBase
, Ideea aici este să folosiți cele prefabricate massageFormValues
funcția din clasă. Ar trebui să-mi convertească valorile într-un format pregătit pentru baze de date dacă am înțeles corect, dar până acum nu m-a ajutat.
- Formatator de câmpuri: ScheduleDefaultFormatter.php
clasa ScheduleDefaultFormatter extinde FormatterBase {
/**
* {@inheritdoc}
*/
funcția publică viewElements(FieldItemListInterface $items, $langcode)
{
$elemente = [];
foreach ($items ca $delta => $item) {
$elemente[$delta] = [
'#start' => $item->start,
'#finish' => $item->finish
];
}
returnează $elemente;
}
}
Cam asta este pentru codul meu, am crezut că este bun, ei bine, mi s-a părut așa, dar...
PROBLEMA
Când am adăugat noul meu câmp personalizat la entitatea mea de eveniment în secțiunea „Gestionați câmpurile”, am creat un nou eveniment și i-am adăugat date, am primit...
Această valoare ar trebui să fie de tipul primitiv corect.
Ce am încercat
am aruncat $valori
chiar inainte massageFormValues
l-am returnat și așa arată:
Întrebarea mea pentru tine, de ce nu funcționează?
Am încercat să fiu cât mai clar posibil, totuși experiența mea pe Drupal este încă limitată, nu ezitați dacă aveți nevoie de mai multe informații despre codul meu, atâta timp cât ajută la rezolvarea problemei!