我正在使用ajax进行验证,我现在开始使用ajax,问题是什么:
当我使用像<div id="success"></div>
这样的div时,我的屏幕会复制我的原始形式但是使用ajax形式...当我删除这个div“成功”时,一切都还可以。
当我需要在表单中进行一些验证时,我在ajax中调用我的函数,但它没有向我显示任何消息。
这是我的表格
add.ctp
<div id="success"></div>
<div class="form" >
<h3>Registro de Compra de Grano </h3>
<?php echo $this->Form->create('SoyaProductorCompra');?>
<fieldset>
<?php
echo $this->Form->input('proveedor_carnet', array('label' => 'Cantidad en tonelada(s) métrica(s) del producto (TM)', 'id'=>'proveedor_carnet'));
echo $this->Form->input('producto', array(
'options' => array(
'GRANO DE SOYA' => 'Grano de Soya',
'GRANO DE GIRASOL' => 'Grano de Girasol'
), 'label'=>'Tipo de Grano'
));
echo $this->Form->input('toneladas', array('label' => 'Cantidad en tonelada(s) métrica(s) del producto (TM)', 'id'=>'toneladas'));
echo $this->Form->input('preciodolar', array(
'label' => 'Precio en Dolares Americanos por tonelada métrica (TM / $us)',
'style'=>'width:500px; height:30px;',
'default'=>0));
echo $this->Form->input('total', array('label' => 'Total en Dolares Americanos ($us)', 'default'=>0));
echo $this->Form->input('nrofactura', array('label' => 'Numero Factura', 'style'=>'width:500px; height:30px;','id'=>'total'));
?>
<div id="sending" style="display:none;">
<?php echo $this->html->image('ajax-loader.gif', array('alt' => 'Cargando...')); ?>
</div>
<?php
echo $this->Js->submit('Agregar Existencia', array(
'before'=>$this->Js->get('#sending')->effect('fadeIn'),
'success'=>$this->Js->get('#sending')->effect('fadeOut'),
'update'=>'#success'
));
?>
</fieldset>
<?php echo $this->Form->end(); ?>
</div>
validation.js
这是mi第二个问题我正在尝试我的功能在此之后向我显示消息错误
echo $this->Form->input('proveedor_carnet', array('label' => 'Cantidad en tonelada(s) métrica(s) del producto (TM)', 'id'=>'proveedor_carnet'));
但我的功能没有向我显示任何消息
$(document).ready(function(){
$('#proveedor_carnet').blur(function(){
$.post(
'/cake/soyaproductorcompras/validate_form',
{ field: $('#proveedor_carnet').attr('id'), value: $('#proveedor_carnet').val() },
handleNmeValidation
);
});
function handleNmeValidation(error){
if(error.length > 0){
if($('#proveedor_carnet-notempty').length == 0){
$('proveedor_carnet').after('<div id="proveedor_carnet-notEmpty" class="error-message">' + error + '</div>');
}
}else{
$('#proveedor_carnet-notEmpty').remove();
}
}
});
SoyaProductorComprasController.php
public $helpers = array('Html', 'Form', 'Js');
public function add()
{
$this->loadModel('SoyaProductorCompra');
$this->loadModel('SoyaProveedor');
$this->loadModel('Productora');
$this->set('productores', $this->Productora->find('first', array('conditions' => array('user_id' => $this->Auth->user('id')))));
$this->set('soyaproveedores', $this->SoyaProveedor->find('list', array(
'fields' => array('id', 'nombre')
)));
if ($this->request->is('post')) {
$this->request->data['SoyaProductorCompra']['user_id'] = $this->Auth->user('id');
$this->request->data['SoyaProductorCompra']['soya_proveedor_id'] = $this->request->data['SoyaProductorCompra']['proveedor_carnet'];
if ($this->SoyaProductorCompra->save($this->request->data)) {
if($this->RequestHandler->isAjax()){
$this->render('success', 'ajax');
}else{
$this->Session->setFlash(__('La Información no fue Guardada.'));
return $this->redirect(array('action' => 'index'));
}
}
}
public function validate_form(){
$this->loadModel('SoyaProductorCompra');
if ($this->RequestHandler->isAjax()) {
debug($this->data['SoyaProductorCompra'][$this->params['form']['field']]);
$this->data['SoyaProductorCompra'][$this->params['form']['field']]=$this->params['form']['value'];
$this->SoyaProductorCompra->set($this->data);
if($this->SoyaProductorCompra->validate()){
$this->autoRender = FALSE;
}else{
$error=$this->validateErrors($this->SoyaProductorCompra);
$this->set('error', $error[$this->params['form']['field']]);
}
}
}
success.ctp
<p> Guardado </p>
validate_form.ctp
<?php echo $error; ?>
错误:
POST http://localhost:8080/cake/soyaproductorcompras/validate_form 500 (Internal Server Error) jquery2.1.js:4
n.ajaxTransport.k.cors.a.crossDomain.send jquery2.1.js:4
n.extend.ajax jquery2.1.js:4
n.each.n.(anonymous function) jquery2.1.js:4
(anonymous function) validation.js:4
n.event.dispatch jquery2.1.js:3
n.event.add.r.handle
答案 0 :(得分:0)
AD7six简要解释了他的评论中出了什么问题,让我展开。
在你的HTML中
<div id="success"></div>
<div class="form" >[...]</div>
然后你创建JS代码,告诉你的浏览器在发布表单后作为回复收到的#success
附加内容。
当您通过ajax发布表单时,控制器最终会尝试使用此
进行保存if ($this->SoyaProductorCompra->save($this->request->data)) {
[...]
}
尝试显示$this->render('success', 'ajax');
或稍后显示失败会话消息的代码(success.ctp
)嵌套在此if
内,这意味着它仅适用于控制器能够毫无问题地保存数据。如果没有(比如在保存数据时出现问题)它将不会进入if
并且除了退出之外它不会做任何事情,正常情况下呈现典型的add.ctp
每次没有指示时都这样做。
回到您的浏览器,它会收到一些html,按照您的指示放入#success
div中,但它会再次显示整个页面(add.ctp
),像这样的结构:
<div id="success">
<div id="success"></div>
<div class="form" >[...]</div>
</div>
<div class="form" >[...]</div>
后续帖子会让事情变得更糟,因为现在有重复的html ID(例如#success
)这很糟糕。
假设你现在明白了什么是错的,你的下一个问题是你的ajax验证尝试。这是奇怪的路由,我没有看到你的代码中的任何#name
元素将首先触发你的验证(这就是为什么你永远不会看到验证错误 - 假设其他一切都可行)。最后,验证方法中有一个debug()
,会使事情更加混乱。