PHP-变量在同一会话期间未“重置”
我一直在努力沟通Joomla和CiviCRM的档案更新。最初,我只想在Joomla配置文件电子邮件更改时更新CiviCRM匹配配置文件注:最新的civi版本将在civi电子邮件更改时更新Joomla配置文件电子邮件…因此,这一方面已涵盖在内。有了这些,我就有了可以工作的代码。也就是说,当我在经过身份验证的会话中手动触发代码时,它将正确更新civi电子邮件。现在,我正在尝试将此代码嵌入Joomla user_profile插件中,以便当用户更改其电子邮件时,它将更新civi电子邮件 注意:我知道不要破解核心代码。最终,我将用我的自定义代码创建一个新的概要文件插件,但为了在开发过程中简单起见,我使用的是核心用户_概要文件插件。任何阅读本文的人,请勿在生产中使用下面的代码!它是不完整的,核心不应该被黑客攻击 这是可行的,但是我发现,如果用户不注销会话,然后在同一会话中再次更改电子邮件,则不会识别最新的电子邮件。使用的是旧电子邮件,但如果用户注销后再登录,更改电子邮件,则会起作用。我希望这是有道理的 这个问题一定与变量的实例或类似的东西有关,但我对PHP编码还不熟悉,不太确定我做错了什么。我已经将自定义代码放在user\u profile plugin的profile.php脚本中的onUserAfterSave函数中 任何PHP程序员都知道我如何解决这个问题,这样每当Joomla中的电子邮件发生更改时,无论是否在同一会话中,我下面的自定义代码都会触发 我的代码:PHP-变量在同一会话期间未“重置”,php,joomla,joomla1.7,civicrm,Php,Joomla,Joomla1.7,Civicrm,我一直在努力沟通Joomla和CiviCRM的档案更新。最初,我只想在Joomla配置文件电子邮件更改时更新CiviCRM匹配配置文件注:最新的civi版本将在civi电子邮件更改时更新Joomla配置文件电子邮件…因此,这一方面已涵盖在内。有了这些,我就有了可以工作的代码。也就是说,当我在经过身份验证的会话中手动触发代码时,它将正确更新civi电子邮件。现在,我正在尝试将此代码嵌入Joomla user_profile插件中,以便当用户更改其电子邮件时,它将更新civi电子邮件 注意:我知道不
function onUserAfterSave($data, $isNew, $result, $error)
{
$userId = JArrayHelper::getValue($data, 'id', 0, 'int');
// *** Truncating function code to de-clutter
// .
// .
// .
/*****************************************************
* Begin my custom code to save data to civi.
*****************************************************/
require_once '/var/www/joomla/administrator/components/com_civicrm/civicrm.settings.php';
require_once '/var/www/joomla/administrator/components/com_civicrm/civicrm/CRM/Core/Config.php';
require_once '/var/www/joomla/administrator/components/com_civicrm/civicrm/api/v3/UFMatch.php';
require_once '/var/www/joomla/administrator/components/com_civicrm/civicrm.settings.php';
require_once('/var/www/joomla/administrator/components/com_civicrm/civicrm/CRM/Core/DAO.php');
$t911_config = CRM_Core_Config::singleton( );
$t911_user = JFactory::getUser();
$t911_ufID = $t911_user->id;
$t911_ufUSER = $t911_user->username;
$t911_ufEMAIL = $t911_user->email; //this variable only sets on each login session
$t911_ufTYPE = $t911_user->usertype;
$t911_ufGUEST = $t911_user->guest;
$t911_contactID = CRM_Core_BAO_UFMatch::getContactId($t911_ufID);
$t911_query = "select email from civicrm_email where contact_id = $t911_contactID";
$daoResult =& CRM_Core_DAO::executeQuery( $t911_query, $t911_params);
$daoResult->fetch();
if ( $daoResult->email <> $t911_ufEMAIL )
{
CRM_Core_BAO_UFMatch::updateContactEmail($t911_contactID,$t911_ufEMAIL);
}
/*****************************************************
* End my custom code to save data to civi.
****************************************************/
// .
// .
// .
// *** The remainder of the function code
return true;
}
JFactory:getUser正在从会话检索用户对象。这意味着它只在会话为空时(即每次登录后)从数据库读取数据。您描述的问题与用户电子邮件保存到DB后未保存到会话一致,因此它始终使用登录时读取的值 不要使用会话,请尝试以下操作:
$t911_user = new JUser($userId);
它将直接从数据库中加载,并获取刚刚保存的值