SonataAdminBundle 无法更新用户密码
SonataAdminBundle can not update the user password
我无法通过 sonataadmin 仪表板更新用户密码。
我使用symfony2 FosUserBundle2.0 SonataAdminBundle(但是不使用SonataUserBundle)并按照文档来做。
MyUserBundle\Admin\UserAdmin.php
class UserAdmin 像这样扩展 Admin
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
......
->add('plainPassword', 'repeated', array(
'type' => 'password',
'options' => array('translation_domain' => 'FOSUserBundle'),
'first_options' => array('label' => 'form.password'),
'second_options' => array('label' => 'form.password_confirmation'),
'invalid_message' => 'fos_user.password.mismatch',
'required' => false,
)
)
..
}
使用sonataadminbundle
dashboard新建用户没有问题,但是使用dashboard更新密码时,DB中的密码没有变化
其他人可以更新,但是密码,我不知道为什么。没有任何错误信息。
我是 symfony2 的新手,有人帮助我吗?
感谢kwozny,现在我修复了~
我没有更改功能 configureFormFields 代码,只是按照 kwozny 的建议,添加以下 code.i 不知道为什么,但我工作了!
我可以更新密码,当我更新其他密码时(密码字段为空),密码不会更改。
public function prePersist($object)
{
parent::prePersist($object);
}
public function preUpdate($object)
{
parent::preUpdate($object);
}
那是因为您必须捕获对象 User(preUpdate() 和 prePersist())并使用 $user->setPlainPassword 设置密码。这就是我的代码的样子:
改为:
->add('plainPassword', 'repeated', array(
'type' => 'password',
'options' => array('translation_domain' => 'FOSUserBundle'),
'first_options' => array('label' => 'form.password'),
'second_options' => array('label' => 'form.password_confirmation'),
'invalid_message' => 'fos_user.password.mismatch',
'required' => false,
)
)
我有:
->add('newPass', 'text', array(
'label' => 'New password (empty filed means no changes)',
'required' => FALSE
))
然后在同一个管理文件中:
public function prePersist($object) {
parent::prePersist($object);
$this->updateUser($object);
}
public function preUpdate($object) {
parent::preUpdate($object);
$this->updateUser($object);
}
public function updateUser(\AppBundle\Entity\User $u) {
if ($u->getNewPass()) {
$u->setPlainPassword($u->getNewPass());
}
$um = $this->getConfigurationPool()->getContainer()->get('fos_user.user_manager');
$um->updateUser($u, false);
}
我根据 kamwoz 的回答找到了一个更好的方法,它对我有用。
在 FormMapper 中:
$passwordoptions=array(
'type' => 'password',
'options' => array('translation_domain' => 'FOSUserBundle'),
'first_options' => array('label' => 'form.password'),
'second_options' => array('label' => 'form.password_confirmation'),
'translation_domain' => 'FOSUserBundle',
'invalid_message' => 'fos_user.password.mismatch',
);
$this->record_id = $this->request->get($this->getIdParameter());
if (!empty($this->record_id)) {
$passwordoptions['required'] = false;
} else {
$passwordoptions['required'] = true;
}
$formMapper
// ...
->add('plainPassword', 'repeated', $passwordoptions)
注意:如果用户存在,我添加了条件:不需要密码,新用户:需要通过。
现在只需在管理员中添加如下代码:
public function prePersist($object) {
parent::prePersist($object);
$this->updateUser($object);
}
public function preUpdate($object) {
parent::preUpdate($object);
$this->updateUser($object);
}
public function updateUser(\AppBundle\Entity\User $u) {
$um = $this->getConfigurationPool()->getContainer()->get('fos_user.user_manager');
$um->updateUser($u, false);
}
无需更改用户实体,只需像往常一样使用 plainPassword。
在我的例子中添加
public function preUpdate($object) {
parent::preUpdate($object);
//$this->updateUser($object);
if($object->getPlainPassword())
{
$um = $this->getConfigurationPool()->getContainer()->get('fos_user.user_manager');
$um->updateCanonicalFields($object);
$um->updatePassword($object);
}
}
在我的案例中,我已经通过这种方式解决了。我的回答如下。我已经将上述答案的一些代码与奏鸣曲类型 repeated 的代码一起使用,因此验证仍然适用于相同的密码验证。
public function prePersist($object)
{
parent::prePersist($object);
}
public function preUpdate($object)
{
parent::preUpdate($object);
$this->updateUser($object);
}
//update password
public function updateUser(\AppBundle\Entity\User $u) {
if ($u->getPlainPassword()) {
$u->setPlainPassword($u->getPlainPassword());
}
$um = $this->getConfigurationPool()->getContainer()->get('fos_user.user_manager');
$um->updateUser($u, false);
}
protected function configureFormFields(FormMapper $formMapper)
{
$pass_required = false;
//if form is create then add required validation
if (!$this->subject->getId())
$pass_required = true;
$formMapper->add('name', 'text')
->add('email', 'email', array('label' => "Email") )
->add('username', 'text', array('label' => "Username") )
->add('groups', 'entity', array(
'class' => 'AppBundle\Entity\Group',
'required' => false,
'multiple' =>true
))
->add('plainPassword', 'repeated', array(
'type' => 'password',
'options' => array('translation_domain' => 'FOSUserBundle'),
'first_options' => array('label' => 'form.password'),
'second_options' => array('label' => 'form.password_confirmation'),
'invalid_message' => 'fos_user.password.mismatch',
'required' => $pass_required,
))
->end()
;
}
我无法通过 sonataadmin 仪表板更新用户密码。
我使用symfony2 FosUserBundle2.0 SonataAdminBundle(但是不使用SonataUserBundle)并按照文档来做。
MyUserBundle\Admin\UserAdmin.php
class UserAdmin 像这样扩展 Admin
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
......
->add('plainPassword', 'repeated', array(
'type' => 'password',
'options' => array('translation_domain' => 'FOSUserBundle'),
'first_options' => array('label' => 'form.password'),
'second_options' => array('label' => 'form.password_confirmation'),
'invalid_message' => 'fos_user.password.mismatch',
'required' => false,
)
)
..
}
使用sonataadminbundle
dashboard新建用户没有问题,但是使用dashboard更新密码时,DB中的密码没有变化
其他人可以更新,但是密码,我不知道为什么。没有任何错误信息。
我是 symfony2 的新手,有人帮助我吗?
感谢kwozny,现在我修复了~ 我没有更改功能 configureFormFields 代码,只是按照 kwozny 的建议,添加以下 code.i 不知道为什么,但我工作了! 我可以更新密码,当我更新其他密码时(密码字段为空),密码不会更改。
public function prePersist($object)
{
parent::prePersist($object);
}
public function preUpdate($object)
{
parent::preUpdate($object);
}
那是因为您必须捕获对象 User(preUpdate() 和 prePersist())并使用 $user->setPlainPassword 设置密码。这就是我的代码的样子:
改为:
->add('plainPassword', 'repeated', array(
'type' => 'password',
'options' => array('translation_domain' => 'FOSUserBundle'),
'first_options' => array('label' => 'form.password'),
'second_options' => array('label' => 'form.password_confirmation'),
'invalid_message' => 'fos_user.password.mismatch',
'required' => false,
)
)
我有:
->add('newPass', 'text', array(
'label' => 'New password (empty filed means no changes)',
'required' => FALSE
))
然后在同一个管理文件中:
public function prePersist($object) {
parent::prePersist($object);
$this->updateUser($object);
}
public function preUpdate($object) {
parent::preUpdate($object);
$this->updateUser($object);
}
public function updateUser(\AppBundle\Entity\User $u) {
if ($u->getNewPass()) {
$u->setPlainPassword($u->getNewPass());
}
$um = $this->getConfigurationPool()->getContainer()->get('fos_user.user_manager');
$um->updateUser($u, false);
}
我根据 kamwoz 的回答找到了一个更好的方法,它对我有用。
在 FormMapper 中:
$passwordoptions=array(
'type' => 'password',
'options' => array('translation_domain' => 'FOSUserBundle'),
'first_options' => array('label' => 'form.password'),
'second_options' => array('label' => 'form.password_confirmation'),
'translation_domain' => 'FOSUserBundle',
'invalid_message' => 'fos_user.password.mismatch',
);
$this->record_id = $this->request->get($this->getIdParameter());
if (!empty($this->record_id)) {
$passwordoptions['required'] = false;
} else {
$passwordoptions['required'] = true;
}
$formMapper
// ...
->add('plainPassword', 'repeated', $passwordoptions)
注意:如果用户存在,我添加了条件:不需要密码,新用户:需要通过。
现在只需在管理员中添加如下代码:
public function prePersist($object) {
parent::prePersist($object);
$this->updateUser($object);
}
public function preUpdate($object) {
parent::preUpdate($object);
$this->updateUser($object);
}
public function updateUser(\AppBundle\Entity\User $u) {
$um = $this->getConfigurationPool()->getContainer()->get('fos_user.user_manager');
$um->updateUser($u, false);
}
无需更改用户实体,只需像往常一样使用 plainPassword。
在我的例子中添加
public function preUpdate($object) {
parent::preUpdate($object);
//$this->updateUser($object);
if($object->getPlainPassword())
{
$um = $this->getConfigurationPool()->getContainer()->get('fos_user.user_manager');
$um->updateCanonicalFields($object);
$um->updatePassword($object);
}
}
在我的案例中,我已经通过这种方式解决了。我的回答如下。我已经将上述答案的一些代码与奏鸣曲类型 repeated 的代码一起使用,因此验证仍然适用于相同的密码验证。
public function prePersist($object)
{
parent::prePersist($object);
}
public function preUpdate($object)
{
parent::preUpdate($object);
$this->updateUser($object);
}
//update password
public function updateUser(\AppBundle\Entity\User $u) {
if ($u->getPlainPassword()) {
$u->setPlainPassword($u->getPlainPassword());
}
$um = $this->getConfigurationPool()->getContainer()->get('fos_user.user_manager');
$um->updateUser($u, false);
}
protected function configureFormFields(FormMapper $formMapper)
{
$pass_required = false;
//if form is create then add required validation
if (!$this->subject->getId())
$pass_required = true;
$formMapper->add('name', 'text')
->add('email', 'email', array('label' => "Email") )
->add('username', 'text', array('label' => "Username") )
->add('groups', 'entity', array(
'class' => 'AppBundle\Entity\Group',
'required' => false,
'multiple' =>true
))
->add('plainPassword', 'repeated', array(
'type' => 'password',
'options' => array('translation_domain' => 'FOSUserBundle'),
'first_options' => array('label' => 'form.password'),
'second_options' => array('label' => 'form.password_confirmation'),
'invalid_message' => 'fos_user.password.mismatch',
'required' => $pass_required,
))
->end()
;
}