EmbedMany i Skjema

stemmer
2

Jeg har laget en liten Symfony2-nettside (med Symfony PR11) med MongoDB som DB. Jeg kunne lage et skjema, som bruker et vanlig dokument, men hvordan bruker jeg et dokument med en embeddedDocument?

her er de dokumenter:

/**
 * @mongodb:Document(collection=location)
 */
class Location
{
    /**
     * @mongodb:Id
     */
    protected $id;

    /**
     * @mongodb:String
     */
    protected $locationName;

    /**
     * @mongodb:EmbedMany(targetDocument=LocationTerminal)
     */
    protected $terminals = array();

    // Setter

    public function setTerminals(LocationTerminal $terminal)
    {
        array_push($this->terminals, $terminal);
    }

    public function setLocationName($locationName)
    {
        $this->locationName = $locationName;
    }


    // Getter

    public function getId()
    {
        return $this->$id;
    }

    public function getLocationName()
    {
        return $this->locationName;
    }

    public function getTerminals()
    {
        return $this->terminals;
    }

}

Den EmbeddedDocument:

/**
 * @mongodb:EmbeddedDocument
 */
class LocationTerminal
{
    /**
     * @mongodb:String
     */
    protected $terminalName;

    /**
     * @mongodb:Int
     */
    protected $since;

    /**
     * @mongodb:Int
     */
    protected $to;

    // Setter

    public function setTerminalName($terminalName)
    {
        $this->terminalName = $terminalName;
    }

    public function setSince($since)
    {
        $this->since = $since;
    }

    public function setTo($to)
    {
        $this->to = $to;
    }

    // Getter

    public function getTerminalName()
    {
        return $this->terminalName;
    }

    public function getSince()
    {
        return $this->since;
    }

    public function getTo()
    {
        return $this->to;
    }

}

Som du ser $terminalshar en EmbedMany-Document Her er skjemaet:

class LocationForm extends Form
{
    public function configure()
    {
        $this->add(new TextField('locationName', array('max_length' => 255, 'required' => true)));
    }

    public function addTerminals($dm)
    {
        $this->add(new ChoiceField('terminals.terminalName', array('choices' => $dm)));
        $this->add(new DateField('terminals.since', array('required' => true)));
        $this->add(new DateField('terminals.to', array('required' => false)));
    }
}

Den brukte Controller ser slik ut:

class LocationController extends Controller
{
    protected $location;
    protected $locationTerminal;

    protected function getDm()
    {
        return $this->get('doctrine.odm.mongodb.document_manager');
    }

    protected function getLocation($name = null)
    {
        if ($name != null)
        {
            $dm = $this->getDm();
            $this->location = $dm->getRepository('RalfBundle:Location')->findOneBy(array('locationName' => $name));
            if (! $this->location)
            {
                $this->location = new Location();
                $this->locationTerminal = new LocationTerminal();
                $this->location->setLocation($name);
                $this->location->setTerminals($this->locationTerminal);
            }
        }
        else
        {
            $this->location = new Location();
            $this->locationTerminal = new LocationTerminal();
            $this->location->setTerminals($this->locationTerminal);
            $this->locationTerminal->setSince(0);
            $this->locationTerminal->setTerminalName();
            $this->locationTerminal->setTo(0);
        }
    }


protected function getForm()
{
    $form = LocationForm::create($this->get('form.context'), 'location');
    $dm = $this->getDm();
    $form->addTerminals($dm->getRepository('RalfBundle:Terminal')->findAll()->toArray());
    return $form;
}


//... some Actions

    public function createAction()
    {
        $this->getLocation();
        $form = $this->getForm();

        $form->bind($this->get('request'), $this->location);

        if ($form->isValid())
        {
            $dm = $this->getDm();
            $dm->persist($this->location);
            $dm->flush();
            return $this->redirect($this->generateUrl('Location'));
        }
        return $this->render('RalfBundle:Ralf:location_create.html.twig', array('form' => $form));
    }

Jeg kunne se at locationNamemottar de angitte verdier i form, men EmbedMany-Array terminalser fortsatt tom. Hva gjorde jeg galt?

Takk for hjelpen: D

OPPDATERT:

Ok, fant en løsning.

i public function addTerminals($dm)i LocationFormskal det se slik ut:

public function addTerminals($dm)
{
    $this->add(new ChoiceField('terminals.0.terminalName', array('choices' => $dm)));
    $this->add(new DateField('terminals.0.since', array('required' => true, 'type'=> 'timestamp')));
    $this->add(new DateField('terminals.0.to', array('required' => false, 'type' => 'timestamp')));
}
  1. 'type' => 'timestamp'er nødvendig, fordi DateFieldvil skape en DateTime-Object, men dokumentet ventet en Intfor timestamp.
  2. et felt fra terminals-array kan åpnes av normal dot-notasjon.
Publisert på 15/04/2011 klokken 11:06
kilden bruker
På andre språk...                            


2 svar

stemmer
0

Symfony 2 faktisk gir deg et verktøy for å håndtere innebygde dokumenter i former: Det kalles " samling felttype ", og det gjør det mulig å legge inn andre formtypes (fra andre innebygde dokumenter) i en overordnet form.

Den kan konfigureres til å tillate / forby tillegg / sletting av innebygde dokumenter og er faktisk ganske kraftig.

Svarte 14/08/2013 kl. 10:10
kilden bruker

stemmer
0

Ok, fant en løsning.

i public function addTerminals($dm)i LocationFormskal det se slik ut:

public function addTerminals($dm)
{
    $this->add(new ChoiceField('terminals.0.terminalName', array('choices' => $dm)));
    $this->add(new DateField('terminals.0.since', array('required' => true, 'type'=> 'timestamp')));
    $this->add(new DateField('terminals.0.to', array('required' => false, 'type' => 'timestamp')));
}
  1. 'type' => 'timestamp'er nødvendig, fordi DateFieldvil skape en DateTime-Object, men dokumentet ventet en Intfor timestamp.
  2. et felt fra terminals-array kan åpnes av normal dot-notasjon.
Svarte 18/08/2012 kl. 08:08
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more