Nous allons ici développer un système de dépôt de commentaires utilisant un fichier XML pour stocker les données
plutôt qu'une base comme Access, ce qui nous permet
d'utiliser ce script sur un plus grand nombre d'hébergeurs.
Notre script ASP.NET a été réalisé
en C# à l'aide Webmatrix. Nous voulons obtenir un fichier
XML ayant cette forme :
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<Commentaires>
<Page>Mon Petit Lapin Rose</Page>
<Nom>jerms92</Nom>
<Commentaire>kikoo tro kool ton
lapin lol biz!!</Commentaire>
<Date>15/06/2004 16:02</Date>
</Commentaires>
<Commentaires>
<Page>Prosopopée de Fabricius</Page>
<Nom>Diderot</Nom>
<Commentaire>Pas d'accord. Toute
société est mauvaise, mais toutes les sociétés sont bonnes
d'un certain point de vue. Elles sont vivables. DTC LOL!</Commentaire>
<Date>14/06/2004 18:15</Date>
</Commentaires>
</NewDataSet>
Ce fichier sera entièrement créé et
géré par ASP.
L'interface
Au sein de WebMatrix, nous plaçons un composant graphique
DataGrid, deux composants TextBox, un Button et un Label.
Ils sont respectivement nommés DataGrid1, TextBoxNom,
TextBoxComment, Button1 et Label1. Après un petit travail
cosmétique dans Webmatrix, notamment en utilisant quelques
div centrées et en retravaillant les couleurs et tailles
des éléments, voici notre interface :
...dont voici le code HTML :
<html>
<head>
</head>
<body>
<form runat="server">
<div align="center">
<asp:DataGrid
id="DataGrid1" runat="server" ForeColor="Black" CellPadding="3"
BackColor="Black" EnableViewState="False" GridLines="None"
CellSpacing="1" AutoGenerateColumns="False">
<HeaderStyle
font-bold="True" forecolor="White" backcolor="Black"></HeaderStyle>
<ItemStyle
backcolor="White"></ItemStyle>
<Columns>
<asp:BoundColumn
DataField="Nom" HeaderText="Nom"></asp:BoundColumn>
<asp:BoundColumn
DataField="Commentaire" HeaderText="Commentaire"></asp:BoundColumn>
<asp:BoundColumn
DataField="Date" HeaderText="Date"></asp:BoundColumn>
</Columns>
</asp:DataGrid>
<asp:Panel
id="Panel1" runat="server" Height="263px" Width="280px" align="center">
Votre Nom:
<asp:TextBox
id="TextBoxNom" runat="server" Width="240px" MaxLength="250"></asp:TextBox>
<br />
Votre commentaire:<br
/>
<asp:TextBox
id="TextBoxComment" runat="server" Height="120px" Width="240px"
MaxLength="250" TextMode="MultiLine"></asp:TextBox>
<br />
<asp:Button
id="Button1" runat="server" Text="Valider"></asp:Button>
<br />
<asp:Label
id="Label1" runat="server" forecolor="Red" font-bold="True"></asp:Label>
</asp:Panel>
</div>
</form>
</body>
</html>
Le code
Nous voulons donc qu'il soit possible de laisser un commentaire
pour chaque page, et non pour tout le site (auquel cas nous
aurions ici affaire à un livre d'or). Pour ce faire,
notre formulaire sera accessible depuis un lien en popup partant
de chaque page à commenter, ce lien comportant le nom
de la page. Nous stockons ce nom dans le XML, et nous en servons
pour afficher les commentaires qui y sont attachés.
<a href="comment.aspx?page=Euclide">Voir
les commentaires</a>
Notre code doit, à tout chargement de la page, afficher
les anciens commentaires et le formulaire. Quand le bouton
est cliqué, le même processus se déroule,
sauf que l'on sauvegarde le nouveau commentaire dans le fichier
XML.
Nous allons donc utiliser l'évènement Page_Load(),
au sein duquel nous testerons le clic à l'aide d'un
if (IsPostBack == trues),
IsPosBack étant une
propriété de la page nous renseignant si le
chargement se fait suite à un clic (true),
ou si elle est chargée pour la première fois
(false).
Avant toute chose, il nous faut tester si l'argument Page
est bien rempli :
if ( Request.QueryString["page"]
!= null )
Après quoi nous définissons deux objets DataSet
et DataTable, l'un pour gérer
le contenu du fichier XML, l'autre pour gérer l'affichage
dans notre tableau.
Un premier try..catch nous
permet de charger le fichier XML. Si cela réussi, nous
remplissons DataTable1 avec son contenu, si cela échoue
nous créons tout de même un tableau avec la structure
de notre XML.
Si l'utilisateur a effectivement validé le formulaire
(if (IsPostBack == true)),
nous récupérons ses champs dans une nouvelle
ligne du tableau, et nous l'affichons, nous sans avoir effacé
les champs avant.
Un nouveau try..catch nous
permet ensuite de tenter de sauvegarder notre tableau ainsi
augmentée dans notre fichier XML. Si cela échoue,
nous affichons une erreur dans Label1.
|
Forum |
|
Réagissez
dans les forums
de JDN Développeurs
|
Quoiu'il advienne (IsPostBack
ou pas), nous finissons par lier le contenu du tableau à
celui qui est affiché, en prenant de n'afficher (avec
RowFilter) que les lignes
de la page demandée.
Voici notre code en entier :
<%@ Page Language="C#" %>
<%@ import Namespace="System.Data" %>
<script runat="server">
void Page_Load(Object sender, EventArgs e)
{
if ( Request.QueryString["page"] != null )
{
DataSet DataSet1 = new DataSet();
DataTable DataTable1 = new DataTable();
try
{
DataSet1.ReadXml( HttpContext.Current.Server.MapPath("commentaires.xml"),
XmlReadMode.InferSchema);
DataTable1 = DataSet1.Tables[0];
}
catch
{
DataTable1 = DataSet1.Tables.Add("Commentaires");
DataTable1.Columns.Add("Page");
DataTable1.Columns.Add("Nom");
DataTable1.Columns.Add("Commentaire");
DataTable1.Columns.Add("Date");
}
if ( IsPostBack == true )
{
DataRow ligne = DataTable1.NewRow();
DateTime todayDate = DateTime.Now;
ligne[DataTable1.Columns[0].Caption]
= Request.QueryString["page"];
ligne[DataTable1.Columns[1].Caption]
= Server.HtmlEncode(TextBoxNom.Text);
ligne[DataTable1.Columns[2].Caption]
= Server.HtmlEncode(TextBoxComment.Text);
ligne[DataTable1.Columns[3].Caption]
= String.Format("{0:g}", todayDate);
DataTable1.Rows.Add(ligne);
TextBoxNom.Text = "";
TextBoxComment.Text =
"";
try
{
DataSet1.WriteXml(
HttpContext.Current.Server.MapPath("commentaires.xml"));
}
catch
{
Label1.Text
= "Impossible d'enregistrer le commentaire";
}
}
DataView DataView1 = DataSet1.Tables[0].DefaultView;
DataView1.RowFilter = "Page = '" +
Request.QueryString["page"] + "'";
DataGrid1.DataSource = DataView1;
DataGrid1.DataBind();
}
}
</script>
|