2012-11-15 44 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