In my Content type, I add a field Reference: User with unlimited values, Reference method from a view of user managers, and widget checkboxes.
Basically when a user manager edit the node, he can only check the box with his own name. The other checkboxes are set to disabled. The node will be published if all managers check the box.
I've tried creating form_alter function like below
function mymodule_form_alter(&$form, FormStateInterface $form_state, $form_id) {
if ($form_id === 'node_request_order_edit_form') {
$field_approved_by = $form['field_approved_by']['widget']['#options'];
foreach($field_approved_by as $key=>$val) {
if($key != \Drupal::currentUser()->id()) {
$form['field_approved_by']['widget']['#options'][$key]['#disabled'] = true;
}
}
}
}
But I got error
Error: Cannot use object of type Drupal\Core\Field\FieldFilteredMarkup as array...
If I remove the checkboxes using unset,
...
if($key != \Drupal::currentUser()->id()) {
unset($form['field_approved_by']['widget']['#options'][$key]);
}
...
The value get overwritten when different manager checks the box and save the node.
Thanks for any help.
UPDATE 1:
So, I kind of solve it by using JavaScript to disable these checkboxes. Here are the reference tutorials:
But I don't know whether the performance/stability is better or worse than the provided solution from the answers.
Basically I create a JS library file: spo_core.libraries.yml
request_order_edit:
js:
js/request_order_edit.js: {}
dependencies:
- core/jquery
- core/jquery.once
- core/drupal
- core/drupalSettings
Then in JS folder, create file: request_order_edit.js
(function ($) {
'use strict';
Drupal.behaviors.addLayer = {
attach: function (context, settings) {
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 = true;
}
});
/*enable the checkbox before submitting so the disabled checkbox can post value*/
$("form#node-request-order-edit-form").submit(function() {
$('#edit-field-approved-by.form-checkboxes input:checkbox').removeAttr("disabled");
});
}
}
})(jQuery);
Then attach it in form alter like this
...
$form['#attached']['library'][] = 'spo_core/request_order_edit';
$form['#attached']['drupalSettings']['spo_core']['current_uid'] = \Drupal::currentUser()->id();
...