Funktion aus menu_hook wird mehrfach aufgerufen
Eingetragen von finke77@drupal.org (44)
am 25.03.2009 - 13:42 Uhr in
am 25.03.2009 - 13:42 Uhr in
Hallo!
Ich versuche mein erstes Modul zu entwickeln. Dieses Modul soll Daten importieren und Benutzer anlegen.
Ich habe zum einfachen Aufrufen einen Menüeintrag gemacht, der die eigentliche Funktion "create_user_test" aufruft.
Wenn ich nun den Menüeintrag "Import User" zum Erstellen von Benutzern wähle, so wird die Funktion 5 mal aufgerufen!
Ich bin mir recht sicher, dass in der Funktion bzw. in Unterfunktionen (import_user.inc) keine Schleifen sind.
Hat jemand eine Idee, woran das liegen könnte?
Hier der Code aus mymodule.module:
<?php
function cfimport_perm() {
return array('access cfimport');
} // function cfimport_perm()
function cfimport_menu() {
$items = array();
//Menu for Guestbook
$items['cfimport/import_gaestebuch'] = array(
'title' => 'Import Gästebuch',
'page callback' => 'cfimport_gaestebuch',
'access arguments' => array('access cfimport'),
'type' => MENU_NORMAL_ITEM,
'file' => 'import_gaestebuch.inc',
);
//Menu for New
$items['cfimport/import_news'] = array(
'title' => 'Import News',
'page callback' => 'cfimport_news',
'access arguments' => array('access cfimport'),
'type' => MENU_NORMAL_ITEM,
'file' => 'import_news.inc',
);
//cfimport_user
$items['cfimport/import_user'] = array(
'title' => 'Import User',
'page callback' => 'create_user_test',
'access arguments' => array('access cfimport'),
'type' => MENU_NORMAL_ITEM,
'file' => 'import_user.inc',
);
return $items;
}
function cfimport_access($op, $node) {
global $user;
switch ($op) {
case 'access':
// only users with view permission may view.
return user_access('access cfimport');
break;
}
}
?>
(das letzte "?>" habe ich natürlich weggelassen).
Viele Grüße,
Christian
- Anmelden oder Registrieren um Kommentare zu schreiben
Funktion
am 25.03.2009 - 13:49 Uhr
Moin!
Leider zeigst Du nicht den Quelltext der Funktion
create_user_test()
.Mit dem Eintrag in
hook_menu()
sagst Du Drupal nur, welche Funktion aufgerufen werden soll, wenn Du die entsprechende URL besuchst. Daran liegt es also nicht.Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Hier die anderen relevanten Funktionen
am 25.03.2009 - 14:05 Uhr
Hallo!
Hier die anderen relevanten Funktionen:
<?php
function create_user_test() {
$username = 'testuser';
$mail = 'mail@domain.dom';
$password = 'test';
$role = 'Mitglied';
$status = 1;
$output ='';
global $output;
$newuser = create_user($username,$mail,$password,$role,$status);
return $output;
}
function create_user($username,$mail,$password,$role,$status) {
drupal_set_message( t('Creating user '.$username) );
$cfdebuglevel = 4; // 0 = no debug; 1 = error; 2 = warning; 3 = info; 4 = debug
$language = 'de'; //language
$contact = 1; //contact form
$messaging_default = 'mail'; //messaging
$notifications_send_interval = '0'; //0 = sent directly
$notifications_auto = 1; // automatically notifications
if ($role == 'Mitglied') {
$roles = array( 2=>TRUE, 3=>TRUE);
} else {
$roles = array( 2=>TRUE);
}
if($mail == null OR $mail == ''){
$mail = 'noreply@domain.dom';
$initmail = 'sharedemail_noreply@domain.dom';
$contact = 0;
} else {
$initmail = $mail;
$contact = 1;
}
$now = time(); // get current timestamp
$pass = MD5($password);
$user_data = array(
'is_new' => TRUE,
'status' => $status,
'mail' => $mail,
'init' => $initmail,
'name' => $username,
'pass' => $pass,
'roles' => $roles,
'language' => $language,
'contact' => $contact,
'messaging_default' => $messaging_default,
'notifications_send_interval' => $notifications_send_interval,
'notifications_auto' => $notifications_auto,
'created' => $now,
);
// create user
$local_user = user_save( NULL, $user_data );
//DEBUG Level Info
if($cfdebuglevel >= 3) {
output("Created user: ".$local_user->name." UID: ".$local_user->uid." Mail: ".$local_user->mail."<br>");
output(l(t('show user'), 'user/'. $local_user->uid));
}
//DEBUG Level Debug
if($cfdebuglevel >= 4) {
output("<br>================== User ======================<br>");
output(nl2br('<pre>'.print_r($local_user,true).'</pre>'));
output("========================================<br><br>");
}
return $local_user;
}
function output ($inputstring) {
global $output;
$output .= $inputstring."<br>";
}
?>
Ich hoffe das hilft weiter...
Zur Ergänzung bei der Debugausgabe wird bei den ersten 4 Mal kein Benutzer angelegt, beim 5. Mal klappt es dann. Es kommt eine Vollständige Debugausgabe mit dem User Array und der Benutzer wird auch wirklich angelegt und ist vorhanden, wie er sein sollte.
Bei den ersten 4 Mal kommen noch folgende Warnungen:
* user warning: Duplicate entry 'testuser' for key 2 query: INSERT INTO users (status, mail, init, name, pass, language, created, access) VALUES (1, 'mail@domain.dom', 'mail@domain.dom', 'testuser', 'fb469d7ef430b0baf0cab6c436e70375', 'de', 1237986038, 1237986038) in /var/www/drupal-test/html/modules/user/user.module on line 327.
* user warning: Duplicate entry 'testuser' for key 2 query: INSERT INTO users (status, mail, init, name, pass, language, created, access) VALUES (1, 'mail@domain.dom', 'mail@domain.dom', 'testuser', 'fb469d7ef430b0baf0cab6c436e70375', 'de', 1237986038, 1237986038) in /var/www/drupal-test/html/modules/user/user.module on line 327.
* user warning: Duplicate entry 'testuser' for key 2 query: INSERT INTO users (status, mail, init, name, pass, language, created, access) VALUES (1, 'mail@domain.dom', 'mail@domain.dom', 'testuser', 'fb469d7ef430b0baf0cab6c436e70375', 'de', 1237986038, 1237986038) in /var/www/drupal-test/html/modules/user/user.module on line 327.
* user warning: Duplicate entry 'testuser' for key 2 query: INSERT INTO users (status, mail, init, name, pass, language, created, access) VALUES (1, 'mail@domain.dom', 'mail@domain.dom', 'testuser', 'fb469d7ef430b0baf0cab6c436e70375', 'de', 1237986038, 1237986038) in /var/www/drupal-test/html/modules/user/user.module on line 327.
Es gab aber in der Tabelle 'user' zuvor keinen Eintrag mit 'testuser' oder der Mailadresse. Keine Ahnung was da passiert ...
Viele Grüße,
Christian