[英]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/
您需要做的关键是将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');
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.