Як зробити поле для читання лише за допомогою гака_форма_алтер


12

Я намагаюся зробити деякі поля форми профілю Drupal як лише для читання в режимі редагування. Я використовую наступний код у moll_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 та зберегти. Чи є спосіб запобігти такій поведінці?

Відповіді:


6

Це здається, що ви можете виконати те, що вам потрібно за допомогою дозволів на місцях . На основі поля за полем ви можете встановлювати дозволи для:

  • Створіть власну цінність для поля
  • Відредагуйте власне значення для поля
  • Відредагуйте значення кого-небудь для поля
  • Перегляд власного значення для поля
  • Перегляньте значення кого-небудь для поля

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


+1. Оскільки ОП хоче дозволити адміністраторам редагувати значення, field_permissionsбуло б простіше, ніж виконувати роботу брудно.
АйешК

Так, це набагато краща відповідь, ніж моя :)
Альфред Армстронг

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,приховування елементів форми. Це повністю видалить елемент, дозволяючи вам використовувати його значення.


1

Ви не можете запобігти Firebug змінювати поля для читання тільки. Але якщо текстове поле читається лише тоді, це лише мета - відображення даних. То чому б не змінити елемент введення на текстовий елемент?

Ви можете скористатися атрибутом "вимкнено", тому що відключені поля введення не надсилаються на сервер.

Ви також можете видалити атрибут "disabled" і firebug, але drupal core не реагує на зміни введених полів введення!


Дякуємо larrydahooster за допомогу. Моя вимога - щось на зразок блокування деяких полів, заповнених користувачем під час реєстрації. У режимі редагування профілю хочуть відобразити цю інформацію користувачеві, але хочуть завадити користувачеві оновлювати ці поля. Тільки супер користувач може редагувати ці поля
Jayesh Jose

1

Найбезпечніший спосіб зробити це - змінити тип поля, щоб бути "елементом". http://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7#item


Використовуючи атрибут #disabled, я вирішую проблему. У моєму випадку лише деякі користувачі можуть редагувати поле, де так само інші можуть переглядати поле. Я написав логіку, засновану на ролі користувача, і вирішив проблему. Дякую всім
Jayesh Jose

1

Ви можете використовувати Field Permissions + Field Readonly .

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

Поле Readonly дозволить відображати недоступні поля як елементи, доступні лише для читання, на формах редагування (замість того, щоб приховувати їх).


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);
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.