.. -*- coding: utf-8 -*-.. _Overview:Aperçu rapide de `CubicWeb`===========================`CubicWeb` nous permet de développer des instances d'applications webbasées sur un ou plusieurs `cube`.Ce à quoi nous réferrons en parlant de `cube` est un modèle définissantdes types de données et des vues. Un `cube` est un composant re-utilisableregroupé avec d'autres cubes sur le système de fichiers.Un `instance` réferre à une installation spécifique d'un ou plusieurs cubesoù sont regroupés tous les fichiers de configuration de l'application web finale.Dans ce document, nous allons vous montrer comment créer un cube et l'utiliserdans une instance pour votre application web.Créez votre cube----------------Après avoir installé votre environement de développement `CubicWeb`, vous pouvezcommencer à construire votre premier cube: :: cubicweb-ctl newcube blogCela va créer dans ``/path/to/forest/cubes`` une répertoire contenant :: blog/ | |-- data/ | |-- cubes.blog.css | |-- cubes.blog.js | |-- external_resources | |-- debian/ | |-- changelog | |-- compat | |-- control | |-- copyright | |-- cubicweb-blog.prerm | |-- rules | |-- entities.py | |-- i18n/ | |-- en.po | |-- fr.po | |-- __init__.py | |-- MANIFEST.in | |-- migration/ | |-- postcreate.py | |-- precreate.py | |-- __pkginfo__.py | |-- schema.py | |-- setup.py | |-- site_cubicweb.py | |-- sobjects.py | |-- test/ | |-- data/ | |-- bootstrap_cubes | |-- pytestconf.py | |-- realdb_test_blog.py | |-- test_blog.py | |-- views.pyToute modification apportée à votre modele de données devraetre effectué dans ce répertoire.Définissez votre schéma de données----------------------------------Le modèle de données ou schéma est au coeur d'une application `CubicWeb`.C'est là où vous allez devoir définir le type de contenu que votre applicationdevra gérer.Votre modele de données est défini dans le fichier ``schema.py`` de votre cube``blog`` comme suit.:: from cubicweb.schema import format_constraint class Blog(EntityType): title = String(maxsize=50, required=True) description = String() class BlogEntry(EntityType): title = String(required=True, fulltextindexed=True, maxsize=256) publish_date = Date(default='TODAY') content = String(required=True, fulltextindexed=True) entry_of = SubjectRelation('Blog', cardinality='?*')Un ``Blog`` a un titre et une description. Le titre est une chaînede caractères requise par la classe parente EntityType et ne doitpas excéder 50 caractères. La description est une chaîne decaractères sans contraintes.Une ``BlogEntry`` a un titre, une date de publication et du texteétant son contenu. Le titre est une chaîne de caractères qui nedoit pas excéder 100 caractères. La date de publication est de type Date et apour valeur par défaut TODAY, ce qui signifie que lorsqu'une``BlogEntry`` sera créée, sa date de publication sera la datecourante a moins de modifier ce champ. Le texte est une chaîne decaractères qui sera indexée en plein texte et sans contraintes.Une ``BlogEntry`` a aussi une relation nommée ``entry_of`` qui larelie à un ``Blog``. La cardinalité ``?*`` signifie que BlogEntrypeut faire partie de zero a un Blog (``?`` signifie `zero ou un`) etqu'un Blog peut avoir une infinité de BlogEntry (``*`` signifie`n'importe quel nombre incluant zero`).Par soucis de complétude, nous rappellerons que ``+`` signifie`un ou plus`.Créez votre instance--------------------:: cubicweb-ctl create blog blogdemoCette commande va créer un répertoire ``~/etc/cubicweb.d/blogdemo``contenant tous les fichiers de configuration nécessaire au lancementde votre application web.L'instance ``blogdemo`` est construite sur le cube ``blog``.Bienvenue dans votre application web------------------------------------Lancez votre application en exécutant : :: cubicweb-ctl start -D blogdemoVous pouvez à présent accéder à votre application web vous permettant decréer des blogs et d'y poster des messages en visitant l'URL http://localhost:8080/.Un premier formulaire d'authentification va vous être proposé. Par défaut,l'application n'autorisera pas d'utilisateur anonyme à accéder a votreapplication. Vous devrez donc utiliser l'utilisateur administrateur quevous aurez crée lors de l'initialisation de votre base de données via``cubicweb-ctl create``... image:: images/login-form.pngUne fois authentifié, vous pouvez commencer à jouer avec votreapplication et créer des entités. Bravo !.. image:: images/blog-demo-first-page.pngRappelez-vous que pour le moment, tout a été géré par la plate-forme`CubicWeb` et que la seule chose qui a été fournie est le schéma dedonnées.Créons des entités------------------Nous allons maintenant créer quelques entités dans notre application.Créez un Blog~~~~~~~~~~~~~Créons à présent quelques entités. Cliquez sur `[+]` sur ladroite du lien Blog. Appelez cette nouvelle entité Blog ``Tech-Blog``et tapez pour la description ``everything about technology``,puis validez le formulaire d'édition en cliquant sur le bouton``Validate``... image:: images/cbw-create-blog.fr.png :alt: from to create blogEn cliquant sur le logo situé dans le coin gauche de la fenêtre,vous allez être redirigé vers la page d'accueil. Ensuite, si vous allezsur le lien Blog, vous devriez voir la liste des entités Blog, en particuliercelui que vous venez juste de créer ``Tech-Blog``... image:: images/cbw-list-one-blog.fr.png :alt: displaying a list of a single blogSi vous cliquez sur ``Tech-Blog`` vous devriez obtenir une descriptiondétaillée, ce qui dans notre cas, n'est rien de plus que le titreet la phrase ``everything about technology``Maintenant retournons sur la page d'accueil et créons un nouveauBlog ``MyLife`` et retournons sur la page d'accueil, puis suivonsle lien Blog et nous constatons qu'à présent deux blogs sont listés... image:: images/cbw-list-two-blog.fr.png :alt: displaying a list of two blogsCréons un article~~~~~~~~~~~~~~~~~Revenons sur la page d'accueil et cliquons sur `[+]` à droite du lien`articles`. Appellons cette nouvelle entité ``Hello World`` et introduisonsun peut de texte avant de ``Valider``. Vous venez d'ajouter un articlesans avoir précisé à quel Blog il appartenait. Dans la colonne de gauchese trouve une boite intitulé ``actions``, cliquez sur le menu ``modifier``.Vous êtes de retour sur le formulaire d'édition de l'article que vousvenez de créer, à ceci près que ce formulaire a maintenant une nouvellesection intitulée ``ajouter relation``. Choisissez ``entry_of`` dans ce menu,cela va faire apparaitre une deuxième menu déroulant dans lequel vousallez pouvoir séléctionner le Blog ``MyLife``.Vous auriez pu aussi, au moment où vous avez crée votre article, sélectionner``appliquer`` au lieu de ``valider`` et le menu ``ajouter relation`` serait apparu... image:: images/cbw-add-relation-entryof.fr.png :alt: editing a blog entry to add a relation to a blogValidez vos modifications en cliquant sur ``Valider``. L'entité articlequi est listée contient maintenant un lien vers le Blog auquel ilappartient, ``MyLife``... image:: images/cbw-detail-one-blogentry.fr.png :alt: displaying the detailed view of a blogentryRappelez-vous que pour le moment, tout a été géré par la plate-forme`CubicWeb` et que la seule chose qui a été fournie est le schéma dedonnées. D'ailleurs pour obtenir une vue graphique du schéma, visitezle lien `Application schema`` a l'URL suivante :http://localhost:8080/view?vid=schema.. image:: images/cbw-schema.fr.png :alt: graphical view of the schema (aka data-model)Définissez les vues de vos données----------------------------------Le principe de sélection des vues~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Une vue est une classe Python qui inclut: - un identifiant (tous les objets dans `CubicWeb` sont listés dans un registre et cet identifiant est utilisé comme la clé) - un filtre de sélection de `result sets` auxquels il peut s'appliquer`CubicWeb` fournit un ensemble de vues standard pour le type d'objet`EntityView`. vous poubez les trouver listées dans ``cubicweb/web/views``.Une vue est appliquée sur un `result set` qui représente l'ensembledes entités que nous cherchons à appliquer. `CubicWeb` utilise unsélecteur qui permet de calculer un score et d'identifier la vuela plus adaptée au `result set` que nous voulons afficher. La librariestandard des sélecteurs se trouve dans ``cubicweb.common.selector``et une librairie des méthodes utilisées pour calculer les scoresest dans ``cubicweb.vregistry.vreq``.Il est possible de définir plusieurs vues ayant le meme identifiantet d'y associer des sélecteurs et des filtres afin de permettre àl'application de s'adapter au mieux aux données que nous avonsbesoin d'afficher. Nous verrons cela plus en détails dans :ref:`DefinitionVues`.On peut citer l'exemple de la vue nommée ``primary`` qui est celle utiliséepour visualiser une entité seule. Nous allons vous montrer comment modifiercette vue.Modification des vues~~~~~~~~~~~~~~~~~~~~~Si vous souhaitez modifier la manière dont est rendue un article (`Blogentry`),vous devez surcharger la vue ``primary`` définie dans le module ``views`` devotre cube, ``cubes/blog/views.py``.Nous pourrions par exemple ajouter devant la date de publication un préfixeindiquant que la date visualisée est la date de publication.Pour cela appliquez les modifications suivantes::: from cubicweb.web.views import baseviews class BlogEntryPrimaryView(baseviews.PrimaryView): accepts = ('BlogEntry',) def render_entity_title(self, entity): self.w(u'<h1>%s</h1>' % html_escape(entity.dc_title())) def content_format(self, entity): return entity.view('reledit', rtype='content_format') def cell_call(self, row, col): entity = self.rset.get_entity(row, col) # display entity attributes with prefixes self.w(u'<h1>%s</h1>' % entity.title) self.w(u'<p>published on %s</p>' % entity.publish_date.strftime('%Y-%m-%d')) self.w(u'<p>%s</p>' % entity.content) # display relations siderelations = [] if self.main_related_section: self.render_entity_relations(entity, siderelations).. note:: Lors qu'une vue est modifiée il n'est pas nécessaire de relancer l'application. Sauvez juste le fichier Python et rechargez la page dans votre navigateur afin de visualiser les modifications.Nous pouvons voir que la date de publication est préfixée comme souhaitée... image:: images/cbw-update-primary-view.fr.png :alt: modified primary viewLe code que nous avons modifié définit une vue primaire pour une entité detype `BlogEntry`.Etant donné que les vues sont appliquées sur des `result sets` et queles `result sets` peuvent être des tableaux de données, il est indispensablede récupérer l'entité selon ses coordonnées (row,col).La méthode ``self.w()`` est utilisée pour afficher des données. En particulierdans notre exemple, nous l'utilisons pour afficher des tags HTML et des valeursdes attributs de notre entité.