So verbergen und / oder verhindern Sie den Zugriff auf Felder in einem Formular, z. B. group_audience für organische Gruppen

9

Dies hat mich eine Weile beunruhigt. Wenn ich versuche, Felder wie das Gruppenzielgruppenfeld oder die Veröffentlichungseinstellung aus einem Formular auszublenden, hat das Formular bei der Validierung beide Felder auf einen Nullwert gesetzt, obwohl der Standardwert als wurde korrekt deklariert.

Ich habe versucht, Invisible, #access, unset hidden nichts zu verwenden! Dies ist sehr problematisch, da Benutzer in meinem aktuellen Projekt nur kleine Teile ihres Profils bearbeiten können, z. B. nur die Adresse oder das Bild. Wenn ich also die Gruppenpublikum verstecke, wird der Benutzer aus den Gruppen geworfen, zu denen er gehört bearbeiten.

Am Ende habe ich den folgenden Code verwendet, um diese Felder auszublenden, während der Benutzer weiterhin in seiner Gruppe bleibt.

$variables['user_edit_about']['group_audience']= $temp['group_audience'];       
$variables['user_edit_about']['group_audience']['#prefix'] = '<div style="display:none;">';
$variables['user_edit_about']['group_audience']['#suffix'] = '</div>';

Würde sich jemand einen besseren Weg vorstellen, um dies zu erreichen?

Vielen Dank

SilidAdmin
quelle
Diese Antwort ist nicht perfekt, da die Verwendung den Wert mit DOM-Manipulation immer noch ändern kann
iStryker

Antworten:

6

Bearbeiten:

Ok, ich habe es herausgefunden. Fügen Sie dies in Ihr benutzerdefiniertes Modul ein:

function example_form_alter(&$form, &$form_state, $form_id) {
    if($form_id == 'story_node_form') {
        $form['title']['#value'] = 'hot stuff';
        $form['title']['#access'] = FALSE;

    }
}

Dadurch wird der Titel des Story-Knotens auf "Hot Stuff" gesetzt und NICHT auf der Seite gerendert, da #access = FALSE;

Sie können mehr granularity control in hook_form_alter () wie hinzufügen

  global $user;

  // Check to see if $user has does not have the administrator role.
  if (!in_array('administrator', array_values($user->roles))) {
    $form['title']['#access'] = FALSE;
  }

Dies funktioniert für Drupal 6 & 7.

Alte Antwort (ignorieren):

Es ist schon eine Weile her, dass ich so etwas gemacht habe, also kann ich es falsch machen. Wenn Sie das [#value]Formularelement festlegen , wird es im Formular nicht angezeigt.

Ich habe dies in Drupal 6 hook_form_alter()in einem benutzerdefinierten Modul getan . Ich weiß nicht, ob es in Drupal 7 funktioniert, und ich weiß nicht, ob Sie es in einer Vorverarbeitungsfunktion tun können

iStryker
quelle
Vielen Dank für Ihre Antwort, obwohl es in meinem Fall leider nicht funktioniert hat, haben die Formularfelder bereits einen #Wert vorab abgelegt, da es sich um Bearbeitungsformulare handelt
soapAdmin
@ SilkAdmin Bitte sehen Sie neue Änderungen
iStryker
Vielen Dank an Stryker, dass Sie sich die Zeit genommen haben, sich damit zu befassen. Obwohl Ihre oben genannte Technik funktioniert, um Felder auszublenden, scheint es, dass der Standardwert auch beim Senden nicht berücksichtigt wird. Am Ende wird der Benutzer bei jeder Profilbearbeitung immer noch aus seiner Gruppe geworfen. Bisher scheint nur der Trick #prefix # Suffix dafür zu sorgen, dass es sich normal verhält.
SeideAdmin
do $ form ['title'] ['# value'] = $ form ['title'] ['# default_value']
iStryker
5

Sie können dem Formularelement auch einfach die CSS-Klasse 'element-hidden' hinzufügen

$form['user_edit_about']['group_audience']['#attributes']['class'][] = 'element-hidden';

Wie bereits von iStryker erwähnt, ist es weiterhin möglich, den Wert durch DOM-Manipulation zu ändern. Dies ist jedoch eine schöne und einfache Möglichkeit, ein Formularfeld (oder ein anderes Renderelement) auszublenden. Die element-hiddenKlasse ist definiert in system.base.css.

Chaulky
quelle
Kumpel, du hast mich gerettet. Vielen Dank. Alle anderen Methoden, die ich gesehen habe, geben die Elemente nicht im Formular selbst aus. In meinem Fall möchte ich Formularelemente in einem Contrib-Modul ausblenden, das erwartet, dass diese Elemente im Formular enthalten sind, da es sonst nicht ordnungsgemäß funktioniert. Ihr CSS-Fix verbirgt die unerwünschten Elemente, aber alles funktioniert immer noch. Vielen Dank, dass Sie auch darauf hingewiesen haben, dass dies nicht "hackersicher" ist und nur dann funktioniert, wenn Sie lediglich die Benutzeroberfläche vereinfachen müssen, die Sie vertrauenswürdigen Editorbenutzern präsentieren.
Mario Awad