Joomla.it Forum
Joomla! 3 => Joomla! 3 => : thewebsurfer 31 Jul 2014, 21:08:08
-
salve, ho un certo plugin che fa una certa cosa al primo login dell'utente
http://www.readybytes.net/labs/welcome-message.html (http://www.readybytes.net/labs/welcome-message.html)
(il componente a cui si applica è a pagamento, il plugin in oggetto no)
secondo voi c'è modo di 'duplicarlo' ed applicare un'azione diversa per ogni lingua del sito?
in pratica il plugin manda un messaggio di benvenuto all'utente, ma essendo il sito multilingua è un problema mandare un messaggio monolingua
-
Se il plug in è stato progettato per joomla, ovvero avendo rispettato il paradigma MVC, dovresti inserire al posto della tua frase la stringa con la costante che ne richiama la variabile nella lingua in cui uno legge la pagina, nel file di lingua.
questa ad esempio:
JText::_('NOME_PLUG_IN_TUA_COSTANTE')
-
questo è tutto il codice, come vedi all'ultima riga ho già provato ad usare JText lì, ma non funge
<?php
defined('_JEXEC') or die( 'Restricted access' );
jimport( 'joomla.plugin.plugin' );
jimport( 'joomla.filesystem.folder' );
if(!defined('DS')){
define('DS',DIRECTORY_SEPARATOR);
}
class plgUserWelcomeMessage extends JPlugin
{
function _construct(& $subject, $config)
{
parent::__construct($subject, $config);
}
function onLoginUser($user,$option)
{
$this->afterLogin($user, $option);
}
//in J1.7 this event is called
function onUserLogin($user,$option)
{
$this->afterLogin($user, $option);
}
function editMessage($userid,$message,$customurl)
{
$mainframe = JFactory::getApplication();
$name = $lastvisitdate = JFactory::getUser($userid)->name;
$username = $lastvisitdate = JFactory::getUser($userid)->username;
$siteurl = JURI::base();
$sitename = $mainframe->getCfg( 'sitename' );
$pattern = array("/\[\[NAME\]\]/","/\[\[USERNAME\]\]/","/\[\[SITEURL\]\]/","/\[\[SITENAME\]\]/","/\[\[CUSTOMURL\]\]/");
$replace = array($name,$username,$siteurl,$sitename,$customurl);
$message = preg_replace($pattern,$replace,$message);
return $message;
}
function sendMessage($userid,$subject,$message,$emessage,$permessage,$email)
{
$mainframe = JFactory::getApplication();
if($emessage){
$mainframe->enqueueMessage($message);
}
if($permessage){
$jspath = JPATH_ROOT.DS.'components'.DS.'com_community';
include_once($jspath.DS.'libraries'.DS.'core.php');
$inboxModel = CFactory::getModel( 'inbox' );
$postvars = array();
$postvars['to'] = $userid;
$postvars['subject'] = $subject;
$postvars['body'] = $message;
$msgid = $this->sendJomSocialMessage ($postvars);
CFactory::load( 'libraries' , 'userpoints' );
//reload user to clean cache
CFactory::loadUsers(array("$userid"));
CUserPoints::assignPoint('inbox.message.send');
}
if($email){
$mailer = JFactory::getMailer();
$email = JFactory::getUser($userid)->email;
$mailer->addRecipient($email);
$mailer->setSubject($subject);
$mailer->setBody($message);
$mailer->send();
}
}
function sendJomsocialMessage($vars)
{
$db = JFactory::getDBO();
$my = JFactory::getUser();
$admin = $this->getAdmin();
$date = JFactory::getDate(); //get the time without any offset!
$cDate = $date->toSQL();
$obj = new stdClass();
$obj->id = null;
$obj->from = $admin;
$obj->posted_on = $date->toSQL();
$obj->from_name = JFactory::getUser($admin)->name;
$obj->subject = $vars['subject'];
$obj->body = $vars['body'];
$db->insertObject('#__community_msg', $obj, 'id');
// Update the parent
$obj->parent = $obj->id;
$db->updateObject('#__community_msg', $obj, 'id');
$this->addReceipient($obj, $vars['to']);
return $obj->id;
}
function addReceipient($msgObj, $recepientId)
{
$db = JFactory::getDBO();
$recepient = new stdClass();
$recepient->msg_id = $msgObj->id;
$recepient->msg_parent = $msgObj->parent;
$recepient->msg_from = $msgObj->from;
$recepient->to = $recepientId;
$db->insertObject('#__community_msg_recepient', $recepient);
if($db->getErrorNum()) {
JError::raiseError( 500, $db->stderr());
}
}
function getAdmin()
{
$mainframe = JFactory::getApplication();
$db = JFactory::getDBO();
$query = 'SELECT id FROM #__users' . ' '
. 'WHERE `email`="' .$mainframe->getCfg( 'mailfrom' ).'"';
$db->setQuery( $query );
if($db->getErrorNum()) {
JError::raiseError( 500, $db->stderr());
}
$result = $db->loadResult();
return $result;
}
function _isPluginInstalledAndEnabled()
{
$db = JFactory::getDBO();
$query = "SELECT * FROM `#__extensions` WHERE `element` = 'xipt_community' ";
$db->setQuery($query);
$communityPlugin = $db->loadObject();
if(!$communityPlugin || $communityPlugin->enabled == 0)
{
return false;
}
$query = "SELECT * FROM `#__extensions` WHERE `element` = 'xipt_system' ";
$db->setQuery($query);
$systemPlugin = $db->loadObject();
if(!$systemPlugin || $systemPlugin->enabled == 0)
{
return false;
}
return true;
}
function afterLogin($user, $option)
{
$username = JRequest::getVar('username');
$mainframe = JFactory::getApplication();
$userid = JUserHelper::getUserId($username);
// For Guest, do nothing and just return, let the joomla handle it
if(!$userid)
return;
$plugin = JPluginHelper::getPlugin('user', 'welcomemessage');
$params = new JRegistry($plugin->params);
$lastvisitdate = JFactory::getUser($userid)->lastvisitDate;
$block = JFactory::getUser($userid)->block;
//Check for first login
if($lastvisitdate == "0000-00-00 00:00:00" && $block==0){
$path = JPATH_ROOT. DS.'components'.DS.'com_xipt';
if(JFolder::exists($path)){
//Check is XiPT unhook or not
$result = $this->_isPluginInstalledAndEnabled();
if($result){
require_once (JPATH_ROOT. DS.'components'.DS.'com_xipt'.DS.'api.xipt.php');
$pID = XiptAPI::getUserInfo($userid,'PROFILETYPE');
$ptsubject = $params->get('ptypesubject', '');
$subject = $ptsubject->$pID;
$ptmessage = $params->get('ptypemessage', '');
$message = $ptmessage->$pID;
}
else{
$subject = $params->get('subject',' ');
$message = $params->get('message',' ');
}
}
else{
$subject = $params->get('subject', '');
$message = $params->get('message', '');
}
//$message.= $this->getMessage($userid);
$emessage = $params->get('EnqueueMessage', false);
$permessage = $params->get('PersonalMessage',false);
$email = $params->get('Email', false);
$customurl = $params->get('customurl', false);
$subject = $this->editMessage($userid,$subject,$customurl);
$message = $this->editMessage($userid,$message,$customurl);
$this->sendMessage($userid,$subject,JText::_($message),JText::_($emessage),JText::_($permessage),$email);
}
}
}
-
Vedo che $emessage prende un parametro get.
Per sicurezza: a cosa è uguale $emessage;?
Cmq funziona cosi:
Quando tu scrivi:
Jtext::(NOME_CAMPO);
Joomla cerca tra i file .ini che ha caricato nel core, cerca "NOME_CAMPO" e vede che nel file it.ini è uguale a cognome, nel file en.ini è uguale a surname.
A questo punto, se sei su una pagina in italiano ti scrive cognome, se sei su una pagina inglese scrive surname.
Se tu a $emessage applichi un nome diverso a "NOME_CAMPO" che non è presente tra i file .ini della cartella languages, non ti troverà nulla e ti scriverà il contenuto di $emessage (se non esistesse NOME_CAMPO ti scriverebbe: NOME_CAMPO).
-
Vedo che $emessage prende un parametro get.
Per sicurezza: a cosa è uguale $emessage;?
Cmq funziona cosi:
Quando tu scrivi:
Jtext::(NOME_CAMPO);
Joomla cerca tra i file .ini che ha caricato nel core, cerca "NOME_CAMPO" e vede che nel file it.ini è uguale a cognome, nel file en.ini è uguale a surname.
A questo punto, se sei su una pagina in italiano ti scrive cognome, se sei su una pagina inglese scrive surname.
Se tu a $emessage applichi un nome diverso a "NOME_CAMPO" che non è presente tra i file .ini della cartella languages, non ti troverà nulla e ti scriverà il contenuto di $emessage (se non esistesse NOME_CAMPO ti scriverebbe: NOME_CAMPO).
so come funzionano le variabili di lingua :)
è che non sono sicuro sia possibile utilizzarle in quel codice, per questo chiedo aiuto :)
ovviamente ho inserito una variabile NOME_CAMPO nel file .ini, ed ho inserito lo stesso nel form per la definizione del messaggio da mandare all'utente, ma non funziona (il messaggio mandato all'utente è NOME_CAMPO, cioè la variabile non viene risolta)
-
Ok capito :)
Mai capitato problema di questo tipo mi spiace, mi segno questo topic che interessa anche a me :) [size=78%].[/size]
-
Mai capitato problema di questo tipo mi spiace, mi segno questo topic che interessa anche a me :) [size=78%].[/size]
io sono pieno di problemi del genere, i siti multilingua sono una rogna se sviluppi codice ad hoc. :)
qualche esperto da un occhio al codice ho linkato tutto il pacchetto, magari riesce a dirmi almeno se effettivamente c'è modo di rendere il messaggio multilingua o no, io sono ancora dubbioso..
-
Ma prima dell'invio del messaggio hai provato a fare un echo per vedere se sta richiamando la variabile?
-
Ma prima dell'invio del messaggio hai provato a fare un echo per vedere se sta richiamando la variabile?
non è così semplice :) il plugin viene eseguito "on the fly" alla registrazione, se metto una echo in qualche funzione o non vedo nulla o scateno un errore, in questo caso ho provato, è la seconda :) .
-
eureka! ci sono riuscito :D
e soprattutto grazie a te claudio.
anche se il plugin si applica ad un componente a pagamento magari interessa a qualcuno la soluzione:
effettivamente con il suggerimento valido sempre per tutti i programmatori/sviluppatori "quando non capisci dove sei e cosa fai, stampa roba a video" :D mi hai dato un suggerimento per partire
- mi sono reso conto che usare una variabile di lingua nel form per la definizione del messaggio da backend era un po' troppo, così l'ho infilata nel codice
- per capire se funzionava, ho indagato e scoperto quale fosse la funzione effettivamente appesa all'evento after registration e lì ho stampato un po' di roba (che viene stampata in una pagina bianca durante il caricamento del primo login)
- quando ho visto che effettivamente è l'utente registrato che scatena l'evento, quindi il plugin può recuperare la sua lingua, ho risolto :)
-
eureka! ci sono riuscito :D
e soprattutto grazie a te claudio.
anche se il plugin si applica ad un componente a pagamento magari interessa a qualcuno la soluzione:
effettivamente con il suggerimento valido sempre per tutti i programmatori/sviluppatori "quando non capisci dove sei e cosa fai, stampa roba a video" :D mi hai dato un suggerimento per partire
- mi sono reso conto che usare una variabile di lingua nel form per la definizione del messaggio da backend era un po' troppo, così l'ho infilata nel codice
- per capire se funzionava, ho indagato e scoperto quale fosse la funzione effettivamente appesa all'evento after registration e lì ho stampato un po' di roba (che viene stampata in una pagina bianca durante il caricamento del primo login)
- quando ho visto che effettivamente è l'utente registrato che scatena l'evento, quindi il plugin può recuperare la sua lingua, ho risolto :)
Ottimo ;D mi fa piacere di essere stato utile.