我一直在努力弥合Joomla和CiviCRM个人资料更新。最初,我想要做的是在Joomla配置文件电子邮件更改时更新CiviCRM匹配配置文件(注意:当civi电子邮件发生更改时,最新的civi版本将更新Joomla配置文件电子邮件...因此该方面已被覆盖) 。有了这个,我有代码可以工作。也就是说,当我从经过身份验证的会话中手动触发代码时,它会正确更新civi电子邮件。现在我尝试将此代码嵌入到Joomla user_profile插件中,这样当用户更改其电子邮件时,它将更新civi电子邮件。
注意:我知道不要破解核心代码。最后,我将使用我的自定义代码创建一个新的配置文件插件,但为了简化开发过程中我使用的是核心user_profile插件。阅读此内容的任何人,请勿在生产中使用以下代码!它不完整,核心不应被黑客攻击。
这有效,但是我发现如果用户没有注销会话,然后在同一会话中第二次更改电子邮件,则无法识别最新的电子邮件(旧电子邮件是用过),但如果用户注销然后登录,更改电子邮件,它将工作。我希望这是有道理的。
问题必须与变量的“实例”有关,或者与此有关,但我是PHP编码的新手,并不太确定我做错了什么。我已将自定义代码放在user_profile插件的profile.php脚本中的onUserAfterSave函数中。
任何PHP程序员都知道如何解决这个问题,以便下面的自定义代码会在Joomla中每次更改电子邮件时触发,无论是否在同一个会话期间?
我的代码:
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;
}
答案 0 :(得分:0)
JFactory:getUser()正在从会话中检索用户对象。这意味着它只在会话为空时,即每次登录后从数据库中读取。您描述的问题与用户电子邮件在保存到数据库后未保存到会话中是一致的,因此它始终使用登录时读取的值。
不要使用会话,请尝试以下方法:
$t911_user = new JUser($userId);
实际上将直接从数据库加载并获取刚刚保存的值。