![](/img/trans.png)
[英]how to create an ajax-driven auto-complete field in a sonata admin form in symfony?
[英]Create form in Controller using Sonata field type
在 Symfony admin 中,我有一个表单,其中第二个字段类型取决于所选的ChoiceField
值。 第二个字段可以是Symfony Url字段类型或sonata 提供的sonata_type_model_list字段类型。
我已经向 My Bundle Controller 创建了一个 ajax 请求,以返回包含所需字段的表单。
> /src/MyBundle/Controller/MyController.php
namespace MyBundle\Controller
use Sonata\AdminBundle\Controller\CRUDController;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\Mapping\ClassMetadataInfo;
use Sonata\AdminBundle\Form\FormMapper;
class MyController extends CRUDController
{
public function getFieldAction()
{
//getting the value of choice field
$type = $this->get('request')->get('type');
//sonata.admin.reference is a service name of ReferenceBundle admin class
$fieldDescription = $this->admin->getModelManager()
->getNewFieldDescriptionInstance($this->admin->getClass(), 'reference');
$fieldDescription->setAssociationAdmin($this->container->get('sonata.admin.reference'));
$fieldDescription->setAdmin($this->admin);
$fieldDescription->setAssociationMapping(array(
'fieldName' => 'reference',
'type' => ClassMetadataInfo::ONE_TO_MANY,
));
// Getting form mapper in controller:
$contractor = $this->container->get('sonata.admin.builder.orm_form');
$mapper = new FormMapper($contractor, $this->admin->getFormBuilder(), $this->admin);
$form_mapper = $mapper->add('reference', 'sonata_type_model_list', array(
'translation_domain' => 'ReferenceBundle',
'sonata_field_description' => $fieldDescription,
'class' => $this->container->get('sonata.admin.reference')->getClass(),
'model_manager' => $this->container->get('sonata.admin.reference')->getModelManager(),
'label' => 'Reference',
'required' => false,
));
//@ToDo build $form from $form_mapper
return $this->render('MyBundle:Form:field.view.html.twig', array(
'form' => $form->createView(),
));
}
}
我在Sonata\\AdminBundle\\Form\\FormMapper
类中找不到任何方法来构建表单(似乎可以使用create()
方法,但它仅适用于常见的 Symfony 字段类型,而不适用于通常生成的 Sonata 表单字段类型)在 Block 或 Admin 类中)。
是否可以在 Controller 中使用Sonata\\AdminBundle\\Form\\FormMapper
来构建表单? 或者还有另一种方法可以在控制器中使用 Sonata 表单字段类型构建表单?
您不应使用控制器,而应使用 Sonata 管理服务。
Sonata 为您提供了“sonata_type_choice_field_mask”类型,它允许您根据此“sonata_type_choice_field_mask”输入的值动态更改表单上显示的字段。
这是文档,您可以在其中找到有关奏鸣曲类型和选择字段掩码的所有信息。
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('reference', 'sonata_type_choice_field_mask', array(
'choices' => array(
//The list of available 'Reference' here
'choice1',
'choice2'
),
'map' => array(
//What you want to display depending of the selected option
'choice1' => array(
// List of the fields displayed if choice 1 is selected
'field1', 'field3'
),
'choice2' => array(
// List of the fields displayed if choice 2 is selected
'field2', 'field3'
)
),
'placeholder' => 'Choose an option',
'required' => false
))
->add('field1', 'sonata_type_model_list', array(/* Options goes here */))
->add('field2', 'url', array(/* Options goes here */))
->add('field3')
;
}
看起来您可以访问直接使用Sonata\\AdminBundle\\Admin\\AbstractAdmin::getForm
处理构建表单的Sonata\\AdminBundle\\Admin\\AbstractAdmin::getForm
。
$form = $this->admin->getForm();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.