我正在使用带有zend 2的bootstrap。 通过ajax调用检索模态的内容。 但验证根本不起作用,它提交时不检查任何字段:
这是模态加载的地方:
<div class="modal fade" id="themesModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
</div>
</div>
</div>
以下是模态内容:
<div class="modal-body">
<div id="themesbox">
<div class="panel panel-info">
<div class="panel-heading">
<div class="panel-title">title</div>
</div>
<div style="padding-top: 30px" class="panel-body">
<?php
$form = $this->form;
$form->setAttribute('action', $this->url('user/default', array('controller' => 'users', 'action' => 'create')));
$form->prepare();
echo $this->form()->openTag($form);
?>
<div id="mydiv"
style="display: none" class="alert alert-danger">
<p>Error:</p>
<span></span>
</div>
<div class="form-group">
<label for="name" class="col-md-3 control-label">user</label>
<div class="col-md-9">
<?php echo $this->formElement($form->get('name'));?>
</div>
</div>
<div class="form-group">
<label for="description" class="col-md-3 control-label">password</label>
<div class="col-md-9">
<?php echo $this->formElement($form->get('password'));?>
</div>
</div>
<div style="margin-top: 10px" class="form-group">
<!-- Button -->
<div class="col-sm-12 controls">
<?php echo $this->formSubmit($form->get('submit'));?>
<button id="cancel" class="btn btn-success" data-dismiss="modal">Cancel</button>
</div>
</div>
<?php echo $this->form()->closeTag();?>
</div>
<!-- /.panel-body -->
</div>
<!-- /. panel panel-info -->
</div>
</div>
这是jquery验证码:
$('.form-validation').each(function () {
$(this).validate({
errorElement: "span",
errorClass: "help-block",
highlight: function(element) {
$(element).closest('.control-group').removeClass('success').addClass('error');
$(element).attr('style', "border-radius: 5px; border:#FF0000 1px solid;");
},
unhighlight: function(element) {
$(element).addClass('valid').closest('.control-group').removeClass('error').addClass('success');
$(element).attr('style', "border-radius: 4px; border:1px solid #ccc;");
},
errorPlacement: function (error, element) {
$(error).attr('style', "color: #FF0000;");
if ( element.prop('type') === 'checkbox') {
error.insertAfter(element.parent());
} else {
error.insertAfter(element);
}
}
});
});
这是表单代码:
$this->add(array(
'name' => 'name',
'attributes' => array(
'type' => 'text',
'id' => 'username',
'class' => 'form-control',
'required' => 'true',
'minlength' => '8',
'maxlength' => '20',
),
'options' => array(
'label' => 'name',
),
));
$this->add(array(
'name' => 'description',
'attributes' => array(
'type' => 'password',
'id' => 'password',
'class' => 'form-control',
'required' => 'true',
'minlength' => '8',
'maxlength' => '20',
),
'options' => array(
'label' => 'Password',
),
));
答案 0 :(得分:0)
我使用不同的方法工作。
您应该通过AJAX提交表单,让ZF2返回带有表单标记的JsonModel
,而不是尝试在客户端进行自己的验证(添加错误HTML等)。
如果您使用正确的视图助手(具体为FormRow
),则会正确呈现表单错误。
例如
class FooController extends AbstractActionController
{
public function createAction()
{
$request = $this->getRequest();
$service = $this->getServiceLocator()->get('FooService');
$form = $service->getFooCreateForm(); // Zend\Form
if ($request->isPost()) {
$form->setData($request->getPost());
if ($form->isValid()) {
$foo = $service->create($form->getData());
if ($foo instanceof Foo)
// redirect to success page
} else {
$this->flashMessenger()->addErrorMessage('Error!');
}
return $this->redirect()->toRoute('foo', array('action' => 'index'));
} else if ($request->isXmlHttpRequest()) {
$renderer = $this->getServiceLocator()->get('viewrenderer');
$formView = new ViewModel(compact('form')); // add the form to the view
$formView->setTemplate('foo-module/foo/form');
return new JsonModel(array(
'success' => false, // Flag to keep modal open
'content' => $renderer->render($formView), // The "content" being the form HTML
'message' => 'Please check all form fields have been completed successfully',
));
}
}
return new ViewModel(compact('form'));
}
}
<强> form.phtml 强>
<?php
echo $this->form($this->form);
<强> create.phtml 强>
//...modal html
<div class="modal-body">
<?php echo $this->partial('form.phtml', compact('form')); ?>
</div>
//... modal html
你还想要:
createAction
success == true
,则关闭模态success == false
,您将拥有content
变量,然后可以使用$('.modal-content').html(result.content)
替换现有的模态内容。这将包括经过验证的表单HTML(包括生成的所有错误视图)表单视图助手)。答案 1 :(得分:0)
事实上,所有服务器端验证机制都已到位并且运行良好。
我需要通过 jquery 进行客户端验证。
因为 Bootstrap 模式对话框的内容是从 ajax 加载的,所以它没有像往常一样考虑周围的上下文,我需要插入 jquery ajax内容中的代码。
ZF2 不允许在其视图文件中插入 js 代码。
所以我按照以下方式在 ajax 内容中插入以下行:
<?php echo $this->inlineScript()->appendFile($this->basePath() . '/js/custom.js')?>