Profilfeld: Auswahl erzwingen bei 'Listenauswahlfeld'
am 08.04.2009 - 04:17 Uhr in
Hallo @all,
bei meiner Prüfung, ob Drupal für meine Aufgabe die richtige Lösung ist, bin ich im Moment beim Benutzerprofil angekommen.
Ich habe ein neues Feld angelegt und will es aus einer Auswahlliste füllen lassen. Inhaltlich korrekte Antworten wären
Antwort 1
Antwort 2
Antwort 3.
Nun will ich den User zwingen, eine Antwort zu geben. Es ist mir klar, dass ich ihn nicht zwingen kann, eine ehrliche Antwort zu geben, aber ich will es ihm nicht zu einfach machen und deshalb die Möglichkeit nehmen, einfach den ersten Eintrag stehen zu lassen. Also füge ich vor die erste sinnvolle Antwort 'bitte auswählen' ein. Damit sieht meine Auswahlliste wie folgt aus:
bitte auswählen
Antwort 1
Antwort 2
Antwort 3
Wie schaffe ich es nun, dass beim Speichern nur Antworten akzeptiert werden, die ungleich 'bitte auswählen' sind ?
Oder gibt es für diese Aufgabe eine bessere Lösung ?
Danke für jede konstruktive Antwort.
Gruß
Wolfgang
- Anmelden oder Registrieren um Kommentare zu schreiben
Minimodul und validate()
am 08.04.2009 - 08:27 Uhr
Moin!
Das kannst Du erreichen, indem Du der Auswahlliste eine eigene Validierungsfunktion hinzufügst.
Das klingt vielleicht ersteinmal seltsam, ist jedoch eigentlich gar nicht so schwierig.
Dafür erstellst Du Dir ein Minimodul mit unten stehendem Inhalt.
Die Id des Formulars bekommst Du heraus, indem Du Dir (z.B. mit firebug) den HTML-Quelltext der Seite anschaust und in der Id des <form> Elements einfach "-" durch "_" ersetzt (z.B. "comment-form" wird zu "comment_form").
<?php
function mymodule_form_FORMID_alter(&$form, &$form_state) {
$form['my_select_list']['#validate']['mymodule_validate'] = array();
}
function mymodule_validate($element) {
if ($element['#value'] == t('please select')) {
form_set_error('my_select_list', t('Please select an answer from the list.'));
}
}
?>
hth,
Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Minimodul und validate()
am 28.06.2009 - 09:51 Uhr
Hallo stBorchert,
ich habe ein Verständnisproblem was das Aufbereiten der Funktionen angeht, ich habe eine mini-module erstellt wie es beschrieben ist.
Wie muss ich jetzt die Funktion an meinen Gegebenheiten anpassen, also welche Werte muss ich mit eigenen Werten ersetzen?
<?php
function mymodule_form_FORMID_alter(&$form, &$form_state) { //soll ich hier meine FORMID dazwischen kopieren oder kommt nur die FORMID hier her?
$form['my_select_list']['#validate']['mymodule_validate'] = array(); // muss ich "my_select_list" mit dem Namen meiner Auswahlliste ersetzen?
}
function mymodule_validate($element) {
if ($element['#value'] == t('please select')) {
form_set_error('my_select_list', t('Please select an answer from the list.'));
}
}
?>
Gibt es auch einen andere Lösung für diese Problem?
Vielen Dank schon mal
Markus
www.wildenatur.com
Formulare und hooks
am 28.06.2009 - 10:00 Uhr
Moin.
Wie muss ich jetzt die Funktion an meinen Gegebenheiten anpassen, also welche Werte muss ich mit eigenen Werten ersetzen?
Du musste "FORM_ID" (ich hatte einen Unterstrich vergessen) durch die entsprechende (interne) Id des Formulars ersetzen. Siehe dazu auch das API zu hook_form_FORM_ID_alter.
// muss ich "my_select_list" mit dem Namen meiner Auswahlliste ersetzen?
Klar. Woher soll Drupal sonst wissen, für welches Element das gilt.
Gibt es auch einen andere Lösung für diese Problem?
Ist mir nicht bekannt.
Auf lullabot gibt es ein kleines Tutorial zum Einsatz von hook_form_alter. Mit dieser Funktion kannst Du generell alle Formulare verändern (und bekommst gleich noch die FormularId mitgeliefert). hook_form_FORM_ID_alter ist speziell für ein Formular (und sieht m.E. sauberer im Code aus, wenn man die Änderungen wirklich nur auf ein Formular anwenden will).
hth,
Stefan
--
sei nett zu Deinem Themer
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
ja FORM_ID ist ein
am 28.06.2009 - 10:10 Uhr
ja FORM_ID ist ein Platzhalter für die eigentlich ID des Formulars. Und 2. auch da muss der Name der Auswahlliste hin, weil dies hier auch nur ein Beispiel ist.
Aber wenn ich mich nicht irre sollte das Mitteilen der Element-Überprüfung so aussehen.
<?php
function mymodule_form_FORMID_alter(&$form, &$form_state) {
$form['my_select_list']['#element_validate'][] = 'mymodule_validate';
}
function mymodule_validate($element, $form_state) {
if ($element['#value'] == t('please select')) {
form_set_error('my_select_list', t('Please select an answer from the list.'));
}
}
?>
----------------------------------------
http://tobiasbaehr.de/
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Ein Forum ist kein Ersatz für das www (Google.de).
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Das Verhältnis anderen zu helfen muss höher sein, als von anderen Hilfe zu erfragen/erwarten.
Formulare und hooks
am 28.06.2009 - 10:59 Uhr
Hallo Stefan,
vielen Dank für deinen Antwort und Tipps.
Ich bin schon mal so weit, das wenn ich das Formular abspeicher, ich einen weißen Bildschirm bekomme :-) also irgend wo hängt das ganze gerade mitten in der Abfrage.
Komm auch nicht drauf wo es jetzt Probleme gibt, sieht wohl leichter aus wie es ist.
Ich möchte ja lediglich aus dem Mehrfachauswahlfeld ein Pflichtfeld machen im dem "Auswahl-Liste" nicht als Eintrag gewertet wird.
Na ich probier mal weiter mein Glück, für Hilfe bin ich Natürlich jederzeit offen :-)
Besten Gruß
Markus
www.wildenatur.com
Warum stellst du in den
am 28.06.2009 - 11:05 Uhr
Warum stellst du in den Feldeinstellung nicht ein, dass es ein Pflichtfeld sein soll? Oder geht das bei Mehrfachauswahl nicht?
Mach mal bei deinen form_set_error dadrunter noch ein return '';
----------------------------------------
http://tobiasbaehr.de/
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Ein Forum ist kein Ersatz für das www (Google.de).
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Das Verhältnis anderen zu helfen muss höher sein, als von anderen Hilfe zu erfragen/erwarten.
Feldeinstellung
am 28.06.2009 - 11:20 Uhr
Das Problem ist wie LiLiConsult es oben schon geschildert hat, man kann in der Feldeinstellung zwar ein Pflichtfeld draus machen aber wenn du z.B. in der Liste "Auswahl" als Platzhalter stehen hast wird dieser auch als Eingabe gezählt und so kommt kein Hinweis das z.B. ein Bundesland ausgewählt werden soll.
www.wildenatur.com
Wenn man ein Feld als
am 28.06.2009 - 11:24 Uhr
Wenn man ein Feld als Pflichtfeld setzt dann brauch man doch nicht "bitte auswählen" hinzufügen, dass macht doch dann CCK.
----------------------------------------
http://tobiasbaehr.de/
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Ein Forum ist kein Ersatz für das www (Google.de).
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Das Verhältnis anderen zu helfen muss höher sein, als von anderen Hilfe zu erfragen/erwarten.
Also ich lege ein
am 28.06.2009 - 11:35 Uhr
Also ich lege ein "Listenauswahlfeld" unter Profile an in dem ich z.B. alle Bundesländer anlege. Jetzt möchtet ich das der User in seinem Profil ein Bundesland auswählen muss. Wenn ich jetzt in der Option des Auswahfeldes "Der Benutzer muss einen Wert eingeben." einstelle sollte man meinen das alles seine Richtigkeit hat. Bei einem normalen Texfeld funktioniert es ja auch.
Aber hier ist jetzt das Problem, es wird nicht automatisch ein "Bitte Auswählen" in die Auswahlbox gesetzt sondern das z.B. erste Bundesland wird angezeigt. Und wenn ein User jetzt diese Feld nicht beachtet wir er auch nicht darauf Aufmerksam gemacht da der erste Wert als Ausgewählt behandelt wird.
Oder mach ich da was falsch?
www.wildenatur.com
Aso ok, dachte du meinst
am 28.06.2009 - 12:01 Uhr
Aso ok, dachte du meinst CCK. Dann musste dich via minimodul einklinken.
<?php
function mymodule_validate($element, $form_state) {
if ($element['#value'] == t('please select')) {
form_set_error('my_select_list', t('Please select an answer from the list.'));
return '';
}
}
?>
Hier würde ich das return noch hinzufügen.
----------------------------------------
http://tobiasbaehr.de/
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Ein Forum ist kein Ersatz für das www (Google.de).
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Das Verhältnis anderen zu helfen muss höher sein, als von anderen Hilfe zu erfragen/erwarten.
Danke für eure Hilfe,
am 28.06.2009 - 17:41 Uhr
Danke für eure Hilfe, leider habe ich es immer noch nicht hin bekommen. Schon bei der aktivierung des mini-modules und wenn ich das Formular abschicke erhalte ich eine weiße Seite die keinen Quellcode enthält.
Ich weiß nicht wo mein Fehler liegt, ich habe die Funktion so angepasst wie ich es verstanden habe.
Ermitteln der FROM_ID, im HTML Tag:
<form id="user-profile-form">
hier kopiere ich die ID heraus und tausche "-" gegen "_"
Ergebnis: user_profile_form
Ermittele den Namens der Auswahlliste:
unter Benutzerverwaltung > Profile im Spalt Name entnehme ich den Namen.
In meinem Fall "profile_bundesland".
Anpassen des Quellcodes:
" mymodule_form_FORM_ID_alter"
wird dann zu
" mymodule_form_user_profile_form_alter "
und
$form['my_select_list']
wird zu
$form['profile_bundesland']
.Unter der Funktion " function mymodule_validate " ändere ich dann noch
"
if ($element['#value'] == t('please select'))
"in
"
if ($element['#value'] == t('Auswahl'))
"und
"
form_set_error('my_select_list'
"in
"
form_set_error('profile_bundesland'
".Habe ich da was falsch verstanden?
<?php
function mymodule_form_user_profile_form_alter(&$form, &$form_state) {
$form['profile_bundesland']['#element_validate'][] = 'mymodule_validate';
}
function mymodule_validate($element, $form_state) {
if ($element['#value'] == t('Auswahl')) {
form_set_error('profile_bundesland', t('Please select an answer from the list.'));
}
}
?>
www.wildenatur.com
Mit
am 28.06.2009 - 19:02 Uhr
Mit $form_state.
<?php
function mymodule_form_user_profile_form_alter(&$form, &$form_state) {
$form['profile_bundesland']['#element_validate'][] = 'mymodule_validate';
}
function mymodule_validate($element, $form_state) {
if ($form_state['values'] == t('Auswahl')) {
return form_set_error('profile_bundesland', t('Please select an answer from the list.'));
}
}
?>
----------------------------------------
http://tobiasbaehr.de/
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Ein Forum ist kein Ersatz für das www (Google.de).
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Das Verhältnis anderen zu helfen muss höher sein, als von anderen Hilfe zu erfragen/erwarten.
t-Funktion
am 28.06.2009 - 21:40 Uhr
t('please select') ==> t('Auswahl'))
Nur so nebenbei: Texte, die mit Hilfe der Funktion t() ausgegeben werden, sind übersetzbar. Da die Standardsprache von Drupal Englisch ist, werden der Funktion auch nur englischsprachige Texte übergeben, die dann über die Oberfläche übersetzt werden.
Bei weissen Bildschirmen hilft ein Blick in das error-log von PHP (konfigurierbar in der php.ini) sehr häufig weiter. Dort stehen dann nämlich eventuelle Fehler.
hth,
Stefan
--
sei nett zu Deinem Themer
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Guten Morgen, danke Jungs
am 29.06.2009 - 07:26 Uhr
Guten Morgen,
danke Jungs für die Hilfe aber es läuft immer noch nicht, sobald ich den speichern Button klick kommt ein weißer Bildschirm.
@Stefan, ich habe keinen Zugriff auch die error-log´s mein Webspace stellt diese nicht zur Verfügung aber ich werde mal meinen Provider kontaktieren.
Besten Gruß
Markus
www.wildenatur.com
Also ich habe es getestet
am 29.06.2009 - 11:24 Uhr
Also ich habe es getestet und es funktioniert. Bitte paste mal dein kleines Modulchen.
----------------------------------------
http://tobiasbaehr.de/
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Ein Forum ist kein Ersatz für das www (Google.de).
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Das Verhältnis anderen zu helfen muss höher sein, als von anderen Hilfe zu erfragen/erwarten.
Hey Tobias, hier mein
am 30.06.2009 - 08:13 Uhr
Hey Tobias,
hier mein Modulchen
Dateiname: mymodule.module und mymodule.info
mymodule.info
; $Id: mymodule.info, v 1.0 2009/06/30 19:00:00 quiptime $
name = Pflichtfeld Auswahliste
description = Erzeut ein Pflichtfeld in einem Mehrauswahlfeld.
package = Pflichtfeld Auswahliste
version = VERSION
core = 6.x
; Information added by quiptime on 2009-06-30
version = "6.x-dev"
project = "mymodule"
mymodule.module
<?php
/* $Id: mymodule.module,v 1.0 2009/06/30 19:00:00 quiptime $ */
function mymodule_form_user_profile_form_alter(&$form, &$form_state) {
$form['profile_bundesland']['#element_validate'][] = 'mymodule_validate';
}
function mymodule_validate($element, $form_state) {
if ($form_state['values'] == t('please select')) {
return form_set_error('profile_bundesland', t('Please select an answer from the list.'));
}
}
?>
Danke im Voraus
Gruß Markus
www.wildenatur.com
Ach verdammt diese Copy &
am 30.06.2009 - 08:49 Uhr
Ach verdammt diese Copy & Paste Fehler.
Mach mal
<?php
function mymodule_validate($element, $form_state) {
if ($form_state['values']['profile_bundesland'] == t('please select')) {
return form_set_error('profile_bundesland', t('Please select an answer from the list.'));
}
}
?>
----------------------------------------
http://tobiasbaehr.de/
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Ein Forum ist kein Ersatz für das www (Google.de).
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Das Verhältnis anderen zu helfen muss höher sein, als von anderen Hilfe zu erfragen/erwarten.
Listenauswahlfeld als Pflichtfeld [gelöst]
am 30.06.2009 - 09:56 Uhr
Hey Tobians,
SUPER GEIL :-) klappt jetzt endlich!! Danke
Musste nur noch das "please select" mit meinem Platzhalter "Auswahl" austauschen und es hat funktioniert.
Vielen Dank an alle für die Hilfe!
Gruß
Markus
www.wildenatur.com
t-Funktion
am 30.06.2009 - 10:02 Uhr
Musste nur noch das "please select" mit meinem Platzhalter "Auswahl" austauschen ...
Wie bereits schon vorher gesagt: Texte innerhalb der t() Funktion sind in englischer Sprache zu schreiben und dann über die Oberfläche zu übersetzen. Anders ist falsch.
Stefan
--
sei nett zu Deinem Themer
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Ja da habe ich dran gedacht,
am 30.06.2009 - 10:19 Uhr
Ja da habe ich dran gedacht, hab es nur zum Test ausgetauscht.
Danke noch mal.
Gruß
Markus
www.wildenatur.com