Extending Sonata User Bundle and adding new fields
Solution 1
I found out the issue was a doctrine issue. My extended bundle was utilizing the original xml field mappings. I deleted those files and reverted to annotations. Everything worked brilliantly from there. I hope this helps someone else who is experiencing the same issue.
Solution 2
1. Create a new bundle
Something like AcmeUserBundle. Create it and register it as you do normally.
2. Create a new User entity
Then create a User
and Group
entity which extends Sonata\UserBundle\Entity\BaseUser
and Sonata\UserBundle\Entity\BaseGroup
. You should also add the configuration for the primary key, for instance:
/**
* @ORM\Entity
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
}
3. Configure the entity
then, go to your app/config/config.yml
file and configure these new entities:
sonata_user:
class:
user: Acme\UserBundle\Entity\User
group: Acme\UserBundle\Entity\Group
4. Override the UserAdmin class
Then, you need to create a new UserAdmin class. To do this, just create a new UserAdmin
class inside your bundle, extend Sonata\UserBundle\Admin\Model\UserAdmin
and override the methods like this:
namespace Acme\UserBundle\Admin;
use Sonata\UserBundle\Admin\Model\UserAdmin as SonataUserAdmin;
class UserAdmin extends SonataUserAdmin
{
/**
* {@inheritdoc}
*/
protected function configureFormFields(FormMapper $formMapper)
{
parent::configureFormFields($formMapper);
$formMapper
->with('new_section')
->add(...)
// ...
->end()
;
}
}
5. Replace the old UserAdmin class
Then, you need to make sure Sonata uses the new UserAdmin class. You just need to set the sonata.user.admin.user.class
parameter to your new class and your ready!
# app/config/config.yml
parameters:
sonata.user.admin.user.class: Acme\UserBundle\Admin\UserAdmin
Justin Griffith
Updated on June 15, 2022Comments
-
Justin Griffith almost 2 years
I am extending the Sonata User Bundle and creating some extra fields in the new user entity. These fields will only be updated within the Sonata admin area under users so they do not need to be available in the edit profile form. I am having trouble updating these fields via the Sonata User Manager and tried several different ways to extend/implement that class in Application\Sonata\UserBundle. Has anyone encountered this before and can give me a tutorial or step by step process of the cleanest way to extend the new User entity?
-
Justin Griffith about 11 yearsI am actually already to the end of these steps. My issue comes into play when I extend the User entity class with new properties and then want those properties to be updated on "Update" within the Sonata Admin area. The preUpdate() function is not updating the new fields.
-
Justin Griffith about 11 yearsYes, but will they be used in the Sonata Admin area? That is what is happening to me. The entities work correctly for any front end areas, but not in the admin area.
-
likeitlikeit about 11 years@JustinGriffith, do the fields show in the Edit form of your entity? If yes, what happens when you click Update? It would help if you could edit your question to post your
config.yml
(minus private data) and theAppKernel.php
file. Please try to describe the problem as precisely as possible. -
likeitlikeit about 11 years@JustinGriffith By the way, to use
preUpdate()
(as stated in the comment to the answer by Wouter J), you need to use theHasLifeCycleCallbacks
, as detailed e.g. here. -
Pierre de LESPINAY almost 11 yearsDo you know how to inject other parameters into this admin class ? I don't see the related service.
-
Wouter J almost 11 years@PierredeLESPINAY just override
sonata.user.admin.user
-
Pierre de LESPINAY almost 11 yearsDo we have to redefine all the values ? tags, arguments, ... Do you have a YML example somewhere ?
-
Beniston almost 11 yearsCan you please provide any link which would detail this setup process?