Флажок Zend Framework 2 Doctrine 2 "один ко многим" для увлажнения

У меня есть ManyToMany что я вломился OneToMany а также ManyToOne отношения. Я хочу создать форму с флажками вместо коллекции, и я использую гидратор DoctrineObject, но он не работает, и я не знаю, что происходит не так.

Я удалил из своего кода ниже всех других не связанных полей.

Роль

/**
 * @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;
    }
}

Сущность таблицы ManyToManyней больше полей, и я разбил ее):

    /**
 * @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;
    }
}

Моя форма выглядит так:

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

Проблема в том, что когда я сбрасываю $role не содержит rolePermissions и даже то, что они переданы из формы, они просто не гидратированы в объект. Я надеюсь, что мой вопрос ясен.

Любая идея о том, что не так с моим кодом или есть лучший способ сделать это с помощью флажков?

2 ответа

      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
                        ),
                        // ...
                    ),
                ),
            ),
        ));

        // ...
    }

    // ...
}

вы неправильно обрабатываете rolePermissions. при использовании DoctrineHydrator вам необходимо убедиться, что поле является свойством, настроенным для обработки ассоциации с RolesPermissionsEntity.

      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\RolesPermissionsEntity', // Update the target class to RolesPermissionsEntity
                'property'       => 'permission', // Update the property to permission
                'is_method'      => true, // Add this line
                'find_method'    => array( // Add this line
                    'name'   => 'findPermissionsForRole', // Replace with your custom method name
                    'params' => array(
                        'criteria' => array('role' => $this->getObject()), // Use the getObject() method to get the current RolesEntity object
                    ),
                ),
            ),
        ));

        $this->add(array(
            'name' => 'submit',
            'type'  => 'Submit',
            'attributes' => array(
                'value' => 'Submit',
            ),
        ));
    }

    public function getInputFilterSpecification()
    {
        return array(
            'roleCode' => array(
                'required' => false
            ),
            'rolePermissions' => array(
                'required' => true
            )
        );
    }
}
Другие вопросы по тегам