Jak zrobić pole tylko do odczytu za pomocą hook_form_alter


12

Próbuję ustawić niektóre z pól formularza profilu Drupal jako tylko do odczytu w trybie edycji. Korzystam z następującego kodu w 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;
}

W polu interfejsu użytkownika jest wyświetlany jako tylko do odczytu, ale nadal mogę zmienić wartość za pomocą firebuga i zapisać. Czy jest jakiś sposób, aby temu zapobiec?

Odpowiedzi:


6

Wygląda na to, że możesz osiągnąć to, czego potrzebujesz dzięki uprawnieniom pola . W poszczególnych polach możesz ustawić uprawnienia do:

  • Utwórz własną wartość dla pola
  • Edytuj własną wartość dla pola
  • Edytuj wartość każdego pola
  • Wyświetl własną wartość dla pola
  • Zobacz wartość dla każdego pola

Tak więc z łatwością będziesz mógł zezwolić użytkownikom na tworzenie wartości pola początkowo, ale gdy tylko będą mieli taką możliwość, będzie ona możliwa do edycji tylko przez administratora.


+1. Ponieważ OP chce zezwolić administratorom na edycję wartości, field_permissionsbyłoby to łatwiejsze niż wykonywanie brudnej pracy.
AyeshK,

Tak, to zdecydowanie lepsza odpowiedź niż moja :)
Alfred Armstrong,

6

Po ustawieniu pola jako readonlyprzeglądarka blokuje to pole i wysyła dane z powrotem do serwera po przesłaniu. Innym atrybutem jest to, disabledże blokuje pole i nie wysyła danych z powrotem do serwera.

W obu przypadkach można siłą ustawić wartość, która jest taka sama po przesłaniu. Tak więc, nawet jeśli pole jest ustawione na readonlylub disabled, a użytkownik zmodyfikował kod HTML i wysłał inne dane, $form_state['values']pozostanie niezmieniony.

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;
}

Zauważ, że ustawiamy #value z #default_value. #default_value to zwykły sposób ustawiania wartości domyślnej, która ładuje się po zbudowaniu formularza i $form_state['values']będzie zawierać wartość domyślną lub dane wprowadzone przez użytkownika. Po #valuejawnym ustawieniu wprowadzanie przez użytkownika jest ignorowane i #valuebędzie używane.

Tak czy inaczej, polecam używać do '#access' => FALSE,ukrywania elementów formularza. Całkowicie usunie element, umożliwiając jednocześnie korzystanie z jego wartości.


1

Nie można uniemożliwić Firebugowi zmiany pól tylko do odczytu. Ale jeśli pole tekstowe jest tylko do odczytu, jego jedynym celem jest wyświetlanie danych. Dlaczego więc nie zmienić elementu wejściowego na element tekstowy?

Możesz zamiast tego użyć atrybutu „disabled”, ponieważ wyłączone pola wejściowe nie są wysyłane do serwera.

Możesz również usunąć atrybut „disabled” za pomocą firebuga, ale rdzeń drupala nie reaguje na zmiany wyłączonych pól wejściowych!


Dzięki larrydahooster za pomoc. Moim wymogiem jest coś w rodzaju zablokowania niektórych pól wypełnionych przez użytkownika podczas rejestracji. Będąc w trybie edycji profilu, chcę wyświetlać te informacje użytkownikowi, ale chcę uniemożliwić mu aktualizację tych pól. Tylko superużytkownik może edytować te pola
Jayesh Jose,


1

Możesz użyć Uprawnienia do pola + Tylko do odczytu pola .

Uprawnienia do pól pozwolą ci uczynić niektóre pola niedostępnymi dla niektórych użytkowników.

Pole Tylko do odczytu pozwoli Ci wyświetlić niedostępne pola jako elementy tylko do odczytu w formularzach edycji (zamiast ich ukrywania).


1

Myślę, że użycie #disabled = true;jest najłatwiejszym sposobem na osiągnięcie tego zamiast dodawania jakiegoś ciężkiego modułu do twojego rdzenia, jako przykład wyłączam edycję niestandardowego pola obrazu w user_profile_form, gdy jest on wcześniej wypełniany przez użytkownika.

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);
        }
}

Możesz także sprawdzić rolę użytkownika i po prostu wyłączyć (pole tylko do odczytu) dla użytkowników niebędących administratorami.

    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);
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.