Ciao ragazzi, dato che ormai conosco il codice di mambo a memoria e non sto scherzando, vi do due cosigli su come risolvere due errori che ho incontrato oggi.<br>
Se poi qualcuno lo facesse notare a programmatori di mambo sarebbe meglio.
# ERRORE 1
1 - Se non avete inserito l'indirizzo e-mail e il nome dell'utente, che invia le email da mambo, nella configurazione globale di mambo nella sezione mail (
Menu: Sito>Configurazione>Mail), fate attenzione perkè al momento che registrate un utente dal pannello di amministrazione
non viene inviata l'email con la login e la password all'utente registrato.
Ecco il perkè dell'errore:
File: administrator\components\com_users\admin.users.php ;
Riga: 290;
Cercate questo parte di codice:
PHP Code:
// for new users, email username and password
if ($isNew) {
$query = "SELECT email FROM #__users WHERE id=$my->id";
$database->setQuery( $query );
$adminEmail = $database->loadResult();
$subject = _NEW_USER_MESSAGE_SUBJECT;
$message = sprintf ( _NEW_USER_MESSAGE, $row->name, $mosConfig_sitename, $mosConfig_live_site, $row->username, $pwd );
if ($mosConfig_mailfrom != "" && $mosConfig_fromname != "") {
$adminName = $mosConfig_fromname;
$adminEmail = $mosConfig_mailfrom;
} else {
$query = "SELECT name, email FROM #__users WHERE usertype='superadministrator'";
$database->setQuery( $query );
$rows = $database->loadObjectList();
$row = $rows[0]; // Ecco l'errore
$adminName = $row->name; // Ecco l'errore
$adminEmail = $row->email; // Ecco l'errore
}
mosMail( $adminEmail, $adminName, $row->email, $subject, $message );
}
L'errore sta nel rimpiazzo l'oggetto
$row, poichè è gia utilizzato per la registrazione dell'utente attraverso la classe:
PHP Code:
Riga 226: [b]$row = new mosUser( $database );[/b]
con quello che viene caricato per recuperare il nome e la mail di un super administrator dalla tabella mos_user:
Riga 305: $rows = $database->loadObjectList();
Riga 306: $row = $rows[0]; // Ecco l'errore
Riga 307: $adminName = $row->name; // Ecco l'errore
Riga 308: $adminEmail = $row->email; // Ecco l'errore
Infatti al punto:
Riga 310: mosMail( $adminEmail, $adminName, $row->email, $subject, $message );
Che vi tradurro cosi:
$adminEmail = Email di chi Invia,
$adminName = Nome di chi Invia,
$row->email = Email di destinazione,
$subject = Oggetto dell'email,
$message = Messaggio dell'email;
La variabile $row->email ha come valore l'indirizzo e-mail dell'amministratore
Io ho risolto cosi:
PHP Code:
if ($isNew) {
$query = "SELECT email FROM #__users WHERE id=$my->id";
$database->setQuery( $query );
$adminEmail = $database->loadResult();
$subject = _NEW_USER_MESSAGE_SUBJECT;
$message = sprintf ( _NEW_USER_MESSAGE, $row->name, $mosConfig_sitename, $mosConfig_live_site, $row->username, $pwd );
if ($mosConfig_mailfrom != "" && $mosConfig_fromname != "") {
$adminName = $mosConfig_fromname;
$adminEmail = $mosConfig_mailfrom;
} else {
$query = "SELECT name, email FROM #__users WHERE usertype='superadministrator'";
$database->setQuery( $query );
$rows = $database->loadObjectList();
$rowmail = $rows[0];
$adminName = $rowmail->name;
$adminEmail = $rowmail->email;
}
mosMail( $adminEmail, $adminName, $row->email, $subject, $message );
}
Infatti funziona, l'email arriva.
------------------------------------------
# ERRORE 2
2- Nel caso creiate due voci di menu (anche in due menu diversi) che linkino ad un stesso contenuto dinamico, ("
content_item_link" da codice, nella procedura di creazione della voce del menu in italiano si chiama:
Link - Contenuto), il modulo mod_mainmenu va in panne.
Se avete creato le due voci, e cliccate prima su una e poi sull'altra, verra sempre considerata active, la voce del menu che viene prima nella tabella del database.
Ecco il perkè dell'errore:
File: modules\mod_mainmenu.php;
Riga: 28;
Cercate questo parte di codice: PHP Code:
case 'content_item_link';
$temp = split("&task=view&id=", $mitem->link);
$mitem->link .= '&Itemid='. $mainframe->getItemid($temp[1]);
Che ha questo significato:
PHP Code:
case 'content_item_link';
// Recupera solamente l'id del content estrapolandolo dal link della voce del menu
$temp = split("&task=view&id=", $mitem->link);
// Lo passa alla funzione $mainframe->getItemid($temp[1]) che ne restituisce l'id del menu
$mitem->link .= '&Itemid='. $mainframe->getItemid($temp[1]);
Questa:
$mainframe->getItemid($temp[1]);
Richiama la funzione "function getItemid" che si trova nel file "includes\mambo.php"
File: includes\mambo.php;
Riga: 746;
Cercate questo parte di codice: PHP Code:
if ($_Itemid == '' && $link) {
// Search for item link
$this->_db->setQuery( "SELECT id "
."\nFROM #__menu "
."\nWHERE type='content_item_link' AND published='1' AND link='index.php?option=com_content&task=view&id=$id'" );
$_Itemid = $this->_db->loadResult();
}
Come potete vedere, chi conosce la struttura di mambo, sa che la funzione loadResult() della classe database, che in questo caso è chiamata "$this->_db->loadResult()", restituisce il primo valore dell'array che ne deriva da una Select di un solo campo in Mysql.
In parole povere restituisce il valore array[0]; quindi in caso di più voci di menu, Mysql restituirà sempre la prima voce caricata nel db.
Per adesso io risolto facendo un piccolo hack sul modulo mod_mainmenu:
PHP Code:
case 'content_item_link';
// $temp = split("&task=view&id=", $mitem->link);
// $mitem->link .= '&Itemid='. $mainframe->getItemid($temp[1]);
// Ma noi l'id del menu l'abbiamo di già, perkè viene passato con l'oggetto $mitem quindi:
$mitem->link .= $mitem->id;
E funziona.
Un grazie a tutti e ci sentiamo.