PageRenderTime 53ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/fr/tutorials-and-examples/blog/part-two.rst

https://gitlab.com/albertkeba/docs
ReStructuredText | 744 lines | 598 code | 146 blank | 0 comment | 0 complexity | ce33bd0bfb5cec2465f27cafa0e438e1 MD5 | raw file
  1. Blog Tutoriel - Ajouter la logique
  2. **********************************
  3. Créer un model Post
  4. ===================
  5. La classe Model est le pain quotidien des applications CakePHP. En
  6. créant un model CakePHP qui interagira avec notre base de données,
  7. nous aurons mis en place les fondations nécessaires pour faire plus
  8. tard nos opérations de lecture, d'insertion, d'édition et de suppression.
  9. Les fichiers des classes Model de CakePHP se trouvent dans ``/app/Model``,
  10. et le fichier que nous allons créer maintenant sera enregistré dans
  11. ``/app/Model/Post.php``. Le fichier complet devrait ressembler à ceci ::
  12. class Post extends AppModel {
  13. }
  14. La convention de nommage est vraiment très importante dans CakePHP. En nommant
  15. notre model Post, CakePHP peut automatiquement déduire que ce model sera
  16. utilisé dans le controller PostsController, et sera lié à la table ``posts``
  17. de la base de données.
  18. .. note::
  19. CakePHP créera dynamiquement un objet model pour vous, s'il ne trouve
  20. pas le fichier correspondant dans /app/Model. Cela veut aussi dire que
  21. si vous n'avez pas nommé correctement votre fichier (par ex. post.php ou
  22. posts.php au lieu de Post.php), CakePHP ne reconnaîtra pas votre
  23. configuration et utilisera ses objets model par défaut.
  24. Pour plus d'informations sur les models, comme les préfixes des tables,
  25. les callbacks, et la validation, consultez le chapitre :doc:`/models` du
  26. manuel.
  27. Créer un controller Posts
  28. =========================
  29. Nous allons maintenant créer un controller pour nos posts. Le controller est
  30. l'endroit où s'exécutera toute la logique métier pour l'intéraction du
  31. processus de post. En un mot, c'est l'endroit vous jouerez avec les models
  32. et les tâches liées aux posts s'exécutent. Nous placerons ce nouveau
  33. controller dans un fichier appelé ``PostsController.php`` à l'intérieur du
  34. dossier ``/app/Controller``. Voici à quoi devrait ressembler le controller
  35. de base ::
  36. class PostsController extends AppController {
  37. public $helpers = array('Html', 'Form');
  38. }
  39. Maintenant, ajoutons une action à notre controller. Les actions représentent
  40. souvent une simple fonction ou une interface dans une application. Par exemple,
  41. quand les utilisateurs requêtent www.exemple.com/posts/index (qui est
  42. la même chose que www.exemple.com/posts/), ils pourraient s'attendre à voir une
  43. liste de posts. Le code pour cette action devrait ressembler à quelque chose
  44. comme ça ::
  45. class PostsController extends AppController {
  46. public $helpers = array('Html', 'Form');
  47. public function index() {
  48. $this->set('posts', $this->Post->find('all'));
  49. }
  50. }
  51. En définissant la fonction ``index()`` dans notre PostsController, les
  52. utilisateurs peuvent accéder à cette logique en demandant
  53. www.exemple.com/posts/index. De la même façon, si nous devions définir une
  54. fonction appelée ``foobar()``, les utilisateurs pourrait y accéder en demandant
  55. www.exemple.com/posts/foobar.
  56. .. warning::
  57. Vous pourriez être tenté de nommer vos controllers et vos actions d'une
  58. certaine manière pour obtenir une certaine URL. Résistez à cette tentation.
  59. Suivez les conventions CakePHP (le nom des controllers au pluriel, etc.) et
  60. nommez vos actions de façon lisible et compréhensible. Vous pouvez lier les
  61. URLs à votre code en utilisant ce qu'on appelle des "routes", on le verra
  62. plus tard.
  63. La seule instruction que cette action utilise est ``set()``, pour transmettre
  64. les données du controller à la vue (que nous créerons à la prochaine étape).
  65. La ligne définit la variable de vue appelée 'posts' qui est égale à la valeur
  66. de retour de la méthode ``find('all')`` du model Post. Notre model Post est
  67. automatiquement disponible via $this->Post, parce que nous avons suivi les
  68. conventions de nommage de CakePHP.
  69. Pour en apprendre plus sur les controllers de CakePHP, consultez le chapitre
  70. :doc:`/controllers`.
  71. Créer les Vues des Posts
  72. ========================
  73. Maintenant que nous avons nos données en provenance du model, ainsi que la
  74. logique applicative et les flux définis par notre controller, nous allons créer
  75. une vue pour l'action "index" que nous avons créé ci-dessus.
  76. Les vues de CakePHP sont juste des fragments de présentation "assaisonnée",
  77. qui s'intègrent au sein d'un layout applicatif. Pour la plupart des
  78. applications, elles sont un mélange de HTML et PHP, mais les vues peuvent aussi
  79. être constituées de XML, CSV ou même de données binaires.
  80. Un Layout est un code de présentation, encapsulé autour d'une vue. Ils peuvent
  81. être définis et interchangés, mais pour le moment, utilisons juste celui par
  82. défaut.
  83. Vous souvenez-vous, dans la dernière section, comment nous avions assigné
  84. la variable 'posts' à la vue en utilisant la méthode ``set()`` ?
  85. Cela devrait transmettre les données à la vue qui ressemblerait à quelque
  86. chose comme cela ::
  87. // print_r($posts) affiche:
  88. Array
  89. (
  90. [0] => Array
  91. (
  92. [Post] => Array
  93. (
  94. [id] => 1
  95. [title] => Le titre
  96. [body] => Voici le contenu du post.
  97. [created] => 2008-02-13 18:34:55
  98. [modified] =>
  99. )
  100. )
  101. [1] => Array
  102. (
  103. [Post] => Array
  104. (
  105. [id] => 2
  106. [title] => Encore un titre
  107. [body] => Et le contenu du post qui suit.
  108. [created] => 2008-02-13 18:34:56
  109. [modified] =>
  110. )
  111. )
  112. [2] => Array
  113. (
  114. [Post] => Array
  115. (
  116. [id] => 3
  117. [title] => Le retour du titre
  118. [body] => C'est très excitant, non ?
  119. [created] => 2008-02-13 18:34:57
  120. [modified] =>
  121. )
  122. )
  123. )
  124. Les fichiers des vues de CakePHP sont stockés dans ``/app/View`` à l'intérieur
  125. d'un dossier dont le nom correspond à celui du controller (nous aurons à créer
  126. un dossier appelé 'Posts' dans ce cas). Pour mettre en forme les données de
  127. ces posts dans un joli tableau, le code de notre vue devrait ressembler à
  128. quelque chose comme cela
  129. .. code-block:: php
  130. <!-- File: /app/View/Posts/index.ctp -->
  131. <h1>Blog posts</h1>
  132. <table>
  133. <tr>
  134. <th>Id</th>
  135. <th>Titre</th>
  136. <th>Créé le</th>
  137. </tr>
  138. <!-- Here is where we loop through our $posts array, printing out post info -->
  139. <?php foreach ($posts as $post): ?>
  140. <tr>
  141. <td><?php echo $post['Post']['id']; ?></td>
  142. <td>
  143. <?php echo $this->Html->link($post['Post']['title'],
  144. array('controller' => 'posts', 'action' => 'view', $post['Post']['id'])); ?>
  145. </td>
  146. <td><?php echo $post['Post']['created']; ?></td>
  147. </tr>
  148. <?php endforeach; ?>
  149. <?php unset($post); ?>
  150. </table>
  151. Vous avez sans doute remarqué l'utilisation d'un objet appelé ``$this->Html``.
  152. C'est une instance de la classe CakePHP :php:class:`HtmlHelper`.
  153. CakePHP est livré avec un ensemble de "helpers" (des assistants) pour les vues,
  154. qui réalisent en un clin d'œil des choses comme le "linking" (mettre les liens
  155. dans un texte), l'affichage des formulaires, du JavaScript et de l'AJAX. Vous
  156. pouvez en apprendre plus sur la manière de les utiliser dans le chapitre
  157. :doc:`/views/helpers`, mais ce qu'il est important de noter ici, c'est que la
  158. méthode ``link()`` génèrera un lien HTML à partir d'un titre (le premier
  159. paramètre) et d'une URL (le second paramètre).
  160. Lorsque vous indiquez des URLs dans CakePHP, il est recommandé d'utiliser les
  161. tableaux. Ceci est expliqué dans le chapitre des Routes. Utiliser les tableaux
  162. dans les URLs vous permet de tirer profit des capacités de CakePHP à
  163. -inverser les routes. Vous pouvez aussi utiliser les URLs relatives depuis
  164. la base de l'application comme suit /controller/action/param1/param2.
  165. A ce stade, vous devriez être en mesure de pointer votre navigateur sur la
  166. page http://www.exemple.com/posts/index. Vous devriez voir votre vue,
  167. correctement formatée avec le titre et le tableau listant les posts.
  168. Si vous avez essayé de cliquer sur l'un des liens que nous avons créés dans
  169. cette vue (le lien sur le titre d'un post mène à l'URL :
  170. /posts/view/un_id_quelconque), vous avez sûrement été informé par CakePHP que
  171. l'action n'a pas encore été définie. Si vous n'avez pas été informé, soit
  172. quelque chose s'est mal passé, soit en fait vous aviez déjà défini l'action,
  173. auquel cas vous êtes vraiment sournois ! Sinon, nous allons la créer sans plus
  174. tarder dans le Controller Posts ::
  175. // File: /app/Controller/PostsController.php
  176. class PostsController extends AppController {
  177. public $helpers = array('Html', 'Form');
  178. public function index() {
  179. $this->set('posts', $this->Post->find('all'));
  180. }
  181. public function view($id = null) {
  182. if (!$id) {
  183. throw new NotFoundException(__('Invalid post'));
  184. }
  185. $post = $this->Post->findById($id);
  186. if (!$post) {
  187. throw new NotFoundException(__('Invalid post'));
  188. }
  189. $this->set('post', $post);
  190. }
  191. }
  192. L'appel de ``set()`` devrait vous être familier. Notez que nous utilisons
  193. ``findById()`` plutôt que ``find('all')`` parce que nous voulons seulement
  194. récupérer les informations d'un seul post.
  195. Notez que notre action "view" prend un paramètre : l'ID du post que nous
  196. aimerions voir. Ce paramètre est transmis à l'action grâce à l'URL demandée.
  197. Si un utilisateur demande /posts/view/3, alors la valeur '3' est transmise
  198. à la variable ``$id``.
  199. Nous faisons aussi une petite vérification d'erreurs pour nous assurer qu'un
  200. utilisateur accède bien à l'enregsitrement. Si un utilisateur requête
  201. ``/posts/view``, nous lancerons un ``NotFoundException`` et laisserons
  202. le Gestionnaire d'Erreur de CakePHP ErrorHandler prendre le dessus. Nous
  203. exécutons aussi une vérification similaire pour nous assurer que l'utilisateur
  204. a accède à un enregistrement qui existe.
  205. Maintenant, créons la vue pour notre nouvelle action "view" et plaçons-la
  206. dans ``/app/View/Posts/view.ctp``.
  207. .. code-block:: php
  208. <!-- Fichier : /app/View/Posts/view.ctp -->
  209. <h1><?php echo h($post['Post']['title']); ?></h1>
  210. <p><small>Créé le : <?php echo $post['Post']['created']; ?></small></p>
  211. <p><?php echo h($post['Post']['body']); ?></p>
  212. Vérifiez que cela fonctionne en testant les liens de la page /posts/index
  213. ou en affichant manuellement un post via ``/posts/view/1``.
  214. Ajouter des Posts
  215. =================
  216. Lire depuis la base de données et nous afficher les posts est un bon début,
  217. mais lançons-nous dans l'ajout de nouveaux posts.
  218. Premièrement, commençons par créer une action ``add()`` dans le
  219. PostsController ::
  220. class PostsController extends AppController {
  221. public $helpers = array('Html', 'Form', 'Session');
  222. public $components = array('Session');
  223. public function index() {
  224. $this->set('posts', $this->Post->find('all'));
  225. }
  226. public function view($id) {
  227. if (!$id) {
  228. throw new NotFoundException(__('Invalid post'));
  229. }
  230. $post = $this->Post->findById($id);
  231. if (!$post) {
  232. throw new NotFoundException(__('Invalid post'));
  233. }
  234. $this->set('post', $post);
  235. }
  236. public function add() {
  237. if ($this->request->is('post')) {
  238. $this->Post->create();
  239. if ($this->Post->save($this->request->data)) {
  240. $this->Session->setFlash(__('Your post has been saved.'));
  241. return $this->redirect(array('action' => 'index'));
  242. }
  243. $this->Session->setFlash(__('Unable to add your post.'));
  244. }
  245. }
  246. }
  247. .. note::
  248. ``$this->request->is()`` prend un unique argument, qui peut être la METHOD
  249. request (``get``, ``put``, ``post``, ``delete``) ou toute identifier de
  250. request (``ajax``). Ce **n'est pas** une façon de vérifier une data postée
  251. spécifique. Par exemple, ``$this->request->is('book')`` ne retournera pas
  252. true si les data du book ont été postées.
  253. .. note::
  254. Vous avez besoin d'inclure le component Session (SessionComponent) et
  255. le helper Session (SessionHelper) dans chaque controller que vous
  256. utiliserez. Si nécessaire, incluez-les dans le controller principal
  257. (AppController) pour qu'ils soient accessibles à tous les controllers.
  258. Voici ce que fait l'action ``add()`` : si la requête HTTP est de type POST,
  259. essayez de sauvegarder les données en utilisant le model "Post". Si pour une
  260. raison quelconque, la sauvegarde a échouée, affichez simplement la vue. Cela
  261. nous donne une chance de voir les erreurs de validation de l'utilisateur et
  262. d'autres avertissements.
  263. Chaque requête de CakePHP contient un objet ``CakeRequest`` qui est accessible
  264. en utilisant ``$this->request``. Cet objet contient des informations utiles
  265. sur la requête qui vient d'être reçue, et permet de contrôler les flux de votre
  266. application. Dans ce cas, nous utilisons la méthode
  267. :php:meth:`CakeRequest::is()` pour vérifier que la requête est de type POST.
  268. Lorsqu'un utilisateur utilise un formulaire pour poster des données dans votre
  269. application, ces informations sont disponibles dans ``$this->request->data``.
  270. Vous pouvez utiliser les fonctions :php:func:`pr()` ou :php:func:`debug()` pour
  271. les afficher si vous voulez voir à quoi cela ressemble.
  272. Nous utilisons la méthode :php:meth:`SessionComponent::setFlash()` du component
  273. Session (SessionComponent) pour définir un message dans une variable session
  274. et qui sera affiché dans la page juste après la redirection. Dans le layout,
  275. nous trouvons la fonction :php:func:`SessionHelper::flash` qui permet
  276. d'afficher et de nettoyer la variable correspondante. La méthode
  277. :php:meth:`Controller::redirect` du controller permet de rediriger vers une
  278. autre URL. Le paramètre ``array('action' => 'index')`` sera traduit vers l'URL
  279. /posts (dans notre cas l'action "index" du controller "Posts").
  280. Vous pouvez vous référer à la fonction :php:func:`Router::url()` dans
  281. `l'API <http://api.cakephp.org>`_ pour voir les différents formats d'URL
  282. acceptés dans les différentes fonctions de CakePHP.
  283. L'appel de la méthode ``save()`` vérifiera les erreurs de validation et
  284. interrompra l'enregistrement si une erreur survient. Nous verrons
  285. la façon dont les erreurs sont traitées dans les sections suivantes.
  286. Nous appelons la méthode ``create()`` en premier afin
  287. de réinitialiser l'état du model pour sauvegarder les nouvelles informations.
  288. Cela ne crée pas réellement un enregistrement dans la base de données mais
  289. réinitialise Model::$id et définit Model::$data en se basant sur le champ par
  290. défaut dans votre base de données.
  291. Valider les données
  292. ===================
  293. Cake place la barre très haute pour briser la monotonie de la validation des
  294. champs de formulaires. Tout le monde déteste le dévelopement de formulaires
  295. interminables et leurs routines de validations. Cake rend tout cela plus facile
  296. et plus rapide.
  297. Pour tirer profit des fonctionnalités de validation, vous devez utiliser
  298. le helper "Form" (FormHelper) dans vos vues. :php:class:`FormHelper` est
  299. disponible par défaut dans toutes les vues avec la variables ``$this->Form``.
  300. Voici le code de notre vue "add" (ajout)
  301. .. code-block:: php
  302. <!-- Fichier : /app/View/Posts/add.ctp -->
  303. <h1>Ajouter un post</h1>
  304. <?php
  305. echo $this->Form->create('Post');
  306. echo $this->Form->input('title');
  307. echo $this->Form->input('body', array('rows' => '3'));
  308. echo $this->Form->end('Sauvegarder le post');
  309. ?>
  310. Nous utilisons le :php:class:`FormHelper` pour générer la balise
  311. d'ouverture d'une formulaire HTML. Voici le code HTML généré par
  312. ``$this->Form->create()`` ::
  313. .. code-block:: html
  314. <form id="PostAddForm" method="post" action="/posts/add">
  315. Si ``create()`` est appelée sans aucun paramètre, CakePHP suppose que vous
  316. construisez un formulaire qui envoie les données en POST à l'action ``add()``
  317. (ou ``edit()`` quand ``id`` est dans les données du formulaire) du controller
  318. actuel.
  319. La méthode ``$this->Form->input()`` est utilisée pour créer des éléments de
  320. formulaire du même nom. Le premier paramètre dit à CakePHP à quels champs ils
  321. correspondent et le second paramètre vous permet de spécifier un large éventail
  322. d'options - dans ce cas, le nombre de lignes du textarea. Il y a un peu
  323. d'introspection et "d'automagie" ici : ``input()`` affichera différents
  324. éléments de formulaire selon le champ spécifié du model.
  325. L'appel de la méthode ``$this->Form->end()`` génère un bouton de soumission
  326. et ajoute la balise de fermeture du formulaire. Si une chaîne de caractères est
  327. passée comme premier paramètre de la méthode ``end()``, le helper "Form"
  328. affichera un bouton de soumission dont le nom correspond à celle-ci. Encore
  329. une fois, référez-vous au chapitre :doc:`/views/helpers` pour en savoir plus
  330. sur les helpers.
  331. A présent, revenons en arrière et modifions notre vue
  332. ``/app/View/Posts/index.ctp`` pour ajouter un lien "Ajouter un post". Ajoutez
  333. la ligne suivante avant ``<table>`` ::
  334. <?php echo $this->Html->link(
  335. 'Ajouter un Post',
  336. array('controller' => 'posts', 'action' => 'add')
  337. ); ?>
  338. Vous vous demandez peut-être : comment je fais pour indiquer à CakePHP mes
  339. exigences de validation ? Les règles de validation sont définies dans le
  340. model. Retournons donc à notre model Post et procédons à quelques
  341. ajustements ::
  342. class Post extends AppModel {
  343. public $validate = array(
  344. 'title' => array(
  345. 'rule' => 'notEmpty'
  346. ),
  347. 'body' => array(
  348. 'rule' => 'notEmpty'
  349. )
  350. );
  351. }
  352. Le tableau ``$validate`` indique à CakePHP comment valider vos données
  353. lorsque la méthode ``save()`` est appelée. Ici, j'ai spécifié que les
  354. deux champs "body" et "title" ne doivent pas être vides. Le moteur de
  355. validation de CakePHP est puissant, il dispose d'un certain nombre de
  356. règles intégrées (code de carte bancaire, adresse emails, etc.)
  357. et d'une souplesse pour ajouter vos propres règles de validation. Pour
  358. plus d'informations sur cette configuration, consultez le chapitre
  359. :doc:`/models/data-validation`.
  360. Maintenant que vos règles de validation sont en place, utilisez l'application
  361. pour essayer d'ajouter un post avec un titre et un contenu vide afin de voir
  362. comment cela fonctionne. Puisque que nous avons utilisé la méthode
  363. :php:meth:`FormHelper::input()` du helper "Form" pour créer nos éléments
  364. de formulaire, nos messages d'erreurs de validation seront affichés
  365. automatiquement.
  366. Editer des Posts
  367. ================
  368. L'édition de posts : nous y voilà. Vous êtes un pro de CakePHP maintenant, vous
  369. devriez donc avoir adopté le principe. Créez d'abord l'action puis la vue.
  370. Voici à quoi l'action ``edit()`` du controller Posts (PostsController) devrait
  371. ressembler ::
  372. public function edit($id = null) {
  373. if (!$id) {
  374. throw new NotFoundException(__('Invalid post'));
  375. }
  376. $post = $this->Post->findById($id);
  377. if (!$post) {
  378. throw new NotFoundException(__('Invalid post'));
  379. }
  380. if ($this->request->is(array('post', 'put'))) {
  381. $this->Post->id = $id;
  382. if ($this->Post->save($this->request->data)) {
  383. $this->Session->setFlash(__('Your post has been updated.'));
  384. return $this->redirect(array('action' => 'index'));
  385. }
  386. $this->Session->setFlash(__('Unable to update your post.'));
  387. }
  388. if (!$this->request->data) {
  389. $this->request->data = $post;
  390. }
  391. }
  392. Cette action s'assure d'abord que l'utilisateur a essayé d'accéder à un
  393. enregistrement existant. S'il n'y a pas de paramètre ``$id`` passé, ou si le
  394. post n'existe pas, nous lançons une ``NotFoundException`` pour que le
  395. gestionnaire d'Erreurs ErrorHandler de CakePHP s'en occupe.
  396. Ensuite l'action vérifie si la requête est une requête POST ou PUT. Si elle
  397. l'est, alors nous utilisons les données POST pour mettre à jour notre
  398. enregistrement Post, ou sortir et montrer les erreurs de validation à
  399. l'utilisateur.
  400. S'il n'y a pas de données définies dans ``$this->request->data``, nous le
  401. définissons simplement dans le post récupéré précédemment.
  402. La vue d'édition devrait ressembler à quelque chose comme cela:
  403. .. code-block:: php
  404. <!-- Fichier: /app/View/Posts/edit.ctp -->
  405. <h1>Editer le post</h1>
  406. <?php
  407. echo $this->Form->create('Post');
  408. echo $this->Form->input('title');
  409. echo $this->Form->input('body', array('rows' => '3'));
  410. echo $this->Form->input('id', array('type' => 'hidden'));
  411. echo $this->Form->end('Save Post');
  412. ?>
  413. Cette vue affiche le formulaire d'édition (avec les données pré-remplies) avec
  414. les messages d'erreur de validation nécessaires.
  415. Une chose à noter ici : CakePHP supposera que vous éditez un model si le champ
  416. 'id' est présent dans le tableau de données. S'il n'est pas présent (ce qui
  417. revient à notre vue "add"), CakePHP supposera que vous insérez un nouveau model
  418. lorsque ``save()`` sera appelée.
  419. Vous pouvez maintenant mettre à jour votre vue "index" avec des liens pour
  420. éditer des posts :
  421. .. code-block:: php
  422. <!-- Fichier: /app/View/Posts/index.ctp (lien d\'édition ajouté) -->
  423. <h1>Blog posts</h1>
  424. <p><?php echo $this->Html->link("Ajouter un Post", array('action' => 'add')); ?></p>
  425. <table>
  426. <tr>
  427. <th>Id</th>
  428. <th>Title</th>
  429. <th>Action</th>
  430. <th>Created</th>
  431. </tr>
  432. <!-- Ici se trouve la boucle de notre tableau $posts, impression de l\'info du post -->
  433. <?php foreach ($posts as $post): ?>
  434. <tr>
  435. <td><?php echo $post['Post']['id']; ?></td>
  436. <td>
  437. <?php echo $this->Html->link(
  438. $post['Post']['title'],
  439. array('action' => 'view', $post['Post']['id'])
  440. ); ?>
  441. </td>
  442. <td>
  443. <?php echo $this->Html->link(
  444. 'Editer',
  445. array('action' => 'edit', $post['Post']['id'])
  446. ); ?>
  447. </td>
  448. <td>
  449. <?php echo $post['Post']['created']; ?>
  450. </td>
  451. </tr>
  452. <?php endforeach; ?>
  453. </table>
  454. Supprimer des Posts
  455. ===================
  456. A présent, mettons en place un moyen de supprimer les posts pour les
  457. utilisateurs. Démarrons avec une action ``delete()`` dans le controller
  458. Posts (PostsController) ::
  459. public function delete($id) {
  460. if ($this->request->is('get')) {
  461. throw new MethodNotAllowedException();
  462. }
  463. if ($this->Post->delete($id)) {
  464. $this->Session->setFlash(
  465. __('Le post avec id : %s a été supprimé.', h($id))
  466. );
  467. } else {
  468. $this->Session->setFlash(
  469. __('Le post avec l\'id: %s n'a pas pu être supprimé.', h($id))
  470. );
  471. }
  472. return $this->redirect(array('action' => 'index'));
  473. }
  474. Cette logique supprime le Post spécifié par $id, et utilise
  475. ``$this->Session->setFlash()`` pour afficher à l'utilisateur un message de
  476. confirmation après l'avoir redirigé sur ``/posts``. Si l'utilisateur tente
  477. une suppression en utilisant une requête GET, une exception est levée.
  478. Les exceptions manquées sont capturées par le gestionnaire d'exceptions de
  479. CakePHP et un joli message d'erreur est affiché. Il y a plusieurs
  480. :doc:`/development/exceptions` intégrées qui peuvent être utilisées pour
  481. indiquer les différentes erreurs HTTP que votre application pourrait
  482. rencontrer.
  483. Etant donné que nous exécutons juste un peu de logique et de redirection,
  484. cette action n'a pas de vue. Vous voudrez peut-être mettre à jour votre vue
  485. "index" avec des liens pour permettre aux utilisateurs de supprimer des Posts,
  486. ainsi :
  487. .. code-block:: php
  488. <!-- Fichier: /app/View/Posts/index.ctp -->
  489. <h1>Blog posts</h1>
  490. <p><?php echo $this->Html->link(
  491. 'Ajouter un Post',
  492. array('action' => 'add')
  493. ); ?></p>
  494. <table>
  495. <tr>
  496. <th>Id</th>
  497. <th>Titre</th>
  498. <th>Actions</th>
  499. <th>Créé le</th>
  500. </tr>
  501. <!-- Ici, nous bouclons sur le tableau $post afin d'afficher les informations des posts -->
  502. <?php foreach ($posts as $post): ?>
  503. <tr>
  504. <td><?php echo $post['Post']['id']; ?></td>
  505. <td>
  506. <?php echo $this->Html->link(
  507. $post['Post']['title'],
  508. array('action' => 'view', $post['Post']['id'])
  509. ); ?>
  510. </td>
  511. <td>
  512. <?php echo $this->Form->postLink(
  513. 'Supprimer',
  514. array('action' => 'delete', $post['Post']['id']),
  515. array('confirm' => 'Etes-vous sûr ?'));
  516. ?>
  517. <?php echo $this->Html->link(
  518. 'Editer',
  519. array('action' => 'edit', $post['Post']['id'])
  520. ); ?>
  521. </td>
  522. <td>
  523. <?php echo $post['Post']['created']; ?>
  524. </td>
  525. </tr>
  526. <?php endforeach; ?>
  527. </table>
  528. Utiliser :php:meth:`~FormHelper::postLink()` permet de créer un lien qui
  529. utilise du Javascript pour supprimer notre post en faisant une requête POST.
  530. Autoriser la suppression par une requête GET est dangereux à cause des robots
  531. d'indexation qui peuvent tous les supprimer.
  532. .. note::
  533. Ce code utilise aussi le helper "Form" pour demander à l'utilisateur
  534. une confirmation avant de supprimer le post.
  535. Routes
  536. ======
  537. Pour certains, le routage par défaut de CakePHP fonctionne suffisamment bien.
  538. Les développeurs qui sont sensibles à la facilité d'utilisation et à la
  539. compatibilité avec les moteurs de recherches apprécieront la manière dont
  540. CakePHP lie des URLs à des actions spécifiques. Nous allons donc faire une
  541. rapide modification des routes dans ce tutoriel.
  542. Pour plus d'informations sur les techniques de routages, consultez le chapitre
  543. :ref:`routes-configuration`.
  544. Par défaut, CakePHP effectue une redirection d'une personne visitant la racine
  545. de votre site (par ex: http://www.exemple.com) vers le controller Pages
  546. (PagesController) et affiche le rendu de la vue appelée "home". Au lieu de
  547. cela, nous voudrions la remplacer avec notre controller Posts
  548. (PostsController).
  549. Le routage de CakePHP se trouve dans ``/app/Config/routes.php``. Vous devrez
  550. commenter ou supprimer la ligne qui définit la route par défaut. Elle
  551. ressemble à cela ::
  552. Router::connect(
  553. '/',
  554. array('controller' => 'pages', 'action' => 'display', 'home')
  555. );
  556. Cette ligne connecte l'URL '/' à la page d'accueil par défaut de CakePHP. Nous
  557. voulons que cette URL soit connectée à notre propre controller, remplacez donc
  558. la ligne par celle-ci ::
  559. Router::connect('/', array('controller' => 'posts', 'action' => 'index'));
  560. Cela devrait connecter les utilisateurs demandant '/' à l'action ``index()`` de
  561. notre controller Posts (PostsController).
  562. .. note::
  563. CakePHP peut aussi faire du 'reverse routing' (ou routage inversé).
  564. Par exemple, pour la route définie plus haut, en ajoutant
  565. ``array('controller' => 'posts', 'action' => 'index')`` à la fonction
  566. retournant un tableau, l'URL '/' sera utilisée. Il est d'ailleurs bien
  567. avisé de toujours utiliser un tableau pour les URLs afin que vos routes
  568. définissent vont les URLs, mais aussi pour s'assurer qu'elles aillent
  569. dans la même direction.
  570. Conclusion
  571. ==========
  572. Créer des applications de cette manière vous apportera, paix, honneur, amour
  573. et argent au-delà même de vos fantasmes les plus fous. Simple n'est ce pas ?
  574. Gardez à l'esprit que ce tutoriel était très basique. CakePHP a *beaucoup* plus
  575. de fonctionnalités à offrir et il est aussi souple dans d'autres domaines que
  576. nous n'avons pas souhaité couvrir ici pour simplifier les choses. Utilisez
  577. le reste de ce manuel comme un guide pour développer des applications plus
  578. riches en fonctionnalités.
  579. Maintenant que vous avez créé une application CakePHP basique, vous êtes prêt
  580. pour les choses sérieuses. Commencez votre propre projet et lisez le reste du
  581. :doc:`Cookbook </index>` et l'`API <http://api.cakephp.org>`_.
  582. Si vous avez besoin d'aide, il y a plusieurs façons d'obtenir de l'aide -
  583. merci de regarder la page :doc:`/cakephp-overview/where-to-get-help`
  584. Bienvenue sur CakePHP !
  585. Prochaines lectures suggérées
  586. -----------------------------
  587. Voici les différents chapitres que les gens veulent souvent lire après :
  588. 1. :ref:`view-layouts`: Personnaliser les Layouts de votre application.
  589. 2. :ref:`view-elements`: Inclure et -utiliser les portions de vues.
  590. 3. :doc:`/controllers/scaffolding`: Construire une ébauche d'application
  591. sans avoir à coder.
  592. 4. :doc:`/console-and-shells/code-generation-with-bake` Générer un code
  593. CRUD basique.
  594. 5. :doc:`/tutorials-and-examples/blog-auth-example/auth`: Tutoriel sur
  595. l\'enregistrement et la connexion d'utilisateurs.
  596. .. meta::
  597. :title lang=fr: Blog Tutoriel Ajouter la logique
  598. :keywords lang=fr: doc models,vérification validation,controller actions,model post,php class,classe model,objet model,business logic,table base de données,convention de nommage,bread et butter,callbacks,prefixes,nutshell,intéraction,array,cakephp,interface,applications,suppression