Пользовательский пакет сонаты, переопределение

Я пытаюсь использовать пользовательский пакет сонаты. Я должен добавить несколько полей.

Я видел папку Application\Sonata\UserBundle, которая создается при установке пользовательского пакета сонаты.

Затем я попытался изменить файл Entity\User.php:

<?php

namespace Application\Sonata\UserBundle\Entity;

use Sonata\UserBundle\Entity\BaseUser as BaseUser;

class User extends BaseUser
{
    /**
     * @var integer $id
     */
    protected $id;

    /**
     * Get id
     *
     * @return integer $id
     */
    public function getId()
    {
        return $this->id;
    }

Например добавление:

<?php

namespace Application\Sonata\UserBundle\Entity;

use Sonata\UserBundle\Entity\BaseUser as BaseUser;

class User extends BaseUser
{
    /**
     * @var integer $id
     */
    protected $id;

    /**
     * Get id
     *
     * @return integer $id
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * @var String $nom
     */
    protected $nom;
/**
 * Get nom
 *
 * @return string 
 */
public function getNom() {
    return $this->nom;
}

Но моя база данных не обновляется и ничего не работает. Вы знаете, как это сделать?

В качестве альтернативы я также попытался написать в файле UserAdmin.php:

 $formMapper
            ->with('General')
                ->add('username')
                ->add('email')
                ->add('plainPassword', 'text', array(
                    'required' => (!$this->getSubject() || is_null($this->getSubject()->getId()))
                ))
                ->add('nom')
            ->end()
            ->with('Groups')
                ->add('groups', 'sonata_type_model', array(
                    'required' => false,
                    'expanded' => true,
                    'multiple' => true
                ))
            ->end()

Но у меня следующая ошибка:

Please define a type for field `Prenom` in `Sonata\UserBundle\Admin\Entity\UserAdmin`

Спасибо С уважением


person anubis    schedule 05.04.2015    source источник


Ответы (1)


После того, как вы создали пакет пользователя easy extension для сонаты, соната создает файлы orm для сущностей, например, если ваш расширенный пакет создан в src/Application, то ваши файлы отображения формы будут сгенерированы в src/Application/Sonata/UserBundle/Resources/config/doctrine как User.orm.xml или User.mongodb.xml в зависимости от типа вашей базы данных, добавьте определение поля в файл отображения доктрины

<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
                  http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
    <entity name="Application\Sonata\UserBundle\Entity\User" table="fos user table name">
        <id name="id" column="id" type="integer">
            <generator strategy="AUTO" />
        </id>
        <field name="nom" type="string" column="title" length="255" nullable="false"/>
    </entity>
</doctrine-mapping>

Если вам не нужно сопоставление xml и вы хотите использовать аннотации, переименуйте папку доктрины во что-то другое, например src/Application/Sonata/UserBundle/Resources/config/doctrine-backup, теперь в вашем объекте User добавьте сопоставление полей в виде аннотации.

namespace Application\Sonata\UserBundle\Entity;
use Sonata\UserBundle\Entity\BaseUser as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="fos user table name")
 * @ORM\Entity
 */
class User extends BaseUser {
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name="nom", type="string", length=255, nullable=true)
     */
    protected $nom;

    /**
     * Set nom
     *
     * @param string $nom
     *
     * @return User
     */
    public function setNom( $nom) {
        $this->nom= $nom;

        return $this;
    }

    /**
     * Get nom
     *
     * @return string
     */
    public function getNom() {
        return $this->nom;
    }

}

Также следует отметить одну вещь: не изменяйте основные файлы пакета, как ваша ошибка говорит, что Sonata\UserBundle\Admin\Entity\UserAdmin попытайтесь переопределить класс администратора основного пользователя. Sonata предоставляет способ через конфигурацию пользовательского пакета для определения класса администратора.

sonata_user:
    class:                  # Entity Classes
        user:               Application\Sonata\UserBundle\Entity\User
        group:              Application\Sonata\UserBundle\Entity\Group

    admin:                  # Admin Classes
        user:
            class:          Application\Sonata\UserBundle\Admin\UserAdmin # there define your extended admin class
            controller:     SonataUserBundle:UserCURD
            translation:    SonataUserBundle

        group:
            class:          Sonata\UserBundle\Admin\Entity\GroupAdmin
            controller:     SonataAdminBundle:CRUD
            translation:    SonataUserBundle
person M Khalid Junaid    schedule 03.05.2015
comment
@M Khalid Junaid Я добавил новое имя поля как $nic и решил его. но на стороне администратора поле помечено как form.label_nic, но оно должно отображаться как nic. - person Muhammad Taqi; 29.09.2015