Можете ли вы уточнить "не удается"?
Во-первых, вам не хватает формы & из $.Для начала измените это.
Если это не помогает, попробуйте выяснить, какая часть вашего кода на самом деле работает.Попробуйте добавить drupal_set_message («пользователь в роли foo»);внутри условия if.
Если это показывает, то это проблема с unset.Обратите внимание, что вы не должны использовать unset, а вместо этого установите '#access' в FALSE.Как это:
$form['field_non_foo']['#access'] = FALSE;
Вы можете даже пойти по вкусу и напрямую сохранить все, что возвращается из in_array_check ():
$form['field_non_foo']['#access'] = in_array('foo_role', $user->roles);
Однако здесь есть разница, и это то, чтотеперь вы должны быть либо TRUE, либо FALSE и не использовать какое-либо значение, которое у него уже может быть.
Редактировать: Вы уверены, что ваше поле не находится внутри набора полей?Тогда вместо этого будет $ form ['the_fieldset'] ['field_non_foo'].