Hook_form_alter kullanarak bir alanı salt okunur yapma


12

Bazı Drupal profil form alanlarını düzenleme modunda salt okunur olarak yapmaya çalışıyorum. Hook_alter içinde aşağıdaki kodu kullanıyorum

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

Dosyalanan kullanıcı arayüzünde salt okunur olarak gösteriliyor, ancak yine de, kundakçı kullanarak değeri değiştirebilir ve kaydedebilirim. Bu davranışı önlemenin bir yolu var mı?

Yanıtlar:


6

Alan İzinleriyle ihtiyacınız olanı başarabileceğiniz anlaşılıyor . Alanlar bazında, aşağıdakiler için izinler ayarlayabilirsiniz:

  • Alan için kendi değeri oluşturun
  • Alan için kendi değerini düzenleme
  • Alan için kimsenin değerini düzenleyin
  • Alan için kendi değerini görüntüleme
  • Alan için kimsenin değerini görüntüleme

Böylece, kullanıcılarınızın başlangıçta alan için değer oluşturmasına kolayca izin verebilirsiniz, ancak sahip olur olmaz sadece bir yönetici tarafından düzenlenebilir hale gelir.


+1. OP yöneticilerin değeri düzenlemesine izin vermek istediğinden field_permissions, işi kirli bir şekilde yapmaktan daha kolay olacaktır.
AyeshK

Evet, bu benimkinden çok daha iyi bir cevap :)
Alfred Armstrong

6

Bir alanı olarak ayarladığınızda readonly, tarayıcı alanı kilitler ve verileri gönderildikten sonra sunucuya geri gönderir . Diğer öznitelik disabledalanı kilitler ve verileri sunucuya geri göndermez .

Her iki durumda da, değeri gönderdikten sonra aynı olacak şekilde zorla ayarlayabilirsiniz. Bu nedenle, alan readonlyveya olarak ayarlandığında disabledve kullanıcı HTML'yi değiştirip farklı veriler gönderdiğinde bile $form_state['values']değişmeden kalacaktır.

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 değerinden ayarladığımızı unutmayın . #default_value, form oluşturulduğunda yüklenen $form_state['values']ve default_value veya kullanıcı girdisini içerecek varsayılan değeri ayarlamanın genel yoludur . #valueAçık bir şekilde ayarladığınızda , kullanıcı girişi yoksayılır ve #valuekullanılır.

Her neyse, '#access' => FALSE,form öğelerini gizlerken kullanmanızı öneririm . Değerlerini kullanmanıza izin verirken öğeyi tamamen kaldıracaktır.


1

Firebug'un salt okunur alanları değiştirmesini engelleyemezsiniz. Ancak metin alanı salt okunursa, tek amacı verileri görüntülemek. Öyleyse neden giriş öğesini bir metin öğesine karşı değiştirmiyorsunuz?

Bunun yerine "devre dışı" özniteliğini kullanabilirsiniz, çünkü devre dışı bırakılan giriş alanları sunucuya gönderilemez.

Firebug ile "devre dışı" özelliğini de kaldırabilirsiniz, ancak drupal çekirdek devre dışı giriş alanlarındaki değişikliklere tepki vermez!


Yardım için larrydahooster teşekkürler. Benim gereksinimim, kayıt sırasında kullanıcı tarafından doldurulmuş bazı alanları kilitlemek gibi bir şey. Profil düzenleme modundayken bu bilgileri kullanıcıya göstermek, ancak kullanıcının bu alanı güncellemesini önlemek istersiniz. Sadece süper kullanıcı bu alanları düzenleyebilir
Jayesh Jose


1

Sen kullanabilir Saha izinler + Alan Readonly .

Alan İzinleri , alanlarınızdan bazılarını belirli kullanıcılar tarafından erişilemez hale getirmenize olanak tanır.

Salt Okunur Alan , erişilemeyen alanları düzenleme formlarında (bunları gizlemek yerine) salt okunur öğeler olarak görüntülemenize olanak tanır.


1

Bence kullanmanın #disabled = true;çekirdeğinize ağır bir modül eklemek yerine bunu başarmanın en kolay yolu olduğunu düşünüyorum .

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

Ayrıca, kullanıcının rolünü kontrol edebilir ve yalnızca yönetici olmayan kullanıcılar için devre dışı bırakabilirsiniz (salt okunur alanı).

    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);
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.