Î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();
...