Puncte:1

Nu se poate salva valoarea câmpului personalizat de dată și oră

drapel in

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ă:

descărcarea valorii câmpului meu personalizat

Î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!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.