Рейтинг:-2

How to check and disable one of the checkboxes in a form?

флаг kz

I found this snippet in the code for a form ($roles is an array of roles).

$form['config_options']['roles'] = [
  '#type' => 'checkboxes',
  '#options' => $roles,
];
// Check and disable the 'authenticated' role.
$form['config_options']['roles'][RoleInterface::AUTHENTICATED_ID] = [
  '#default_value' => TRUE,
  '#disabled' => TRUE,
];

What this does is to check the checkbox for the 'authenticated' role, and then disables it (so it can't be unchecked). This works.

I have a very similar requirement. In a form I have checkboxes for a bunch of fields, where $fields is an array of them. The fields are from user profile. I want to check and disable the 'email' field.

Based upon the code snippet above, I think the solution should be something like this:

$form['config_fields']['fields'] = [
  '#type' => 'checkboxes',
  '#options' => $fields,
];
// Check and disable the 'email' field.
$form['config_fields']['fields'][ -- What to put here? -- ] = [
  '#default_value' => TRUE,
  '#disabled' => TRUE,
];

However, I have no idea what to put in the selector where I've written " -- What to put here? --".

Based upon a comment from Clive I've tried to examine $fields. This is what the devel Default variables-dumper gives me (using short array syntax):

$fields = [
  …
  mail => stdClass Object (
    [__CLASS__] => Drupal\Core\StringTranslation\TranslatableMarkup
    [translatedMarkup:protected] => 
    [options:protected] => []
    [stringTranslation:protected] => 
    [string:protected] => Email
    [arguments:protected] => []
  )
  …
]

So it is a bit more complex than the example given in Clive's comment (e.g. it is an object, not an array (as implied by Clive).

So far I've tried 'Email'.

$form['config_fields']['fields'] = [
  '#type' => 'checkboxes',
  '#options' => $fields,
];
// Check and disable the 'email' field.
$form['config_fields']['fields']['Email'] = [
  '#default_value' => TRUE,
  '#disabled' => TRUE,
];

This does not work.

Help will be appreciated.

Also, if I am barking up the wrong tree, and there exists another way to do this, I shall equally appreciate an alternative solution.

(I am using Drupal 9).

флаг cn
Это будет соответствующий ключ массива из `$fields`. например если `$fields = ['foo' => 'Foo', 'bar' => 'Bar'];`, и вы хотите проверить `Bar`, ключ `bar`
Free Radical avatar
флаг kz
@Clive Спасибо за предложение. Я расширил «поля» и обновил вопрос расширенной версией. Это похоже на объект, а ваше предложение подразумевает, что это массив. Мне до сих пор не ясно, что использовать в качестве ключа. Следуя вашему предложению, я думаю, что это должно быть «Электронная почта», но «Электронная почта» у меня не работает.
Рейтинг:0
флаг kz

ОК, получается, что ключ - это просто машина имя поля, которое вы хотите проверить и отключить. Это работает:

$form['config_fields']['поля'] = [
  '#type' => 'флажки',
  '#options' => $поля,
];
// Проверяем и отключаем поле 'mail'.
$form['config_fields']['fields']['mail'] = [
  '#default_value' => ИСТИНА,
  '#отключено' => ИСТИНА,
];

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.