後試圖弄清楚的Symfony到菜譜進入多天...... http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html最終處理Symfony2的動態表單修改
我終於差點第三個例子,我ProductType.php文件,下面的代碼工作(見下文)。
當我添加一個遊戲時,有一個相應的服務器和類別列表,當我點擊提交按鈕時出現。如果我通過將無效輸入放入其中一個字段來強制執行錯誤,則只會顯示新字段。
我有兩個問題。如果所有不在$ formModifier變量中的數據都是有效的,它會提交數據,而我看不到「服務器」和「類別」選項。我如何確保'服務器'和'類別'是必需的,即使我不需要它們在選擇遊戲之前出現。
第二個問題是在食譜條目中它說:「一件事情可能仍然是你選擇運動後你的表單的客戶端更新,這應該通過嚮應用程序發回一個AJAX調用來處理。在該控制器中,您可以提交表單,但不是處理它,只需使用提交的表單來呈現更新的字段。「
由於我的事件修飾符位於「提交」上,我如何使用所選遊戲(id)提交給控制器條目,並且只渲染僅在遊戲被選中後才需要的字段?
在此先感謝。
斯科特
<?php
namespace Acme\MainBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\FormInterface;
use Acme\MainBundle\Entity\Game;
class ProductsType extends AbstractType {
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('name')
->add('price')
->add('description')
->add('game')
;
// ** Build Form Interface Based On Selected Game **//
$formModifier = function(FormInterface $form, Game $game, $game_id) {
// ** Add Servers Based On Game Id ** //
$form->add('server', 'entity', array(
'class' => 'Acme\MainBundle\Entity\GameServers',
'query_builder' => function(EntityRepository $er) use ($game_id) {
$query = $er->createQueryBuilder('i')
->select(array('i'))
->where('i.game_id = :game_id')
->setParameter('game_id', $game_id)
->orderBy('i.name', 'ASC');
return $query;
},
)
);
// ** Build Category List Based on Game Id Submitted ** //
// Refactor this so that is nothing is selected that it Doesn't Build Category List **/
$form->add('category', 'entity', array(
'class' => 'Acme\MainBundle\Entity\GameCategories',
'query_builder' => function(EntityRepository $er) use ($game_id) {
$query = $er->createQueryBuilder('i')
->select(array('i'))
->where('i.game_id = :game_id')
->setParameter('game_id', $game_id)
->orderBy('i.name', 'ASC');
return $query;
},
)
);
};
//** Checks for Games That Are Submitted and Adds Servers and Categories Based on Game Selection **//
$builder->get('game')->addEventListener(
FormEvents::POST_SUBMIT, function(FormEvent $event) use ($formModifier) {
// Get Form Data to Pass Back to Modifier
$game = $event->getForm()->getData();
// Get Game Id to pass back to Form Modifier
$game_id = $event->getForm()->getData()->getId();
$formModifier($event->getForm()->getParent(), $game, $game_id);
}
);
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver) {
$resolver->setDefaults(array(
'data_class' => 'Acme\MainBundle\Entity\Products'
));
}
/**
* @return string
*/
public function getName() {
return 'acme_mainbundle_products';
}
}
謝謝你,我做了這個改變,你是正確的,但這不是真正的問題。問題是當字段最初沒有出現時的驗證以及如何僅基於遊戲ID呈現提交的新字段。 – smugford