Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 07-12-2017 12:55:32

globule
Nouveau membre
Date d'inscription: 30-11-2017
Messages: 1

Formulaires et entités

Bonjour,

J'ai un problème et je n'arrive pas à trouver de solution. J'ai une table "versions" liée à des "types" par l’intermédiaire d'une autre table ("Versionstypes"). Voilà les entités correspondantes :

Code:

[lang=php]
<?php 
/**
 * @ORM\Table(name="Versions")
 * @ORM\Entity
 */
class Versions
{
    /**
     * @var integer @ORM\Column(name="IdVersion", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var \Doctrine\Common\Collections\Collection @ORM\OneToMany(targetEntity="\Entity\Versionstypes", mappedBy="version",cascade={"persist"})
     */
    private $versionstypes;
}


/**
 * @ORM\Table(name="Versionstypes")
 * @ORM\Entity
 */
class Versionstypes
{
    /**
     * @var \Entity\Versions
     * @ORM\ManyToOne(targetEntity="\Entity\Versions", inversedBy="versionstypes",cascade={"persist"})
     * @ORM\JoinColumns({
     * @ORM\JoinColumn(name="IdVersion", referencedColumnName="IdVersion", nullable=false, onDelete="cascade")
     * })
     */
    private $version;
    

    /**
     * @var \Entity\Types
     * @ORM\ManyToOne(targetEntity="\Entity\Types4decouv", inversedBy="versionstypes",cascade={"persist"})
     * @ORM\JoinColumns({
     * @ORM\JoinColumn(name="IdType", referencedColumnName="IdType", nullable=false)
     * })
     */
    private $types;
    
    /**
     * @var string
     *
     * @ORM\Column(name="Texte", type="string", length=255, nullable=true)
     */
    private $texte;
    
    ...
} 

/**
 * Types
 *
 * @ORM\Table(name="Types")
 * @ORM\Entity
 */
class Types
{    
    /**
     * @var integer
     *
     * @ORM\Column(name="IdType", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\OneToMany(targetEntity="\Entity\Versionstypes", mappedBy="types")
     */
    private $versionstypes;
    
    /**
     * @ORM\Column(name="Affichetype1", type="boolean", options={"default":0})
     */
    private $affichetype1;

    /**
     * @ORM\Column(name="Affichetype2", type="boolean", options={"default":0})
     */
    private $affichetype2;
        
    ...
}

Dans un formulaire qui édite une version je dois afficher :
- 1 fieldset qui contient le champ "texte" (de "Versionstypes") d'un certain "type" (ex : id = 1 et 2 et 3) lié à la version
- 1 fieldset qui contient le champ "texte" (de "Versionstypes") d'un certain "type" (ex : id = 3 et 4 et 5) lié à la version

Je suis donc parti sur un formulaire de ce genre mais ça n'affiche rien dans ma vue (ce qui est un peu logique pour le moment) :

Code:

[lang=php]
class EditVersionForm extends Form implements InputFilterProviderInterface
{    
    $this->add([
        'type' => 'Zend\Form\Element\Collection',
        'name' => 'versionstypestype1',
        'options' => [
            'count' => -1,
            'should_create_template' => true,
            'allow_add' => true,
            'allow_remove' => true,
            'template_placeholder' => '__placeholder__',
            'target_element' =>new VersionsTypesFieldset($this->entityManager, 'type1'),
        ],
    ]);
    
    $this->add([
        'type' => 'Zend\Form\Element\Collection',
        'name' => 'versionstypestype2',
        'options' => [
            'count' => -1,
            'should_create_template' => true,
            'allow_add' => true,
            'allow_remove' => true,
            'template_placeholder' => '__placeholder__',
            'target_element' =>new VersionsTypesFieldset($this->entityManager, 'type2')
        ],
    ]);
    ...
}

class VersionsTypesFieldset extends Fieldset /*implements InputFilterProviderInterface */
{
    public function __construct(EntityManager $entityManager, $name=null)
   {
        parent::__construct ( 'versionstypes4decouv'.$name );
        $this->entityManager = $entityManager;

        $hydrator = new DoctrineHydrator ( $this->entityManager );
        //         $hydrator->addStrategy('datedeb', new DateTimeStrategy);
        //           $hydrator->addStrategy('datefin', new DateTimeStrategy);
        $this->setHydrator ( $hydrator )->setObject ( new Versionstypes());

        $this->add ([
            'type' => 'DoctrineModule\Form\Element\ObjectSelect',
            'name' => 'type4decouvtype1',
            'options' => [
                'object_manager' => $this->entityManager,
                'target_class' => '\Entity\Types',
                'property' => 'nomtype4decouv',
                'is_method' => true,
                //                         'find_method' => [
                //                                 'name' => 'getType4DeCouvEdito',
                //                         ],
                'find_method' => [
                    'name' => 'findBy',
                    'params' => [
                        'criteria' => ['affichetype1'=>1],
                        'orderBy'  => ['id' => 'ASC'],
                    ],
                ],
                'label' => ('Types de résumés'),
                'label_attributes' => [
                    'class' => 'control-label'
                ],
                'disable_inarray_validator' => true,
            ],
            'attributes' => [
                'id' => 'type2',
            ],
        ]);

        $this->add ( array (
            'type' => 'DoctrineModule\Form\Element\ObjectSelect',
            'name' => 'type4decouvtype2',
            'options' => array (
                'object_manager' => $this->entityManager,
                'target_class' => '\Entity\Types4decouv',
                'property' => 'nomtype4decouv',
                'is_method' => true,
                //                         'find_method' => array (
                    //                                 'name' => 'getType4DeCouvEdito',
                    //                         ),
                'find_method' => array (
                    'name' => 'findBy',
                    'params' => array(
                        // Use key 'orderBy' if using ORM
                        'criteria' => array('affichetype2'=>1),
                        'orderBy'  => array('id' => 'ASC'),
                    ),
                ),
            ),
            'attributes' => array (
                'id' => 'type2',
            )
        ) );

        $this->add ( array (
            'type' => 'Zend\Form\Element\Textarea',
            'name' => 'texte',
            'options' => array (
                'label' => ('Texte'),
            ),
            'attributes' => array (
                //'required' => 'required',
                'id' => 'texte',
            )
        ) );
    }
}

En gros je voudrais bien arriver à faire ce genre de requête :

Code:

[lang=sql]
SELECT VersionsTypes.Texte, Types.id
FROM Versions
INNER JOIN VersionsTypes ON Versions.Id = VersionsTypes.IdVersion
INNER JOIN Types ON (Types.IdType = VersionsTypes.IdType AND Types.Affichetype1 = 1 /* ou 2 */
WHERE Versions.Id = 1

Je ne sais pas trop comment m'y prendre pour faire ça. Si quelqu'un a une idée je suis preneur.

Merci

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages