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.