Symfony使用推进模型更改表单集合下拉列表

时间:2015-01-30 14:49:59

标签: forms symfony propel

是否可以更改表单下拉列表的内容,该表单下拉列表是使用propel填充的表单集合的一部分,但未映射数据。获取以下数据的代码示例:

地址类型:

public function buildForm(FormBuilderInterface $builder, array $options){

   $builder->
      ->add("addressOne", new addressOneType()),
      ->add("addressTwo", new addressTwoType(), array(
         "required" => false,
       )),
}

addressOneType:

public function buildForm(FormBuilderInterface $builder, array $options){

   $builder->
      ->setMethod('POST')
      ->add('Country', 'model', array(
          'mapped' => 'bundle\nameBundle\Model\Countries',
          'required' => true,
          'multiple' => false,
          'expanded' => false,
          'property' => 'label',
          'query' => CountryQuery::create()->find(),
       ))
       ->getForm();
}

此集合用于应用程序的特定部分,但在此部分需要从表单本身调用服务。这是可能的,因为我试图扩展ContainerInterface并在构造方法中声明这个,但这只会引发错误。

但是,我认为这是因为表单构建器未声明为服务。

通过注入新模型来覆盖原始模型,是否有更简单的方法来更改下拉菜单的数据。例如:

$form = $this->createForm(new AddressType());

$newData = CountriesQuery::create()
           ->orderBy("different_field");

$form['collectionName']['fieldname']->setData($newData);

执行上述操作不会更改或覆盖正在更改数据的原始模型。在->find()字段末尾有$newData或不带{{1}}。

是否有人知道如何覆盖模型的数据集?

1 个答案:

答案 0 :(得分:0)

传递特定选项的一种非常简单的方法是在构造函数中...

class addressOneType
{
    protected  $countryQuery;
    public function __constructor( $countryQuery = null )
    {
        $this->countryQuery = $countryQuery;
    }

    public function buildForm(FormBuilderInterface $builder, array $options){
         $query = $this->countryQuery ? $this->countryQuery : 
              CountryQuery::create();

          $builder
             ->setMethod('POST')
             ->add('Country', 'model', array(
                 'mapped' => 'bundle\nameBundle\Model\Countries',
                 'required' => true,
                 'multiple' => false,
                 'expanded' => false,
                 'property' => 'label',
                 'query' => $query->find(),
              ))
       ->getForm();
   }
}

...你可以用这种方式打电话给表格......

$cQuery = CountriesQuery::create()->orderBy("different_field");
$form = $this->createForm(new AddressType($cQuery));