Pflichtfeld in Abhängigkeit von Rolle
Eingetragen von bjacob@drupal.org (58)
am 03.01.2008 - 14:30 Uhr in
am 03.01.2008 - 14:30 Uhr in
Hallo Leute,
ich möchte gerne mit Hilfe des CCK ein Feld anlegen, dass in Abhängigkeit von der Nutzerrolle ein Pflichtfeld ist. Bis jetzt habe ich für diese Aufgabe noch kein Modul gefunden und habe selber Hand angelegt:
1. Feld "phone" erstellt, kein Pflichtfeld
2. Feld "phone_0" erstellt, Pflichtfeld
3. in meine .tpl.php Datei folgenden Code eingefügt:
<?php
global $user;
if (in_array('ROLLE',$user->roles)) {
print drupal_render($form['group']['field_phone']);
} else {
print drupal_render($form['group']['field_phone_0']);
}
Die Anzeige klappt, d.h. je nach Rolle wird entweder das Pflichtfeld oder das optionale Feld angezeigt. Beim Preview des Knotens wird aber stets die Fehlermeldung gebracht, das das Feld "Phone" (phone) benötigt wird. Also habe ich es mit
unset($form['group']['field_phone_0']);
versucht - kein Erfolg. Die Meldung wird weiterhin gebracht.
Hat jemand eine Idee, wie ich das Problem lösen kann?
Grüße
Björn
- Anmelden oder Registrieren um Kommentare zu schreiben
Workflow Required Fields
am 03.01.2008 - 17:06 Uhr
ich möchte gerne mit Hilfe des CCK ein Feld anlegen, dass in Abhängigkeit von der Nutzerrolle ein Pflichtfeld ist. [...] Hat jemand eine Idee, wie ich das Problem lösen kann?
Das Modul Workflow Required Fields macht Felder zu Pflichtfeldern, abhängig von dem Zustand im Workflow. Das trifft zwar nicht genau deine Anforderungen, lässt sich aber gut als Basis für eine Eigenentwicklung nehmen.
Der Konfigurationsdialog müsste überarbeitet werden und die Formularänderungen müssten die neue Konfiguration nutzen.
Die Beta1 hat noch Fehler, die aber nur im Zusammenhang mit Workflow zum Tragen kommen. Eine neue Version erscheint heute.
--
Hallo traxer, danke für
am 07.01.2008 - 11:46 Uhr
Hallo traxer,
danke für deinen Beitrag und dein Modul. Das klingt nach ner Menge Arbeit. Was mich wundert ist, dass ich das besagte Pflichtfeld nicht einfach mit unset() deaktivieren kann. Wieso geht das nicht? Was habe ich da falsch verstanden?
Viele Grüße
Björn
Verwende hook_form_alter
am 08.01.2008 - 15:28 Uhr
Was mich wundert ist, dass ich das besagte Pflichtfeld nicht einfach mit unset() deaktivieren kann.
Das hängt damit zusammen, wie Drupal Formulare verarbeitet. Die verantwortliche Funktion
drupal_get_form
wird im Zuge der Formularverarbeitung zwei mal aufgerufen:Wenn du im Theme (oder sonstwo an falscher Stelle) Formularelemente manipulierst, dann hat das keinen Einfluss auf das Formular an sich (also auch keinen Einfluss auf Validierung).
Die richtige Stelle, Formulare zu manipulieren, ist eine Implementierung von
hook_form_alter
.--
Hallo auch, ich habe nun ein
am 14.01.2008 - 14:27 Uhr
Hallo auch,
ich habe nun ein eigenes Modul erstellt und versucht, dass Formular via den Hook form_alter zu manipulieren. Irgendwie klappt es immer noch nicht so richtig. Gibt es noch andere Elemente, die vor meinem Modul Vorrang haben und so das unset() verhindern? Bspw. von Seiten CCK? Das komische ist, dass meine Manipulation bzgl. og funktioniert (und für CCK Felder nicht).
Mein Modul sieht so aus (und funktioniert in dem Sinne, dass es das richtige Formular anspricht):
<?php
function custom_form_fields_form_alter($form_id, &$form) {
if ($form_id == 'startup_node_form') {
//funktioniert:
$form['og_description']['#required'] = FALSE;
//funktioniert:
//unset($form['og_description']);
//funktioniert nicht:
unset($form['group_business_details']['field_tags']);
}
}
Ich hab ein wenig weiter
am 14.01.2008 - 15:11 Uhr
Ich hab ein wenig weiter probiert und eine neue Strategie entwickelt. Alle meine Felder, die - abhängig von der Rolle - Pflichtfelder sein sollen, lege ich mit CCK als normale Felder (kein Pflichtfeld). Mit meinem eigenen Modul und form_alter() manipuliere ich ein gewünschtes Feld so, dass es - in Abhängigkeit von der Rolle - erforderlich ist. Dazu sieht der Code so aus:
function custom_form_fields_form_alter($form_id, &$form) {
if ($form_id == 'startup_node_form') {
global $user;
if (in_array('MEINE_ROLLE',$user->roles)) {
$form['field_company_phone']['0']['value']['#required'] = 1;
}
}
}
Wie man sieht, greife ich nun ganz anders auf das Feld zu (nicht mehr über die Kategorie, sondern direkt.