2011-12-16 16 views
0

私はJoomlaとCiviCRMのプロファイル更新を橋渡しするために働いています。最初は、私がしたいのは、Joomlaのプロファイルの電子メールが変更されたときにCiviCRMの一致するプロファイルを更新することです(注:最新のCiviのバージョンは、Civiの電子メールが変更されたときにJoomlaのプロファイルの電子メールを更新します... 。それで、私は動作するコードを持っています。つまり、認証されたセッションの内部からコードを手動で起動すると、電子メールが正しく更新されます。今私はこのコードをJoomlaのuser_profileプラグインに埋め込み、ユーザーが電子メールを変更したときに電子メールを更新するようにしています。PHP - 同じセッション中に変数が "リセット"されない

注:私はコアコードをハックしないことを知っています。最終的には、カスタムコードで新しいプロファイルプラグインを作成しますが、開発中のシンプルさのために、core_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); 

実際にデータベースから直接ロードすると、先ほど保存した値を取得:

むしろセッションを使用するよりも、これを試してみてください。

関連する問題