Przemysław Godlewski

Przemysław Godlewski Own company/PHP
programmer/Web
Developer

Temat: dynamiczna zmiana typu pola w formularzu

witam

zastanawiam sie czy istnieje mozliwosc zmiany typu pola w formularzu w zaleznosci od tego czy w kontrolerze zachodzi pewien warunek lub nie, a mianowicie:

ogolnie mam formularz z polem menu (jest to select menu):

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('menu', null, array('label' => '* Wybierz menu:', 'empty_value' => '- wybierz
menu -'))
}

chcialbym zrobic, ze jesli w kontrolerze ustawiona jest zmienna $parent_id: $parent_id=$request->get('parent_id');

to $builder->add('menu') powinno zostac zamienione na tekstowe pole hidden z wybraną juz wartoscią menu (zamiast selecta)

Zastanawiam sie jak mozna w metodzie buildForm odczytac $request'a albo czy jest jakas inna metoda ktora zamieni pole formularza select na pole hidden po stronie KONTROLERA przed renderowaniem htmla (w kontrolerze moglbym sprawdzic pewne warunki i zmienic typ pola), tylko jak?
Piotr Lewandowski

Piotr Lewandowski Programista
aplikacji
internetowych (PHP,
MySQL, SF2, Mag...

Temat: dynamiczna zmiana typu pola w formularzu

Jeśli chodzi o dynamiczne generowanie / modyfikowanie formularzy:
http://symfony.com/doc/current/cookbook/form/dynamic_f...

Krótko mówiąc: w klasie formularza raczej bym tego nie robił, tylko dodał event subscriber do klasy formularza. Piotr Lewandowski edytował(a) ten post dnia 02.01.13 o godzinie 10:23
Przemysław Godlewski

Przemysław Godlewski Own company/PHP
programmer/Web
Developer

Temat: dynamiczna zmiana typu pola w formularzu

tak, to jest z pewnoscia droga, tylko szukam jak przekazac zmienna z kontrolera do klasy eventu oraz jak wygenerowac albo pole select albo pole hidden...
Piotr Lewandowski

Piotr Lewandowski Programista
aplikacji
internetowych (PHP,
MySQL, SF2, Mag...

Temat: dynamiczna zmiana typu pola w formularzu

Ja to robię np. tak:


<?php

namespace Madcoders\FileStorageBundle\Form\EventListener;

use Symfony\Component\Form\Event\DataEvent;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvents;

class FileStorageTypeSubscriber implements EventSubscriberInterface
{
private $factory;

public function __construct(FormFactoryInterface $factory)
{
$this->factory = $factory;
}

public static function getSubscribedEvents()
{
return array(
FormEvents::PRE_SET_DATA => 'preSetData',
);
}

public function preSetData(DataEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
if (null === $data)
{
return;
}
if ($data->getId())
{
$form->add($this->factory->createNamed('delete_file', 'checkbox'));
}
}
}


Druga sprawa, to radzę przekazać cokolwiek musimy do klasy formularza / entity (jeśli formularz jest powiązany z obiektem Doctrine). Do obiektu formularza dostaniesz sie poprzez obiekt DataEvent.

Jeśli potrzebujesz dostępu do jakiś komponentów / serwisów wewnątrz klasy formularza, to eventualnie można wstrzyknąć zależności za pomocą Service Container, definiując "formularz" jako serwis i tagując go jako "form.type".


services:
form.type.fileStorage:
class: %madcoders.file.form.class%
tags:
- { name: form.type, alias: fileStorage }


Zależności wstrzykujesz jak do każdego innego serwisu np:

arguments: [ @doctrine, @madcoders.file.config, @annotation_reader ]


http://symfony.com/doc/current/book/service_container....

Następna dyskusja:

formularze w ssf 2.1.4 -wym...




Wyślij zaproszenie do