Php Symfony 3与奏鸣曲动态形式更新。基于从“选择”字段中选择的值
我想要做的。我有帖子、分类和属性。我可以在我的Post Admin页面上创建与许多属性相关的类别。在我的帖子中,我可以选择一个类别。当我选择类别(选择字段)后,我会将所选属性显示为(输入字段) 我的表单上的下拉列表和文本字段: 当我用所选类别保存帖子时,我将在提交属性输入字段后看到。这是有效的 这是必要的,但不好。好的,我需要一个ajax解决方案。没有Symfony没问题但有一个大的^^ 我用谷歌搜索了一下,我需要一个CRUD控制器和一个表单类型类中的事件 我的打字班:Php Symfony 3与奏鸣曲动态形式更新。基于从“选择”字段中选择的值,php,jquery,ajax,symfony,sonata,Php,Jquery,Ajax,Symfony,Sonata,我想要做的。我有帖子、分类和属性。我可以在我的Post Admin页面上创建与许多属性相关的类别。在我的帖子中,我可以选择一个类别。当我选择类别(选择字段)后,我会将所选属性显示为(输入字段) 我的表单上的下拉列表和文本字段: 当我用所选类别保存帖子时,我将在提交属性输入字段后看到。这是有效的 这是必要的,但不好。好的,我需要一个ajax解决方案。没有Symfony没问题但有一个大的^^ 我用谷歌搜索了一下,我需要一个CRUD控制器和一个表单类型类中的事件 我的打字班: class Prope
class PropertiesType extends AbstractType
{
public $em;
private $session;
public function __construct(EntityManagerInterface $em,Session $session)
{
$this->em = $em;
$this->session = $session;
}
protected function generateFormInputs(FormEvent $event){
$form = null;
if(!is_array($event->getData()) && ($event->getData() === null || !$event->getData()->getCategory())){
return false;
}
if(!is_array($event->getData())){
$furniture = $event->getData();
$form = $event->getForm();
}else{
$pp = $this->em->getRepository('ProductBundle:Furniture')->findOneBy(array('id' => $event->getData()['furniture_id']));
$pp->setCategory($this->em->getRepository('ProductBundle:Category')->findOneBy(array('id' => $event->getData()['category_id'])));
$event->setData($pp);
$furniture = $event->getData();
$form = $event->getForm();
}
if($furniture !== null){
foreach($furniture->getCategory()->getProperties() as $val){
$repo = $this->em->getRepository('ProductBundle:FurnitureProperties')->findOneBy(array('furniture' => $furniture->getId(), 'property' => $val->getId()));
if($repo === null){
$repo = new FurnitureProperties();
$repo->addProperty($val);
$repo->addFurniture($furniture);
$repo->setPropertyId($val->getId());
$repo->setCurrentLocale($this->session->get('_locale'));
}
$form->add('properties_'.$val->getId(), 'text', array(
'mapped' => false,
'label' => $val->getName(),
'data' => $repo,
'required' => false
));
}
}
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
if($event->getData() !== null){
foreach($event->getData() as $key => $val){
$obj = '';
$obj = $event->getForm()->get($key)->getData();
if($val !== ''){
$obj->setText($val);
$this->em->persist($obj);
$obj->mergeNewTranslations();
$this->em->flush();
}else{
$this->em->remove($obj);
$this->em->flush();
}
}
}
});
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$this->generateFormInputs($event);
});
}
/**
* @param OptionsResolverInterface $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'ProductBundle\Entity\Furniture',
'empty_data' => new FurnitureProperties(),
));
}
}
我的积垢控制器:
<?php
namespace ProductBundle\Controller;
use ProductBundle\Form\Type\PropertiesType;
use Sonata\AdminBundle\Controller\CRUDController as Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
class FurnitureCRUDController extends Controller
{
public function ajaxAction($furniture_id, $category_id, Request $request)
{
$form = $this->createForm(PropertiesType::class, array(
'furniture_id' => $furniture_id,
'category_id' => $category_id
));
$form->handleRequest($request);
return $this->render('form/fields.html.twig',
array(
'form' => $form->createView()
)
);
}
}
是的,我知道。ID为的解决方案不是最好的:
'properties_'.$val->getId()
但这是另一个问题:)这里没有人能帮助我吗?我唯一想做的就是将文本字段添加到表单(使用ajax)并保存到db。您解决了这个问题吗?如果是,请张贴答案。这样可以帮助像我这样的人。谢谢
<div class="category_replacement">
<div id="sonata-ba-field-container-properties_properties_1" class="form-group">
<label for="properties_properties_1" class="control-label ">höhe</label>
<div class="sonata-ba-field sonata-ba-field-standard-natural">
<input class="form-control" name="properties[properties_1]" id="properties_properties_1" value="">
</div>
</div>
<div id="sonata-ba-field-container-properties__token" class="form-group">
<label for="properties__token" class="control-label "></label>
<div class="sonata-ba-field sonata-ba-field-standard-natural">
<input class="form-control" name="properties[_token]" id="properties__token" value="AhNHvQrq_8f6ObAOTB1MmbX7Nv_FBmFsgQe3z_sH7qg">
</div>
</div>
</div>
<div class="category_replacement">
<div id="sonata-ba-field-container-s594d9b1861e8e_furniture_properties_1" class="form-group">
<label for="s594d9b1861e8e_furniture_properties_1" class="control-label ">height</label>
<div class="sonata-ba-field sonata-ba-field-standard-natural">
<input class="form-control" name="s594d9b1861e8e[furniture][properties_1]" id="s594d9b1861e8e_furniture_properties_1" value="">
</div>
</div>
</div>
"php": ">=5.5.9",
"doctrine/doctrine-bundle": "^1.6",
"doctrine/orm": "^2.5",
"friendsofsymfony/rest-bundle": "^2.2",
"incenteev/composer-parameter-handler": "^2.0",
"knplabs/doctrine-behaviors": "^1.4",
"nelmio/api-doc-bundle": "^2.13",
"sensio/distribution-bundle": "^5.0.20",
"sensio/framework-extra-bundle": "^3.0.2",
"sonata-project/admin-bundle": "3.19.0",
"sonata-project/doctrine-orm-admin-bundle": "^3.1",
"sonata-project/google-authenticator": "^2.0",
"sonata-project/media-bundle": "^3.5",
"sonata-project/translation-bundle": "^2.1",
"sonata-project/user-bundle": "dev-master",
"stof/doctrine-extensions-bundle": "^1.2",
"symfony/assetic-bundle": "^2.8",
"symfony/monolog-bundle": "^3.1.0",
"symfony/polyfill-apcu": "^1.0",
"symfony/swiftmailer-bundle": "^2.3.10",
"symfony/symfony": "3.3.*",
"twig/twig": "1.34.3"
'properties_'.$val->getId()