Puncte:1

Dezactivați anumite rânduri ale unei vizualizări Sursă de referință a entității

drapel in

Am un câmp care este o referință de entitate pe o bucată de conținut. Am creat o vedere care este o Sursa de referință a entității și setați tipul de referință pe câmp la acea vizualizare. Când editez conținutul, văd lista mea de casete de selectare care folosesc asta Sursa de referință a entității vedere.

Datele din listă sunt turnee. Odată ce un turneu este finalizat, nu vreau ca utilizatorul să poată debifa acel turneu atunci când editează conținutul. Ei pot comuta doar turneele „viitoare”.

Am încercat să modific o formă, dar fiecare opțiune în $form['field_tournament']['widget']['#options'] pare a fi o Drupal\Core\Field\FieldFilteredMarkup deci nu pot dezactiva rândul, deoarece este doar marcajul HTML, care include doar eticheta, nu caseta de selectare.

funcția MYMODULE_form_group_league_edit_form_alter(&$form, FormStateInterface $form_state) {
  foreach ($form['field_tournaments']['widget']['#options'] ca $key => $option) {
    // dezactivează aici dacă turneul este setat să se finalizeze.
  }
}

Înțeleg, în vizualizare, pot seta să afișeze doar turneele „viitoare”, dar vreau ca ei să poată vedea care dintre ele au fost finalizate în timpul editării.

drapel in
Cu cât fac mai multe cercetări, se pare că un widget de câmp personalizat ar fi calea de urmat.
Puncte:0
drapel in

Așa că mi-am dat seama folosind un widget personalizat și Atribute pentru opțiuni de formular modul, deși acum, când mă gândesc la asta, probabil că aș fi putut realiza același lucru în formularul de modificare, deoarece tocmai încarc termenul prin cheia la care aveam acces înainte. Oricum, am căutat baza de cod a modului în care Casete de bifat/radio widget-ul a fost construit și copiat și a modificat codul pentru a adăuga un atribut dezactivat opțiunii.

<?php

spațiu de nume Drupal\pick_dynasty_golf\Plugin\Field\FieldWidget;

utilizați Drupal\Core\Field\FieldItemListInterface;
utilizați Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsButtonsWidget;
utilizați Drupal\Core\Form\FormStateInterface;

/**
 * Definește widget-ul câmpului „pick_dynasty_golf_tournament_selection”.
 *
 * @FieldWidget(
 * id = "pick_dynasty_golf_tournament_selection",
 * label = @Translation ("Selectare turneu"),
 * field_types = {
 * „boolean”,
 * "entity_reference",
 * "list_integer",
 * „list_float”,
 * „list_string”,
 *},
 * multiple_values ​​= TRUE
 * )
 */
clasa TournamentSelectionWidget extinde OptionsButtonsWidget {

  /**
   * {@inheritdoc}
   */
  funcția publică formElement(FieldItemListInterface $articole, $delta, matrice $element, matrice &$form, FormStateInterface $form_state) {
    $element = parent::formElement($articole, $delta, $element, $form, $form_state);
    // Obțineți toate opțiunile.
    $opțiuni = $this->getOptions($items->getEntity());
    // Obțineți opțiunile deja selectate.
    $selectat = $this->getSelectedOptions($articole);
    $tids = [];
    // Folosiți cheia din $opțiuni pentru a obține ID-uri de termen (turnee).
    foreach ($opțiuni ca $tid => $opțiune) {
      $tids[] = $tid;
    }
    // Încarcă toate turneele.
    $term_storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term');
    $termi = $term_storage->loadMultiple($tids);
    $disabled = [];
    // Parcurgeți-le și dezactivați orice turneu cu starea „post”
    foreach ($terms ca $term) {
      $status = $term->get('field_tournament_status')->valoare;
      if ($status == 'post') {
        $disabled[$term->id()] = [
          'disabled' => TRUE,
        ];
      }
    }

    $element += [
      '#type' => 'casete de selectare',
      '#default_value' => $selectat,
      '#options' => $opțiuni,
      '#options_attributes' => $disabled, // Acesta este din modulul Atribute Opțiuni formular.
    ];

    returnează $element;
  }

}

unu MARE Problema pe care nu am luat-o în considerare a fost dacă câmpul este dezactivat (chiar dacă este selectat anterior) nu este trimis, așa că pierd valoarea. numai citire pe casetele de selectare nu este o opțiune. Practic, trebuie să-l dezactivez în JS, din păcate, și să scriu un validator personalizat pe backend care verifică dacă nu au fost adăugate/eliminate elemente dezactivate.

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.