PHP - переменная не "сбрасывается" во время той же сессии - PullRequest
0 голосов
/ 16 декабря 2011

Я работаю, чтобы связать обновления профилей Joomla и CiviCRM.Изначально все, что я хочу сделать, это обновить профиль соответствия CiviCRM при изменении электронной почты профиля Joomla (Примечание: последняя версия civi будет обновлять электронную почту профиля Joomla при изменении электронной почты civi ... так, чтобы эта сторона была закрыта),С этим у меня есть код, который будет работать.То есть он будет корректно обновлять электронную почту, когда я вручную запускаю код из аутентифицированного сеанса.Сейчас я пытаюсь внедрить этот код в плагин Joomla user_profile, чтобы при изменении пользователем электронной почты он обновлял электронную почту civi.

Примечание. Я знаю, что не нужно взламывать основной код.В конечном итоге я создам новый плагин профиля с моим пользовательским кодом, но для простоты в процессе разработки я использую основной плагин user_profile.Любой, кто читает это, не используйте код ниже в производстве!Это неполно, и ядро ​​не должно быть взломано.

Это работает, однако я обнаружил, что если пользователь не выходит из сеанса, а затем изменяет электронную почту во второй раз в том же сеансе, самый новыйэлектронная почта не распознается (используется старая электронная почта), но если пользователь выходит из системы, а затем снова входит в систему, меняет электронную почту, он будет работать.Я надеюсь, что это имеет смысл.

Проблема должна иметь отношение к «экземпляру» переменной или что-то в этом роде, но я новичок в кодировании PHP и не совсем уверен, что яделать неправильно.Я поместил свой пользовательский код в функцию onUserAfterSave в скрипте profile.php плагина user_profile.

Любые программисты 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;
    }

1 Ответ

0 голосов
/ 16 февраля 2012

JFactory: getUser () извлекает объект пользователя из сеанса.Это означает, что он читает только из базы данных, когда сеанс пуст, т.е. после каждого входа в систему.Проблема, которую вы описываете, согласуется с тем, что электронная почта пользователя не сохраняется в сеансе после ее сохранения в БД, поэтому она всегда использует значение, прочитанное при входе в систему.

Вместо того, чтобы использовать сеанс, попробуйте следующее:

$t911_user = new JUser($userId);

, который будет фактически загружаться напрямую из базы данных и получать только что сохраненные значения.

...