Как сделать поле доступным только для чтения с помощью hook_form_alter

12

Я пытаюсь сделать некоторые поля формы профиля Drupal доступными только для чтения в режиме редактирования. Я использую следующий код в hook_alter

$form[field_organisation_company_name][und][0]['#after_build'][]='_build_element_readonly';

function _build_element_readonly($element, &$form_state) {  
    $element['value']['#attributes']['readonly'] = 'readonly';
    return $element;
}

В пользовательском интерфейсе поле отображается только для чтения, но, тем не менее, я могу изменить значение, используя firebug и save. Есть ли способ предотвратить такое поведение?

Джаеш Хосе
источник

Ответы:

6

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

  • Создать собственное значение для поля
  • Изменить собственное значение для поля
  • Изменить чье-либо значение для поля
  • Просмотр собственного значения для поля
  • Посмотреть чью-либо ценность для поля

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

Клайв
источник
+1. Поскольку OP хочет разрешить администраторам редактировать значение, field_permissionsэто будет проще, чем делать работу грязным способом.
AyeshK
Да, это гораздо лучший ответ, чем мой :)
Альфред Армстронг
6

Когда вы устанавливаете поле как readonly, браузер блокирует поле и отправляет данные обратно на сервер после отправки. Другой атрибут заключается в disabledтом, что блокирует поле и не отправляет данные обратно на сервер.

В обоих случаях вы можете принудительно установить одинаковое значение после отправки. Таким образом, даже если для поля установлено значение readonlyили disabled, а пользователь изменил HTML и отправил разные данные, $form_state['values']он останется неизменным.

function _build_element_readonly($element, &$form_state) {  
    $element['value']['#attributes']['readonly'] = 'readonly';
    $element['value']['#value'] = isset($element['value']['#default_value']) 
       ?  $element['value']['#default_value']
       :  ''; 
    return $element;
}

Обратите внимание, что мы установили #value из #default_value. #default_value - это обычный способ установить значение по умолчанию, которое загружается при построении формы и $form_state['values']будет содержать default_value или пользовательский ввод. Когда вы устанавливаете #valueявно, пользовательский ввод игнорируется и #valueбудет использоваться.

В любом случае, я бы рекомендовал использовать '#access' => FALSE,при скрытии элементов формы. Он полностью удалит элемент, позволяя вам использовать его значения.

AyeshK
источник
1

Вы не можете запретить Firebug изменять поля только для чтения. Но если текстовое поле доступно только для чтения, его единственной целью является отображение данных. Так почему бы не заменить элемент input на элемент text?

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

Вы также можете удалить атрибут «disabled» с помощью firebug, но ядро ​​drupal не реагирует на изменения отключенных полей ввода!

larrydahooster
источник
Спасибо larrydahooster за помощь. Мое требование - что-то вроде блокировки некоторых полей, заполненных пользователем во время регистрации. Находясь в режиме редактирования профиля, хотите отобразить эту информацию для пользователя, но хотите запретить пользователю обновлять эти поля. Только супер пользователь может редактировать эти поля
Jayesh Jose
1

Самый безопасный способ сделать это - изменить тип поля на «элемент». http://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7#item

Альфред Армстронг
источник
Используя атрибут #disabled, я решаю проблему. В моем случае только некоторые пользователи могут редактировать поле, тогда как другие могут просматривать только поле. Я написал логику, основанную на роли пользователя, и решил проблему. Спасибо всем
Jayesh Jose
1

Вы можете использовать Полевые разрешения + Поле только для чтения .

Полевые разрешения позволят вам сделать некоторые из ваших полей недоступными для определенных пользователей.

Поле Readonly позволит вам отображать недоступные поля в виде элементов только для чтения в формах редактирования (а не скрывать их).

anrikun
источник
1

Я думаю, что использование #disabled = true;- это самый простой способ для достижения этой цели, вместо добавления какого-либо тяжелого модуля в ваше ядро, в качестве примера я отключаю редактирование настраиваемого поля изображения в user_profile_form, когда оно ранее заполнялось пользователем.

function MY_CUSTOM_MODULE_form_alter(&$form, $form_state, $form_id){

        if($form_id == 'user_profile_form'){
            if($form['field_national_front']['und'][0]['#default_value']['fid']){
                $form['field_national_front']['und']['#disabled'] = true;
             }
          //ym($form);
        }
}

Кроме того, вы можете проверить роль пользователя и просто отключить (поле только для чтения) для не администраторов.

    function MY_CUSTOM_MODULE_form_alter(&$form, $form_state, $form_id){
       global $user;
       if($form_id == 'user_profile_form'){
           if($form['field_national_front']['und'][0]['#default_value']['fid'] && !in_array('webadmin', $user->roles)){
              $form['field_national_front']['und']['#disabled'] = true;
         }
//ym($form);
    }
}
Юсеф
источник