Zend Framework 2 Doctrine 2 Eins-zu-Viele-Kontrollkästchen-Hydratation

Lesezeit: 3 Minuten

Benutzeravatar von Mohammad ZeinEddin
Mohammad ZeinEddin

Ich habe ein ManyToMany in die ich eingebrochen bin OneToMany Und ManyToOne Beziehung. Ich möchte ein Formular erstellen, das Kontrollkästchen anstelle einer Sammlung enthält, und ich verwende den Hydrator „DoctrineObject“, aber er funktioniert nicht und ich weiß nicht, was falsch läuft.

Ich habe aus meinem Code unten alle anderen nicht verwandten Felder entfernt.

Rollenentität:

/**
 * @orm\Entity
 * @orm\Table(name="roles")
 */
class RolesEntity extends HemisEntity {
    /**
     * @orm\Id
     * @orm\Column(type="integer");
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;
    
    /**
     * @orm\Column(name="role_code",type="string")
     */
    protected $roleCode;

    /**
     * @orm\OneToMany(targetEntity="RolesPermissionsEntity", mappedBy="role", cascade={"persist"})
     */
    protected $rolePermissions;

    public function __construct()
    {
        $this->rolePermissions = new ArrayCollection();
    }

    public function setRolePermissions($rolePermissions)
    {
        $this->rolePermissions = $rolePermissions;
        return $this;
    }
    
    public function addRolePermissions(Collection $rolePermissions)
    {
        foreach ($rolePermissions as $rolePermission) {
            $rolePermission->setRole($this);
            $this->rolePermissions->add($rolePermission);
        }
    }
    
    public function removeRolePermissions(Collection $rolePermissions)
    {
        foreach ($rolePermissions as $rolePermission) {
            $rolePermission->setRole(null);
            $this->rolePermissions->removeElement($rolePermission);
        }
    }
    
    public function getRolePermissions()
    {
        return $this->rolePermissions;
    }
}

Die ManyToMany-Tabellenentität (Es hat mehr Felder und deshalb habe ich es kaputt gemacht):

    /**
 * @orm\Entity
 * @orm\Table(name="roles_permissions")
 */
class RolesPermissionsEntity extends HemisEntity {
    /**
     * @orm\Id
     * @orm\Column(type="integer");
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;
    
    /**
     * @orm\ManyToOne(targetEntity="RolesEntity", inversedBy="rolePermissions")
     * @orm\JoinColumn(name="role_id", referencedColumnName="id")
     **/
    protected $role;
    
    /**
     * @orm\ManyToOne(targetEntity="PermissionsEntity", inversedBy="permissionRoles")
     * @orm\JoinColumn(name="permission_id", referencedColumnName="id")
     **/
    protected $permission;
    
    public function setRole($role)
    {
        $this->role = $role;
        return $this;
    }
    
    public function getRole()
    {
        return $this->role;
    }

    public function setPermission($permission)
    {
        $this->permission = $permission;
        return $this;
    }

    public function getPermission()
    {
        return $this->permission;
    }
}

Mein Formular sieht so aus:

class RoleForm extends Form implements InputFilterProviderInterface
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('role');

        $this->setHydrator(new DoctrineHydrator($objectManager))
             ->setObject(new RolesEntity());

        $this->add(array(
            'type' => 'Zend\Form\Element\Hidden',
            'name' => 'id'
        ));

        $this->add(array(
            'type'    => 'Zend\Form\Element\Text',
            'name'    => 'roleCode',
            'options' => array(
                'label' => 'Role Code'
            ),
        ));

        $this->add(array(
            'name' => 'rolePermissions',
            'type' => 'DoctrineModule\Form\Element\ObjectMultiCheckbox',
            'options' => array(
                'label' => 'Permissions',
                'object_manager' => $objectManager,
                'target_class'   => 'Hemis\Fnd\PermissionsEntity',
                'property'       => 'permissionDesc'
            ),
        ));
        
        $this->add(array(
            'name' => 'submit',
            'type'  => 'Submit',
            'attributes' => array(
                'value' => 'Submit',
            ),
        ));
    }

    public function getInputFilterSpecification()
    {
        return array(
            'roleCode' => array(
                'required' => false
            ),
            'rolePermissions' => array(
                'required' => true
            )
        );
    }
}

Das Problem ist, dass, wenn ich das wegwerfe $role es enthält keine rolePermissions Und obwohl sie aus der Form weitergegeben werden, werden sie einfach nicht in das Objekt hydratisiert.

Was stimmt mit meinem Code nicht? Gibt es eine bessere Möglichkeit, dies mithilfe von Kontrollkästchen zu tun?

  • Ich verstehe nicht, warum hast du die Viele-zu-Viele-Beziehung abgebrochen? Und wo ist die PermissionsEntity? Ihr Entitätsdiagramm scheint etwas daneben zu liegen. Versuchen Sie einfach, ein RolesEntity m2m mit PermissionsEntity zu haben.

    – Stefano Torresi

    3. April 2015 um 12:52 Uhr

class RoleForm extends Form implements InputFilterProviderInterface
{
    public function __construct(ObjectManager $objectManager)
    {
        // ...

        $this->add(array(
            'name' => 'rolePermissions',
            'type' => 'Zend\Form\Element\Collection',
            'options' => array(
                'label' => 'Role Permissions',
                'count' => 0,
                'should_create_template' => true,
                'allow_add' => true,
                'target_element' => array(
                    'type' => 'Zend\Form\Fieldset',
                    'options' => array(
                        'use_as_base_fieldset' => true
                    ),
                    'elements' => array(
                        // add form fields for the properties of the RolesPermissionsEntity class here
                        array(
                            'name' => 'id',
                            'type' => 'Zend\Form\Element\Hidden',
                        ),
                        array(
                            'name' => 'role',
                            'type' => 'Zend\Form\Element\Checkbox',
                            // other options
                        ),
                        // ...
                    ),
                ),
            ),
        ));

        // ...
    }

    // ...
}

1454150cookie-checkZend Framework 2 Doctrine 2 Eins-zu-Viele-Kontrollkästchen-Hydratation

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy