[gelöst] Parameter für eigene Modulseite
Eingetragen von MaWe4585 (41)
am 29.12.2009 - 17:51 Uhr in
am 29.12.2009 - 17:51 Uhr in
Hallo,
ich möchte eine Seite meines Moduls mit Parametern aufrufen, soll so aussehen:
http://drupal.meineseite.de/seite/param1/param2
Nun weis ich das ich mit der Methode arg() diese Parameter auslesen kann, aber wie kann ich die mit einem Formular erzeugen?
Wenn man http://drupal.meineseite.de/seite/ aufruft, kommt ein Formular auf welchem man param1 und param2 auswählen kann. Aber was muss in das Formular rein damit diese auch in der URL drin sind?
<?php
function param_all() {
$param1 = arg(1);
$page_content = '';
if(is_numeric($param1)){
$page_content .= t('This is the site of param1');
}else{
$page_content .= drupal_get_form('choose_param_form');
}
return $page_content;
}
function choose_param_form($form_state){
// Description
$query = "SELECT * FROM {mytable} ";
$qRes = db_query($query);
$paramoptions = array();
while($param1 = db_fetch_object($qRes)) {
$paramoptions["$param1->param_id"] = $param1->param_name;
}
$form['param1'] = array(
'#type' => 'select',
'#title' => t('Select Param1'),
'#default_value' => $node->selectbox,
'#options' => $paramoptions,
'#description' => t('Please choose Param1.'),
);
$form['submit'] = array('#type' => 'submit', '#value' => t('Submit'));
return $form;
}
?>
Was muss ich hier ergänzen/anders machen?
edit: Wie sieht die url ohne mod-rewrite dann aus? Bzw ändert sich was an der Auswertung?
- Anmelden oder Registrieren um Kommentare zu schreiben
Weis keiner wie das geht
am 31.12.2009 - 09:39 Uhr
Weis keiner wie das geht oder hab ich das undeutlich beschrieben?
Oder sind grad alle im Urlaub? :(
Re: Parameter für eigene Modulseite
am 01.01.2010 - 15:13 Uhr
Nun weis ich das ich mit der Methode arg() diese Parameter auslesen kann, ...
Solltest du aber nur in Notfällen machen. Normalerweise solltest du in deiner Implementierung von hook_menu angeben, welche Teile des Drupal-Pfades an den Page Callback übergeben werden und im Page Callback auf die Argumente der Funktion zugreifen. Teile des Drupal-Pfades, die über das hinausgehen, was im Menüeintrag festgelegt ist, werden automatisch als Argumente an den Page Callback übergeben. Zum Experimentieren:
<?php
function mymodule_menu() {
return array(
'mymodule/%/page' => array(
'page callback' => 'mymodule_page',
'page arguments' => array(1),
'access arguments' => array('access content'),
),
);
}
function mymodule_page($arg1) {
$args = func_get_args();
$args_php = var_export($args, true);
return '<pre>' . highlight_string("<?php\n" . $args_php, true) . '</pre>';
}
?>
Schau mal was passiert wenn du
index.php?q=mymodule/foo/page/bar/baz
aufrufst.Wenn man http://drupal.meineseite.de/seite/ aufruft, kommt ein Formular auf welchem man param1 und param2 auswählen kann. Aber was muss in das Formular rein damit diese auch in der URL drin sind?
Ich versteh's nicht. Wenn man http://drupal.meineseite.de/seite/ aufruft, dann sind param1 und param2 nie in der URL drin. Damit param1 und param2 in der URL sind müsste man eine andere URL aufrufen, z.B. http://drupal.meineseite.de/seite/param1 oder http://drupal.meineseite.de/seite/param2.
Bitte erzähle mal in chronologischer Reihenfolge aus Sicht des Benutzers was du umsetzen willst.
edit: Wie sieht die url ohne mod-rewrite dann aus?
Genau so wie mit mod_rewrite. mod rewrite hat keinen Einfluss auf das Aussehen von URLs. mod_rewrite ändert lediglich die Art wie Anfragen von Apache behandelt werden. Das Aussehen von URLs wird durch die Konfigurationseinstellung Clean URLs bestimmt.
Bzw ändert sich was an der Auswertung?
Für Drupal-Module ändert sich nichts durch Clean URLs und auch nichts durch mod_rewrite.
--
OK, also ich programmiere
am 01.01.2010 - 18:28 Uhr
OK, also ich programmiere ein Browsergame welches auf nem cms basiert, bisher wollt ich ein anderes cms als Drupal verwenden, arbeite mich jetzt aber in Drupal ein um zu schauen ob das besser ist.
Das Spiel wird ein Fussballmanager(ja ich weis, etwa der Millionste, ich machs trotzdem ;) )
Nun lässt sich ein Spieler seine aktuelle Liga anzeigen:
http://drupal.meineseite.de/liga/
Damit andere von aussen seine Liga sehen können, muss er einen Link mit Parametern rausgeben, deswegen brauch ich:
http://drupal.meineseite.de/liga/land_id/liga_index[/spieltag]
Wenn spieltag mitangegeben wird, wird die Tabelle dieses Spieltags angezeigt, ansonsten der aktuelle.
Um nun im Ligabildschirm zu einer anderen Liga wechseln zu können, möchte ich oberhalb davon ein Formular mit 3 select-boxen machen über die man land, liga und spieltag auswählen kann.
Bei Klick auf den Submit-button soll eben die gewählte Liga ausgewählt werden und in der Adresszeile eben das stehen:
http://drupal.meineseite.de/liga/land_id/liga_index[/spieltag]
Ein problem ist aber: die Formulare senden per POST, in der Adresszeile steht also nur
http://drupal.meineseite.de/liga/
Da wirst Du wohl mit ein
am 01.01.2010 - 18:45 Uhr
Da wirst Du wohl mit ein paar Zeilen JavaScript oder besser jQuery im Browser die Aktion des Formulars umbiegen müssen. Ich wüßte jedenfalls nicht wie das anders gehen sollte, da der Server von der Auswahl des Users nicht mitbekommt.
Beste Grüße
Werner
Wie meinst der Server
am 01.01.2010 - 18:49 Uhr
Wie meinst der Server bekommt nix mit? Es wird doch zum Server gesendet, ich kann ja das $_POST auswerten.
Re: OK, also ich programmiere
am 01.01.2010 - 21:22 Uhr
Bei Klick auf den Submit-button soll eben die gewählte Liga ausgewählt werden und in der Adresszeile eben das stehen:
http://drupal.meineseite.de/liga/land_id/liga_index[/spieltag]
Wenn du eine Formulardefinition in Drupal hast, dann brauchst du noch einen Submit Handler:
<?php
/**
* Submit-Handler für das Formular choose_param_form.
*
* @param array $form Das Formular
* @param array $form_state Zustand des Formulares
* inklusive der Werte die der Benutzer eingetragen
* hat.
*/
function choose_param_form_submit($form, &$form_state) {
// TODO: In $form_state['values'] nachschauen,
// was der Benutzer eingetragen hat
// TODO: In $form_state['redirect'] den Drupal-Pfad
// der Seite eintragen, auf die weitergeleitet
// werden soll.
}
?>
Der Submit Handler wird automatisch von
drupal_get_form
aufgerufen, allerdings nur dann, wenn der Benutzer das Formular auch tatsächlich ausgefüllt und abgeschickt hat. Du brauchst dich darum also nicht kümmern, du musst den Submit Handler lediglich bereitstellen unddrupal_get_form
aufrufen.In deinem Fall besteht die Formularverarbeitung wohl nur daraus, anhand der Werte den richtigen Drupal-Pfad zusammenzubauen und das Ergebniss an $form_state['redirect'] zuzuweisen um die Weiterleitung dorthin anzustoßen.
--
Ich seh schon, da wartet
am 01.01.2010 - 22:20 Uhr
Ich seh schon, da wartet noch ne Menge arbeit auf mich und ne Menge Funktionen und hooks die ich kennenlernen muss :D
habs jetz so gelöst:
<?php
function choose_param_form_submit($form, &$form_state) {
drupal_goto('league/'.$form_state['values']['param1'].'/'.$form_state['values']['param2']);
}
?>
was hat es eigentlich mit dem & vor dem $form_state auf sich? Heisst das, dass es nur ein Zeiger ist?
Danke für eure Hilfe, Thema gelöst
Ja, es ist nur ein Zeiger
am 01.01.2010 - 23:53 Uhr
Ja, es ist nur ein Zeiger und erlaubt, daß wenn im Unterprogramm der Wert der Variablen geändert wird, der auch im rufenden Programm geändert ist. Die Stichworte hier sind "call by value" und "call by reference". Solltest Du mal nach googeln.
Beste Grüße
Werner
Re: Ich seh schon, da wartet
am 02.01.2010 - 10:56 Uhr
<?php
function choose_param_form_submit($form, &$form_state) {
drupal_goto('league/'.$form_state['values']['param1'].'/'.$form_state['values']['param2']);
}
?>
Besser:
<?php
function choose_param_form_submit($form, &$form_state) {
$form_state['redirect'] = 'league/'.$form_state['values']['param1'].'/'.$form_state['values']['param2'];
}
?>
Probleme deiner Lösung:
hook_form_alter
verändert werden. Wenn ein Modul das macht, dann trägt es oft auch einen zusätzlichen Submit-Handler ein, der dann z.B. zusätzliche Eingabefelder auswertet. Durchdrupal_goto
wird allerdings sofort weitergeleitet, ohne das weitere Submit-Handler ausgeführt werden.drupal_get_form
schaut selbst nach, was in$form_state['redirect']
eingetragen wurde und leitet dorthin weiter (das geht natürlich nur, weil$form_state
per Referenz übergeben wird).drupal_execute
können Formulare programmatisch (ohne Benutzerinteraktion) ausgefüllt und abgesendet werden. In diesem Fall soll überhaupt nicht weitergeleitet werden, da nach Beendigung vondrupal_execute
wahrscheinlich weitere Anweisungen ausgeführt werden sollen.was hat es eigentlich mit dem & vor dem $form_state auf sich? Heisst das, dass es nur ein Zeiger ist?
Ein Zeiger im eigentlichen Sinne ist es nicht. Es verhällt sich aber in vielen Aspekten so wie einer. In PHP heißen diese Dinger Referenz.
--