php - Symfony2根据选择形成动态输入文本字段填充

时间:2014-07-02 16:29:08

标签: php forms symfony

我有以下情况:

在数据库中有一个表格,其中包含一个国家/地区的所有县,另一个表格包含同一个国家/地区的所有城市。城市表格包含以下列:

- id
- name
- longitude
- latitude
- county - county id
页面上的

我有一个表格:

- county select field - symfony entity field type
- city select field - symfony entity field type
- longitude input (text) field
- latitude input (text) field - let's ignore this field for the moment

因此,当用户选择一个县时,城市字段将填满与所选县相对应的所有城市;然后,当用户选择一个城市时,经度字段将填充城市逻辑数据库值。

按照本教程(http://aulatic.16mb.com/wordpress/2011/08/symfony2-dynamic-forms-an-event-driven-approach/),我设法处理县选择和城市归档动态替换。但我似乎无法找到如何填充一个简单的文本值(在这种情况下经度)“symfony方式”。

我试过这样做

$refreshLongitude = function( $form, $city, $translator ){
    $form->add(
        'longitude',
        'text',
        array(
            'label' => $translator->trans( 'project.longitude' ),
            'required' => true,
            'attr' => array(
                'class'=> 'form-control',
                'value' => function( \Doctrine\ORM\EntityRepository $repository ) use ( $city ){
                    if( $city instanceof City ){
                        return $city->getLongitude();
                    }

                    $query = $repository->createQueryBuilder( 'city' );

                    if( is_numeric( $city ) ){
                        $query->where( 'city.id = :city' )
                            ->setParameter( 'city', $city );
                    }
                    else{
                        $query->where( 'city.id = 2715' );
                    }

                    $city = $query->getSingleResult();

                    return $city->getLongitude();
                }
            )
        )
    );
};

但我得到了: ContextErrorException:Catchable Fatal Error:类Closure的对象无法转换为字符串

任何想法?

1 个答案:

答案 0 :(得分:0)

所以,从phpisuber01评论开始(非常感谢),我已经设法概述了以下代码,以便在symfony2中以一定的数据库值填充一个简单的文本字段。我不确定这是正确的方法,但它确实有效。欢迎任何更优雅的方式。

$refreshLongitude = function( $form, $city, $translator, $em ){
    $form->add(
        'longitude',
        'text',
        array(
            'label' => $translator->trans( 'project.longitude' ),
            'required' => true,
            'attr' => array(
                'class'=> 'form-control',
                'value' => call_user_func( function() use ( $city, $em ){
                    if( $city instanceof City ){
                        return $city->getLongitude();
                    }
                    else{
                        $repository = $em->getRepository( 'AppBundle:City' );
                        $query = $repository->createQueryBuilder( 'city' );

                        if( is_numeric( $city ) ){
                            $query->where( 'city.id = :city' )
                                ->setParameter( 'city', $city );
                        }
                        else{
                            $query->where( 'city.id = 2715' );
                        }

                        $city = $query->getQuery()->getSingleResult();

                        return $city->getLongitude();
                    }
                })
            )
        )
    );
};

$ translator和$ em vars从控制器传递到表单构建器,然后传递给事件监听器,然后传递到$ refreshLongitude函数