php - texto - Extender el paquete de usuario de Sonata y agregar nuevos campos
string strip_tags (3)
1. Crea un nuevo paquete
Algo así como AcmeUserBundle. Créelo y regístrelo como lo hace normalmente.
2. Crea una nueva entidad de usuario
A continuación, cree una entidad de User
y Group
que extienda Sonata/UserBundle/Entity/BaseUser
y Sonata/UserBundle/Entity/BaseGroup
. También debe agregar la configuración para la clave principal, por ejemplo:
/**
* @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 la entidad
luego, vaya a su archivo app/config/config.yml
y configure estas nuevas entidades:
sonata_user:
class:
user: Acme/UserBundle/Entity/User
group: Acme/UserBundle/Entity/Group
4. Reemplace la clase UserAdmin
Entonces, necesitas crear una nueva clase UserAdmin. Para hacerlo, simplemente cree una nueva clase UserAdmin
dentro de su paquete, amplíe Sonata/UserBundle/Admin/Model/UserAdmin
y anule los métodos como este:
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. Reemplazar la antigua clase UserAdmin
Luego, debes asegurarte de que Sonata use la nueva clase UserAdmin. Solo necesita establecer el parámetro sonata.user.admin.user.class
en su nueva clase y listo!
# app/config/config.yml
parameters:
sonata.user.admin.user.class: Acme/UserBundle/Admin/UserAdmin
Extiendo el paquete de usuario de Sonata y creando algunos campos adicionales en la nueva entidad de usuario. Estos campos solo se actualizarán dentro del área de administración de Sonata bajo los usuarios, por lo que no es necesario que estén disponibles en el formulario de edición de perfil. Tengo problemas para actualizar estos campos a través del Administrador de usuarios de Sonata y probé varias formas diferentes de extender / implementar esa clase en Application / Sonata / UserBundle. ¿Alguien ha encontrado esto antes y puede darme un tutorial o proceso paso a paso de la manera más limpia para extender la nueva entidad de usuario?
Esto es fácil, pero la documentación de SonataUserBundle
es bastante corta en esto. Básicamente, después de configurar los dos paquetes como se describe aquí y aquí :
Necesita crear una clase para extender la clase Sonata/UserBundle/Entity/BaseUser
en SonataUserBundle
. Tenga en cuenta que si anula el constructor, aún debe llamar al constructor del objeto principal.
namespace Your/Bundle/Entity;
use Doctrine/ORM/Mapping as ORM;
use Doctrine/ORM/EntityManager;
use Sonata/UserBundle/Entity/BaseUser as BaseUser;
/**
* @ORM/Entity
* @ORM/Table(name="user",indexes={@ORM/Index(name="username_idx", columns={"username"})})
*/
class User extends BaseUser {
public function __construct()
{
parent::__construct();
// your code here
}
/**
* @ORM/Column(type="string")
*/
protected $firstName = "";
public function getFirstName() {
return $this->firstName;
}
public function setFirstName($firstName) {
$this->firstName = $firstName;
}
}
Si es necesario, también puede anular el objeto Sonata/UserBundle/Entity/BaseGroup
de forma similar.
Luego, edite su config.yml
para que coincida con sus espacios de nombres, como este
# FOS User Bundle Configuration
fos_user:
user_class: Your/Bundle/Entity/User
# To also override the Group object
# group:
# group_class: Your/Bundle/Entity/Group
# Sonata User Bundle configuration
sonata_user:
class:
user: Your/Bundle/Entity/User
# To also override the Group object
# group: Your/Bundle/Entity/Group
Borrar el caché Se usarán sus entidades en lugar de las integradas.
Descubrí que el problema era un problema de doctrina. Mi paquete extendido estaba utilizando las asignaciones de campo xml originales. Eliminé esos archivos y volví a anotaciones. Todo funcionó brillantemente desde allí. Espero que esto ayude a alguien más que está experimentando el mismo problema.