【问题标题】:Codeigniter form on same page as results与结果在同一页面上的 Codeigniter 表单
【发布时间】:2013-12-09 22:03:22
【问题描述】:

我正在使用 codeigniter 和来自 here 的教程。我制作了一个可以正常工作的基本博客工具。但是,要添加新帖子,您必须转到单独的页面“create.php”才能访问表单。我想尝试将表单与将要更新的页面(即“index.php”)放在同一页面上。如果我现在尝试这样做,表单只会刷新并提交数据。

型号

function insert_post($data){
    $this->db->insert('posts', $data);
    return;
}

当前视图 (admin/create.php)

<?php echo validation_errors(); ?>

<h4>Create A New Post Below</h4>
<form action="" method="post" >
<p>Title:</p>
<input type="text" name="title" size="50"/><br/>       
<p>Summary:</p>
<textarea name="summary" rows="2" cols="50"></textarea><br/>
<p>Post Content:</p>
<textarea name="content" rows="6" cols="50"></textarea><br/>
<input type="submit" value="Save" />

<?php echo anchor('admin','Cancel'); ?>

</form>

查看我想要打开的表单 (index.php)

<?php
    echo '<p>Welcome '.$username.'! All posts available for edit or deletion is listed below.</p><br/>';

    echo anchor('admin/create','Create New Post');

    $count = count($post['id']);
    for ($i=0;$i<$count;$i++)
    {
        echo '<div class="postDiv">';
        echo '<h4>'.$post['title'][$i];
        echo '<p>'.$post['summary'][$i].'</p>';
        echo '<p>'.$post['content'][$i].'</p>';
        //echo anchor('blog/view/'.$post['id'][$i],' [view]');
        echo anchor('admin/edit/'.$post['id'][$i],' [edit]');
        echo anchor('admin/delete/'.$post['id'][$i],' [delete]</h4>');
        echo '</div>';
    }
?>

控制器

function create(){
    $data['userId'] = $this->tank_auth->get_user_id();
    $data['username'] = $this->tank_auth->get_username();

    $this->form_validation->set_rules('title','title','required');
    $this->form_validation->set_rules('summary','summary','required');
    $this->form_validation->set_rules('content','content','required');

    if($this->form_validation->run()==FALSE)
    {
        $this->load->view('template/admin_html_head',$data);
        $this->load->view('admin/create',$data);
        $this->load->view('template/html_tail',$data);
    } else {
        $data = $_POST;
        $this->posts->insert_post($data);
        redirect('admin');
    }
}

当我使用普通的 php 时,这是直截了当的,但使用 codeigniter 我迷失了 MVC 的东西。我知道这可能是一个相当基本的问题,所以请解释您的答案或给我一个链接,该链接将解释我想从中学习需要做什么。我已阅读有关验证的 codeigniter 文档,但我认为这不是我的问题?

【问题讨论】:

    标签: php forms codeigniter


    【解决方案1】:

    您正在尝试做的事情称为嵌入视图。我将尝试解释如何,但您还应该检查一些可能被证明更深入的链接:

    http://net.tutsplus.com/tutorials/php/an-introduction-to-views-templating-in-codeigniter/

    Codeigniter: Best way to structure partial views

    您需要做的关键是将 index.php 上的链接更改为:

    echo anchor('admin/create','Create New Post');
    

    到

    $this->load->view('admin/create');
    

    现在这应该可以了,但是为了在 MVC 方面帮助您,它有助于解释为什么这样做是错误的。 MVC 的想法是将应用程序中的功能分离为不同的角色。大多数人会不喜欢将业务逻辑放入视图中,除非它非常小。我们可以改进您的代码的方法是在控制器中加载视图,并将其设置为变量。

    在视图的 codeigniter 文档的底部,它显示了如何加载到变量中:

    http://ellislab.com/codeigniter/user-guide/general/views.html

    如果 load->view 的第三个参数设置为 true,那么该函数会将您的视图作为字符串返回,而不是将其输出到浏览器

    $data['input_form'] = $this->load->view('admin/create', $data, true);
    

    然后在要加载该表单的视图中,您需要做的就是 echo input_form

    <?php echo $input_form;?>
    

    这样应该可以解决您的问题,但您还可以在视图文件中执行更多操作,以提高代码的可读性。

    你可以使用 foreach 来代替使用 count() 和 for 循环,这让一切变得更容易

    <?php foreach ($post as $post_item):?>
    <div>
    <h4><?php echo $post_item['title'];?></h4>
    </div>
    <?php endforeach;?>
    

    它还有助于分解视图文件并拥有更多标签。看起来它看起来很臃肿,但是当您有更大的视图文件时,继续使用尽可能多的回声会非常麻烦

    【讨论】:

    • 感谢您的详细回复。这些链接非常有用,谢谢。我想我需要离开并做更多的阅读,但不幸的是我无法让它发挥作用。如果我尝试您提到的第一种方法(因为它最不可能让我搞砸)我可以看到表单,但我再次遇到表单没有向数据库提交任何数据的问题。如果我使用您提到的第二种方法,也会发生同样的情况。我还能做错什么吗?
    • 因此,我使用您的说明作为指导,以一种倒退的方式完成了这项工作。如果我试图将表单放在索引页面上,那么表单没有提交,因为索引页面没有调用 insert_post 函数。我已将索引页面放在创建页面的底部,现在一切正常。这不是我想要的,但我现在明白发生了什么,所以我想我应该能够解决这个问题。感谢您的帮助!
    【解决方案2】:

    只需在您的表单操作中添加一个方法 uri_string(),uri_string 将采用相同的页面 url,您可以将表单提交到同一页面

    <?php echo validation_errors(); ?>
    
    <h4>Create A New Post Below</h4>
    <form action="<?=uri_string()?>" method="post" >
    <p>Title:</p>
    <input type="text" name="title" size="50"/><br/>       
    <p>Summary:</p>
    <textarea name="summary" rows="2" cols="50"></textarea><br/>
    <p>Post Content:</p>
    <textarea name="content" rows="6" cols="50"></textarea><br/>
    <input type="submit" value="Save" />
    
    <?php echo anchor('admin','Cancel'); ?>
    
    </form>
    

    在控制器中的小变化

    function create(){
        $data['userId'] = $this->tank_auth->get_user_id();
        $data['username'] = $this->tank_auth->get_username();
    
        $this->form_validation->set_rules('title','title','required');
        $this->form_validation->set_rules('summary','summary','required');
        $this->form_validation->set_rules('content','content','required');
    
        if($this->form_validation->run()==FALSE)
        {
            $this->load->view('template/admin_html_head',$data);
            $this->load->view('admin/create',$data);
            $this->load->view('template/html_tail',$data);
        } else {
            $data = $this->input->post();
            $this->posts->insert_post($data);
            redirect('admin');
        }
    }
    

    【讨论】:

    • 感谢您的回答。我试过了,但我得到了相同的结果,即提交表单时没有任何反应
    【解决方案3】:

    使用会话库

    check this another stackoverflow thread to know how to use session

    为了使用会话库,你需要在config.php中配置encryption_key

    为此,check this out

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 2011-11-10
      • 1970-01-01
      相关资源
      最近更新 更多