Development

Documentation/fr_FR/askeet/4 (diff)

You must first sign up to be able to contribute.

Changes between Version 2 and Version 3 of Documentation/fr_FR/askeet/4

Show
Ignore:
Author:
forresst (IP: 82.251.136.138)
Timestamp:
06/22/08 17:27:21 (9 years ago)
Comment:

Correctifs

Legend:

Unmodified
Added
Removed
Modified
  • Documentation/fr_FR/askeet/4

    v2 v3  
     1{{{ 
     2#!html 
     3<div style="border: solid 2px #f00;padding:10px;margin:5px;background-color: #faa"> 
     4}}} 
     5Cette page fait partie de la traduction en français de la documentation de Symfony. Il s'agit d'une version traduite qui peut comporter des erreurs. La seule version officielle est la [http://www.symfony-project.com/askeet/4 version en anglais]. 
     6 
     7 * Traduction : Nicosgamer  
     8 * Relecture : forresst 
     9 * Date de traduction : Inconnu 
     10 * Date de dernière modification : 22 Juin 2008 (A cette date à jour avec l'original anglais) 
     11{{{ 
     12#!html 
     13</div> 
     14}}} 
     15 
    116{{{ 
    217#!WikiMarkdown 
    3 Calendrier de l'Avent, 4ème jour : Refactorisation 
     18Symfony - Calendrier de l'Avent, 4ème jour : Refactorisation 
    419================================================== 
    520 
    4156Le résultat de cette requête est passé au template `showSuccess.php` grâce à la variable `$question`. 
    4257 
    43 La méthode `->getRequestParameter('id')` de l'objet `sfAction` récupère ... le paramètre `id`, qu'il soit passé par la méthode GET ou POST. Par exemple si vous demandez  
    44          
    45        http://askeet/frontend_dev.php/question/show/id/1/myparam/myvalue 
    46  
    47 . . . ensuite l'action `show` sera capable de rechercher `myvalue` en faisant `$this->getRequestParameter('myparam')`. 
    48  
    49 >**Note**: la méthode `forward404Unless()` envoie au navigateur une page 404 si la question n'existe pas dans la base de données. C'est toujours bon de traiter les cas inconnus et les erreurs qui peuvent apparaître pendant l'exécution. Symfony vous fournit des méthodes simples pour vous aider à faire des choses correctes, facilement.  
     58La méthode `->getRequestParameter('id')` de l'objet `sfAction` récupère ... le paramètre `id`, qu'il soit passé par la méthode GET ou POST. Par exemple si vous demandez: 
     59 
     60    http://askeet/frontend_dev.php/question/show/id/1/myparam/myvalue 
     61 
     62... ensuite l'action `show` sera capable de rechercher `myvalue` en faisant `$this->getRequestParameter('myparam')`. 
     63 
     64>**Note**: La méthode `forward404Unless()` envoie au navigateur une page 404 si la question n'existe pas dans la base de données. C'est toujours bon de traiter les cas inconnus et les erreurs qui peuvent apparaître pendant l'exécution. Symfony vous fournit des méthodes simples pour vous aider à faire des choses correctes, facilement. 
    5065 
    5166### Modifier le template `showSuccess.php` 
    8095    </div> 
    8196 
    82 Vous reconnaissez ici le div `interested_block` qui a déjà été ajouté hier au template `listSuccess.php`. Il affiche juste le nombre d'utilisateur intéressé par une question. Ensuite, les markup ressemblent beaucoup à ceux de `list`, mis à part qu'il n'y a pas de `link_to` dans le titre. C'est juste une réécriture du code initial pour afficher seulement les informations nécessaires à une question. 
     97Vous reconnaissez ici le div `interested_block` qui a déjà été ajouté hier au template `listSuccess.php`. Il affiche juste le nombre d'utilisateur intéressé par une question. Ensuite, les markup ressemblent beaucoup à ceux de `list`, mis à part qu'il n'y a pas de `link_to` dans le titre. C'est juste une réécriture du code initial pour afficher seulement les informations nécessaires à une question.  
    8398 
    8499La nouvelle partie est le div `answers`. Il affiche toutes les réponses d'une question (utilisant simplement la méthode Propel `$question->getAnswers()`), et pour chaque réponse, affiche le taux de pertinence, le nom de l'auteur et la date de création en plus du contenu. 
    85100 
    86101La fonction `format_date()` est un autre exemple d'assistants pour les template, qui nécessite une déclaration initiale. Vous pouvez en apprendre plus sur la syntaxe de cet assistant et sur d'autres dans [le chapitre sur l'internationalisation](http://www.symfony-project.com/book/1_0/13-I18n-and-L10n) du livre symfony (ces assistants accélèrent les taches pénibles en affichant les dates dans le bon format). 
    87   
    88 >**Note**: Propel crée le nom des méthodes, liés à une table, en ajoutant automatiquement un 's' à la fin du nom de la table. Veuillez pardonner l'affreuse méthode `->getRelevancys()` puisqu'elle vous évitera plusieurs lignes de code SQL. 
     102 
     103>**Note**: Propel crée le nom des méthodes, liés à une table, en ajoutant automatiquement un 's' à la fin du nom de la table. Veuillez pardonner l'affreuse méthode `->getRelevancys()` puisqu'elle vous évitera plusieurs lignes de code SQL.  
    89104 
    90105### Ajouter quelques données de test 
    126141Naviguez jusqu'à l'action affichant la première question pour vérifier si les modifications sont correctes: 
    127142 
    128        http://askeet/frontend_dev.php/question/show/id/XX 
     143    http://askeet/frontend_dev.php/question/show/id/XX 
    129144 
    130145>**Note**: Remplacez XX par l'`id` de votre première question. 
    137152---------------------------- 
    138153 
    139 Il est presque sûr que le nom complet de l'auteur sera nécessaire à un autre endroit de l'application. Vous pouvez donc considérer que c'est un attribut de l'objet `User`. Cela veut dire qu'il va y avoir une méthode dans le modèle de `User` permettant de récupérer le nom complet, au lieu de le construire dans une action supplémentaire. Ecrivons cette méthode. Ouvrez le fichier `askeet/lib/model/User.php` et ajouter la méthode suivante :  
     154Il est presque sûr que le nom complet de l'auteur sera nécessaire à un autre endroit de l'application. Vous pouvez donc considérer que c'est un attribut de l'objet `User`. Cela veut dire qu'il va y avoir une méthode dans le modèle de `User` permettant de récupérer le nom complet, au lieu de le construire dans une action supplémentaire. Ecrivons cette méthode. Ouvrez le fichier `askeet/lib/model/User.php` et ajouter la méthode suivante: 
    140155 
    141156    [php] 
    145160    } 
    146161 
    147 Pourquoi la méthode est nommée `__toString()` au lieu de `getFullName()` ou quelque chose de similaire? Parce que la méthode `__toString()` est la méthode par défaut utilisée par PHP5 pour représenter un objet sous la forme d'un string. Cela signifie que vous pouvez simplement remplacer       
    148  
    149 [php] 
     162Pourquoi la méthode est nommée `__toString()` au lieu de `getFullName()` ou quelque chose de similaire? Parce que la méthode `__toString()` est la méthode par défaut utilisée par PHP5 pour représenter un objet sous la forme d'un string. Cela signifie que vous pouvez simplement le remplacer 
     163 
     164    [php] 
    150165    posted by <?php echo $answer->getUser()->getFirstName().' '.$answer->getUser()->getLastName() ?>  
    151  du template `askeet/apps/frontend/modules/question/templates/showSuccess.php` 
    152  
    153 par 
     166 
     167du template `askeet/apps/frontend/modules/question/templates/showSuccess.php` par un simple 
    154168 
    155169    [php] 
    197211> Heureusement, nous avons une manière de tester cette modification, et vous la découvrirez plus tard dans cette partie. 
    198212 
    199 ### Ajouter un champ dans le modèle objet de User 
    200  
    201 Allez y sans crainte et modifiez le modèle de données `askeet/config/schema.xml` en ajoutant à la table `ask_question`:  
     213### Ajouter un champ dans le modèle objet de `User` 
     214 
     215Allez y sans crainte et modifiez le modèle de données `askeet/config/schema.xml` en ajoutant à la table `ask_question`: 
    202216 
    203217    [xml] 
    213227 
    214228    $ symfony propel-build-sql 
    215     $ mysql -u youruser -p askeet < data/sql/schema.sql 
     229    $ mysql -u youruser -p askeet < data/sql/lib.model.schema.sql 
    216230    $ php batch/load_data.php 
    217231 
    245259### Sécuriser la requête de mise à jour avec une transaction 
    246260 
    247 Que se passe t-il si la base de données crash entre la mise à jour de l'objet `Question` et celui de l'objet `Interest` ? Vous finiriez avec des données corrompues. C'est le même problème qui est rencontré dans une banque lors d'un transfert d'argent. Une première requête diminue le montant d'un compte, et une seconde augmente un autre compte. 
     261Que se passe t-il si la base de données crash entre la mise à jour de l'objet `Question` et celui de l'objet `Interest`? Vous finiriez avec des données corrompues. C'est le même problème qui est rencontré dans une banque lors d'un transfert d'argent. Une première requête diminue le montant d'un compte, et une seconde augmente un autre compte. 
    248262 
    249263Si  deux requêtes sont hautement dépendantes, vous devriez sécuriser leur exécution avec une **transaction**. Une transaction est une assurance que les deux requêtes réussiront, ou aucunes d'elles. Si quelque chose de mauvais arrive à l'une des requêtes de la transaction, toutes les précédentes réussies sont annulées, et la base de données retourne dans l'état avant la transaction. 
    250264 
    251 Notre méthode `save()` est une bonne opportunité pour illustrer l'implémentation des transactions dans Symfony. Remplacez le code par:  
     265Notre méthode `save()` est une bonne opportunité pour illustrer l'implémentation des transactions dans Symfony. Remplacez le code par: 
    252266 
    253267    [php] 
    292306    <?php echo $question->getInterestedUsers() ?> 
    293307 
    294 >**Note**: Grâce à notre brillante idée d'employer un fragment au lieu de laisser le code reproduit dans les template, cette modification nécessite seulement que nous le fassions qu'une fois. Sinon, nous aurions du modifier les template `listSuccess.php` et `showSuccess.php` et pour des gens paresseux comme nous, cela aurait été accablant. 
     308>**Note**: Grâce à notre brillante idée d'employer un fragment au lieu de laisser le code reproduit dans les template, cette modification nécessite seulement que nous le fassions qu'une fois. Sinon, nous aurions du modifier les template `listSuccess.php` et `showSuccess.php` et pour des gens paresseux comme nous, cela aurait été accablant. 
    295309 
    296310En termes de nombre de requêtes et temps d'exécution, cela devrait être meilleur. Vous pouvez le vérifier grâce au nombre de requêtes à la base de données indiquée dans la barre d'outils de débogage, après l'icône base de données. Notez que vous pouvez aussi récupérer des détails sur les requêtes SQL de la page courante en cliquant sur l'icône base de données: 
    318332------------------------------- 
    319333 
    320 Ce qui a été fait pour `count($question->getInterests())` peut être aussi bien fait pour `count($answer->getRelevancys())`. La seule différence sera qu'une réponse peut avoir des votes positifs et négatifs, alors qu'une question peut seulement être notée comme intéressante. 
    321 Maintenant que vous avez compris comment modifier le modèle, nous pouvons aller plus vite. Voici les changements, juste pour rappel. Vous n'avez pas à les copier à la main pour le tutoriel de demain, si vous utilisez [l'espace de stockage SVN d'askeet](http://svn.askeet.com/tags/release_day_4/). 
     334Ce qui a été fait pour `count($question->getInterests())` peut être aussi bien fait pour `count($answer->getRelevancys())`. La seule différence sera qu'une réponse peut avoir des votes positifs et négatifs, alors qu'une question peut seulement être notée comme intéressante. Maintenant que vous avez compris comment modifier le modèle, nous pouvons aller plus vite. Voici les changements, juste pour rappel. Vous n'avez pas à les copier à la main pour le tutoriel de demain, si vous utilisez [l'espace de stockage SVN d'askeet](http://svn.askeet.com/tags/release_day_4/). 
    322335 
    323336* Ajoutez les colonnes suivantes à la table `answer` dans `schema.xml` 
    331344        $ symfony propel-build-model 
    332345        $ symfony propel-build-sql 
    333         $ mysql -u youruser -p askeet < data/sql/schema.sql 
    334  
     346        $ mysql -u youruser -p askeet < data/sql/lib.model.schema.sql 
     347         
    335348* La fonction `->save()` de la classe `Relevancy` dans `lib/model/Relevancy.php` 
    336349 
    423436------- 
    424437 
    425 Depuis le début du tutorial, nous appelons l'URL: 
     438Depuis le début du tutorial, nous appelons l'URL 
    426439 
    427440    http://askeet/frontend_dev.php/question/show/id/XX 
    428441     
    429 Les règles de routage par défaut de Symfony comprennent cette requête comme si vous aviez réellement demandé : 
     442Les règles de routage par défaut de Symfony comprennent cette requête comme si vous aviez réellement demandé 
    430443 
    431444    http://askeet/frontend_dev.php?module=question&action=show&id=XX 
    459472Avant cela, nous allons créer une classe personnalisée pour réellement transformer un titre en titre dépouillé, puisque cette fonction ne concerne pas vraiment l'objet `Question` (nous l'utiliserons probablement aussi pour l'objet `Answer`).  
    460473 
     474 
    461475Créons un nouveau fichier `myTools.class.php` dans le répertoire `askeet/lib/`:  
    462476 
    501515    $ php batch/load_data.php 
    502516 
    503 Si vous voulez en savoir plus sur les classes personnalisées et l'aide personnalisée, lisez le [chapitre sur les extensions](http://www.symfony-project.com/book/1_0/07-Inside-the-View-Layer) du livre Symfony. 
     517Si vous voulez en savoir plus sur les classes personnalisées et l'aide personnalisée, lisez le [chapitre sur les extensions](http://www.symfony-project.com/book/1_0/07-Inside-the-View-Layer) du livre symfony. 
    504518 
    505519### Changer les liens de l'action `show` 
    543557      param: { module: question, action: show } 
    544558 
    545 Dans la ligne `url`, le mot `question` est un texte personnalisé qui apparait dans l'url finale, alors que `stripped_title` est un paramètre (il est précédé de`:`). Ils forment un **pattern** que le système de routage de Symfony applique aux liens de l'action `question/show`  parce que tous les liens de nos template utilisent l'assistant `link_to()`. 
     559Dans la ligne `url`, le mot `question` est un texte personnalisé qui apparait dans l'url finale, alors que `stripped_title` est un paramètre (il est précédé de `:`). Ils forment un **pattern** que le système de routage de Symfony applique aux liens de l'action `question/show`  parce que tous les liens de nos template utilisent l'assistant `link_to()`. 
    546560 
    547561Il est temps pour le test final: réaffichez la page d'accueil, cliquez sur le titre de la première question. Non seulement la première question s'affiche (montrant que rien n'est cassé) mais la barre d'adresse de votre navigateur affiche: 
    549563    http://askeet/frontend_dev.php/question/what-shall-i-do-tonight-with-my-girlfriend 
    550564 
    551 Si vous voulez en apprendre plus à propos des dispositifs de routages, lisez le [chapitre sur la politique de routage](http://www.symfony-project.com/book/1_0/09-Links-and-the-Routing-System) du livre Symfony. 
     565Si vous voulez en apprendre plus à propos des dispositifs de routages, lisez le [chapitre sur la politique de routage](http://www.symfony-project.com/book/1_0/09-Links-and-the-Routing-System) du livre symfony. 
    552566 
    553567A demain 
    554568-------- 
    555569 
    556 Aujourdhui, le site web en lui-même n'a pas beaucoup de nouvelles fonctionnalités. Cependant, nous avons vu plus de codage sur les template, vous savez comment modifier le modèle, et globalement le code a été refait dans beaucoup d'endroit. 
     570Aujourdhui, le site web en lui-même n'a pas beaucoup de nouvelles fonctionnalités. Cependant, nous avons vu plus de codage sur les template, vous savez comment modifier le modèle, et globalement le code a été refait dans beaucoup d'endroit.  
    557571 
    558572Cela arrive tout le temps dans la vie dun projet Symfony: le code qui peut être réutilisé est refait en fragment ou en classe personnalisée, le code qui apparait dans une action ou un template et qui appartient réellement au modèle est déplacé dans celui-ci. Même si cela sépare le code en un bon nombre de petits fichiers disséminés dans beaucoup de dossiers, la maintenance et l'évolution est plus facile. De plus, la structure de fichiers d'un projet Symfony le rend facile à localiser selon sa nature (Aide, modèle, template, action, classe personnalisée, etc.). 
    559573 
    560 Le travail de refactorisation réalisé aujourdhui va accélérer le développement dans les jours à venir. 
    561 Et nous ferons périodiquement encore plus de refactorisation dans la vie de ce projet, puisque la manière dont nous développons - faire une fonctionnalité utilisable sans se préoccuper des  fonctionnalités à venir - requiert une bonne structure du code si nous ne voulons pas finir avec un désordre total. 
     574Le travail de refactorisation réalisé aujourdhui va accélérer le développement dans les jours à venir. Et nous ferons périodiquement encore plus de refactorisation dans la vie de ce projet, puisque la manière dont nous développons - faire une fonctionnalité utilisable sans se préoccuper des  fonctionnalités à venir - requiert une bonne structure du code si nous ne voulons pas finir avec un désordre total. 
    562575 
    563576Qu'est-il prévu pour demain? Nous allons commencer à écrire un formulaire et voir comment récupérer ses informations. Nous allons également diviser la liste des questions de la page d'accueil en plusieurs pages. Dans le même temps, n'hésitez pas à télécharger le code d'aujourd'hui dans l'espace de stockage SVN (tagged release_day_4):  
    564577 
    565578    http://svn.askeet.com/tags/release_day_4/ 
    566    
     579     
    567580et à nous envoyer vos questions en utilisant la [mailing-list askeet](mailto:askeet-subscribe@symfony-project.com) ou le [forum dédié](http://www.symfony-project.com/forum/index.php/f/8/). 
    568    
     581 
    569582[1]: http://en.wikipedia.org/wiki/Agile_software_development  "Agile Software development definition at Wikipedia" 
    570583[2]: http://propel.phpdb.org/docs/user_guide/                 "Propel documentation"