• # Un framework en C++ qui l'est bien : CppCMS

    Posté par . En réponse au message Développer des interfaces "web". Évalué à 2.

    Comme son nom ne l'indique pas, ce n'est pas un CMS

    http://cppcms.com/wikipp/en/page/main hop les liens qui vont bien

    Après si tu veux pas t'embeter vu qu'en ce moment je code plein de truc avec, je me suis fait un "squelette" pour m'aider à générer des sites rapidements

    https://github.com/sysko/cppcms-skeleton

    et si tu veux un exemple

    https://github.com/sysko/Tatodetect

    J'écrirais surement à journal dessus, car il ne me semble pas avoir vu des gens en parler ici

    Comme cela fait beaucoup de code à digérer grosso modo:

    En gros il a une classe principale "Application" sur lequel on branche des "sous applications" comme suit

     Application::Application(cppcms::service &serv) :
     cppcms::application(serv),
     sousApplication(serv) {
     add(sousApplication, "^/url-qui-va-bien(.*)", 1);
     }
    
    

    Ainsi lorsque ton utilisateur va sur une URL qui commence par /url-qui-va-bien, cela passe la main à sous application, qui recupere le morceau d'url qui suit (note: il est tout à fait possible de définir d'autre type de regexp, là c'est juste mon choix personnel)

    Ensuite dans SousApplication cela se passe comme ça

    SousApplication::SousApplication(cppcms::service &serv) : Controller(serv) {
     usersModel = new models::Users();
     cppcms::url_dispatcher* d = &dispatcher();
     d->assign("/sous-url/(\\w+)$", &SousApplication::methode_qui_va_bien, this, 1);
     }
    
    

    Cela dit que lorsqu'un utilisateur va sur /url-qui-va-bien/sous-url/bonjour
    1 - on appelle SousApplication avec "/sous-url"
    2- cela va appeler "methode_qui_va_bien" avec un parametre "bonjour"

    Maintenant la méthode

     void SousApplication::methode_qui_va_bien(std::string message) {
     // en admettant qu'on l'ai mis quelque chose avant
     std::string username = session()["name"];
     // classe dérivant de Content à définir autre part
     MonContent c;
     c.message = message;
     c.username = username;
     render("vue_qui_va_bien", c);
     }
    
    

    En gros le but va d'etre de remplir un Content (donc évidemment après on le remplit comme on veut, appelle à une bdd etc.) qui sera ensuite passé à une vue

    Et là je vois les ruby-on-railistes et les phpistes et autres djangoistes me dire "Bon t'es bien gentil mais nous on veut voir comment on genere le html, en c++ ça doit etre drole, allez fait nous rire avec ton langage bas niveau"

    Et Non c'est là toute la magie de cppcms, il utilise aussi des templates
    donc ma vue n'est en fait rien d'autre que cela

    <% c++ #include "contents/MonContent.h" %>
    <% skin %>
    <% view vue_qui_va_bien uses MonContent extends master %>
    <% template title() %><% gt "Tout va bien %><% end template %>
    <% template body() %> 
     <%= message %>
     <%= username %>
    <% end template %>
    <% end view %>
    <% end skin %>
    
    

    et le "Master" qui va bien

    <% c++ #include "contents/content.h" %>
    <% skin %>
    <% view master uses contents::BaseContent %>
    <% template render() %>
    <!DOCTYPE
     html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
    >
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
     <% include header() %>
    </head>
    <body>
     <% include body() %>
    </body>
    </html>
    <% end template %>
    <% template title() %>TODO: replace this<% end template %>
    <% template header() %>
    <title><% include title() %></title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     <% include css() %>
    <% end template %>
    <% template css() %>
    <% end template %>
    
    

    Celui là il suffit de l'écrire une fois et après redéfinir dans les autres vues, les fonctions que l'on veut "override"

    après cppcms offre un outil qui convertira ces templates en code C++ (c'est à préciser dans le makefile, mais il suffit de pomper celui donner dans les exemples, rien de magique)

    Après il est possible soit de le lancer derrière un Apache/nginx/lighttps (meme I2S) avec fast-cgi ou sinon il vient également avec son mini serveur http standalone (le binaire généré prend un fichier de configuration en paramètre, écrit en json, qui permet de préciser, entre autre, fast-cgi ou standalone)

    Enfin pour me simplifier la vie, avec cppcms-skeleton je fais simplement un git clone
    je remplis les options qui vont bien dans 'tootls/config.y'
    je lance un "init.py"
    et après pour ajouter une nouvelle sous application "./addController.py SousApplication"
    pour ajouter une nouvelle méthode/content/vue associé "./addMethod.py SousApplication bonjour"
    le code généré compile, après il suffit juste de remplir le code.