PHP-变量在同一会话期间未“重置”

PHP-变量在同一会话期间未“重置”,php,joomla,joomla1.7,civicrm,Php,Joomla,Joomla1.7,Civicrm,我一直在努力沟通Joomla和CiviCRM的档案更新。最初,我只想在Joomla配置文件电子邮件更改时更新CiviCRM匹配配置文件注:最新的civi版本将在civi电子邮件更改时更新Joomla配置文件电子邮件…因此,这一方面已涵盖在内。有了这些,我就有了可以工作的代码。也就是说,当我在经过身份验证的会话中手动触发代码时,它将正确更新civi电子邮件。现在,我正在尝试将此代码嵌入Joomla user_profile插件中,以便当用户更改其电子邮件时,它将更新civi电子邮件 注意:我知道不

我一直在努力沟通Joomla和CiviCRM的档案更新。最初,我只想在Joomla配置文件电子邮件更改时更新CiviCRM匹配配置文件注:最新的civi版本将在civi电子邮件更改时更新Joomla配置文件电子邮件…因此,这一方面已涵盖在内。有了这些,我就有了可以工作的代码。也就是说,当我在经过身份验证的会话中手动触发代码时,它将正确更新civi电子邮件。现在,我正在尝试将此代码嵌入Joomla user_profile插件中,以便当用户更改其电子邮件时,它将更新civi电子邮件

注意:我知道不要破解核心代码。最终,我将用我的自定义代码创建一个新的概要文件插件,但为了在开发过程中简单起见,我使用的是核心用户_概要文件插件。任何阅读本文的人,请勿在生产中使用下面的代码!它是不完整的,核心不应该被黑客攻击

这是可行的,但是我发现,如果用户不注销会话,然后在同一会话中再次更改电子邮件,则不会识别最新的电子邮件。使用的是旧电子邮件,但如果用户注销后再登录,更改电子邮件,则会起作用。我希望这是有道理的

这个问题一定与变量的实例或类似的东西有关,但我对PHP编码还不熟悉,不太确定我做错了什么。我已经将自定义代码放在user\u profile plugin的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;
    }

JFactory:getUser正在从会话检索用户对象。这意味着它只在会话为空时(即每次登录后)从数据库读取数据。您描述的问题与用户电子邮件保存到DB后未保存到会话一致,因此它始终使用登录时读取的值

不要使用会话,请尝试以下操作:

$t911_user = new JUser($userId);
它将直接从数据库中加载,并获取刚刚保存的值