Symfony 3.4 和模态表单验证
Symfony 3.4 and Modal Form Validation
我正在使用模态形式的 Symfony 3.4 项目工作,感谢 RaresModalBundle,这部分非常容易实现。我的问题!?!?表单的约束验证不起作用,因为我找不到一种方法来保持模式打开或重新打开它并出现错误。
我阅读了很多文章,但找不到可靠的解决方案。大约一周后,我发现 jquery 有一个库调用 jqueryvalidation 可以帮助验证表单,但我阅读和分析的示例到目前为止在我的项目中不起作用......模态仍然关闭我在没有正确验证的情况下点击了提交按钮。
但是,如果我在 de modal 外部单击,我可以看到验证器正在工作,问题仍然存在于提交按钮中...这是控制器和模态的代码:
/**
* Función encargada de generar el formulario para agregar un nuevo depósito.
*
* Se autorizan métodos GET y POST. El primero para acceder al formulario y el segundo para
* recibir el mismo.
*
* @Route("/agregar", name="agregar_depositos", methods={"GET", "POST"})
*
* @param Request $request
* @return RedirectResponse|Response
*/
public function agregarDepositos(Request $request)
{
$deposito = new Deposito();
$form = $this->createForm('AppBundle\Form\DepositoType', $deposito);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($deposito);
try {
$em->flush();
$this->addFlash('success', 'El depósito '.$deposito->getNombre().' ha sido insertado correctamente.');
}catch (DBALException $e){
$this->addFlash('error', 'El depósito '.$deposito->getNombre().' ya existe en la base de datos.');
};
return new ModalRedirectResponse($this->generateUrl('listar_depositos'));
}
return $this->render('registro/deposito/agregar.html.twig', array(
'deposito' => $deposito,
'form' => $form->createView(),
));
}
{% extends '@RaresModal/baseModal.html.twig' %}
{% block modalContent %}
{{ form_start(form, {'action': path('agregar_depositos')}) }}
<div class="modal-header">
<h5 class="modal-title m-0 font-weight-bold text-secondary"><i class="fas fa-fw fa-share-square"></i> Agregar Depósito</h5>
</div>
<div class="modal-body">
<div class="input-group mb-3" style="padding-top: 15px">
<div class="input-group-prepend">
<span class="input-group-text" id="basic-addon1"><i class="far fa-fw fa-building"></i></span>
</div>
{{ form_widget(form.nombre) }}
</div>
</div>
<div class="modal-footer">
<div>
<button type="submit" class="btn btn-primary btn-sm btn-icon-split">
<span class="icon text-white-50">
<i class="fas fa-save"></i>
</span>
<span class="text">Guardar</span>
</button>
</div>
<div>
<button type="button" class="btn btn-secondary btn-sm btn-icon-split" data-dismiss="modal">
<span class="icon text-white-50">
<i class="fas fa-times"></i>
</span>
<span class="text">Cancelar</span>
</button>
</div>
</div>
<script type="text/javascript">
$( document ).ready( function () {
$( "#deposito-form" ).validate( {
rules: {
'appbundle_deposito[nombre]': {
required: true,
minlength: 3
}
},
messages: {
'appbundle_deposito[nombre]': {
required: "Este campo es obligatorio.",
minlength: "Este campo debe contener 3 o más caracteres."
}
},
errorElement: "em",
errorPlacement: function ( error, element ) {
// Add the `invalid-feedback` class to the error element
error.addClass( "invalid-feedback" );
if ( element.prop( "type" ) === "checkbox" ) {
error.insertAfter( element.next( "label" ) );
} else {
error.insertAfter( element );
}
},
highlight: function ( element, errorClass, validClass ) {
$( element ).addClass( "is-invalid" ).removeClass( "is-valid" );
},
unhighlight: function (element, errorClass, validClass) {
$( element ).addClass( "is-valid" ).removeClass( "is-invalid" );
}
} );
} );
</script>
{{ form_end(form) }}
{% endblock %}
对不起我的英语...BR...
好的...经过一些额外的搜索,当然还有尝试和错误,我的问题的解决方案是:
- 向提交按钮添加 class。 EG: createButtom
- 将以下行添加到模态视图中的 javascript 块:
$(".createButton").click(function(e) {
if (!$('#deposito-form').valid()) {
e.preventDefault()
}
});
我正在使用模态形式的 Symfony 3.4 项目工作,感谢 RaresModalBundle,这部分非常容易实现。我的问题!?!?表单的约束验证不起作用,因为我找不到一种方法来保持模式打开或重新打开它并出现错误。
我阅读了很多文章,但找不到可靠的解决方案。大约一周后,我发现 jquery 有一个库调用 jqueryvalidation 可以帮助验证表单,但我阅读和分析的示例到目前为止在我的项目中不起作用......模态仍然关闭我在没有正确验证的情况下点击了提交按钮。
但是,如果我在 de modal 外部单击,我可以看到验证器正在工作,问题仍然存在于提交按钮中...这是控制器和模态的代码:
/**
* Función encargada de generar el formulario para agregar un nuevo depósito.
*
* Se autorizan métodos GET y POST. El primero para acceder al formulario y el segundo para
* recibir el mismo.
*
* @Route("/agregar", name="agregar_depositos", methods={"GET", "POST"})
*
* @param Request $request
* @return RedirectResponse|Response
*/
public function agregarDepositos(Request $request)
{
$deposito = new Deposito();
$form = $this->createForm('AppBundle\Form\DepositoType', $deposito);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($deposito);
try {
$em->flush();
$this->addFlash('success', 'El depósito '.$deposito->getNombre().' ha sido insertado correctamente.');
}catch (DBALException $e){
$this->addFlash('error', 'El depósito '.$deposito->getNombre().' ya existe en la base de datos.');
};
return new ModalRedirectResponse($this->generateUrl('listar_depositos'));
}
return $this->render('registro/deposito/agregar.html.twig', array(
'deposito' => $deposito,
'form' => $form->createView(),
));
}
{% extends '@RaresModal/baseModal.html.twig' %}
{% block modalContent %}
{{ form_start(form, {'action': path('agregar_depositos')}) }}
<div class="modal-header">
<h5 class="modal-title m-0 font-weight-bold text-secondary"><i class="fas fa-fw fa-share-square"></i> Agregar Depósito</h5>
</div>
<div class="modal-body">
<div class="input-group mb-3" style="padding-top: 15px">
<div class="input-group-prepend">
<span class="input-group-text" id="basic-addon1"><i class="far fa-fw fa-building"></i></span>
</div>
{{ form_widget(form.nombre) }}
</div>
</div>
<div class="modal-footer">
<div>
<button type="submit" class="btn btn-primary btn-sm btn-icon-split">
<span class="icon text-white-50">
<i class="fas fa-save"></i>
</span>
<span class="text">Guardar</span>
</button>
</div>
<div>
<button type="button" class="btn btn-secondary btn-sm btn-icon-split" data-dismiss="modal">
<span class="icon text-white-50">
<i class="fas fa-times"></i>
</span>
<span class="text">Cancelar</span>
</button>
</div>
</div>
<script type="text/javascript">
$( document ).ready( function () {
$( "#deposito-form" ).validate( {
rules: {
'appbundle_deposito[nombre]': {
required: true,
minlength: 3
}
},
messages: {
'appbundle_deposito[nombre]': {
required: "Este campo es obligatorio.",
minlength: "Este campo debe contener 3 o más caracteres."
}
},
errorElement: "em",
errorPlacement: function ( error, element ) {
// Add the `invalid-feedback` class to the error element
error.addClass( "invalid-feedback" );
if ( element.prop( "type" ) === "checkbox" ) {
error.insertAfter( element.next( "label" ) );
} else {
error.insertAfter( element );
}
},
highlight: function ( element, errorClass, validClass ) {
$( element ).addClass( "is-invalid" ).removeClass( "is-valid" );
},
unhighlight: function (element, errorClass, validClass) {
$( element ).addClass( "is-valid" ).removeClass( "is-invalid" );
}
} );
} );
</script>
{{ form_end(form) }}
{% endblock %}
对不起我的英语...BR...
好的...经过一些额外的搜索,当然还有尝试和错误,我的问题的解决方案是:
- 向提交按钮添加 class。 EG: createButtom
- 将以下行添加到模态视图中的 javascript 块:
$(".createButton").click(function(e) {
if (!$('#deposito-form').valid()) {
e.preventDefault()
}
});