Codeigniter - 使用ajax从视图中调用另一个控制器

时间:2013-02-19 07:15:34

标签: php codeigniter jquery

最初我试图从一个控制器加载两个视图。

提交时,我将一个视图传递给一个控制器,另一个视图使用ajax动态传递给另一个控制器。这是控制器的骨架

function edit(){     
    if (!$this->login_model->is_logged_in())
    {
        redirect('auth/login', 'refresh');
    }   
    $this->load->library('form_validation');    
    $this->data['custom_error'] = '';

        //------------- Getting Student data----------------

    if ($this->form_validation->run('students') == false)
    {
         $this->data['custom_error'] = (validation_errors() ? '<div class="form_error">'.validation_errors().'</div>' : false);

    } else
    {                            
        $data = array(
                'username' => $this->input->post('username'),
                'city' => $this->input->post('city')
        );

        if ($this->student_model->edit('students',$data,'id',$this->input->post('id')) == TRUE)
        {
            redirect(base_url().'index.php/students/manage/');
        }
        else
        {
            $this->data['custom_error'] = '<div class="form_error"><p>An Error Occured</p></div>';

        }
    }

    $this->data['result'] = $this->codegen_model->get('students','id,username,city,created_on,date_created','id = '.$this->uri->segment(3),NULL,NULL,true);

    $this->data['message'] = $this->db->get('messages')->result();

            //---------------------- Posting student data for Edit--------------
    $this->load->view('pheader');
    $this->load->view('/students/students_edit', $this->data);  

            //-------- loading comment controller for comment box --------------
            $msg_data['result'] = $this->db->get('messages')->result();
            $this->load->view('commentView', $msg_data);
}

所以问题是当我提交messages_view时控制器都已加载,但我只需要加载一个控制器

这是我的student_edit视图,我在其中编辑我的详细信息

<?php     

echo form_open(current_url()); ?>
<?php echo $custom_error; ?>
<?php echo form_hidden('id',$result->id) ?>

        <p><label for="username">Username<span class="required">*</span></label>                                
        <input id="username" type="text" name="username" value="<?php echo $result->username ?>"  />
        <?php echo form_error('username','<div>','</div>'); ?>
        </p>

        <p><label for="city">City<span class="required">*</span></label>                                
        <input id="city" type="text" name="city" value="<?php echo $result->city ?>"  />
        <?php echo form_error('city','<div>','</div>'); ?>
        </p>
        <?php echo form_submit( 'submit', 'Submit'); ?>
</p>

<?php echo form_close(); ?>

以下是我与控制器分开加载的commentView

<div id="content-table-inner">
    <table border="0" width="100%" cellpadding="0" cellspacing="0">
        <?php foreach ($result as $comment): ?>

            <tr valign="top">
                <p>Posted By : <?=$comment->created_by?></p> 
                <p>Posted On : <?=$comment->created->on?></p> 
                <p>Message : <?=$comment->message?></p> 
            </tr>
            <br/>
        <?php endforeach; ?>
        </table>
        <div class="submitComment" id="insertbeforMe">
            <h3>Add a message</h3>
            <form id="form" method="POST" action="">
             <p>
                 <textarea name="message"></textarea>
            </p>
                <input type="hidden" value="<?=base_url()?>" id="baseurl"/>
                <button name="submit comment">Submit Comment</button>
            </form>
        </div>
        <script type="text/javascript">
        function comment(){
            var baseurl = $('#baseurl').val();
            $('.submitComment').click(function(){
                $.ajax({
                    url : baseurl + 'index.php/comment/insert',
                    data : $('form').serialize(),
                    type: "POST",
                    success : function(comment){
                        $(comment).hide().insertBefore('#insertbeforMe').slideDown('slow');
                    }
                })
                return false;
            })
        }
        </script>

</div>

谁能告诉我这是什么问题?

2 个答案:

答案 0 :(得分:2)

如果我理解正确......

您应该捕获的事件是表单的“提交”,而不是提交按钮的“点击”。您实际上是在运行AJAX请求提交表单。

尝试这样的事情:

$('form').on('submit', function(e) {
    e.preventDefault(); // this prevents the form from submitting

    // do AJAX stuff
});

答案 1 :(得分:0)

除非我弄错了,否则您将事件附加到'.submitComment'div上的点击事件。

你不应该给按钮一个id并附上.click事件吗? 然后你需要定义你想通过ajax调用的视图来返回你的函数可以使用的一些json:

Javascript:

       $('#button').click(function(){
                    $.ajax({
                        url : baseurl + 'index.php/comment/insert',
                        data : $('form').serialize(),
                        type: "POST",
                        dataType: "json",
                        success : function(comment){
                            $('table').append('<tr><p>'+comment.createdby+'</p><p>'+comment.createdon+'</p><p>'+comment.message+'</p></tr>');
                        }
                    })
                    return false;
       })

Controller方法(注释/插入):

function insert() {
    $comment = $this->input->post('message');
    $result = $this->commentModel->insert($comment);
    if($result["OK"]) {
        $data['json'] = json_encode(array('createdon' => $result["createdon"], 'createdby' => $result["createdby"], 'message' => $result["message"]));
        $this->load->view('json_comment_view', $data);
    }
    //ELSE deal with errors (flashdata etc...)
} 

视图(通过ajax加载):

<?php
    $this->output->set_header('Content-Type: application/json; charset=utf-8');
    echo $json;
?>

我没有测试过这段代码 - 或者在大约一年内广泛使用了codeigniter,但所涵盖的概念应该能让您走上正确的道路,实现您想要达到的目标。让我知道!