В моем типе контента я добавляю поле Ссылка: Пользователь с неограниченными значениями, эталонным методом с точки зрения менеджеров пользователей и флажками виджетов.
По сути, когда менеджер пользователей редактирует узел, он может установить флажок только со своим именем. Остальные флажки отключены. Узел будет опубликован, если все менеджеры поставят галочку.
Я попытался создать функцию form_alter, как показано ниже.
функция mymodule_form_alter(&$form, FormStateInterface $form_state, $form_id) {
если ($ form_id === 'node_request_order_edit_form') {
$field_approved_by = $form['field_approved_by']['виджет']['#options'];
foreach($field_approved_by as $key=>$val) {
если($key != \Drupal::currentUser()->id()) {
$form['field_approved_by']['widget']['#options'][$key]['#disabled'] = true;
}
}
}
}
Но я получил ошибку
Ошибка: невозможно использовать объект типа Drupal\Core\Field\FieldFilteredMarkup в качестве массива...
Если я сниму флажки с помощью unset,
...
если($key != \Drupal::currentUser()->id()) {
unset($form['field_approved_by']['widget']['#options'][$key]);
}
...
Значение перезаписывается, когда другой менеджер устанавливает флажок и сохраняет узел.
Спасибо за любую помощь.
ОБНОВЛЕНИЕ 1:
Итак, я как бы решаю это, используя JavaScript для отключения этих флажков. Вот справочные руководства:
Но я не знаю, лучше или хуже производительность/стабильность, чем предоставленное решение из ответов.
В основном я создаю файл библиотеки JS: spo_core.libraries.yml
request_order_edit:
js:
js/request_order_edit.js: {}
зависимости:
- ядро/jquery
- ядро/jquery.once
- ядро/друпал
- настройки ядра/друпала
Затем в папке JS создайте файл: request_order_edit.js
(функция ($) {
'использовать строгий';
Drupal.behaviors.addLayer = {
прикрепить: функция (контекст, настройки) {
console.log(drupalSettings.spo_core.current_uid);
$('#edit-field-approved by input:checkbox').each(function(){
если (это.значение!= drupalSettings.spo_core.current_uid){
this.disabled = истина;
}
});
/*включите флажок перед отправкой, чтобы отключенный флажок мог публиковать значение*/
$("form#node-request-order-edit-form").submit(function() {
$('#edit-field-approved-by.form-checkboxes input:checkbox').removeAttr("disabled");
});
}
}
})(jQuery);
Затем прикрепите его в форме изменить, как это
...
$form['#attached']['library'][] = 'spo_core/request_order_edit';
$form['#attached']['drupalSettings']['spo_core']['current_uid'] = \Drupal::currentUser()->id();
...