Antworten auf deine Fragen:
Neues Thema erstellen

Antworten zum Thema „Symfony 2.3 Dynamisches Formular“

Greenhorn79

Nicht mehr ganz neu hier

Hallo zusammen,

ich bräuchte ein dynamisches Formular in Symfony 2.3. Ich suche und probiere nun schon 14 Tage aber ich finde einfach keine Lösung.

Ich habe zwei Entities eine Projekt und eine Artikel mit einer ManytoOne-Beziehung, was in der Article.php so aussieht:

PHP:
/**
     * @ORM\ManyToOne(targetEntity="Pso\ProjectBundle\Entity\Project", inversedBy="article")
     * @ORM\JoinColumn(name="project_id", referencedColumnName="id")
     */
     private $projects;

Der Controller sieht wie folgt aus ( es soll hier ein mal das Projekt dargestellt werden was auch ohne Probleme funktioniert und einmal die zugehörigen Artikel was leider nicht funktioniert):

PHP:
public function maintainProjectAction(id $id, Request $request)
    {
        $em = $this->getDoctrine()->getManager();   
        $project = $em->getRepository('PsoProjectBundle:Project')->find($id);
        $form =  $this->createForm(new MaintainProjectType(),$project);
        $form->handleRequest($request);
       
        //$article = $em->getRepository('PsoProjectBundle:Project')->findArticle($id);
        //return New Response (var_dump($article));
        //$form2 =  $this->createForm(new ArticleType($article));
        //$form2 =  $this->createForm(new ArticleType($article),$form_data);
        //$form2 =  $this->createForm(new ArticleType(),$article);
        $form2 = $this->createForm(new ArticleType($id));
        $form2->handleRequest($request);
}

An den Kommentaren sieht man, dass ich schon verschiedenes versucht habe :)

Im Repository findet man einen entsprechenden Select, der auch die richtigen Daten liefert:
PHP:
public function findArticle($id)
    {
        return $this->getEntityManager()
            ->createQuery(
                'SELECT a.id,a.category,a.product_description,a.article_nr,a.color,a.carton_qty
                  FROM PsoProjectBundle:article a
                  JOIN a.projects p
                  WHERE p.id = :id
                '
            )
            ->setParameter('id', $id)
            ->getResult();
    }

Mein ArticleType sieht momentan so aus:

PHP:
<?php

namespace Pso\ProjectBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;


class ArticleType extends AbstractType
{

protected $id;

    public function __construct(id $id) {
        $this->id        = $id;
    }
    
    public function buildForm(FormBuilderInterface $builder, array $options)
    {   
                $id = $this->id;
        $builder
            ->add('category','text', array('label' => 'Category'))
            ->add('product_description','text', array('label' => 'Product description'))
            ->add('article_nr','text', array('label' => 'Article-Nr'))
            ->add('id', 'entity', array(
                  'class' => 'PsoProjectBundle:Article',
                    'query_builder' => function(EntityRepository $er) use ($id) {
                             return $er->createQuery ('SELECT a.id
                  FROM PsoProjectBundle:article a
                  JOIN a.projects p
                  WHERE p.id = :id')
                             ;
                         },
            ))
            ->add('color','text', array('label' => 'color'))
            ->add('carton_qty','text', array('label' => 'carton_qty'))
            ->add('qty','text', array('label' => 'qty'))
            ->add('carton','text', array('label' => 'carton'))
            ->add('size','text', array('label' => 'size'))
            ->add('price','text', array('label' => 'price'))
            ->add('price_calculation_file','text', array('label' => 'price_calculation_file'))
            ->add('closed','text', array('label' => 'closed'))
            ->add('dbinsert','text', array('label' => 'dbinsert'))
            ->add('dbupdate','text', array('label' => 'dbupdate'))
            ->add('product_packaging','text', array('label' => 'product_packaging'))
            ->add('outer_packaging','text', array('label' => 'outer_packaging'))
            ->add('submit', 'submit',  array(
                'attr'=> array (
                    'formnovalidate' => 'formnovalidate')))
            ;
    }
   
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Pso\ProjectBundle\Entity\Article',
        ));
    }
   
   
    public function getName()
    {
        return 'Article';
    }
}

Dies so wie es jetzt aussieht, bewirkt immer den Fehler
Class Pso\ProjectBundle\Controller\id does not exist

Mittlerweile habe ich soviel probiert, verschiedene Fehler erhalten, aber ich komme nicht weiter. Daher wäre ich unsagbar froh, wenn jemand einen Tipp für mich hätte.

Viele Grüße
Micha
 

fakerer

Aktives Mitglied

ich vermute mal die fehlermeldung kommt von
Code:
public function maintainProjectAction(id $id, Request $request)
id ist kein datentyp ausser du hast es als alias
 

