0

我正在学习 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是项目编号。但是,我不想要这个新 URL,我真的只想/news/重新加载页面以显示新内容。显然,我这样做的方式有潜在的危险,因为用户简单的页面刷新会删除另一个项目。解决/处理此问题的标准方法是什么?

2) 在我的 Controllerdelete()函数中,在第一行之后,我基本上只是从 Controllerindex()函数中重复相同的 5 行代码。毫无疑问,这在某种程度上与问题 #1 相关,但同样,更好的方法是什么?

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

4

4 回答 4

1

好吧,我不会再包括所有的东西,而是写:

public function delete($id) {
    $this->news_model->delete_news($id);
    redirect(base_url().'news/')
}

因此,在单击链接并删除新闻后,用户会被重定向到正常的新闻页面。

请参阅:CodeIgniter url 帮助程序

最好的祝福

斯蒂芬·S。

于 2012-11-15T20:49:41.937 回答
1

1)我建议您加载 url 帮助程序并重定向到/news/那时。如果您希望显示删除确认,我建议您flash_messagesession库中使用,它允许在会话中存储警报直到您显示它,它专门用于此目的。

2)您可能做的唯一更好的事情可能是制作一个自制的助手来管理您的视图,因此您只需调用带有参数的函数即可输出视图。但是没有其他方法可以优化它或节省一些代码行。

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

编辑:

如果需要显示错误或成功信息,请参考 CodeIgniter 的session 库的 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 的目的,正确且简单地显示错误消息。

于 2012-11-15T20:50:20.753 回答
1

下一步将考虑错误和不良数据

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

重定向('/news/adminerror/delete');

然后在你的新闻控制器中,有一个像 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'

也用于确认发生了更新。但是,如果您进行更新,假设您正在更新博客文章 - 然后您再次单击以更新,但实际上您没有更改任何内容......那么这将返回为假。更新确实通过了,但由于内容相同,因此数据库没有更改或“受影响”。

因此,如果您使用该方法来确认更新 - 可能会有更酷的方法来执行此操作,但我只是发送一些与更新内容一起总是不同的内容 - 日期/时间、随机数等。

于 2012-11-15T22:30:38.240 回答
0

感谢 Jean-François GB 和 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>
于 2012-11-15T21:01:56.127 回答