[gelöst] Funktionsaufruf nach Submit
am 04.03.2011 - 23:00 Uhr in
Guten Abend zusammen,
ich google mich schon eine Weile durchs Netz, habe mich auch schon hier im Forum umgesehen und finde keine Lösung, darum mache ich ein neues Thema auf, in der Hoffnung, mir werde geholfen!
Ich schreibe an einem Formular, welches (später) mehrere Eingabefelder für Geburtsjahr, Geschlecht, Hobbies usw haben wird. Nach Drücken des Submit-Buttons werden diese Daten mit allen registrierten Usern verglichen und passende ausgegeben, also sozusagen eine erweiterte Usersuche. HIer einmal der Code:
<?php
// $Id$
/**
* Baut das Menu neu auf (nur während der Entwicklungsphase)
*/
function usersuche_init(){
menu_rebuild();
}
/**
* Erstellt Menüeinträge
*/
function usersuche_menu() {
$items['usersuche'] = array(
'title' => 'UserSuche',
'page callback' => 'usersuche_formular',
'access arguments' => array('access user profiles'),
'type' => MENU_NORMAL_ITEM);
return $items;
} // END usersuche_menu
?>
<?php
/**
* Gibt das Formular aus
*/
function usersuche_formular(){
$uebergabe = t('Suche nach Benutzern');
$uebergabe .= drupal_get_form('formular');
return $uebergabe;
} // END usersuche_formular()
?>
<?php
/**
* Hier wird das Formular angelegt
*/
function formular()
{
$form = array();
$form['Vorname'] = array
(
'#title' => t('Vorname'),
'#type' => 'textfield',
'#description' => t('Hier gib bitte den Vornamen ein')
);
$form['submit'] = array
(
'#type' => 'submit',
'#value' => t('Senden')
);
return $form;
} // END formular()
?>
<?php
/**
* Das kommt jetzt nach erfolgreicher Validierung
*/
function usersuche_submit($form, &$form_state)
{
return 'usersuche_ergebnis';
} // END usersuche_submit()
?>
<?php
/**
* Generiert die Ergebnis - Seite
* @param op the operation from the URL
* @param delta offset
* @returns block HTML
*/
function usersuche_ergebnis() {
//Inhalt der Seite, die nachher zurückgegeben wird
$page_content = '';
$query = "SELECT uid, name FROM {users}";
$queryResult = db_query($query);
while ($links = db_fetch_object($queryResult)) {
$page_content .= l($links->name, 'user/'.$links->uid) . '<br />';
}
return $page_content;
} // END usersuche_ergebnis()
?>
Wie man sieht, sollte nach erfolgreichem Drücken des Submit-Buttons die Funktion "usersuche_ergebnis" aufgerufen werden... tuts aber nicht.
Was mache ich falsch? Ist meine Vorgehendweise eventuell nicht richtig und man macht so etwas auf eine andere Art?
Vielen Dank schonmal!
- Anmelden oder Registrieren um Kommentare zu schreiben
Warum verwendest du nicht
am 04.03.2011 - 23:44 Uhr
Warum verwendest du nicht Views? Die Submit-Funktion muss formular_submit heißen. Und
return 'usersuche_ergebnis';
ist ein String. return usersuche_ergebnis();. Allerdings ist auch falsch. Diese Ausgabe muss in der Funktion usersuche_formular() untergebracht werden.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.
Auch eine Idee
am 04.03.2011 - 23:51 Uhr
Das wäre auch eine Idee gewesen, ich dachte aber durch das Schreiben eines Moduls lerne ich das Modulprogrammieren für Drupal eher.
Danke für deine Tips, werde das baldmöglichst ausprobieren.
Wenn ich die Ausgabe in usersuche_formular() packen muss, wie lautet dann die if Anweisung? Ich muss ja irgendwie checken, ob der Submitbutton schon gedrückt wurde?
In diesem Fall macht man es
am 06.03.2011 - 13:13 Uhr
In diesem Fall macht man es so wie die Core-Suche. Man hängt das Gesuchte an die URL, diese kann man dann ja abfragen im Page-Callback.
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.
Modul erstellen
am 06.03.2011 - 13:48 Uhr
Hallo.
Das wäre auch eine Idee gewesen, ich dachte aber durch das Schreiben eines Moduls lerne ich das Modulprogrammieren für Drupal eher.
Ja, das ist prinzipiell auch richtig. Allerdings solltest Du Dir dann gleich die (Coding-)Standards einverleiben und diese dann auch verwenden.
<?php t('Suche nach Benutzern'); ?>
ist beispielsweise nicht nur gruselig, sondern auch noch schlichtweg falsch. Texte in der [api:t:6]-Funktion werden generell auf englisch geschrieben. Ansonsten sind sie nicht übersetzbar.Zum Thema Modulentwicklung gibt es diverse Handbücher. Zum Beispiel http://www.drupalcenter.de/handbuch/15747
nichtsdestotrotz viel Spass weiterhin beim Programmieren,
Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Aber wie?
am 07.03.2011 - 10:00 Uhr
In diesem Fall macht man es so wie die Core-Suche. Man hängt das Gesuchte an die URL, diese kann man dann ja abfragen im Page-Callback.
Hmm, ich hab jetzt probiert und gemacht, vermutlich verstehe ich noch nicht genau die Arbeitsweise... Was genau passiert denn, wenn ich den Submitbutton drücke? Wird die selbe Funktion (in diesem Fall
usersuche_formular()
) nochmals aufgeerufen? Und wie hänge ich dann die Ergebnisse an die URL?Die Lösung scheint in Sicht...
am 07.03.2011 - 12:26 Uhr
So, ich habe nun eine Lösung gefunden und die möchte ich natürlich nicht für mich behalten ;)
Ich habe es nun wie folgt gelöst:
Durch das Hinzufügen von
$items['usersuche_ergebnis'] = array(
'title' => 'Mitgliederliste',
'page callback' => 'usersuche_ergebnis',
'access arguments' => array('access user profiles'),
'type' => MENU_CALLBACK
);
im usersuche_menu() und
$form['#action'] = 'usersuche_ergebnis';
bei der Erstellung des Formulars komme ich nun nach Klicken des Submit-Buttons in die gleichnamige Funktion
usersuche_ergebnis()
und kann dort die eingegebenen Formulardaten mittels Abfrage von $_POST herausziehen und weiterverarbeiten.
Ich hätte es so
am 08.03.2011 - 15:55 Uhr
Ich hätte es so gemacht:
<?php
/**
* Erstellt Menüeinträge
*/
function usersuche_menu() {
$items['usersuche'] = array(
'title' => 'UserSuche',
'page callback' => 'usersuche_formular',
'access arguments' => array('access user profiles'),
'type' => MENU_NORMAL_ITEM
);
return $items;
} // END usersuche_menu
/**
* Gibt das Formular aus
*/
function usersuche_formular($searched_user = NULL){
$uebergabe = 'Suche nach Benutzern';
$uebergabe .= drupal_get_form('formular');
if (!empty($searched_user)) {
$uebergabe .= usersuche_ergebnis($searched_user);
}
return $uebergabe;
} // END usersuche_formular()
/**
* Hier wird das Formular angelegt
*/
function formular($form_state) {
$form = array();
$form['vorname'] = array(
'#title' => 'Vorname',
'#type' => 'textfield',
'#description' => 'Hier gib bitte den Vornamen ein',
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Senden'
);
return $form;
} // END formular()
/**
* Das kommt jetzt nach erfolgreicher Validierung
*/
function formular_submit($form, &$form_state) {
drupal_goto('usersuche/'. $form_state['values']['vorname']);
return;
} // END usersuche_submit()
/**
* Generiert die Ergebnis - Seite
* @param op the operation from the URL
* @param delta offset
* @returns block HTML
*/
function usersuche_ergebnis($searched_user) {
//Inhalt der Seite, die nachher zurückgegeben wird
$page_content = '';
$query = "SELECT uid, name FROM {users} WHERE name = '%s'";
$queryResult = db_query($query, $searched_user);
while ($links = db_fetch_object($queryResult)) {
$page_content .= l($links->name, 'user/'.$links->uid) . '<br />';
}
return $page_content;
} // END usersuche_ergebnis()
?>
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.
API
am 08.03.2011 - 17:01 Uhr
Ich nochmal. Bitte achtet bei den Beispielen darauf, dass ihr auch die Richtlinien der Modulprogrammierung befolgt (mir geht es speziell um übersetzbare Texte und die hier immer wieder falsch verwendete [api:t:6]-Funktion).
Das mag jetzt ein wenig zu detailversessen klingen, aber wenn ein unerfahrener Programmierer diese Zeilen sieht und einfach abschreibt, fängt er gleich mit deutlich falschem Code an.
Also: gleich von Beginn an richtig machen und entsprechend der Regeln programmieren, dann gibt es später auch weniger Dinge, die falsch laufen können.
Tipp: Beachte die Verhaltensregeln des DrupalCenter.