Javascript 在非实体类的Symfony表单中添加ChoiceType选项
我有一个由Ajax请求提交的Symfony表单。此表单包含两个字段:日期(datepicker)和天数(choiceType)。我无法初始化窗体生成的天数,因为它依赖于选定的日期。使用Javascript,我更新了select picker中的选项。这很有效。通常,选项如下所示:Javascript 在非实体类的Symfony表单中添加ChoiceType选项,javascript,jquery,ajax,forms,symfony,Javascript,Jquery,Ajax,Forms,Symfony,我有一个由Ajax请求提交的Symfony表单。此表单包含两个字段:日期(datepicker)和天数(choiceType)。我无法初始化窗体生成的天数,因为它依赖于选定的日期。使用Javascript,我更新了select picker中的选项。这很有效。通常,选项如下所示:1焦耳 现在,在提交表单时,我需要在choiceType中添加这些字段 我使用了isXmlHttpRequest方法,因为表单是通过Ajax请求提交的,等待回答如果表单有效,我需要通知Ajax调用(我不想呈现其他模板)。
1焦耳
现在,在提交表单时,我需要在choiceType中添加这些字段
我使用了isXmlHttpRequest方法,因为表单是通过Ajax请求提交的,等待回答如果表单有效,我需要通知Ajax调用(我不想呈现其他模板)。
我在控制器中执行以下操作:
/**
*@param Request$Request
*@返回响应
*@Route(“/ajout\u favoris”,name=“ajoffavoris”)
*/
公共功能Ajoffavoris(请求$Request){
$form=$this->creerFormulaire()->getForm();
$form->handleRequest($request);
如果($request->isXmlHttpRequest()){
如果($form->isValid()){
//行动。。。
$reponse=['statut'=>'success'];
}否则{
$reponse=['statut'=>'forminvalid'];
}
$reponse=新响应(json_encode($reponse));
$reponse->headers->set('Content-Type','application/json');
返回$response;
}
返回$this->render('@Carte/Reservation/Reservation.html.twig',数组(
“form”=>$form->createView());
以下是我如何构建表单:
public function creerFormulaire(){
$formulaire=$this->createFormBuilder()
->addEventListener(FormEvents::PRE_SUBMIT,函数(FormEvent$event){
$form=$event->getForm();
$data=$event->getData();
$optionList=$this->getValidChoicesForNbJours($data[“nbJours]”);
$form->add('nbJours','choice',数组(
'attr'=>['占位符'=>'名称',
“类”=>“选择器选择器”,
],
“选项”=>$options列表,
));
})
->添加('DateFirst',DateTimeType::class[
'widget'=>'single_text',
'格式'=>'日/月/年',
'输入'=>'日期时间',
'label'=>'datedébut',
“必需”=>true,
'attr'=>['class'=>'datepicker输入日期',
'类型'=>'文本',
“占位符”=>“JJ/MM/AAAA”,
“只读”=>true,
“必需”=>true,]
])
->添加('nbJours','choice'[
“标签”=>“名称”,
“选项”=>[],
'attr'=>['占位符'=>'名称',
“类”=>“选择器选择器”,
“title”=>“Nombre de jours”,
“只读”=>true,
“必需”=>false,]
])
->添加('ajoffavoris',SubmitType::class[
'label'=>'Ajouter aux favoris',
'attr'=>['class'=>'btn btn主保留服务器']
]);
返回$formulaire;
}
下面是我如何填写选项:
公共函数GetValidChoicesfornJours($range){
$liste=[];
对于($i=1;$i您可以通过调用$builder->get('nbJours')->resetViewTransformers();
在添加字段后,您可以通过调用$builder->get('nbJours')->resetViewTransformers()禁用表单验证
添加字段后,请提供一些表单呈现方式的html。原因很可能是缺少表单标记,该标记未随数据一起发送。您是否已禁用CSRF?您是否也尝试发送标记
-字段?我没有自动触摸CSRF保护。Symfony表单为令牌添加一个隐藏输入(如果分析,我们可以在浏览器的页面中看到)。在数据中添加令牌值,如data={CSRF:document.getElementById('form_u-token').value}
或不添加任何更改。对!您也尝试过这个data={{u-token document.getElementById('form_u-token').value}
。假设此隐藏表单字段名为\u token
,请提供一些有关表单呈现方式的html。原因很可能是缺少表单标记而未随数据一起发送。您是否已禁用CSRF?您是否已尝试发送token
-字段?我不接触CSRF保护ion.Symfony表单会自动为令牌添加隐藏输入(如果分析的话,我们可以在浏览器的页面中看到)。在数据中添加令牌值,如data={CSRF:document.getElementById('form\u token')。value}
或不添加任何更改。对!您也尝试过这个data={\u token document.getElementById吗('form__-token').value}
。假设此隐藏表单字段被称为\u-token
path_to_add_fav = ...
idPlan = ...
$("#form_ajoutFavoris").click(function (e) {
let dateDebut = document.getElementById('form_dateDebut').value;
let nbJours = document.getElementById('form_nbJours').value;
if (dateDebut && nombreJours){
let data = {
poste_id: idPoste,
plan_id: idPlan,
nbJours: nbJours ,
};
$.ajax({
url: path_to_add_fav,
type: "post",
data: JSON.stringify(data),
dataType: "json",
success: function (data) {
console.log(data.statut);
if (data.statut === "success") {
window.parent.$.fancybox.close();
}
}
});
}
});
let new_options = "";
for (i = 0; i < nbOptions; i++, j++)
new_options += "<option value=" + j + ">" + j + " jours</option>";
$("#form_nbJours").html(new_options).selectpicker('refresh');
$('form').submit(function (e) {
console.log("ok");
e.preventDefault();
let formSerialize = $(this).serialize();
$.post(path_to_add_fav, formSerialize, function(response) {
console.log(response.statut);
if (response.statut === "success") {
console.log("Réponse correcte !");
window.parent.$.fancybox.close();
}
}, 'JSON');
}