Come creare un campo in sola lettura usando hook_form_alter


12

Sto cercando di rendere alcuni dei campi del modulo del profilo Drupal di sola lettura in modalità di modifica. Sto usando il seguente codice in 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;
}

Nell'interfaccia utente archiviata viene visualizzato come di sola lettura, ma è ancora possibile modificare il valore utilizzando firebug e salvare. C'è un modo per prevenire questo comportamento?

Risposte:


6

Sembra che potresti ottenere ciò di cui hai bisogno con le autorizzazioni sul campo . Su base campo per campo è possibile impostare le autorizzazioni per:

  • Crea il tuo valore per il campo
  • Modifica il tuo valore per il campo
  • Modifica il valore di chiunque per il campo
  • Visualizza il proprio valore per il campo
  • Visualizza il valore di chiunque per il campo

In questo modo potresti facilmente consentire ai tuoi utenti di creare inizialmente il valore per il campo, ma non appena lo diventano diventa modificabile solo da un amministratore.


+1. Poiché OP desidera consentire agli amministratori di modificare il valore, field_permissionssarebbe più semplice che svolgere il lavoro in modo sporco.
AyeshK

Sì, questa è una risposta molto migliore della mia :)
Alfred Armstrong,

6

Quando si imposta un campo come readonly, il browser blocca il campo e invia i dati al server al momento dell'invio. Altro attributo è disabledche blocca il campo e non restituisce i dati al server.

Per entrambi i casi, è possibile impostare forzatamente il valore in modo che sia lo stesso dopo l'invio. Pertanto, anche quando il campo è impostato su readonlyo disablede l'utente ha modificato l'HTML e inviato dati diversi, $form_state['values']rimarrà invariato.

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

Nota che abbiamo impostato #value da #default_value. #default_value è il solito modo per impostare il valore predefinito che viene caricato quando viene compilato il modulo e $form_state['values']conterrà il valore predefinito o l'input dell'utente. Quando si imposta #valueesplicitamente, l'input dell'utente viene ignorato e #valueverrà utilizzato.

Ad ogni modo, consiglierei di usarlo '#access' => FALSE,per nascondere gli elementi del modulo. Rimuoverà completamente l'elemento, consentendo al contempo di utilizzare i suoi valori.


1

Non puoi impedire a Firebug di modificare i campi di sola lettura. Ma se il campo di testo è di sola lettura, l'unico scopo è visualizzare i dati. Quindi perché non modificare l'elemento di input rispetto a un elemento di testo?

È possibile utilizzare invece l'attributo "disabilitato", poiché i campi di input disabilitati non vengono inviati al server.

Puoi rimuovere l'attributo "disabilitato" anche con firebug, ma il core drupal non reagisce alle modifiche dei campi di input disabilitati!


Grazie larrydahooster per l'aiuto. Il mio requisito è qualcosa come bloccare alcuni dei campi compilati dall'utente al momento della registrazione. Mentre sei in modalità modifica profilo, vuoi visualizzare queste informazioni all'utente, ma vuoi impedire all'utente di aggiornare questi campi. Solo i super utenti possono modificare questi campi
Jayesh Jose,


1

È possibile utilizzare Autorizzazioni campo + Campo in sola lettura .

Le autorizzazioni di campo ti permetteranno di rendere alcuni dei tuoi campi non accessibili a determinati utenti.

Field Readonly ti consentirà di visualizzare i campi non accessibili come elementi di sola lettura nei moduli di modifica (anziché nasconderli).


1

Penso che usare #disabled = true;sia il modo più semplice per raggiungere questo obiettivo invece di aggiungere qualche modulo pesante al tuo core, ad esempio disabilito la modifica del campo immagine personalizzato in user_profile_form quando viene riempito dall'utente prima.

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

Inoltre, puoi controllare il ruolo dell'utente e disabilitare (campo di sola lettura) per gli utenti non amministratori.

    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);
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.