繁体   English   中英

Codeigniter表单与结果在同一页上

[英]Codeigniter form on same page as results

我使用笨和教程这里 我做了一个基本的博客工具,可以正常工作。 但是,按原样添加新帖子,您必须转到单独的页面“ 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文档,但我认为那不是我的问题吗?

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

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

Codeigniter:构造部分视图的最佳方法

您需要做的关键是将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;?>

它还有助于分解视图文件并具有更多标签。 看起来似乎有些膨胀,但是当您拥有较大的视图文件时,继续使用尽可能多的回声将非常麻烦

只需在表单操作中添加一个方法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');
    }
}

使用会话

检查这另一个stackoverflow线程,以了解如何使用会话

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

为此, 请检查一下

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM