it-swarm.com.de

So erstellen Sie ein Feld schreibgeschützt mit hook_form_alter

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 Benutzeroberfläche wird die Anzeige als schreibgeschützt angezeigt, aber ich kann den Wert mithilfe von Firebug ändern und speichern. Gibt es eine Möglichkeit, dieses Verhalten zu verhindern?

12
Jayesh Jose

Es hört sich so an, als könnten Sie mit Feldberechtigungen das erreichen, was Sie brauchen. Feld für Feld 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

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

6
Clive

Wenn Sie ein Feld als readonly festlegen, sperrt der Browser das Feld und sendet Daten beim Senden an den Server zurück. Ein anderes Attribut ist disabled, das das Feld sperrt und sendet nicht Daten zurück an den Server.

In beiden Fällen können Sie den Wert nach dem Senden zwangsweise so einstellen, dass er gleich ist. Selbst wenn das Feld auf readonly oder disabled gesetzt ist und der Benutzer den HTML-Code geändert und andere Daten gesendet hat, bleibt $form_state['values'] 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 Aus #default_value setzen. #default_value ist die übliche Methode zum Festlegen des Standardwerts, der beim Erstellen des Formulars geladen wird, und $form_state['values'] enthält den Standardwert oder die Benutzereingabe. Wenn Sie #value Explizit festlegen, werden Benutzereingaben ignoriert und #value Verwendet.

Auf jeden Fall würde ich empfehlen, '#access' => FALSE, Zu verwenden, wenn Formularelemente ausgeblendet werden. Das Element wird vollständig entfernt, und Sie können seine Werte verwenden.

6
AyeshK

Ich denke mit #disabled = true; ist der einfachste Weg, dies zu erreichen, anstatt Ihrem Kern ein schweres Modul 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 (schreibgeschütztes Feld) für Benutzer ohne Administratorrechte deaktivieren.

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

Sie können Feldberechtigungen + Feld schreibgeschützt verwenden.

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

Feld schreibgeschützt ermöglicht es Ihnen, die nicht zugänglichen Felder als schreibgeschützte Elemente in Bearbeitungsformularen anzuzeigen (anstatt sie auszublenden).

1
anrikun

Sie können Firebug nicht daran hindern, schreibgeschützte Felder zu ändern. Wenn das Textfeld jedoch schreibgeschützt ist, dient es nur zum Anzeigen von Daten. Warum also nicht das Eingabeelement gegen ein Textelement ändern?

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, aber der Kern drupal] reagiert nicht auf Änderungen deaktivierter Eingabefelder!

1
larrydahooster

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

1