% -*- mode: latex; -*- mustache tags:  
\ifx\wholebook\relax\else

	\documentclass[10pt,twoside,english]{root/support/latex/sbabook/sbabook}
  \usepackage{import}
  \subimport{root/support/latex/}{common.tex}

  \hypersetup{pdfinfo = {
    Title = {L'application TinyBlog : présentation et modèle},
    Author = {},
    Keywords = {pharo, smalltalk}}}
  \begin{document}
\fi

\chapter{L'application TinyBlog : pr\'{e}sentation et mod\`{e}le}
Tout au long de ce projet, nous allons vous guider pour d\'{e}velopper et enrichir une application Web  pour g\'{e}rer un ou plusieurs blogs (voir l'\'{e}tat final de l'application dans la Figure \ref{TinyBlogOnPharoCloud}).  Dans la suite, nous appellerons cette application: TinyBlog. L'id\'{e}e est qu'un visiteur du site Web puisse voir les posts et que l'auteur du blog puisse se connecter sur le site pour administrer le blog c'est-\`{a}-dire ajouter, supprimer ou modifier des posts.

TinyBlog est une application \`{a} but p\'{e}dagogique qui va vous montrer comment d\'{e}finir et d\'{e}ployer une application en utilisant Pharo/Seaside/Mongo ainsi que des frameworks disponibles en Pharo comme NeoJSON. Nous exposerons aussi comment exposer votre application via un serveur REST. 
Les solutions propos\'{e}es dans ce tutoriel sont parfois non optimales afin de vous faire r\'{e}agir et que vous puissiez proposer d'autres solutions et des am\'{e}liorations.
Notre objectif n'est pas d'\^{e}tre exhaustif. Nous montrons une fa\c{c}on de faire cependant nous invitons le lecteur \`{a} lire les r\'{e}f\'{e}rences sur les autres chapitres, livres et tutoriaux Pharo afin d'approfondir son expertise et enrichir son application.


\begin{figure}

\begin{center}
\includegraphics[width=1.0\textwidth]{figures/TinyBlogOnPharoCloud.png}\caption{Final state of the TinyBlog application\label{TinyBlogOnPharoCloud}}\end{center}
\end{figure}

\section{Installation de Pharo}
Attention, dans ce cours nous supposons que vous utilisez Pharo 5.0 avec une image sp\'{e}ciale avec des packages pr\'{e}-charg\'{e}s. Dans TinyBlog, nous allons \'{e}galement utiliser des biblioth\`{e}ques et frameworks suppl\'{e}mentaires pour le d\'{e}veloppement d'applications Web: Seaside, Magritte, Bootstrap, Voyage, VoyageMongo, ... Vous pouvez t\'{e}l\'{e}charger cette image (machine virtuelle et image) \`{a} l'adresse : \url{http://mooc.pharo.org/}.

Dans le cadre de ce cours, nous vous sugg\'{e}rons de toujours utiliser l'image avec tous les packages web charg\'{e}s que vous trouvez sur \url{http://mooc.pharo.org} car cette image contient tous les packages n\'{e}cessaires.
\section{Le mod\`{e}le des posts}
Le mod\`{e}le de TinyBlog est extr\^{e}mement simple.
Nous commencerons ici par la classe \textcode{TBPost}.
\section{La classe TBPost}
Dans la suite, nous pr\'{e}fixons tous les noms de classe par \textcode{TB} (pour TinyBlog).
Il serait pr\'{e}f\'{e}rable que choisissiez un autre pr\'{e}fixe (par exemple \textcode{TBM}) afin de pouvoir ensuite charger la correction dans la m\^{e}me image Pharo et la comparer \`{a} votre propre classe. 

D\'{e}finissez la classe \textcode{TBPost} comme suit:

\begin{displaycode}{smalltalk}
Object subclass: #TBPost
   instanceVariableNames: 'title text date category visible'
   classVariableNames: ''
   package: 'TinyBlog'
\end{displaycode}
\section{Description d'un post}
Nous utilisons cinq variables d'instance pour d\'{e}crire un post sur le blog.

\begin{tabular}{lll}
\toprule
\textbf{Variable} & \textbf{Signification} &  \\
\midrule
title & Titre du post &  \\
text & Texte du post &  \\
date & Date de redaction &  \\
category & Rubrique contenant le post &  \\
visible & Post visible ou pas ? &  \\
\bottomrule
\end{tabular}

Ces variables ont des m\'{e}thodes accesseurs dans le protocole 'accessing'.

\begin{displaycode}{smalltalk}
TBPost >> title
   ^ title
\end{displaycode}

\begin{displaycode}{smalltalk}
TBPost >> title: anObject
   title := anObject
\end{displaycode}

\begin{displaycode}{smalltalk}
TBPost >> text
   ^ text
\end{displaycode}

\begin{displaycode}{smalltalk}
TBPost >> text: anObject
   text := anObject
\end{displaycode}

\begin{displaycode}{smalltalk}
TBPost >> date
   ^ date
\end{displaycode}

\begin{displaycode}{smalltalk}
TBPost >> date: anObject
   date := anObject
\end{displaycode}

\begin{displaycode}{smalltalk}
TBPost >> visible
   ^ visible
\end{displaycode}

\begin{displaycode}{smalltalk}
TBPost >> visible: anObject
   visible := anObject
\end{displaycode}

\begin{displaycode}{smalltalk}
TBPost >> category
   ^ category
\end{displaycode}

\begin{displaycode}{smalltalk}
TBPost >> category: anObject
   category := anObject
\end{displaycode}
\section{G\'{e}rer la visibilit\'{e} d'un post}
Il faut avoir la possibilit\'{e} d'indiquer qu'un post est visible ou pas. Il faut \'{e}galement pouvoir demander \`{a} un post s'il est visible. Les m\'{e}thodes sont d\'{e}finies dans la protocole 'action'.

\begin{displaycode}{smalltalk}
TBPost >> beVisible
   self visible: true
\end{displaycode}

\begin{displaycode}{smalltalk}
TBPost >> notVisible
   self visible: false
\end{displaycode}

\begin{displaycode}{smalltalk}
TBPost >> isVisible
   ^ self visible
\end{displaycode}
\section{Initialisation}
La m\'{e}thode \textcode{initialize} (protocole 'initialization') fixe la date \`{a} celle du jour et la visibilit\'{e} \`{a} faux. L'utilisateur devra par la suite activer la visibilit\'{e} ce qui permet de r\'{e}diger des brouillons et de publier lorsque le post est termin\'{e}. Un post est \'{e}galement rang\'{e} par d\'{e}faut dans la cat\'{e}gorie 'Unclassified' que l'on d\'{e}finit au niveau classe.  La m\'{e}thode \textcode{unclassifiedTag} renvoie une valeur indiquant que le post n'est pas rang\'{e} dans une cat\'{e}gorie.

\begin{displaycode}{smalltalk}
TBPost class >> unclassifiedTag
   ^ 'Unclassified'
\end{displaycode}

Attention la m\'{e}thode \textcode{unclassifiedTag} est d\'{e}finie au niveau de la classe (cliquer le bouton classe pour la d\'{e}finir). Les autres m\'{e}thodes sont des m\'{e}thodes d'instances c'est-\`{a}-dire qu'elles seront ex\'{e}cut\'{e}es sur des instances de la classe \textcode{TBPost}. 

\begin{displaycode}{smalltalk}
TBPost >> initialize
   self category: TBPost unclassifiedTag.
   self date: Date today.
   self notVisible
\end{displaycode}

Dans la solution propos\'{e}e ci-dessus pour la m\'{e}thode \textcode{initialize}, il serait pr\'{e}f\'{e}rable de ne pas faire une r\'{e}f\'{e}rence en dur \`{a} la classe \textcode{TBPost}. 
Nous traiterons ce point ult\'{e}rieurement dans le MOOC.
\section{M\'{e}thodes de cr\'{e}ation}
Cot\'{e} classe, on sp\'{e}cifie des m\'{e}thodes pour faciliter la cr\'{e}ation de post appartenant ou pas \`{a} une cat\'{e}gorie.

\begin{displaycode}{smalltalk}
TBPost class >> title: aTitle text: aText
   ^ self new
        title: aTitle;
        text: aText;
        yourself
\end{displaycode}

\begin{displaycode}{smalltalk}
TBPost class >> title: aTitle text: aText category: aCategory
   ^ (self title: aTitle text: aText)
            category: aCategory;
            yourself
\end{displaycode}
\section{Cr\'{e}er des posts}
Vous pouvez d\`{e}s maintenant cr\'{e}er des posts.
Ouvrez l'outil Playground et ex\'{e}cuter l'expression suivante :

\begin{displaycode}{smalltalk}
TBPost 
	title: 'Welcome in TinyBlog' 
	text: 'TinyBlog is a small blog engine made with Pharo.' 
	category: 'TinyBlog'
\end{displaycode}

Si vous inspectez le code ci-dessus (clique droit sur l'expression et \symbol{34}inspect\symbol{34}), vous allez obtenir un inspecteur sur l'objet post nouvellement cr\'{e}\'{e}.
\section{Test}
Nous d\'{e}finissons une m\'{e}thode afin de savoir si un post est class\'{e} dans une cat\'{e}gorie.

\begin{displaycode}{smalltalk}
TBPost >> isUnclassified
   ^ self category = TBPost unclassifiedTag
\end{displaycode}

De m\^{e}me il serait pr\'{e}f\'{e}rable de ne pas faire une r\'{e}f\'{e}rence en dur \`{a} la classe \textcode{TBPost}.
\section{Conclusion}
Nous avons maintenant une premi\`{e}re partie du mod\`{e}le et nous vous sugg\`{e}rons 
de sauver votre image Pharo (menu item 'save'). Lors de la prochaine s\'{e}ance nous vous montrerons comment sauver votre code (package) avec le syst\`{e}me de version de Pharo. 


\ifx\wholebook\relax\else
\end{document}
\fi