arg() gibt immer etwas falsches zurück (kein Aliasproblem)

am 27.04.2009 - 07:20 Uhr in
Guten Morgen,
ich schreibe meine selbstgebastelten Module um damit sie auf D6 laufen.
Jetzt fiel mir etwas (für mich) kurioses auf.
Ich hab eine Funktion die so ähnlich beginnt
funktion hook_menu() {
$url[0] = arg(0);
$url[1] = arg(1);
$url[2] = arg(2);
items['user/%user/meinRegister'] ...
...
...
...
print_r($url)
}
Wenn ich mir jetzt den Inhalt von $url anzeigen lasse, dann steht dort
url[0] = admin
url[1] = build
url[2] = module
auch wenn die Seite http://meineSeite.de/user/2/meinRegister angezeigt wird.
Wie ich den Pfad setze hat keine Auswirkung auf arg(), natürlich auf die Seite die ich aufrufen muss.
Mir ist nicht so richtig klar wie das sein kann, unter D5 ging das einwandfrei. An Aliasen kann es schlecht liegen, da ich ja nicht auf einen Alias zugreife und die Seite wird auch korrekt im "Mein Konto" angezeigt.
Hat wer bitte einen kurzen prägnanten Tip?
- Anmelden oder Registrieren um Kommentare zu schreiben
Wie jetzt wenn du
am 27.04.2009 - 07:24 Uhr
Wie jetzt wenn du user/123/meinR... aufrufst, hast du als arg0 admin, arg1 build?
----------------------------------------
http://tobiasbaehr.de/
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Genau, und das kommt mir
am 27.04.2009 - 18:49 Uhr
Genau, und das kommt mir schon etwas merkwürdig vor.
Zuvor habe ich ein Update von 5.16 auf 6.10 gemacht, das fehlerfrei durchlief.
Update status sagt auch das ich aktuell bin.
Es sind sonst keine weiteren Module aktiviert.
Edit:
Ich habs jetzt anders gemacht:
$items['user/%user/meinRegister'] = array(
'title' => 'Register im Userkonto',
'page callback' => 'meineRegister_function',
'page arguments' => array($user, 1),...
Aber irgendwas stimmt bei meiner Testumgebung nicht, denn selbst als ich:
$path = $_GET['q'];
aufrief und dann $path ausgab war "admin/build/module" drin.
Danach habe ich mal den Browser-Cache deaktiviert, Cacheing in Drupal ausgestellt und den Cache geleert. Seit dem hatte ich dann "admin/settings/performance" in $path stehen. Naja zumindest solange bis ich Module de-/aktiviert hatte, dann stand $path nämlich wieder "admin/build/module"
Ich weiss nicht wieso das so ist, wenn jemand einen Tip hat. Immer her damit.
Also ich habe keine Probleme
am 27.04.2009 - 22:24 Uhr
Also ich habe keine Probleme damit.
----------------------------------------
http://tobiasbaehr.de/
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Wildcard Loader Arguments
am 27.04.2009 - 23:48 Uhr
Dein Code
<?php
$items['user/%user/meinRegister'] = array(
'title' => 'Register im Userkonto',
'page callback' => 'meineRegister_function',
'page arguments' => array($user, 1),...
?>
Was soll 'page arguments' => array($user, 1) ? Ich denke das ist falsch.
Lese Dich auf drupal.org in wildcard arguments ein. Wildcard Loader Arguments
Wenn Du das mit dem 'page arguments' in die richtige Reihe bringst bist Du vermutlich auch das Problem mit den falschen arg()-Werten los.
Edit
Probier es mal damit:
<?php
$items['user/%user/meinRegister'] = array(
'title' => 'Register in user account',
'page callback' => 'drupal_get_form',
'page arguments' => array(meineRegister_function, 1),
...
?>
In Deiner Callbackfunktion
<?php
meineRegister_function($form_state, &$user)
?>
------------------------
Quiptime Group
Danke für die
am 28.04.2009 - 07:09 Uhr
Danke für die Antworten.
Was soll 'page arguments' => array($user, 1) ? Ich denke das ist falsch.
Das passt so hoffe ich, aber es ist ziemlich unverständlich. Also $user ist der eingeloggte Benutzer (global $user;) und %user wird gleich als User-Object durch die 1 angesprochen.
Lese Dich auf drupal.org in wildcard arguments ein. Wildcard Loader Arguments
Das habe ich ;-)
Wildcard usage and core's wildcards (im unteren 1/3 bei %user)
<?php
$items['user/%user/meinRegister'] = array(
'title' => 'Register in user account',
'page callback' => 'drupal_get_form',
'page arguments' => array(meineRegister_function, 1),
...
?>
In Deiner Callbackfunktion
<?php
meineRegister_function($form_state, &$user)
?>
<?php
meineRegister_function($form_state, &$user, $profil_seite_von)
?>
So sieht meine Callback-Funktion aus. Und das geht auch soweit.
Ich benötige
<?php
global $user;
$user->uid //vom aktuell die Seite anschauenden Benutzer und die
$profil_seite_von->uid // von demjenigen Benutzer, dessen Profil angezeigt wird
?>
drupal_get_form() rufe ich später in meineRegister_function() auf. Das funktioniert ja auch so.
Zu den falschen arg()-Werten:
Hier scheint bei mir etwas falsch zu laufen. Und es sind nicht nur die arg()-Werte.
Beispiel:
<?php
function hook_menu() {
global $user;
items['meinRegister']
...
...
print_r($user);
...
?>
Gibt mir beim Aufruf von http://meineSeite.de/meinRegister das Userobject des Benutzers aus mit dem ich das Modul aktiviert habe.
Tu es bitte und sag mir was die Parameter-Variable $user enthält
am 28.04.2009 - 09:49 Uhr
<?php
meineRegister_function($form_state, &$user, $profil_seite_von)
?>
Das kann so nicht sein wenn Du in der hook_menu() nur 1 Parameter an meineRegister_function() uebergibst:
<?php
array(meineRegister_function, 1),
?>
Weiterhin denke ich das Du in Deiner hook_menu() Funktion global $user NICHT benoetigst.
Das Argument %user arbeitet mit der globalen Wildcardfunktion user_load zusammen. Aus diesem Grund steht in der Callbackfunktion bereits das User Object zur Verfuegung.
Hast Du Dir in Deiner Callbackfunktion mal den Inhalt des Parameters $user anzeigen lassen? Ja oder Nein? Tu es bitte und sage mir was die Parameter-Variable $user enthaelt. <-- Mache dies aber ohne ein global $user in der Callbackfunktion.
Wie lautet die Bezeichnung Deiner hook_menu() Funktion in Deinem Modul?
Poste bitte den vollstaendigen Code Deiner Callbackfunktion und den dazu gehoerenden Part aus der hook_menu Funktion. Wo soll das Formular der Callbackfunktion auftauchen? Ist es ein eigenstaendiger Link oder soll es ein Tab sein?
------------------------
Quiptime Group
Ich komme die nächsten paar
am 28.04.2009 - 21:37 Uhr
Ich komme die nächsten paar Tage nicht mehr an DIESE Testumgebung ran, aber ich habe mein Modul auf einer anderen D6-Seite installiert und dort geht alles wie gewünscht.
Scheinbar ist wirklich etwas an der Drupal-Installation nicht in Ordnung. Also sind wir sozusagen Off-Topic.
Das Modul soll den registrierten Drupal-Usern die Möglichkeit geben ihr eigenes Mumble-Passwort zu ändern, hat man die Berechtigung "administer users" kann man auch für andere Benutzer das Passwort ändern oder neue Mumble-user registrieren.
Das geht nur weil die Tabellen für Mumble in der Drupal-Datenbank erstellt wurden.
Mein Code sieht jetzt so aus:
<?php
/**
* Implementation of hook_menu().
*/
function mumbleuser_menu() {
$items = array();
// Ein Register unter /user da kann der Benutzer sein
// eigenes Mumble-Passwort setzen oder Benutzer mit
// Berechtigung 'administer users' können Fremde PW vergeben
$items['user/%user/mumbleuser'] = array(
'title' => 'Mumble Userkonto',
'page callback' => 'mumbleuser_password',
'page arguments' => array(1),
'type' => MENU_LOCAL_TASK,
'access arguments' => array('Zugriff Mumbleuser'),
'weight' => 2,
);
// Einfache Seite auf der neue Benutzer im Mumble-Server
// registriert werden können.
$items['register/mumbleuser'] = array(
'title' => 'Mumble Benutzerregistrierung',
'page callback' => 'mumbleuser_password',
'page arguments' => array(),
'type' => MENU_CALLBACK,
'access arguments' => array('administer users'),
'weight' => 2,
);
return $items;
}
function mumbleuser_password(&$account=FALSE) {
//eine Hilfsfunktion die mittlerweile nichtmehr viel Sinn hat
global $user;
$output .= drupal_get_form('mumbleuser_password_form', $user, $account);
// echo "<pre>";
// print_r($user);
// echo "</pre>";
return $output;
}
function mumbleuser_password_form(&$form_state, $user, $account) {
$form['Mumbleuser']['text'] = array(
'#type' => 'fieldset',
'#title' => t('Mumbleuser erstellen oder aktualisieren'),
'#value' => "Mumbleuser = $account->name, User = $user->name",
'#collapsible' => FALSE,
'#collapsed' => FALSE,
);
// Wenn kein $account gesetzt ist, gibt das eine
// Neuregistrierung mit Eingabe des Benutzernamens
// und die 'playerid' wird auf FALSE gesetzt.
if ($account) {
$form['Mumbleuser']['playerid'] = array('#type' => 'value', '#value' => $account->uid);
$form['Mumbleuser']['name'] = array('#type' => 'value', '#value' => $account->name);
$form['Mumbleuser']['email'] = array('#type' => 'value', '#value' => $account->name ."@totekrieger.de");
} else {
$form['Mumbleuser']['text']['name'] = array(
'#type' => 'textfield',
'#title' => 'Benutzername',
'#description' => 'Der Name des neu zu registrierenden Benutzers, dieser Name
muss <b>eindeutig</b> sein! d.h. er darf nicht bereits verwendet
werden.',
'#size' => 20,
'#maxlength' => 20,
'#required' => TRUE,
);
$form['Mumbleuser']['playerid'] = array('#type' => 'value', '#value' => FALSE);
$form['Mumbleuser']['email'] = array('#type' => 'value', '#value' => "nichteingetragen@totekrieger.de");
}
//Passworteingabefelder im Klartext!
$form['Mumbleuser']['text']['password1'] = array(
'#type' => 'textfield',
'#title' => t('Das gewuenschte Password'),
'#size' => 20,
'#required' => TRUE,
);
$form['Mumbleuser']['text']['password2'] = array(
'#type' => 'textfield',
'#title' => t('Das gewuenschte Password zum zweiten'),
'#size' => 20,
'#required' => TRUE,
);
// Damit niemand sagen kann, ich habe wohl falsch geklickt!
// Der Name des Mumbleuser muss eingegeben werden
if ($user->uid != $account->uid) {
$form['Mumbleuser']['text']['check'] = array(
'#type' => 'textfield',
'#title' => '<h3>Mir ist bewusst,<br>dass ich das Passwort fuer einen anderen Benutzer ('.$account->name.') setze!</h3><br>Gib hier den Namen des Nutzers ein!',
'#required' => FALSE,
'#default_value' => "Namen Eingeben!",
'#size' => 20,
);
} else {
// ...oder bei bekannten Usern wird es vom System erledigt
$form['Mumbleuser']['text']['check'] = array('#type' => 'value', '#value' => $account->name);
}
$form['Mumbleuser']['senden'] = array('#type' => 'submit', '#value' => t('Submit'));
return $form;
}
?>
Der Rest besteht aus validierung und Datenbankabfragen.
Es gibt noch eine Menge Erweiterungspotential, z.B. User wieder löschen zu können :-)