Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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 :
[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) :
[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 :
[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