1

Как вы устанавливаете культуру пользователя во время процесса signin, который обрабатывается sfDoctrineGuardPlugin? Каждый пользователь может установить предпочтительный язык, который хранится в таблице sfGuardUserProfile.Настройка пользовательской культуры при signin с помощью sfDoctrineGuardPlugin

Первоначально я думал о переопределении функции executeSignin() делать что-то похожее на это:

public function executeSignin(sfWebRequest $request) 
{ 
    $this->getUser()->setCulture($this->getUser()->getGuardUser()->getProfile()->getLanguage()); 
    parent::executeSignin($request); 
} 

, но очевидно, что я не могу этого сделать, так как у меня нет доступа к объекту GuardUser перед родительской функции выполняется.

Тогда я подумал о создании postExectute() функцию, подобную этой:

public function postExecute() 
{ 
    if($this->getUser()->isAuthenticated()){ 
    //SET USER CULTURE 
    } 
} 

но опять-таки это не может работать, потому что функция делает для входа в аккаунт редирект так postExecute() никогда не будет работать.

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

ответ

2

Я пойду на что-то легче, чем заново создаю действие.

В файле /apps/[your app]/lib/user/myUser.class.php, который простирается sfGuardSecurityUser:

Вы можете переопределить signIn функцию так:

public function signIn($user, $remember = false, $con = null) 
{ 
    parent::signin($user, $remember, $con); 

    $this->setCulture($user->getProfile()->getLanguage()); 
} 

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

+0

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

+0

@MichalTrojanowski это всегда зависит от того, сколько работы вам нужно сделать * вокруг * метод signIn :) – j0k

+0

Спасибо! Это именно то, что я искал. Также в качестве бонуса я не понимал, что могу опустить 'getGuardUser()' и напрямую вызвать getProfile() '. Отлично. – Zach

0

У вас нет доступа к объекту sfGuardUser перед аутентификацией. Это не означает, что у вас нет доступа к sfUser из экземпляра action, который вам нужен.

ли линия

$this->getUser()->isAuthenticated() 

не предлагает вам, что пользователь не обязательно проверки подлинности при вызове его.

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

В Symfony sfUser представляет собой сеанс PHP, который запускается до входа пользователя, а не пользователя. Вы пытаетесь манипулировать данными сеанса с помощью sfUser :: setAttribute, чтобы они работали.

+0

Я понимаю, что у меня есть доступ к sfUser, чтобы установить культуру, однако я не знаю, какую культуру установить, пока я не получу доступ к объекту sfGuardUser, так как пользователь сохраняет предпочтение своего языка в таблице sfGuardUserProfile. Что касается 'isAuthenticated()' call ... эта функция 'postExecute()' находится в модуле sfGuardAuth, который также обрабатывает вывеску, поэтому мне нужно проверить и убедиться, что пользователь аутентифицирован до того, как попытаюсь получить доступ к объекту sfGuardUser или мне будут возникать ошибки. – Zach

+0

Итак, почему бы вам не обернуть линию, которая пытается установить культуру в первом фрагменте в условное выражение во втором фрагменте? Я имею в виду NOT в postExecute, но на месте (в первом фрагменте). – marekful

1

Ваше первое предположение является правильным подходом, просто нужно изменить;)

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

$this->getUser()->setCulture($this->getUser()->getGuardUser()->getProfile()->getLanguage()); 

непосредственно перед перенаправлением сделано - поэтому, когда у вас уже есть профиль, присвоенный ваша пользовательская сессия.

Вы можете изменить настройки в settings.yml иметь sfDoctrineGuard использовать новое действие:

all: 
    .settings: 
    login_module:   myCleverModule 
    login_action:   signinMyUser 

Вы также можете создать папку в app/appName/modules/sfGuardAuth/actions, создать actions.class.php там и положить вашу executeSignin() функции в этом файле. Он автоматически переопределит оригинал из плагина.

+0

Спасибо за хороший ответ. Я принял ответ j0k, потому что он более изящный для моих текущих потребностей. Если в будущем мне нужно добавить больше логики или настроить функциональность по умолчанию, ваше решение, безусловно, будет правильным. – Zach

Смежные вопросы