Я расширяю пакет User Sonata и создаю дополнительные поля в новом пользовательском объекте. Эти поля будут обновляться только внутри области администрирования Sonata, поэтому они не должны быть доступны в форме профиля редактирования. У меня возникли проблемы с обновлением этих полей через Sonata User Manager и попробовал несколько разных способов расширения/реализации этого класса в Application\Sonata\UserBundle. Кто-нибудь сталкивался с этим раньше и может дать мне учебник или пошаговый процесс самого чистого способа расширить новый пользовательский объект?
Расширение пользовательского пакета Sonata и добавление новых полей
Ответ 1
Я узнал, что проблема была вопросом доктрины. В моем расширенном пакете использовались исходные сопоставления полей xml. Я удалил эти файлы и вернулся к аннотации. Оттуда все было блестяще. Я надеюсь, что это поможет кому-то другому, кто испытывает ту же проблему.
Ответ 2
1. Создайте новый пакет
Что-то вроде AcmeUserBundle. Создайте его и зарегистрируйте, как обычно.
2. Создайте новый пользовательский объект
Затем создайте объект User
и Group
, который расширяет Sonata\UserBundle\Entity\BaseUser
и Sonata\UserBundle\Entity\BaseGroup
. Вы также должны добавить конфигурацию для первичного ключа, например:
/**
* @ORM\Entity
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
}
3. Настроить объект
затем перейдите в свой app/config/config.yml
файл и настройте эти новые объекты:
sonata_user:
class:
user: Acme\UserBundle\Entity\User
group: Acme\UserBundle\Entity\Group
4. Переопределить класс UserAdmin
Затем вам нужно создать новый класс UserAdmin. Для этого просто создайте новый класс UserAdmin
внутри вашего пакета, расширьте Sonata\UserBundle\Admin\Model\UserAdmin
и переопределите следующие методы:
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. Замените старый класс UserAdmin
Затем вам нужно убедиться, что Sonata использует новый класс UserAdmin. Вам просто нужно установить параметр sonata.user.admin.user.class
в ваш новый класс и ваш готовый!
# app/config/config.yml
parameters:
sonata.user.admin.user.class: Acme\UserBundle\Admin\UserAdmin
Ответ 3
Это легко, но SonataUserBundle
документация довольно короткая. В принципе, после настройки двух пакетов, как описано здесь и здесь:
Вам нужно создать класс для расширения класса Sonata\UserBundle\Entity\BaseUser
в SonataUserBundle
. Обратите внимание: если вы переопределите конструктор, вы все равно должны вызвать конструктор родительского объекта.
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;
}
}
Если вам нужно, вы также можете переопределить объект Sonata\UserBundle\Entity\BaseGroup
аналогичным образом.
Затем отредактируйте свой config.yml
, чтобы он соответствовал вашим пространствам имен, например
# 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
Очистите кеш. Ваши объекты будут использоваться вместо встроенных.