Le problème :
Cakephp creer des liens hypertext seulement avec la méthode GET. Bien sûr ce n'est pas la meilleur moyen lorsqu'il s'agit d'effacer une ressource (dans la base de donnée), cela devrait être réaliser depuis un méthode POST.
Comment faire
En fait on va creer un formulaire avec un peu de javascript :
Effacer
Lorsque l'utilisateur confirm l'action, cela creer le formulaire qui sera envoyé à l'application.
Dans CakePhp
Helper
J'ai choisis de créer un helper personnalisé qui utilisera celui par défaut, $html->link :
//file: app/views/helpers/html2.php
class Html2Helper extends Helper {
//permet d'utiliser l'helper Html
var $helpers = array('Html');
function link($title, $url = null, $htmlAttributes = array(), $confirmMessage = false, $escapeTitle = true, $return = false) {
//On ajoute le formulaire seulement si confirmMessage est présent:
if ($confirmMessage) {
$confirmMessage = str_replace("'", "\'", $confirmMessage);
$confirmMessage = str_replace('"', '\"', $confirmMessage);
//on ajout le post
$htmlAttributes['onclick']="if (confirm('$confirmMessage')) { var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'post'; f.action = this.href;f.submit(); };return false;";
}
//Et on utilise l'helper de base
$output = $this->Html->link($title, $url, $htmlAttributes, null, $escapeTitle, $return);
return $this->output($output, $return);
}
}
?>
Utilisation : View
On peut donc inserer dans n'importe quelle vue. Il ne faut pas oublier de l'importer dans le controller. Le message de confirmation est obligatoire :
link('post link', '/pages/index', null, 'Es-tu sûr?'); ?>
Controller
Importer l'helper et verification: :
//file: app/controller/pages_controller.php
class PagesController extends AppController {
var $name = 'Posts';
//hell yeah!
var $helpers = array('Html2');
//le composant de requetes
var $components = array('RequestHandler');
function index(){
//Si la requete est en POST : renvoie vrai
if($this->RequestHandler->isPost())
debug('request is post');
else
debug('request is not post T_T');
}
}
?>
Et après ...
On peut modifier ces scripts pour rentrer dans les bonnes grâces d'applications RESTful : PUT, DELETE.