2011-12-16 3 views
0

저는 Joomla 및 CiviCRM 프로필 업데이트를 연결하려고했습니다. 처음에 Joomla 프로필 전자 메일이 변경되면 CiviCRM 일치 프로필이 업데이트됩니다 (참고 : 최신 Civi 버전은 Civi 전자 메일이 변경 될 때 Joomla 프로필 전자 메일을 업데이트합니다. . 그걸로, 나는 작동 코드가 있습니다. 즉, 인증 된 세션 내부에서 코드를 수동으로 실행하면 Civi 전자 메일이 제대로 업데이트됩니다. 이제 사용자가 전자 메일을 변경할 때 전자 메일을 업데이트하도록 Joomla user_profile 플러그 인에이 코드를 포함하려고합니다.PHP - 같은 세션에서 "재설정 중"변수가 없습니다.

참고 : 핵심 코드를 해킹하지 않는 것이 좋습니다. 궁극적으로, 커스텀 코드로 새로운 프로필 플러그인을 만들 겠지만, 개발 과정에서 단순화를 위해 핵심 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

JFactory : 인 getUser()이 세션에서 사용자 개체를 검색하는 중입니다. 즉, 세션이 비어있을 때, 즉 로그인 할 때마다 데이터베이스에서 읽는 것입니다. 사용자가 설명하는 문제는 DB에 저장 한 후 세션에 저장되지 않는 사용자 전자 메일과 일치하므로 항상 로그인시 읽은 값을 사용합니다.

$t911_user = new JUser($userId); 

실제로 데이터베이스에서 직접로드 할 그냥 저장된 값을 얻을 :

오히려 세션을 사용하는 것보다, 이것을 시도.