McGivrer's Home

life of french web solution architect

  • Play!framework: embedded H2 database and Web interface

    • 24 Jun 2011
    • 0 Responses
    •  views
    • db h2 java play!framework trick&tips
    • Edit
    • Delete
    • Tags
    • Autopost
    Working with the Java Play! framework for some months now, I've just (sic!) discovered the Web database interface on H2 throught the url http://localhost:9000/@db

    A first page will ask you to configure the database connection:

    Capture1

    fig. 1 - Connection management page on embedded H2 database

    And the you are able to query as you want any table from the H2 database:

    Capture2

    fig. 2 - Browse interface on "mydatabase" instance

    Have fun (again) with Play!framework .
    • Tweet
  • Play!framework - tutorial - Customisation de la page d'accueil (2.4)

    • 11 May 2011
    • 0 Responses
    •  views
    • book extrait livre play playframework tutorial
    • Edit
    • Delete
    • Tags
    • Autopost

    Extrait du chapitre 2.4 du livre que je suis en train d'écrire sur le Play!framework. Le but de ce livre est la découverte de l'utilisation du framework Play! au travers d'un exemple de site web communautaire de partage de liste de jeux video.

     

     affichage de la liste de jeux

    Comme prévu, nous souhaitons créer notre propre page d’accueil (sinon, où est l’intérêt ? :)

    Aussi, voici ce que nous souhaitons obtenir en première étape: l’affichage de la fiche d’un jeu vidéo:

    figure 2.4.1 - Fiche d'une jeu vidéo
    figure 2.4.1 – Fiche d’un jeu vidéo

    Ce qui se traduit côté code “HTML/Groovy” par les lignes suivantes dans le fichier app/view/Application/index.html:

    #{extends 'main.html' /}
      <div id="games" class="games">
        <h1>&{'home.games.title'}</h1>
        #{if games}
          #{list items:games, as:'game'}
            #{set title:'Home / '+game.platform+'/'+game.title /}
            <div class="game" id="game_${game.id}">
                            <div class="title">
                        <span>#${game.id}.</span>
                        ${game.platform}/${game.title}
                            </div>
               <div class="side">
                #{if game.cover}
                <div class="cover">
                  <img src="public/images/games/${game.platform}/${game.title}/cover/${game.cover}.resized"
                    title="${game.platform}/${game.title}" width="60"/>
                </div>
                #{/if}
                <div class="tags">
                </div>
              </div>
              <div class="info">
                #{if game.description}
                <div class="label">&{'home.games.game.description'}</div>
                <div class="bloc">${game.description}</div>
                #{/if}
                #{if game.testContent}
                <div class="label">&{'home.games.game.test'}</div>
                <div class="bloc">${game.testContent}</div>
                #{/if}
              </div>
            </div>
          #{/list}
        #{/if}
        #{else}
          <p>&{'home.games.noitems'}</p>
        #{/else}
      </div>

    listing 2.4.1 – Template index.html pour l’affichage de la liste des jeux

    les notations

    On distingue plusieurs notations utiles qui vont permettre le rendu de plusieurs types d’informations issues de différentes sources:

    • &{} permet l’affichage de messages issus des fichier "messages.[langue]", exemple: &{'home.games.title'},
    • ${} permet l’affichage de variables d’entités,
    • #{} permet les tests de structures et boucles.

    Les méthodes intéressantes sont:

    • #{if}#{/if} délimite une condition,
    • #{else}#{/else} délimite le cas échéant de la condition,
    • #{list items:[liste], as:'[item]'} permet de parcourir une liste [liste] avec comme index l’objet [item]. il est alors possible de référencer chaque occurense dans la liste par “[item].attribut”, où attribut est un attribut valorisé de l’occurence.

    Par exemple, la génération d’une liste de prénoms d’utilisateurs:

    <ul>
            #{list:users, as: 'user'}
            <li>@user.firstname.</li>
            #{/list}
        </ul>

    listing 2.4.2 – Exemple de boucle pour l’affichage d’une liste

    Référons nous à la documentation présente sur le site de Play! pour découvrir toutes les subtilités de Groovy, qui est le langage utilisé ici.

    note: si nous n’avons pas accès à internet pendant le dévelopement, pour une raison quelconque, nous pouvons accèder à tout moment à la documentation de Play! en démarrant le serveur play intégrer (commande play start@) dans un projet vierge (par exemple) et en appelant l’urlhttp://localhost:9000/@documentation.

    template des pages

    Notons l’importance de #{extends main.html /} qui permet à notre page d’hériter de la mise en page de notre site située dansapp/view/main.html.

    Pour le moment, cette page se résume à :

    <!DOCTYPE html>
        <html>
            <head>
                <title>#{get 'title' /}</title>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
                <link rel="stylesheet" type="text/css" media="screen" href="@{'/public/stylesheets/main.css'}">
                #{get 'moreStyles' /}
                <link rel="shortcut icon" type="image/png" href="@{'/public/images/favicon.png'}">
                <script src="@{'/public/javascripts/jquery-1.4.2.min.js'}" type="text/javascript" charset="utf-8"></script>
                #{get 'moreScripts' /}
            </head>
            <body>
                #{doLayout /}
            </body>
        </html>

    listing 2.4.3 – Template de base des page : main.html

    Nous constatons l’utlisation du doctype HTML5. Nous ferons abstraction des nombreuses déclarations de début de fichier pour nous concentrer sur celles qui méritent toute notre attention:

    #{doLayout /}

    C’est via cette simple balise que toutes les pages héritant de main.html (#{extends 'main.html'}) verront ici leur contenu inséré.

    Modifions maintenant l’aspect globale de notre site en personnalisant le template app/views/main.html :

    Ajoutons la zone de titre (header) et la zone de pied de page (footer):

    <!DOCTYPE html>  
      <html>
          <head>
              <title>#{get 'title' /}</title>
              <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
              <link rel="stylesheet" type="text/css" media="screen" href="@{'/public/stylesheets/main.css'}">
              #{get 'moreStyles' /}
              <link rel="shortcut icon" type="image/png" href="@{'/public/images/favicon.png'}">
              <script src="@{'/public/javascripts/jquery-1.4.2.min.js'}" type="text/javascript" charset="utf-8"></script>
              #{get 'moreScripts' /}
          </head>
          <body>
            <header>
              <h1>&{'site.title'}</h1>
              <h2>&{'site.subtitle'}</h2>
              <nav class="menu">
                <ul>
              #{if !user}
                  <li>&{'home.actions.login'}
                              </li>
              #{/if}
              #{if user}
                  <li>&{'home.actions.logout'}
                              </li>
              #{/if}
                </ul>
              </nav>
            </header>
            <section id="content">
                #{doLayout /}
              <div class="clear"></div>
            </section>
            <footer>
              <p>&{'site.footer.label'} - &{'site.footer.credits', "http://www.famfamfam.com/lab/icons/silk/"}</p>
            </footer>
          </body>
      </html>

    listing 2.4.4 – refonte de main.html pour intégrer entête, menu et pied de page

    Nous notons dans la ligne :

    <link rel="stylesheet" type="text/css" media="screen" href="@{'/public/stylesheets/main.css'}">

    qui charge la feuille de styles pour notre site, le chemin vers la feuille de styles est calculée par le tag @{’/public/stylesheets/main.css’}.

    Mais regardons de plus près la commande #{get 'moreStyles' /}. Celle permettra dans tout sous-template d’ajouter la définition d’une feuille de styles supplémentaire, sans avoir a la référencer systématiqement dans le template de la page.

    ...
            #{set 'moreStyles'}
            <link rel="stylesheet" type="text/css" media="screen" href="@{'/public/stylesheets/xxx.css'}" />
            #{/set}
    ...

    listing 2.4.5 – Ajout d’un style dans un sous template qui sera généré dans le main.html

    Il existe également le #{get 'moreScripts'}, procédant de la même manière pour les fichiers javascript.

    note: Notons le copyright en fin de page relatif aux icônes que nous avons embarqué dans nos pages, icônes qui proviennet dewww.famfamfam.com.

    Découpage du modèle de page

    Nous allons diviser notre page de la manière suivante:

    HTML
        HEADER
          NAV "menu"
        SECTION "content"
        FOOTER
    • Le header est l’entête de page, contenant titre, sous-tire, et nav, le menu de navigation,
    • La Section “content” contient (sic!!) les données à afficher, ici les fiches des différents jeux vidéo,
    • le Footer est le pied de page, contenant le information traditionnelle de copyright et autres informations utiles (Il est utilisé depuis peu également comme sources d’information pour les fils RSS par exemple).

    figure 2.4.2 - Page d'accueil personnalis&eacute;e
    figure 2.4.2 – Page d’accueil personnalisée

    Fonction de filtrage et de recherche sur la liste des jeux

    Filtrage par platforme

    Ajoutons maintenant, en plus de la liste de jeux, un moyen de filtrer celle-ci par un type de plateforme. Pour cela, nous devons récupérer une liste des valeurs distinctes du champs platform dans l’entité Game.

    MODIFICATION DU CONTRÔLEUR

    le contrôleur Application doit être modifier pour ajouter une liste de plateformes dans les objets mis à disposition du render. Aussi, nous devons modifier la méthode index() comme ci-dessous:

    static void index(){
        ...
        List<Game> platforms = Game.find(
            "select distinct g.platform "+
            "from Game g "+
            "order by g.platform").fetch();
        ...
        render(games,platforms);
      }

    listing 2.4.6 – Ajout de la liste des plateforme de jeux a dessein de filtrage de la liste des jeux

    TAG #{PLATFORMS /}

    Intégrons une nouvelle notion: les tags ! Grâce à ce nouvelle élement, nous allons pouvoir éviter les répétitions de code dans les templates. Nous souhaitons afficher dans nos page la liste des platformes. Pour cela, créons un nouveau fichier app/views/tags/platforms.html:

    #{if _userConnected}
            #{if _items}
                    <h2>&{'home.platforms.title'}</h2>
                    <ul>
                        <li>
                                
                                        &{'home.platforms.filter.showAll'}
                        </li>
                    #{list items:_items, as:'platform'}
                        <li>
                                
                                        ${platform}
                        </li>
                    #{/list}
                    </ul>
            #{/if}
    #{/if}

    listing 2.4.7 – Affichage de la liste des plateformes de jeux

    Ensuite, dans le template de page index.html, nous référencerons ce nouveau tag dont la notation est la suivante:

    #{platforms items:platforms, userConnected:user}

    TAG #{GAMES /}

    Nous allons en profiter également pour créer un tag pour la liste des jeux, qui nous sera utile dans le paragraphe suivant, concernant la recherche par nom, le fichier du tag sera :app/views/tags/games.html.

    #{if _userConnected}
            #{if _items}
            <h2>&{'home.games.title', _userConnected?.username}</h2>
                #{list items:_items, as:'game'}
                    #{set title:'Home / ' + filterPlatform /}                
                    <div class="game" id="game_${game.id}">
                        <div class="title">
                                <span>#${game.id}.</span> 
                                        ${game.title}
                        </div>
                        <div class="side">
                            #{if game.cover}
                            <div class="cover">
                                
                                        &{'game.details.cover.alt', game.title, game.platform}
                            </div>
                            #{/if}
                            <div class="tags">
                            </div>
                        </div>
                        <div class="info">
                            <span class="platform">
                                    ${game.platform}
                            </span>
                            #{if game.description}
                            <div class="bloc">${game.description}</div>
                            #{/if}
                        </div>
                    </div>
                #{/list}
            #{/if}
            #{else}
                <p>&{'home.games.noitems'}</p>
            #{/else}
    #{/if}
    #{else}
            <p>&{'home.anonymous.welcome.message',"Register/create","Goto to Register form"}</p>
    #{/else}

    listing 2.4.8 – Tag #{games/} présentant la liste des jeux

    note: Nous nous proposerons d’enrichir notre liste de jeux avec l’utilisation de Jquery lightbox, un plugin permettant l’affichage modal des images des couvertures des jeux dans un prochain chapître.

    TEMPLATE INDEX.HTML

    Ainsi, dans le template app/views/Application/index.html nous intégrons les deux nouveaux tags; la liste des platformes #{platforms /} et la liste des jeux #{games /} :

    #{extends 'main.html' /}
            <section id="platforms" class="platforms">
                    #{platforms items:platforms, userConnected:user /}
            </section>
            <section id="games" class="games">
                    #{games items:games, userConnected:user/}
            </section>

    listing 2.4.9 – Intégration de nos nouveaux tags #{platforms/} et #{games/}

    Ce qui nous donnera dans notre navigateur:

    figure 2.4.3 - Int&eacute;gration de la liste des plateformes dans la page d'accueil
    figure 2.4.3 – Intégration de la liste des platformes dans la page d’accueil

    Recherche par un nom (title) de jeu

    Nous souhaitons pouvoir proposer une recherche sur le nom d’un jeu afin de retrouver rapidement la fiche d’un jeu. Nous allons donc réaliser un filtrage sur le titre du jeu (Game.title).

    Pour cela, ajoutons un champs de recherche. Editons le fichier du tag app/views/tags/platforms.html pour ajouter un tag input de type texte portant le nom search, au tout début de la section platforms :

    #{if _userConnected}
                    <section id="searchForm">
                            <label for="search">&{'home.search.label'}</label><br />
                            <input type="text" name="search" id="search" size="25" maxlength="40"/>
                            <script type="text/javascript">
                            $("#search").keyup(function(event) { // retour simple
                                    if(event.keyCode==13){
                                            $.post('@{Application.filterByGameTitle()}',
                                                            {search: $("#search").val()}, 
                                                            function(data){
                                                                    $('#games').html(data);
                                                            }
                                            );
                                    }
                            });
                            </script>
                    </section>
                    #{if _items}
                            ...
                    #{/if}
            #{/if}

    listing 2.4.10 – champs search dans la section searchForm

    Ainsi, la recherche est poussée via JQuery et son composant $.post(). Ceci évite un rechargement complet de la page en ciblant uniquement la zone de la liste des jeux.

    Modifions le controleur Application et ajoutons la méthode filterByGameTitle() comme ci-dessous pour réaliser le traitement de recherche:

    /**
             * Recherche dans la liste de jeux de l'utilisateur connecté des jeux
             * contenant la chaîne <code>search</code> dans le titre du jeu. Se base
             * également sur la plateforme sélectionnée et sur l'utilisateur connecté.
             * 
             * @param search
             *            nom ou partie du nom de jeu à rechercher
             */
            public static void filterByGameTitle(String search) {
                    renderArgs.put("search", search);
                    // récupération de l'utilisateur connecté
                    User user = (User) renderArgs.get("user");
                    // recupération de la plateforme (si présente)
                    //String platform = (String) renderArgs.get("filterPlatform");
                    // Constitution de la liste des plateformes distinctes
                    List<Game> platforms = Game.find(
                                    "select distinct g.platform from Game g order by g.platform")
                                    .fetch();
                    // recherche des jeux correspondant à game.title=%search% et
                    // game.platform=platefom
                    List<Game> games = Game.find(
                                    "select g from Game g " + "where lower(g.title) like ? "
                                                    + "and g.author=? " + "and g.publish=true "
                                                    + "order by g.platform, g.title ",
                                    "%" + search.toLowerCase() + "%", user).fetch();
                    // rendu de la page
                    renderTemplate("Application/search.html", games, user, platforms);
            }

    listing 2.4.11 – recherche de jeux correspondant à la saisie du champs search

    Ainsi, il nous faut créer un template pour le rendu du résultat de la recherche: ce sera app/views/Application/search.html

    #{games games:games, user:user /}

    listing 2.4.12 – template d’affichage du resultat de recherche: search.html

    Simple non ?

    Nous obtenons alors le rendu suivant dans notre navigateur:

    figure 2.4.4 - Recherche par titre et filtre sur les plateformes
    figure 2.4.4 – Recherche par titre et filtre sur les plateformes

     

    • Tweet
  • Play!framework - Création d'un tag (9.1)

    • 11 May 2011
    • 0 Responses
    •  views
    • book extrait livre play! playframework tutorial
    • Edit
    • Delete
    • Tags
    • Autopost

    Extrait du chapitre 9.1 du livre que je suis en train d'écrire sur le Play!framework. Le but de ce livre est la découverte de l'utilisation du framework Play! au travers d'un exemple de site web communautaire de partage de liste de jeux video.

     

    Qui n’a pas pester contre la recopie de nombreuse fois d’une même portion de code HTML dans une page, destiné au rendu d’un objet ?
    Avec la possibilité de créer des tags aussi facilement qu’on écrit une vue dans Play !, il serait réellement dommage de passer à côté.

    Définition

    Le tag un simple fichier HTML dans le répertoire views/tags. Le nom du fichier va fixer le nom du tag: view/tags/mytag.html donnera accès au tag « mytag ».

    mon tag

    Appel

    L’appel à notre tag se fera via la balise #{mytag /}
    Dans notre page HTML :

    <p>Mon tag de rendu</p>
     #{mytag /}

    Passage de paramètres

    Si nous souhaitons passer des paramètres pour obtenir un rendu dynamique, dans le fichier de définition du tag, il suffit d’ajouter les balises de votre choix, préfixées d’un caractère _(souligné, ou underscore pour les anglophones) :

    mon tag avec un paramètre : _parameter

    L’appel à ce tag sera :

    <p>Mon tag de rendu</p>
     #{mytag parameter :'premier paramètre' /}

    Si nous souhaitons passer un objet en paramètre, par exemple un objet User, la définition du tag sera app/views/tags/userdetails.html :

    <div class='userdetails'>
            <h1>Utilisateur</h1>
            <ul>
                    <li><strong>nickname :</strong> _user.username</li>
                    <li><strong>prénom :</strong> _user.firstname</li>
                    <li><strong>nom :</strong> _user.lastname</li>
                    <li><strong>mail :</strong> _user.email</li>
            </ul>
    </div>

    et l’appel à ce tag devient : (apps/views/Application/userdetails.html)

    <p>Utilisateur connecté :</p>
    #{userdetails user:connectedUser /}

    où connectedUser est un objet de type User, représentant l’utilisateur connecté. Et ci-dessous découvrons le rendu obtenu :

    figure 9.1.1 &ndash; Tag pr&eacute;sentant les d&eacute;tails d'un utilisateur
    figure 9.1.1 – Tag présentant les détails d’un utilisateur!

     

     

    • Tweet
  • Play! framework - deuxième partie (1/4)

    • 7 Feb 2011
    • 0 Responses
    •  views
    • Play!framework crud java jpa modules tutorial
    • Edit
    • Delete
    • Tags
    • Autopost

    Les modules

    Comme mentionné précédemment, nous souhaitons mettre en oeuvre deux plugins du framework Play! Ces deux plugins, pourtant natifs, ne sont pas activé par défaut. Nous allons le faire de ce pas.

    Activation CRUD

    Pour activer un plugin engénéral, il faut éditer le fichier [projectname]/conf/application.conf et se rendre vers la section traitant des … modules !

    Elle a à quelques choses prêt cette tête :

    # Additional modules
            # ~~~~~
            # A module is another play! application. Add a line for each module you want
            # to add to your application. Modules path are either absolutes or relative to
            # the application root.
            # They get loaded from top to bottom; Syntax: module.{name}={path}
            #
            # Keep the next line as is to help the play script to manage modules.
            # ---- MODULES ----

    Pour en ajouter, il suffit de procéder à l’ajout d’une ligne à la syntaxe suivante:

    module.[modulename] = ${play.path}/modules/[modulename]-[version]

    où:

    • modulename est le nom du module à activer dans votre projet,
    • version est la version cible du dit module, qui est facultatif.

    CRUD

    Nous souhaitons donc ajouter le module CRUD:

    module.crud=${play.path}/modules/crud

    Le module apportant un certain nombre de fonctionnalités, il est accompagne de nouvelles pages qui seront dynamiquement créés. pour permettre l’accés à ces pages, nous allons devoir découvrir une nouvelle fonctionnalité de Play!: les routes !

    Commençons par finir de configurer notre module CRUD en ajoutant dans le fichier myplayapp/conf/routes la ligne suivante, en fin de fichier:

    # Import the default CRUD routes
            GET     /admin             module:crud

    Cette déclaration va permettre d’accéder au page générée dynamiquement a partir de l’url http://localhost:9000/admin, (pour un accès depuis le server play en mode run).

    Voilà. Comme vu déjà auparavant, on s’apperçoit que les fonctionnalité de Play! sont d’une simplicité de mise en oeuvre déconcertante. Tout développeur Java se souvient des nombreux fichier de configuration qu’ils soient .properties, .conf ou .xml, ils étaient dans tous les cas nombreux. Ici, point de complexité, juste du bon sens.

    nota: Il est important de noter que suite à chaque ajout/déclaration d’un nouveau plugin dans votre projet, il est IMPERATIF de regénéré les dépendance du projet eclipse via la commande play eclispify . sous peine d’avoir des erreur de compilation ainsi que des defaillances du système de complétion automatique offert par Eclipse. Cette remarque est également vraie pour NetBeans.

    CRUD sur mes entités ?

    CRUD, pour les néofites, est un néologisme très anglicisé, correspondant à *C*reate *R*etrieve *U*pdate *D*elete, et signifiant la possibilité de fournir de façon extrêmement simple une interface utilisateur afin d’accéder aux 4 opérations de base pour chaque entité déclaré dans lepackage models.

    Ainsi pour notre entité Game, nous souhaitons avoir rapodement une interface simple permettant la gestion de la liste des entités Game.

    Pour celà, une simple opération permet de définir un contrôleur spécifique à notre entité. Créons la classe Games dans le package controllers. Celle-ci doit hériter de la classe CRUD mise à disposition par le plugin précédemment activé.

    La classe sera :

    /**
             * Project myplayapp Part 2
             * Admin zone
             */
            package controllers;

    /**
    * CRUD management for Game entity.
    * @author McGivrer
    *
    */
    public class Games extends CRUD {

    }

    Puis, prenez votre élant et lancer le serveur play en mode DEV via la commande:

    $ play run

    et constatez la beauté du geste ;)

    La zone d’administration que nous accédons par http://localhost:9000/admin donne la page ci-dessous:

    figure 2.5 - Accueil de la partie principale g&eacute;n&eacute;r&eacute;e par le plugin CRUD
    figure 2.5 – Accueil de la partie principale générée par le plugin CRUD

    Si nous cliquons sur le lien “Games” représentant notre nouveau contrôleur, nous pouvons voir la page spécifique à notre entité Game:

    figure 2.6 - Page g&eacute;n&eacute;r&eacute;e par CRUD pour l'entit&eacute; Game via le contr&ocirc;leur Games
    figure 2.6 – Page générée par CRUD pour l’entité Game via le contrôleur Games

    Et enfin, si nous cliquons sur le lien “Add”, situé en haut à droite de la page en cours, vous voyez alors le formulaire généré par CRUD pour la modification/création d’une (nouvelle) occurence de Game:

    figure 2.7 - Formulaire d'&eacute;dition d'une entit&eacute; Game
    figure 2.7 – Formulaire d’édition d’une entité Game

    I18n

    Ok, vous me direz que ces formulaires et pages auto générés sont fort beaux, mais les labels des champs ne sont pas trop parlant. Qu’à cela ne tienne, allons modifier ces libellés.

    Pour celà, penchons nous sur un autre point fort de Play! : la gestion de l’internationnalisation (le fameux i18n !).

    Vous constaterez certainement, tôt ou tard, la présence, certe bizard, d’un fichier “messages” dans le répertoire conf de votre projet Play!. Et bien, ouvrons le pour voir !

    # You can specialize this file for each language.
            # For example, for French create a messages.fr file
            #

    Bon, ok il est vide de tout contenu, sauf d’un subtile commentaire. Et pourtant, en une seule phrase, tout est dit !

    Vous voulez accéder à des textes subtilement traduit dans une langue particulières, et bien simplement créez le fichier messages.[ext] our [ext] sera le code i18 de la langue cible.

    Ainsi pour nous, bon vieux français, nous devrons créer un fichier “messages.fr” et celui là comportera tous les message dans langue de molière que nous souhaitons voir apparaitre dans nos pages.

    Pour information, la sélection de la langue à afficher dans les pages pour un utilisateur se fera en fonction de la langue configurée dans les options des navigateurs web. par exemple sous firefox, ce paramétrage se trouve dans “Preferences → Advanced → Languages”:

    figure 2.8 - Configuration de la langue d'affichage dans Firefox
    figure 2.8 – Configuration de la langue d’affichage dans Firefox

    figure 2.9.1 - Configuration de la langue d'affichage dans Chromium - &eacute;tape 1
    figure 2.9.1 – Configuration de la langue d’affichage dans Chromium – étape 1

    figure 2.9.2 - Configuration de la langue d'affichage dans Chromium - &eacute;tape 2
    figure 2.9.2 – Configuration de la langue d’affichage dans Chromium – étape 2

    Donc, nous devons tout d’abord déclarer la liste des langues supportées par notre application. Nous nous contenterons ici,,dans le cadre de ce tutoriel, de supporter l’anglais et le français. Aussi, le fichier conf/application.conf sera modifié comme suit:

    # i18n
            # ~~~~~
            # Define locales used by your application.
            # You can then place localized messages in conf/messages.{locale} files
            application.langs=fr,en

    Créons maintenant un fichier conf/messages.fr pour le français, et ajoutons-y nos libellés:

    # You can specialize this file for each language.
            # For example, for French create a messages.fr file
            #
            title=Titre
            platform=Platforme
            description=Description
            publish=Publié
            testContent=Texte du test
            developerStudio=Studio de développement
            editor=Editeur
            yearOfPublication=Année d'édition
            note=Note
            cover=Jaquette
    • ce qui donnera dans l’affichage de la page de modification de Game:

    figure 2.10.1 - Langue fran&ccedil;aise sur le navigateur
    figure 2.10.1 – Langue française sur le navigateur

    • Si nous créons la version anglaise dans le fichier conf/messages.en :
    # You can specialize this file for each language.
            # For example, for French create a messages.fr file
            #
            title=Title
            platform=Platform
            description=Description
            publish=Publish
            testContent=Test Content
            developerStudio=Developer Studio
            editor=Editor
            yearOfPublication=Year
            note=Note
            cover=Cover

    figure 2.10.2 - Langue anglaise sur le navigateur
    figure 2.10.2 – Langue anglais sur le navigateur

    Customisation de l’affichage

    Si les affichage par défaut dans les liste de type d’entiés et des listes des occurences de ces entités, il est possible facilement de modifier ces affichages.

    Titre dans les Listes d’entités

    Pour modifier la liste des entités, il suffit d’ajouter dans les Entity une méthode toString() qui permettra de formater l’affichage d’un objet de type entité dans une liste. Ainsi, pour un object de type Game, on implémentera la méthode toString() comme ci-dessous:

    public String toString(){
                    return this.title + "("+this.yearOfPublication+")";
            }

    La liste sera alors affichée de la manière suivante :

    figure 2.11 - Titre d'un jeu personnalis&eacute; dans la liste des Games
    figure 2.11 – Titre d’un jeu personnalisé dans la liste des Games

    Colonnes affichés dans les listes

    Vous pouvez également donner plus d’information dans les listes affichées. pour cela, vous passez par les fichier list.html des controllers “entities”.

    Pour cela, créons un répertoire views/Games et dans celui-ci créer le fichier list.html et copiez-y les lignes ci-dessous:

    #{extends 'CRUD/layout.html' /}
            <div id="crudList" class="${type.name}">
                    <h2 id="crudListTitle">&{'crud.list.title', type.name}</h2>
                    <div id="crudListSearch">
                            #{crud.search /}
                    </div>
                    <div id="crudListTable">
                            #{crud.table fields:['title', 'yearOfPublication', 'publish', 'platform'] /}
                    </div>
                    <div id="crudListPagination">
                            #{crud.pagination /}
                    </div>
                    <p id="crudListAdd">
                            &{'crud.add', type.modelName}
                    </p>
            </div>

    vous remarquerez la ligne :

    #{crud.table fields:['title', 'yearOfPublication', 'publish', 'platform'] /}

    Celle-ci liste les champs que vous souhaitez afficher dans la liste des jeux.

    figure 2.12 - Liste de champs personnalis&eacute; pour la liste des jeux videos
    figure 2.12 – Liste de champs personnalisé pour la liste des jeux videos

    Vous remarquerz qu’ici aussi, tout les libellés sont traduits.

    Voilà pour aujourd’hui, nous arrêterons là. La suite se concentrera sur le module Secure et son implémentation, ainsi que sur la customisation de la page d’accueil de l’application. Nous en profiterons également pour mettre en place une belle zone d’administration avec plein d’information.

    Il sera également temps de revoir nos diverses entités pour en faire un beau modèle fonctionnel.

     

     

     

    • Tweet
  • Tomcat6 and the Play!framework on Ubuntu (for newbie!)

    • 3 Jan 2011
    • 1 Response
    •  views
    • deploy install newbie playframework tomcat6 ubuntu war
    • Edit
    • Delete
    • Tags
    • Autopost

    Playframework-logo

    I have just installed a brand new Ubuntu 10.10 on my laptop, and one of my first need was to deploy a Playframework java application.

    So I need a Tomcat 6 instance for "Java Runable" purpose.

    Tomcat installation
    So, just read this guide: ubuntu-fr tomcat installation and click this "click-to-install" link: tomcat6,tomcat6-admin,tomcat6-example. If the APT protocol is not installed on your ubuntu linux, just try :

    frederic@nostromo6:~$ sudo apt-get install tomcat6,\
                          tomcat6-admin,tomcat6-examples

    if you try to access the http://localhost:8080/

    you will must obtain the following page :
    Capture-apache_tomcat_-_chromium-1
    figure 1 -Tomcat 6 is now installe dand ready to use.
    User Tomcat path
    To be able to isolate your own work from the Tomcat server instance, you have to install with the following link apt://tomcat6-user  the  "by-user-instance" oriented package for Apache Tomcat server.

    If not PAT protocole is installed, just use  the good old command line:

    frederic@nostromo6:~$ sudo apt-get install tomcat6-user

    Then in your prefered shell command terminal, execute the following command:

    frederic@nostromo6:~$ tomcat6-instance-create ~/tools/tomcat6 \
                          -p 8088 -w 8008

    Then you are able to start  this Tomcat 6 instance with a 

    ~/tools/tomcat6/bin/startup.sh

    To start your own tomcat on port 8088. (note: the control port will be 8008).

    To ask tomcat server to stop, send a "SHUTDOWN" ASCII string to port 8008.

    Conclusion
    Yes, Tomcat 6 is now installed on your computer. you are ready to deploy your Play! Framework based application:

    play war myplayapp -o myplayapp.war

    Just copy the produced myplayapp.war to the [tomcat_server_path]/webapps/ directory, Tomcat cat will auto deploy the war and you will just have to open your stared browser to http://localhost:8080/myplayapp/.
     
    Capture-your_application_is_ready__-_chromium
    figure 2 - Your first empty Play!framework application deployed on Tomcat

    Job done !
    Have good time with the fabulous Play!framework.
    to be continued...
    • Tweet
  • About

    Java/J2EE Expert
    Technical Manager
    Web Standard evangelizer

    120786 Views
  • Archive

    • 2012 (12)
      • May (1)
      • April (7)
      • January (4)
    • 2011 (53)
      • December (5)
      • November (1)
      • September (4)
      • August (4)
      • July (5)
      • June (2)
      • May (11)
      • April (11)
      • March (5)
      • February (3)
      • January (2)
    • 2010 (51)
      • December (2)
      • November (2)
      • October (1)
      • September (3)
      • August (8)
      • July (4)
      • June (15)
      • May (3)
      • April (2)
      • March (5)
      • February (5)
      • January (1)
    • 2009 (29)
      • December (1)
      • November (5)
      • October (6)
      • August (1)
      • July (4)
      • June (2)
      • May (1)
      • April (4)
      • March (2)
      • February (1)
      • January (2)
    • 2008 (39)
      • December (1)
      • November (5)
      • October (8)
      • September (8)
      • August (8)
      • July (9)

    Get Updates

    Follow this Space »
    You're following this Space (Edit)
    You're a contributor here (Edit)
    This is your Space (Edit)
    Follow by email »
    Get the latest updates in your email box automatically.
    Loading...
    Subscribe via RSS
    FlickrPicasametaweblog