Puncte:5

Cum se face o casetă de selectare doar pentru citire/dezactivată din lista de referințe la entitățile utilizatorului

drapel cn

În tipul meu de conținut, adaug un câmp Referință: utilizator cu valori nelimitate, metoda de referință din perspectiva managerilor de utilizatori și casete de selectare pentru widget.

Practic, atunci când un manager de utilizator editează nodul, el poate bifa doar caseta cu propriul nume. Celelalte casete de selectare sunt setate la dezactivate. Nodul va fi publicat dacă toți managerii bifează caseta.

Am încercat să creez funcția form_alter ca mai jos

funcția mymodule_form_alter(&$form, FormStateInterface $form_state, $form_id) {
    dacă ($form_id === 'node_request_order_edit_form') {

        $field_approved_by = $form['field_approved_by']['widget']['#options'];
        
        foreach($field_approved_by ca $key=>$val) {
            if($key != \Drupal::currentUser()->id()) {
                $form['field_approved_by']['widget']['#options'][$key]['#disabled'] = true;
            }
        }
    }
}

Dar am primit o eroare

Eroare: nu se poate folosi obiectul de tip Drupal\Core\Field\FieldFilteredMarkup ca matrice...

Dacă elimin casetele de selectare folosind unset,

    ...
    if($key != \Drupal::currentUser()->id()) {
        unset($form['field_approved_by']['widget']['#options'][$key]);
    }
    ...

Valoarea este suprascrisă atunci când un manager diferit bifează caseta și salvează nodul.

Multumesc pentru orice ajutor.

ACTUALIZARE 1:

Deci, o rezolv folosind JavaScript pentru a dezactiva aceste casete de selectare. Iată tutorialele de referință:

Dar nu știu dacă performanța/stabilitatea este mai bună sau mai proastă decât soluția oferită din răspunsuri.

Practic, creez un fișier de bibliotecă JS: spo_core.libraries.yml

request_order_edit:
  js:
    js/request_order_edit.js: {}
  dependențe:
    - core/jquery
    - core/jquery.o dată
    - miez/drupal
    - core/drupalSettings

Apoi, în folderul JS, creați fișierul: request_order_edit.js

(funcția ($) {
  „utilizați strict”;
  Drupal.behaviors.addLayer = {
    atașați: funcție (context, setări) {
        console.log(drupalSettings.spo_core.current_uid);
        $('#edit-field-approved-by input:checkbox').each(function(){
            if(this.value != drupalSettings.spo_core.current_uid){
                this.disabled = adevărat;
            }
        });

        /*activează caseta de selectare înainte de a trimite, astfel încât caseta de selectare dezactivată să poată posta valoare*/
        $("form#node-request-order-edit-form").submit(function() {
        $('#edit-field-approved-by.form-checkboxes input:checkbox').removeAttr("dezactivat");
    });
    }
  }
})(jQuery);

Apoi atașați-l în formă modificată astfel

...
$form['#attached']['library'][] = 'spo_core/request_order_edit';
$form['#attached']['drupalSettings']['spo_core']['current_uid'] = \Drupal::currentUser()->id();
...
sonfd avatar
drapel in
Aceasta ar putea fi o oportunitate bună de a crea un widget de câmp personalizat care extinde widget-ul casetelor de selectare din core, mai degrabă decât de a utiliza un cârlig de modificare a formularelor.
drapel cn
@sonfd Mulțumesc pentru răspuns. Mi-am actualizat întrebarea adăugând soluția mea de soluție folosind JavaScript. Dar eu Dar nu știu dacă performanța/stabilitatea/standardizarea în comparație cu soluția/răspunsul dumneavoastră. Tu ce crezi?
sonfd avatar
drapel in
Când am avut un scenariu similar (dezactivarea unor casete de selectare într-un element al unui câmp), am creat un Widget de câmp care a extins elementele de bază și am folosit modulul Atribute Opțiuni formular pentru a dezactiva casetele de selectare. După părerea mea, aceasta este cea mai bună soluție. Cu abordarea dvs. javascript, este posibil, deși puțin probabil, cineva să bifeze o casetă înainte ca aceasta să fie dezactivată.
Puncte:4
drapel in

Din câte știu, nucleul Drupal nu oferă această funcționalitate imediată - nu există nicio modalitate de a adăuga atribute la opțiunile individuale ale unui element.

Cu toate acestea, o modalitate prin care am făcut acest lucru este cu ajutorul Atribute pentru opțiunile formularului modul.

Modulul [Atribute Form Options] adaugă posibilitatea de a specifica atribute pentru opțiunile individuale ale elementelor Drupal Form API de tipurile: select, casete de selectare și radiouri.

Este destul de ușor de folosit. De pe pagina proiectului:

Pentru a adăuga atribute la opțiunile unui element de formular, adăugați o cheie #options_attributes la definiția elementului de formular. Valoarea #options_attributes ar trebui să fie o matrice cu chei care se potrivesc cu cheile din matricea de valori #options. Valorile din tabloul #options_attributes ar trebui să fie formatate ca matricea principală #attributes.

De exemplu:

$form['my_field'] = [
  '#options' => [
    '1' => 'Utilizatorul 1',
    '123' => 'Utilizatorul 123',
    '456' => 'Utilizatorul 456',
  ]
  '#options_attributes' => [
    // Dezactivează această opțiune.
    '1' => [
      'disabled' => 'dezactivat',
    ],
    // Permite această opțiune.
    '123' => [],
    // Dezactivează această opțiune.
    '456' => [
      'disabled' => 'dezactivat',
    ],
  ],
];

Sau vezi modulul CITEȘTE-MĂ pentru exemple mai complete.

Puncte:2
drapel cn

Fa asta:

funcția mymodule_form_alter(&$form, FormStateInterface $form_state, $form_id) {
    dacă ($form_id === 'node_request_order_edit_form') {

        $field_approved_by = $form['field_approved_by']['widget']['#options'];
        
        foreach($field_approved_by ca $key=>$val) {
            if($key != \Drupal::currentUser()->id()) {
                $form['field_approved_by']['widget'][$key]['#disabled'] = adevărat;
            }
        }
    }
}

Cheia este că atunci când specificați atributele opțiunilor, lucrați cu elementul copil al „widget”, nu al „#opțiuni”.

drapel us
Mulțumiri. Acest lucru a făcut truc pentru dezactivarea sau ascunderea rolurilor de grup pentru membrii unui grup. $form['group_roles']['widget']['role-name']['#disabled'] = true; sau $form['group_roles']['widget']['role-name']['#access'] = false;

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.