Wie man ein Feld mit hook_form_alter readonly macht

12

Ich versuche, einige der Drupal-Profilformularfelder im Bearbeitungsmodus schreibgeschützt zu machen. Ich verwende den folgenden Code 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;
}

In der UI-Datei wird angezeigt, dass sie schreibgeschützt ist, aber ich kann den Wert mithilfe von Firebug ändern und speichern. Gibt es eine Möglichkeit, dieses Verhalten zu verhindern?

Jayesh Jose
quelle

Antworten:

6

Es hört sich so an, als könnten Sie mit den Feldberechtigungen das erreichen, was Sie brauchen . Feldweise können Sie Berechtigungen festlegen für:

  • Erstellen Sie einen eigenen Wert für das Feld
  • Bearbeiten Sie den eigenen Wert für das Feld
  • Bearbeiten Sie den Wert eines beliebigen Benutzers für das Feld
  • Eigenen Wert für das Feld anzeigen
  • Zeigen Sie den Wert eines beliebigen Benutzers für das Feld an

Auf diese Weise können Sie Ihren Benutzern problemlos erlauben, den Wert für das Feld zunächst zu erstellen, sobald sie ihn haben, kann er jedoch nur von einem Administrator bearbeitet werden.

Clive
quelle
+1. Da OP es Administratoren ermöglichen möchte, den Wert zu bearbeiten, ist field_permissionsdies einfacher, als die Arbeit auf schmutzige Weise auszuführen.
AyeshK
Ja, das ist eine viel bessere Antwort als meine :)
Alfred Armstrong
6

Wenn Sie ein Feld als festlegen readonly, sperrt der Browser das Feld und sendet die Daten bei der Übermittlung an den Server zurück. Ein weiteres Attribut ist, disableddass das Feld gesperrt wird und keine Daten an den Server zurückgesendet werden.

In beiden Fällen können Sie den Wert nach dem Absenden zwangsweise auf den gleichen Wert einstellen. Auch wenn das Feld auf readonlyoder gesetzt disabledist und der Benutzer den HTML-Code geändert und andere Daten gesendet hat, $form_state['values']bleiben diese unverändert.

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

Beachten Sie, dass wir #value #default_value setzen. #default_value ist die übliche Methode zum Festlegen des Standardwerts, der $form_state['values']beim Erstellen des Formulars geladen wird und den Standardwert oder Benutzereingaben enthält. Wenn Sie #valueexplizit festlegen , wird die Benutzereingabe ignoriert und #valueverwendet.

Jedenfalls würde ich empfehlen, '#access' => FALSE,beim Ausblenden von Formularelementen zu verwenden. Das Element wird vollständig entfernt, und Sie können seine Werte verwenden.

AyeshK
quelle
1

Sie können Firebug nicht daran hindern, schreibgeschützte Felder zu ändern. Wenn das Textfeld jedoch schreibgeschützt ist, besteht der einzige Zweck darin, Daten anzuzeigen. Warum also nicht das Eingabeelement gegen ein Textelement austauschen?

Sie können stattdessen das Attribut "disabled" verwenden, da deaktivierte Eingabefelder nicht an den Server gesendet werden.

Sie können das Attribut "disabled" auch mit firebug entfernen, der Drupal-Core reagiert jedoch nicht auf Änderungen deaktivierter Eingabefelder!

larrydahooster
quelle
Danke larrydahooster für die Hilfe. Meine Anforderung besteht darin, einige der Felder, die der Benutzer zum Zeitpunkt der Registrierung ausgefüllt hat, zu sperren. Im Profilbearbeitungsmodus möchten Sie diese Informationen dem Benutzer anzeigen, den Benutzer jedoch daran hindern, diese Felder zu aktualisieren. Nur
Superuser
1

Der sicherste Weg, dies zu tun, besteht darin, den Feldtyp so zu ändern, dass er ein "Element" ist. http://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7#item

Alfred Armstrong
quelle
Mit dem Attribut #disabled löse ich das Problem. In meinem Fall können nur einige Benutzer das Feld bearbeiten, während andere nur das Feld anzeigen können. Ich habe eine Logik basierend auf der Benutzerrolle geschrieben und das Problem gelöst. Vielen Dank an alle
Jayesh Jose
1

Sie können Feldberechtigungen + Feld Readonly verwenden .

Mit den Feldberechtigungen können Sie einige Ihrer Felder für bestimmte Benutzer unzugänglich machen.

Mit Readonly -Feldern können Sie die nicht zugänglichen Felder als schreibgeschützte Elemente in Bearbeitungsformularen anzeigen (anstatt sie auszublenden ).

anrikun
quelle
1

Ich denke, dies #disabled = true;ist der einfachste Weg, anstatt ein schweres Modul zu Ihrem Kern hinzuzufügen. Als Beispiel deaktiviere ich die Bearbeitung des benutzerdefinierten Bildfelds in user_profile_form, wenn es zuvor vom Benutzer ausgefüllt wurde.

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

Sie können auch die Rolle des Benutzers überprüfen und nur für Benutzer ohne Administratorrechte deaktivieren (schreibgeschütztes Feld).

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