0

我一直在努力连接 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;
    }
4

1 回答 1

0

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

而不是使用会话,试试这个:

$t911_user = new JUser($userId);

这实际上将直接从数据库加载并获取刚刚保存的值。

于 2012-02-16T16:01:40.150 回答