Как скрыть и / или запретить доступ к полям в форме, например group_audience для органических групп

9

Это беспокоило меня некоторое время. Когда я пытаюсь скрыть такие поля, как поле групповой аудитории или параметр публикации из формы, при проверке формы в обоих этих полях устанавливается нулевое значение, даже если значение по умолчанию как были правильно объявлены.

Я пытался использовать Invisible, #access, unset hidden ничего не работает! Это очень беспокоит, потому что для моего текущего проекта пользователи могут редактировать только небольшие биты своего профиля в данный момент, например, только адрес или изображение, поэтому, если я скрываю групповую аудиторию, пользователь в итоге вылетает из групп, к которым он принадлежит. редактировать.

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

$variables['user_edit_about']['group_audience']= $temp['group_audience'];       
$variables['user_edit_about']['group_audience']['#prefix'] = '<div style="display:none;">';
$variables['user_edit_about']['group_audience']['#suffix'] = '</div>';

Кто-нибудь придумает лучший способ добиться этого?

Спасибо

silkAdmin
источник
Этот ответ не идеален, потому что использование все еще может изменить значение с помощью манипуляции DOM
iStryker

Ответы:

6

Редактировать:

Хорошо, я понял это. Поместите это в свой пользовательский модуль:

function example_form_alter(&$form, &$form_state, $form_id) {
    if($form_id == 'story_node_form') {
        $form['title']['#value'] = 'hot stuff';
        $form['title']['#access'] = FALSE;

    }
}

Это установит заголовок узла истории как «горячий материал», и он НЕ будет отображаться на странице, потому что #access = FALSE;

Вы можете добавить больше контроля гранулярности в hook_form_alter () как

  global $user;

  // Check to see if $user has does not have the administrator role.
  if (!in_array('administrator', array_values($user->roles))) {
    $form['title']['#access'] = FALSE;
  }

Это работает для Drupal 6 & 7.

Старый ответ (игнорировать):

Прошло некоторое время с тех пор, как я сделал что-то подобное, так что я могу ошибаться. Если вы установите [#value]элемент формы, он не будет виден на форме.

Я сделал это в Drupal 6, hook_form_alter()в пользовательском модуле. Я не знаю, будет ли это работать в Drupal 7, и я не знаю, сможете ли вы сделать это в функции предварительной обработки

iStryker
источник
Спасибо за ваш ответ, хотя, к сожалению, в моем случае это не сработало, поля форм уже имеют предварительное значение #value, поскольку они являются формами редактирования
silkAdmin
@silkAdmin Пожалуйста, смотрите новые правки
iStryker
Спасибо Stryker за то, что уделили время, чтобы разобраться с этим, несмотря на то, что ваш вышеупомянутый techinic действительно работает и скрывает поля, кажется, что значение по умолчанию также не учитывается при отправке. Таким образом, я получаю, что пользователя все еще выгнали из своей группы при каждом редактировании профиля. Пока что только трюк с суффиксом #prefix # заставляет его вести себя нормально.
silkAdmin
do $ form ['title'] ['# value'] = $ form ['title'] ['# default_value']
iStryker
5

Вы также можете просто добавить CSS-класс 'element-hidden' к элементу формы

$form['user_edit_about']['group_audience']['#attributes']['class'][] = 'element-hidden';

Как упоминалось ранее в iStryker, все еще можно изменить значение с помощью манипулирования DOM. Однако это хороший и простой способ скрыть поле формы (или любой другой элемент рендеринга). element-hiddenКласс определен в system.base.css.

Chaulky
источник
Дружище, ты спас меня. Спасибо. Все остальные методы, которые я видел, не выводят элементы в самой форме. В моем случае я хочу скрыть элементы формы в модуле contrib, который ожидает, что эти элементы будут в форме, иначе он не будет работать должным образом. Ваше исправление CSS скрывает ненужные элементы, но все по-прежнему работает. Спасибо за то, что вы также отметили, что это не «защищено от хакеров» и работает только тогда, когда все, что вам нужно, это упростить интерфейс, который вы представляете доверенным пользователям редактора.
Марио Авад