Отключить обязательное поле "изображение" из формы комментариев для админа

Главные вкладки

Аватар пользователя alexboy alexboy 10 февраля 2016 в 11:23

Для комментариев создано дополнительное поле типа "ссылка на изображение" - 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, но так и не смог ни задать полю дефолтное решение, ни отключить его полностью из формы.
Если снять из настроек галочку как обязательное поле, то тогда мой код отключения срабатывает. Но мне надо чтобы оно оставалось обязательным для всех пользователей, кроме админа.

Лучший ответ

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 10 февраля 2016 в 21:59
1
<?php

$image_field 

'field_название_поля';

$user Drupal::currentUser();

$is_admin in_array("administrator"$user->getRoles());
// or
$is_admin $user->hasPermission('administer comments');

// вариант с установкой обязательного
if (!$is_admin) {

  

$form[$image_field]['widget'][0]['#required'] = TRUE;
}

// вариант с заполнением поля
if($is_admin) {

  

$fid $form[$image_field]['widget'][0]['#default_image']['fid']; // fid - ид изображения в базе
  
$form[$image_field]['widget'][0]['#default_value']['fids'][] = $fid;
  
$form[$image_field]['#access']=FALSE// или еще как
}
?>

Комментарии

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 10 февраля 2016 в 19:08
2

alexboy wrote:

Похоже на баг движка.

К сожалению, это фича, причем исконная.

"Поля других типов прекрасно отключаются", потому что если пользователь ничего не выбрал, делают покерфейс и утверждают, что пользователь ввел то значение, которое у них указано в настройках по умолчанию (какое совпадение!). Друпал им верит и записывает его в базу, как обычное значение. Если в настройках значение поменять, на сохраненные материалы это уже не повлияет.

Но поле изображение не такое. Если ничего не выбрано, то так и говорит, и в результате поле остается пустым. А при отображении оно само идет в настройки и берет от туда. Благодаря этому, если поменять значение в настройках - оно будет действовать во всех материалах, где явно не выбрано.

Польза такого подхода спорна. Если нужно обновить дефолт везде - то зашибись, а вот если новый дефолт рассчитан только для нового контента - то.. тоже зашибись, но другое.

При чем здесь опция "обязательное поле"? А при том, что в этом случае Друпала уже не устроит, что изображение пустое, будь оно хоть трижды прописано в настройках по умолчанию. Он знает эти настройки, сегодня там указано, а завтра убрано, а ему красней перед посетителями. Но изображение тоже стало в позу. От фишки своей отказываться не желает, и какое-нибудь изображение-заглушку - не подставишь (вдруг пользователь и сам такое изображение выберет, а потом, при замене дефолта, оно у него поменяется, и он засудит Дриса и всю его компашку на мильён). Так и живем.

Но, возможно, тебе также интересно узнать как быть в твоем случае.

Во-первых, все эти танцы с полями формы никак не влияют на сохранение комментария. Даже ошибка не про то, что обязательное поле не заполнено, а про то, что значение не может быть нулевым.

Поэтому, либо реально подставлять значение программно (только посмотри, как правильно делать, а то что такое "default.png", у меня в каждой папке такой есть, какой ему брать?)

Либо наоборот, сделать поле необязательным, а в форме, если пользователь не админ - менять '#required' на TRUE. Правда пользователь может попытаться отправить комментарий в обход формы, но тут уж надо расставлять засады на всякие этапы сохранения.

И еще, админа лучше тоже проверять не по id, а по роли, или разрешениям. Он ведь может и поменяться, или еще несколько объявятся.

Аватар пользователя alexboy alexboy 10 февраля 2016 в 19:50

vaplas wrote:

Поэтому, либо реально подставлять значение программно (только посмотри, как правильно делать, а то что такое "default.png", у меня в каждой папке такой есть, какой ему брать?)
Либо наоборот, сделать поле необязательным, а в форме, если пользователь не админ - менять '#required' на TRUE. Правда пользователь может попытаться отправить комментарий в обход формы, но тут уж надо расставлять засады на всякие этапы сохранения.

Не получается сделать ни то ни другое. В документации api нет чётких примеров как присвоить для изображения значение по умолчанию. А атрибута required вообще нет у этого поля. Да и для других типов полей не получается отменить этот required. Пробовал так $form['field_image']['#required'] = false;
И так: $form['field_image']]['value']['#required'] = false; Для тестовых, числовых полей тоже не срабатывает.
И наоборот тоже пробовал. Делал поле не обязательным, а для пользователей пытался установить атрибут required = true:
$form['field_image']]['value']['#required'] = true; Но поле обязательным не становится.
За целый день весь гугл перерыл, что только не пробовал, но так и не смог сделать.

Пробовал через валидацию формы сделать. В админке сделать необязательным, а при отправке формы проверять, что если поле пустое то выводить сообщение типа "Заполните это поле". Принцип вроде понимаю, находил пару примеров для седьмого друпала, но у восьмого там поменялись функции и мне самому такое не написать.

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 10 февраля 2016 в 21:59
1
<?php

$image_field 

'field_название_поля';

$user Drupal::currentUser();

$is_admin in_array("administrator"$user->getRoles());
// or
$is_admin $user->hasPermission('administer comments');

// вариант с установкой обязательного
if (!$is_admin) {

  

$form[$image_field]['widget'][0]['#required'] = TRUE;
}

// вариант с заполнением поля
if($is_admin) {

  

$fid $form[$image_field]['widget'][0]['#default_image']['fid']; // fid - ид изображения в базе
  
$form[$image_field]['widget'][0]['#default_value']['fids'][] = $fid;
  
$form[$image_field]['#access']=FALSE// или еще как
}
?>