Deleting records
Just as we can list and view records, as well as edit and create new ones, you'll also want to be familiar with how to delete records using CakePHP.
In this recipe, we'll create an action that allows us to delete records from our table.
Getting ready
As with the previous recipe, we'll continue using the products
table and also extend the ProductsController
that we created.
How to do it...
Perform the following steps:
- Add the following
delete()
method to theProductsController
class:public function delete($id) { if (!$this->request->is('post')) { throw new MethodNotAllowedException(); } if ($this->Product->delete($id)) { $this->Session->setFlash(__('Product removed: %s', $id)); return $this->redirect(array('action' => 'index')); } $this->Session->setFlash(__('Could not remove product')); return $this->redirect($this->referer()); }
- Change the content of the
index.ctp
file to the following:<h2><?php echo __('Products'); ?></h2> <div> <?php echo $this->Html->link(__('Add new product'), array('action' => 'add')); ?> </div> <table> <tr> <th><?php echo $this->Paginator->sort('id'); ?></th> <th><?php echo $this->Paginator->sort('name'); ?></th> <th><?php echo $this->Paginator->sort('created'); ?></th> <th><?php echo __('Actions'); ?></th> </tr> <?php foreach ($products as $product): ?> <tr> <td><?php echo $product['Product']['id']; ?></td> <td><?php echo $this->Html->link($product['Product']['name'], array('action' => 'view', $product['Product']['id'])); ?></td> <td><?php echo $this->Time->nice($product['Product']['created']); ?></td> <td> <?php echo $this->Html->link(__('Edit'), array('action' => 'edit', $product['Product']['id'])); echo $this->Form->postLink(__('Delete'), array('action' => 'delete', $product['Product']['id']), array('confirm' => 'Delete this product?')); ?> </td> </tr> <?php endforeach; ?> </table> <div> <?php echo $this->Paginator->counter(array('format' => __('Page {:page} of {:pages}, showing {:current} records out of {:count} total, starting on record {:start}, ending on {:end}'))); ?> </div> <div> <?php echo $this->Paginator->prev(__('< previous'), array(), null, array('class' => 'prev disabled')); echo $this->Paginator->numbers(array('separator' => '')); echo $this->Paginator->next(__('next >'), array(), null, array('class' => 'next disabled')); ?> </div>
How it works...
In this recipe, we added a delete()
method to our ProductsController
class. This first checks whether the HTTP method used to call the action was POST
. In the event it wasn't, we throw a MethodNotAllowedException
exception, which is presented as an error page when it is thrown from an action. This is to protect our application against attempts to delete data via a simple URL. If the HTTP method is correct, we proceed to call the delete()
method on the Product
model, passing to it the ID of the record to delete. If it is successful, we call the setFlash()
method on our Session
component with a message confirming the removal or with a failure message if the delete()
method fails. Finally, we redirect the request to the index()
action if the record was deleted successfully—if not, then we are redirecting the user back to the URL where the delete()
method was called from. It may also be worth mentioning that the delete()
action itself doesn't have a view associated with it, as nothing is displayed to the user as part of the request.
We then returned to the index.ctp
view to add an option to delete a product using the postLink()
method of the Form
helper. This creates a form with a link that allows us to use POST
when clicking on the link which submits the form. You will notice that this takes a third argument, which is an array with a confirm
key. This prompts the user to confirm the action before submitting the request to delete the record. This is always recommended when dealing with actions that delete records, in case of a mistake on the user's behalf.
See also
- More details on deleting data in your Models can be found at http://book.cakephp.org/2.0/en/models/deleting-data.html
- The Adding and editing records recipe