Для комментариев создано дополнительное поле типа "ссылка на изображение" - field_image. Нужно отключить его из формы комментариев для администратора и оставить видимым для остальных пользователей. Поля других типов прекрасно отключаются таким образом:
function hook_form_comment_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, &$form_state, &$form_id) {
$account = \Drupal::currentUser();
if ($account->id() == 1) {
unset($form['field_image']);
}
}
Но для изображения это не срабатывает. Поле пропадает из формы, но при размещении комментария выходит ошибка: "Данное значение не должно быть пустым".
Пробовал присваивать полю значение по умолчанию и отключать доступ к нему:
function hook_form_comment_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, &$form_state, &$form_id) {
$account = \Drupal::currentUser();
if ($account->id() == 1) {
$form['field_image']['#default_value'] = 'default.png';
$form['field_image']['#access'] = FALSE;
}
}
Но опять таки поле пропадает из формы, но остаётся та же ошибка: "Данное значение не должно быть пустым".
Тогда заметил такую вещь. Если в админке в настройках поля загрузить изображение по умолчанию, то при заполнении поля это умолчание игнорируется и всё равно поле требует, чтобы сам пользователь загрузил изображение. Похоже на баг движка.
В общем бьюсь уже второй день, изучал api, но так и не смог ни задать полю дефолтное решение, ни отключить его полностью из формы.
Если снять из настроек галочку как обязательное поле, то тогда мой код отключения срабатывает. Но мне надо чтобы оно оставалось обязательным для всех пользователей, кроме админа.
Комментарии
$form['field_image']['#required'] = false; вообще не работает, не отменяет обязательность полей.
К сожалению, это фича, причем исконная.
"Поля других типов прекрасно отключаются", потому что если пользователь ничего не выбрал, делают покерфейс и утверждают, что пользователь ввел то значение, которое у них указано в настройках по умолчанию (какое совпадение!). Друпал им верит и записывает его в базу, как обычное значение. Если в настройках значение поменять, на сохраненные материалы это уже не повлияет.
Но поле изображение не такое. Если ничего не выбрано, то так и говорит, и в результате поле остается пустым. А при отображении оно само идет в настройки и берет от туда. Благодаря этому, если поменять значение в настройках - оно будет действовать во всех материалах, где явно не выбрано.
Польза такого подхода спорна. Если нужно обновить дефолт везде - то зашибись, а вот если новый дефолт рассчитан только для нового контента - то.. тоже зашибись, но другое.
При чем здесь опция "обязательное поле"? А при том, что в этом случае Друпала уже не устроит, что изображение пустое, будь оно хоть трижды прописано в настройках по умолчанию. Он знает эти настройки, сегодня там указано, а завтра убрано, а ему красней перед посетителями. Но изображение тоже стало в позу. От фишки своей отказываться не желает, и какое-нибудь изображение-заглушку - не подставишь (вдруг пользователь и сам такое изображение выберет, а потом, при замене дефолта, оно у него поменяется, и он засудит Дриса и всю его компашку на мильён). Так и живем.
Но, возможно, тебе также интересно узнать как быть в твоем случае.
Во-первых, все эти танцы с полями формы никак не влияют на сохранение комментария. Даже ошибка не про то, что обязательное поле не заполнено, а про то, что значение не может быть нулевым.
Поэтому, либо реально подставлять значение программно (только посмотри, как правильно делать, а то что такое "default.png", у меня в каждой папке такой есть, какой ему брать?)
Либо наоборот, сделать поле необязательным, а в форме, если пользователь не админ - менять '#required' на TRUE. Правда пользователь может попытаться отправить комментарий в обход формы, но тут уж надо расставлять засады на всякие этапы сохранения.
И еще, админа лучше тоже проверять не по id, а по роли, или разрешениям. Он ведь может и поменяться, или еще несколько объявятся.
Не получается сделать ни то ни другое. В документации api нет чётких примеров как присвоить для изображения значение по умолчанию. А атрибута required вообще нет у этого поля. Да и для других типов полей не получается отменить этот required. Пробовал так $form['field_image']['#required'] = false;
И так: $form['field_image']]['value']['#required'] = false; Для тестовых, числовых полей тоже не срабатывает.
И наоборот тоже пробовал. Делал поле не обязательным, а для пользователей пытался установить атрибут required = true:
$form['field_image']]['value']['#required'] = true; Но поле обязательным не становится.
За целый день весь гугл перерыл, что только не пробовал, но так и не смог сделать.
Пробовал через валидацию формы сделать. В админке сделать необязательным, а при отправке формы проверять, что если поле пустое то выводить сообщение типа "Заполните это поле". Принцип вроде понимаю, находил пару примеров для седьмого друпала, но у восьмого там поменялись функции и мне самому такое не написать.
/
<?php
$form[$image_field]['widget'][0]['#required'] = TRUE;
$fid = $form[$image_field]['widget'][0]['#default_image']['fid']; // fid - ид изображения в базе
$image_field
= 'field_название_поля'; $user = Drupal::currentUser(); $is_admin = in_array("administrator", $user->getRoles());// or
$is_admin = $user->hasPermission('administer comments'); // вариант с установкой обязательного
if (!$is_admin) {
} // вариант с заполнением поля
if($is_admin) {
$form[$image_field]['widget'][0]['#default_value']['fids'][] = $fid;
$form[$image_field]['#access']=FALSE; // или еще как
}
?>
Оба варианта работают. Воспользовался первым. Спасибо!!!