Buscar..
Sintaxis
- $ form = $ this-> createForm (HouseholdType :: class, $ household, $ formOptions);
Parámetros
Parámetro | Definición |
---|---|
Tipo de Hogar :: clase | clase de formulario personalizado para la entidad del hogar |
$ hogar | una instancia de la entidad del hogar (generalmente creada por $household = new Household(); ) |
$ formOptions | un conjunto de opciones definidas por el usuario para pasar a la clase de formulario, por ejemplo, $formOptions = array('foo' => 'bar'); |
Observaciones
Al crear una clase de formulario, los campos de formulario se agregan en la public function buildForm(FormBuilderInterface $builder, array $options) {...}
. El parámetro $options
incluye un conjunto de opciones predeterminadas, como attr
y label
. Para permitir que sus opciones personalizadas estén disponibles en la clase de formulario, las opciones deben inicializarse en configureOptions(OptionsResolver $resolver)
Así que para nuestro ejemplo del mundo real:
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Household',
'disabledOptions' => [],
));
}
Un ejemplo del mundo real de un controlador de la casa
Antecedentes: la entidad del hogar incluye un conjunto de opciones, cada una de las cuales es una entidad que se administra en un backend de administración. Cada opción tiene una bandera enabled
booleana. Si una opción previamente habilitada está configurada como deshabilitada, deberá persistir en las ediciones posteriores de Household, pero no podrá ser eliminada. Para lograr esto, la definición de campo en la clase de formulario mostrará el campo como un campo de opción deshabilitado si la opción ha enabled = false
(pero se mantiene porque el botón de envío activa un javascript que elimina el atributo disabled
). La definición de campo también evita las opciones deshabilitadas de ser mostrado.
La clase de formulario debe saber, para una entidad del hogar determinada, cuál de sus opciones se ha deshabilitado. Se ha definido un servicio que devuelve una matriz de los nombres de las entidades de opción que se han deshabilitado. Esa matriz es $disabledOptions
.
$formOptions = [
'disabledOptions' => $disabledOptions,
];
$form = $this->createForm(HouseholdType::class, $household, $formOptions);
Cómo se usan las opciones personalizadas en la clase de formulario
->add('housing', EntityType::class,
array(
'class' => 'AppBundle:Housing',
'choice_label' => 'housing',
'placeholder' => '',
'attr' => (in_array('Housing', $options['disabledOptions']) ? ['disabled' => 'disabled'] : []),
'label' => 'Housing: ',
'query_builder' => function (EntityRepository $er) use ($options) {
if (false === in_array('Housing', $options['disabledOptions'])) {
return $er->createQueryBuilder('h')
->orderBy('h.housing', 'ASC')
->where('h.enabled=1');
} else {
return $er->createQueryBuilder('h')
->orderBy('h.housing', 'ASC');
}
},
))
Entidad de vivienda
/**
* Housing.
*
* @ORM\Table(name="housing")
* @ORM\Entity
*/
class Housing
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var bool
*
* @ORM\Column(name="housing", type="string", nullable=false)
* @Assert\NotBlank(message="Housing may not be blank")
*/
protected $housing;
/**
* @var bool
*
* @ORM\Column(name="enabled", type="boolean", nullable=false)
*/
protected $enabled;
/**
* Get id.
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set housing.
*
* @param int $housing
*
* @return housing
*/
public function setHousing($housing)
{
$this->housing = $housing;
return $this;
}
/**
* Get housing.
*
* @return int
*/
public function getHousing()
{
return $this->housing;
}
/**
* Set enabled.
*
* @param int $enabled
*
* @return enabled
*/
public function setEnabled($enabled)
{
$this->enabled = $enabled;
return $this;
}
/**
* Get enabled.
*
* @return int
*/
public function getEnabled()
{
return $this->enabled;
}
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\OneToMany(targetEntity="Household", mappedBy="housing")
*/
protected $households;
public function addHousehold(Household $household)
{
$this->households[] = $household;
}
public function getHouseholds()
{
return $this->households;
}
}