当我使用ajax时复制表单

时间:2014-06-06 14:16:25

标签: javascript jquery css ajax cakephp

我正在使用ajax进行验证,我现在开始使用ajax,问题是什么:

  1. 当我使用像<div id="success"></div>这样的div时,我的屏幕会复制我的原始形式但是使用ajax形式...当我删除这个div“成功”时,一切都还可以。

  2. 当我需要在表单中进行一些验证时,我在ajax中调用我的函数,但它没有向我显示任何消息。

  3. 这是我的表格

    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
    

1 个答案:

答案 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(),会使事情更加混乱。