Greenhorn79

Nicht mehr ganz neu hier

Hallo fakerer,

ja du hast Recht. Das habe ich auch wieder herausgenommen. Ich hatte es in einem Tutorial zu dynamischen Formularen gefunden.

Mein Problem ist, dass ich die id nicht in die Type-Datei bekomme um diese dann im Select als Parameter zu verwenden. Oder aber ich alternativ nicht die Ergebnismenge meines Selects im Repository-File in die Type-Datei bekomme. Irgendwie stehe ich was das dynamische Formular betrifft ziemlich auf der Leitung und verstehe den Grundsatz nicht trotz Cookbook etc.

Hast du hier vielleicht einen Tipp für mich, wie es genau funktioniert?

Viele Grüße
Micha
 

fakerer

Aktives Mitglied

ich würde das ganze mit Hilfe einer collection machen

da du eine manytoone in deiner articel entity hast nehme ich mal an, ein Projekt kann mehrere Artikel haben

dann baust in die articel entite also der onetomany seite in den constructor
Code:
$this->articels = new ArrayCollection();

im project formtype baust dann
Code:
$builder->add('articels', 'collection', array(
'type'=>'ArticelEntity',
...
))


oder wenn du nur ein select haben willst mit den articeln einfach dem projectform den entitymanager oder repository übergeben, und dort dann zb in einem repository die daten für das selct holen und dann also choices dem select hinzufügen


ps: query_builder im formtype gefällt mir hab ich so noch nie gesehen :)
 

Greenhorn79

Nicht mehr ganz neu hier

Ich habe jetzt deinen Vorschlag versucht und dem Projectform den Repository zu übergeben und als Choices dem Select hinzuzufügen:

Das sieht im Controller so aus:

PHP:
$form2 = $this->createForm(new ArticleType($this->getDoctrine()));
        if ($request->getMethod() == 'POST') {
        $form2->bindRequest($request);}


Im Repository:
PHP:
public function findArticle($id)
    {
        return $this->getEntityManager()
            ->createQuery(
                'SELECT a.id,a.category,a.product_description,a.article_nr,a.color,a.carton_qty,a.qty,a.carton,a.size,a.price,a.price_calculation_file,
                 a.closed,a.dbinsert,a.dbupdate,a.product_packaging,a.outer_packaging
                  FROM PsoProjectBundle:article a
                  JOIN a.projects p
                  WHERE p.id = :id
                '
            )
            ->setParameter('id', $id)
            ->getArrayResult();
    }

Und im FormType:
PHP:
<?php

namespace Pso\ProjectBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;


class ArticleType extends AbstractType
{


  
    public function buildForm(FormBuilderInterface $builder, array $options)
    { 
            $builder
            ->add('article', 'choice', array('choices'=>$this->getArticles(), 'multiple'=>true) )  
            ->add('type', 'entity', array('class'=>'PsoProjectBundle:propertytype',
                                          'property'=>'name',
                                          'multiple'=>true           
                ))
            ->add('articles', 'collection', array('type'=>'ArticleEntity',))
            ->add('category','text', array('label' => 'Category'))
            ->add('product_description','text', array('label' => 'Product description'))
            ->add('article_nr','text', array('label' => 'Article-Nr'))
            ->add('color','text', array('label' => 'color'))
            ->add('carton_qty','text', array('label' => 'carton_qty'))
            ->add('qty','text', array('label' => 'qty'))
            ->add('carton','text', array('label' => 'carton'))
            ->add('size','text', array('label' => 'size'))
            ->add('price','text', array('label' => 'price'))
            ->add('price_calculation_file','text', array('label' => 'price_calculation_file'))
            ->add('closed','text', array('label' => 'closed'))
            ->add('dbinsert','text', array('label' => 'dbinsert'))
            ->add('dbupdate','text', array('label' => 'dbupdate'))
            ->add('product_packaging','text', array('label' => 'product_packaging'))
            ->add('outer_packaging','text', array('label' => 'outer_packaging'))
        ;
    }
 
     private function getArticles()
{
    $choices = array();
    $articles = $this->doctrine->getRepository('PsoProjectBundle:Project')->findArticle($id);

    foreach ($articles as $article) {
        $choices[$article->getId()] = $article->getName();
    }


    return $choices;
}

public function getName()
  {
  return 'Article';
  }
}

Ich bekomme dafür den Fehler
ContextErrorException: Notice: Undefined property: Pso\ProjectBundle\Form\ArticleType::$doctrine in C:\xampp\htdocs\pso\src\Pso\ProjectBundle\Form\ArticleType.php line 105
 
Zuletzt bearbeitet:
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
175.189
Beiträge
2.582.077
Mitglieder
67.259
Neuestes Mitglied
SaschMasch1312
Oben