2012-11-15 46 views
0

我正在学习Codeigniter 2并成功使用their Tutorial/Example about how to create a basic news application使用删除功能修改标准Codeigniter 2新闻教程

所以在获得这个工作之后,我想尝试添加一个“删除记录”链接到新闻项目,看看我是否可以自己弄清楚。

我将此添加到我的模式文件,news_model.php

public function delete_news($id) { 
    $this->db->delete('news', array('id' => $id)); 
} 

我将此添加到我的控制器文件,news.php

public function delete($id) { 
    $this->news_model->delete_news($id); 

    $data['news'] = $this->news_model->get_news(); 
    $data['title'] = 'News item deleted'; 

    $this->load->view('templates/header', $data); 
    $this->load->view('news/index', $data); 
    $this->load->view('templates/footer'); 
} 

我将此添加到我的意见文件,index.php

<a href="/news/delete/<?php echo $news_item['id'] ?>">Delete Item</a> 

最后,我已将此添加到我的配置文件,routes.php

$route['news/delete/(:any)'] = 'news/delete/$1'; 

这似乎是工作的写入。

从新闻列表网页在/news/,我点击的链接新闻项目上,当页面重新加载,相应的项目已经一去不复返了。

问题:

1)页面重新加载后,该URL显示/news/delete/id,其中/id是项目编号。但是,我不想要这个新网址,我真的只想要重新加载/news/页面以显示新内容。显然,我这样做的方式是潜在的危险,因为用户简单的页面刷新会删除另一个项目。修复/处理这个问题的标准方法是什么?

2)在我的控制器delete()功能,第一行后,我基本上只是从控制器index()函数重复相同的5行代码。毫无疑问,这与问题#1有关,但是再一次,有什么更好的方法来做到这一点?

3)我错过了有关“标准”或“最佳实践”的内容吗?

+0

就像一个笔记:我会有一个确认链接,所以这篇文章只在POST上被删除。这样,文章不会仅仅通过点击一个URL而被删除。 –

+0

@MartinBean,我完全同意。只是玩弄教程,但随时发布一个答案,并包括你的建议改进。 – Sparky

回答

0

感谢Jean-FrançoisG. B.和Stephan S.为我指出了正确的方向。

这是工作溶液...

控制器文件,news.php

public function delete($id) { 
    $this->news_model->delete_news($id); 
    $this->load->helper('url'); 
    redirect('/news/'); 
} 

编辑:

修改以显示一则确认消息,“记录#x删除“ ...

public function delete($id) { 
    $this->news_model->delete_news($id); 
    $this->load->helper('url'); 
    $this->load->library('session'); 
    $this->session->set_flashdata('error_message', 'record #'. $id . ' deleted'); 
    redirect('/news/'); 
} 

和内部意见文件,index.php

<div id="message"> 
    <?php 
     if ($this->session->flashdata('error_message')) {     
      echo $this->session->flashdata('error_message'); 
     } 
    ?> 
</div> 
1

嗯,我会不会再次,而是包括所有的东西只写:

点击链接和删除新闻用户被重定向到正常的新闻页面后
public function delete($id) { 
    $this->news_model->delete_news($id); 
    redirect(base_url().'news/') 
} 

左右。

参见:CodeIgniter url helper

问候

斯蒂芬S.

+0

感谢您的回答。由于您没有首先加载URL助手,因此'redirect()'会引发错误。 – Sparky

+0

对不起!我总是“自动加载”url helper(application/config/autoload.php - helpers),因为我需要它很多:)参见:http://codeigniter.com/user_guide/general/autoloader.html –

1

1)我建议你加载网址助手,做重定向到/news/即可。如果你想显示删除确认信息,我建议你使用flash_messagesession库,它允许库存警报在会话中,直到你展示它,它是专门用于这一目的。

2)你可能做的唯一更好的事情可能是自制助手来管理你的视图,所以你只需要用参数调用一个函数来输出视图。但是没有其他的方法来优化它或者保存一些代码。

3)你做得很好,很干净。 :)

编辑:

如果你需要显示错误或成功的消息,请参考笨的session library的flash_message,但这里有一个例子。

在控制器中设置错误信息,中庸之道重定向到索引之前:

$this->load->library('session'); 
$this->session->set_flashdata('error_message', "This is my error message"); 

而在你的索引视图,你如果它存在它显示:

<?if($this->session->flashdata('error_message')):?> 
    <div class="nNote nFailure"><p><?=$this->session->flashdata('error_message');?></p></div> 
<?endif;?> 

请注意, flash_message显示一次。这意味着您的索引将显示您的错误,然后销毁会话消息。这是flash_message的目的,正确和简单地显示错误消息。

+0

谢谢你为你的答案。实际上,如果我正在对'/ news /'进行重定向,那么问题#2中的五条冗余代码行就可以被取消。 – Sparky

+0

你能否扩展你的答案来解释更多关于'flash_message'的信息,以及它在这里可以如何使用的细节?谢谢! – Sparky

+0

我可以做一个重定向,但如何将'flash-message'变量传递给页面? – Sparky

1

下一步将占到错误和糟糕的数据

  • 检查$ id来确保其真的是一个整数。这可能会在调用delete之前发生在控制器中,或者作为delete方法的一部分。重要的一点是,因为id直接来自URL而没有验证,所以在让它靠近数据库之前,你必须做一些检查。
  • 在模型中,delete_news应返回true或false,以确认记录已被找到并被删除。
  • 在控制器中,包装$ this-> news_model-> delete_news($ id);在IF中检查它是否从模型中恢复为真,否则错误重定向。
  • 如果有一个错误,因为你想要的网址改变,你仍然可以重定向,只是传递一个适当的错误代码像

重定向(“/新闻/ adminerror /删除”);

然后在您的消息控制器,有像adminerror($ ERRORTYPE)的方法
然后基于对$ ERRORTYPE的值,其在这种情况下将是一个删除错误, 显示适当的消息和视图。

编辑

2-在模型中,您的删除方法里面,只是把这个底:

if ($this->db->affected_rows() == '1') 
{return TRUE;} 
else 
{return FALSE;} 

3-控制器,包裹在一个IF,它通常更容易检查如果事情没有工作第一

if($this->news_model->delete_news($id) == false) 
{ 
// redirect to error page or whatever you need  
} 
// if its not false, then its true, which means it worked 
else 
{ 
$this->session->set_flashdata('error_message', 'record #'. $id . ' deleted'); 
redirect('/news/'); 
} 

最后的快速尖端更新记录 -

$this->db->affected_rows() == '1' 

也用于确认发生了更新。但如果你做了更新,可以说你 正在更新博客文章 - 然后你点击再次更新,但实际上你没有改变任何内容....然后这将返回为假。更新确实通过了,但由于内容相同,数据库没有变化或“受到影响”。

所以如果您使用该方法来确认更新 - 可能会有更酷的方式来做到这一点,但我只是随同更新内容一起发送内容 - 日期/时间,随机数等。

+0

感谢您的提示。你可以显示你的前三个项目的代码? – Sparky