Udvidelse af Sonata Bruger Bundt og tilføjelse af nye felter

Jeg udvide Sonata Bruger Bundt og skabe nogle ekstra felter i den nye brugers enhed. Disse felter vil kun blive opdateret i løbet af Sonaten admin område, der er under-brugere, så de ikke behøver at være til rådighed på rediger profil form. Jeg har problemer med at opdatere disse felter via Sonata User Manager og har prøvet flere forskellige måder at udvide/implementere en klasse i Programmet\Sonata\UserBundle. Er der nogen der er stødt på det før, og kan give mig en tutorial eller trinvis proces for den sikreste metode til at udvide den nye Bruger enhed?

OriginalForfatteren Justin Griffith | 2013-03-25

3 svar

  1. 29

    1. Opret et nyt bundt

    Noget som AcmeUserBundle. Skabe det og registrere det, som du gør normalt.

    2. Opret en ny Bruger enhed

    Derefter oprette en User og Group enhed, der strækker sig Sonata\UserBundle\Entity\BaseUser og Sonata\UserBundle\Entity\BaseGroup. Du bør også tilføje konfiguration for den primære nøgle, for eksempel:

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

    3. Konfigurer enhed

    så gå til din app/config/config.yml fil og konfigurer disse nye enheder:

    sonata_user:
        class:
            user: Acme\UserBundle\Entity\User
            group: Acme\UserBundle\Entity\Group

    4. Tilsidesætte UserAdmin klasse

    Derefter, du er nødt til at oprette en ny UserAdmin klasse. For at gøre dette, skal du bare oprette en ny UserAdmin klasse inde i din bundt, udvide Sonata\UserBundle\Admin\Model\UserAdmin og tilsidesætte de metoder, som dette:

    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. Udskift den gamle UserAdmin klasse

    Derefter, du er nødt til at sørge for, Sonata bruger den nye UserAdmin klasse. Du skal bare sætte den sonata.user.admin.user.class parameter, til din nye klasse, og din klar!

    # app/config/config.yml
    parameters:
        sonata.user.admin.user.class: Acme\UserBundle\Admin\UserAdmin
    Jeg er faktisk allerede til afslutningen af disse trin. Mit spørgsmål kommer i spil, når jeg giver Brugeren enhed klasse med nye egenskaber, og derefter ønsker, at disse egenskaber for at blive opdateret på “Opdater” i Sonata Admin område. Den preUpdate() funktion er ikke at opdatere de nye felter.
    Ved du, hvordan du skal injicere andre parametre i dette admin klasse ? Jeg kan ikke se den tilknyttede arbejdsydelse.
    bare tilsidesætte sonata.user.admin.user
    Vi er nødt til at omdefinere alle de værdier ? tags, argumenter, … har du en YML eksempel et eller andet sted ?
    Kan du give et link, som ville detaljeret beskrivelse af setup-processen?

    OriginalForfatteren Wouter J

  2. 7

    Jeg fandt ud af det var en lære spørgsmål. Min udvidede bundle var at udnytte den oprindelige xml felttilknytninger. Jeg har slettet disse filer og vendte tilbage til anmærkninger. Alt fungerede glimrende. Jeg håber dette hjælper en anden person, der oplever det samme problem.

    OriginalForfatteren Justin Griffith

  3. 0

    Det er let, men SonataUserBundle dokumentation er temmelig kort på denne. Dybest set, når du har konfigureret de to bundter, som beskrevet her og her:

    Du nødt til at oprette en klasse til at udvide Sonata\UserBundle\Entity\BaseUser klasse i SonataUserBundle. Bemærk, at hvis du tilsidesætter entreprenøren, at du stadig skal kalde det overordnede objekt ‘ s constructor.

    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;
        }
    }

    Hvis du har brug for det, kan du også tilsidesætte Sonata\UserBundle\Entity\BaseGroup objekt på en lignende måde.

    Derefter redigere din config.yml til at matche din namespaces, som denne

    # 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

    Ryd cache. Dine enheder vil blive anvendt i stedet for den indbyggede dem.

    Ja, men de vil blive brugt i Sonaten Admin område? Det er, hvad der sker for mig. De enheder, som fungerer korrekt for alle front-end-områder, men ikke i området admin.
    gør felter vis i Rediger form af din virksomhed? Hvis ja, hvad sker der, når du klikker på Opdater? Det ville hjælpe hvis du kunne redigere dine spørgsmål for at sende din config.yml (minus private data) og AppKernel.php fil. Så prøv at beskriv problemet så præcist som muligt.
    Af den måde, er at bruge preUpdate() (som anført i kommentaren til besvarelse af Wouter J), er du nødt til at bruge HasLifeCycleCallbacks, som beskrevet fx her.

    OriginalForfatteren likeitlikeit

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *