Magazine

[cakephp]Liens en methode POST - fr

Publié le 20 septembre 2007 par David Epely

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.

Retour à La Une de Logo Paperblog

A propos de l’auteur


David Epely 3 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte