Menu Module Page Brique Table simple Table complexe Edition Mes ajouts
Obliquid ?
  est un C.M.S.P.G.C.

Vous trouverez un livre blanc sur les CMS sur le site :
www.cms-quebec.com
 
Menu
Module
Page
Brique
Table simple
Explication
Création de la table
Déclaration
Les droits
Le source PHP
Le source TPL
Le résultat
Table complexe
Edition
Mes ajouts
 
Version : 0.0.11
 
Explication
 
Le but de ce menu est de vous guider étape par étape pour la gestion d'un table d'un référentiel contenant l'identifiant et son libellé.
Ce type de table est trés fréquante dans les applications, par exemple pour :
  • La civilité (Mr, Mme, Mlle, ...) ,
  • Le sexe (Masculin, Féminin, ...),
  • Un secteur géographique (Nord, Sud, Est, Ouest, ...),
  • Un type de ... ,
  • Des Marques,
  • etc
 
Création de la table
 
Création dans mysql de la table.

CREATE TABLE `sl_secteur` (
`id_secteur` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT,
`secteur` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`id_secteur`)
) TYPE=MyISAM COMMENT='Table des secteurs';

La table se compose d'un champ identifiant et d'un champ de libellé.

 
Déclaration
 
Déclaration des champs dans obliquid.

INSERT INTO `sl_tabledesc`
( `id_tabledesc` , `tablename` , `field` , `type` , `length` , `is_primary` )
VALUES
('', 'secteur', 'id_secteur', 'integer', NULL , 'Y'),
('', 'secteur', 'secteur', 'text', '50', 'N');

La décaration dans obliquid est obligatoire afin de pouvoir lier une table de notre base à un formulaire de consultation, de saisie, etc.

 
Les droits
 
Création de droit pour la création, modification, suppression.

Dans le menu, cliquez sur l'icône 'Administration des uttilisateurs'.
Dans le menu à gauche de l'écran.

Choisir 'Configuration de la sécurité'.

Dans le nouvel écran valider :
Créer un objet sécurité.
Dans le bandeau 'Nouvelle opération de l'objet de sécurité'.
  • Choisir le nom du module dans la liste.
  • Renseigner le nom de l'opération 'secteuradm' (droit d'administration des secteurs).
  • Puis cliquer sur le bouton Ajouter.
Dans le nouvel écran saisir les rôles qui on le droit d'utiliser cette opération de sécurité.
 
Le source PHP
 
Exemple de code nécessaire pour l'exploitation de cette table.

<?php
/** Gestion des secteurs.
* @version 0.1
* @date 2004/01/11
* @author chautard patrick.chautard@cg94.fr
* @package gestion
*/

/* Gestion des secteurs. */
function gestion_secteur_() {
  global $_obweb;

  // Ajouter un secteur
  if ($_POST["action"]=="add") {
    $sql="INSERT INTO ".$_obweb->tprefix."secteur (secteur) VALUES ('".addslashes($_POST["add"])."')";
    $_obweb->mb->Query($sql);
  }
  // Modifier un secteur
  if ($_POST["action"]=="mod") {
    $sql="UPDATE ".$_obweb->tprefix."secteur SET secteur='".addslashes($_POST["mod"])."' WHERE id_secteur=".$_POST["id"];
  $_obweb->mb->Query($sql);
  }
  // Supprimer un secteur
  if ($_GET["del"]) {
    $sql="DELETE FROM ".$_obweb->tprefix
    .sprintf("secteur WHERE id_secteur=%d", $_GET["del"]);
    $_obweb->mb->Query($sql);
  }
  // Recherche de la liste des types de secteur
  $sql="SELECT ".$_obweb->tprefix."secteur.id_secteur, secteur, COUNT(id_etablissement) FROM ".$_obweb->tprefix."secteur LEFT JOIN ".$_obweb->tprefix."etablissement USING (id_secteur) GROUP BY id_secteur ORDER BY secteur";
  $_obweb->mb->QueryAll($sql, $secteur);

  // Création d'un formulaire
  $dbf =& new db_form();
  // Création des zones écrans
  $param = array();
  $param["class"] = "textform";
  $param["size"] = "50";

  $msg = array();
  $msg["secteur"]="0";
  if ($_obweb->has("100001","secteuradm")) {
  $frm["add"]=$dbf->getInput("TEXTINPUT", "add", $param).$dbf->getHidden("action", "add");
  $frm["submit"]=$dbf->getSubmit("submit", _l("Add"), array("class" => "buttonform") );

  if ($_GET["mod"]) {
    $param["value"]=$_GET["mod"];
    $frm["mod"]=$dbf->getInput("TEXTINPUT", "mod", $param).$dbf->getHidden("action", "mod").$dbf->getHidden("id", $_GET["id"]);
  $frm["submit2"]=$dbf->getSubmit("submit", _l("Update"), array("class" => "buttonform") );

  $msg["mod"]=_l("Modifier un secteur");
  }
  $msg["add"]=_l("Ajouter un secteur");
  $msg["secteur"]="1";
  }
  // Messages multilangue
  $msg["name"]=_l("Secteur");

  $_obweb->addButtons(array("print"));
  $_obweb->smblock->assign("title", _l("Gestion des secteurs"));
  $_obweb->smslot->assign(array("frm" => $frm, "inter" => $secteur, "msg" => $msg ));
}
?>

Explications :

<?php
/** Gestion des secteurs.
* @version 0.1
* @date 2004/01/11
* @author chautard patrick.chautard@cg94.fr
* @package gestion
*/

Ce block contient les informations sur l'origine de la fonction :

  • /** - Titre de la fonction.
  • @version - Version actuelle.
  • @date - Date de réalisation ou de modification.
  • @author - Auteur de la fonction, ajouter son nom en cas de modification.
  • @package - Nom du module donc la fonction fait partie.

// Ajouter un secteur
if ($_POST["action"]=="add") {
  $sql="INSERT INTO ".$_obweb->tprefix."secteur (secteur) VALUES ('".addslashes($_POST["add"])."')";
  $_obweb->mb->Query($sql);
}

  • Si la fonction est appelé avec un paramètre de type $_POST (paramètre envoyé par un formulaire) et que le paramètre action contient la valeur "add", alors génération d'un ordre INSERT sql avec la valeur à ajouter dans le paramètre "add"est execution de celui-ci.
  • Si le paramètre action a pour valeur "mod" traitement identique en modification.
  • Si le paramètre action a pour valeur "del" idem en suppression.

// Recherche de la liste des types de secteur
$sql="SELECT ".$_obweb->tprefix."secteur.id_secteur, secteur, COUNT(id_etablissement) FROM ".$_obweb->tprefix."secteur LEFT JOIN ".$_obweb->tprefix."etablissement USING (id_secteur) GROUP BY id_secteur ORDER BY secteur";
$_obweb->mb->QueryAll($sql, $secteur);

Dans notre schéma de base la table sl_secteur et lié à la table sl_etablissement par le champ id_secteur
Afin de garantir l'intégrité référentielle, une question est posée à la base avec l'identifiant du secteur, le secteur et le nombre d'enregistrement dans la table sl_etablissement qui sont liés à ce secteur.

// Création d'un formulaire
$dbf =& new db_form();
// Création des zones écrans
$param = array();
$param["class"] = "textform";
$param["size"] = "50";
...
$frm["add"]=$dbf->getInput("TEXTINPUT", "add", $param).$dbf->getHidden("action", "add");
$frm["submit"]=$dbf->getSubmit("submit", _l("Add"), array("class" => "buttonform") );
...
if ($_GET["mod"]) {
$param["value"]=$_GET["mod"];
$frm["mod"]=$dbf->getInput("TEXTINPUT", "mod", $param).$dbf->getHidden("action", "mod").$dbf->getHidden("id", $_GET["id"]);
$frm["submit2"]=$dbf->getSubmit("submit", _l("Update"), array("class" => "buttonform") );

  • Création d'un formulaire.
  • Initialisation des valeurs pour la zone de saisie.
  • Ajout dans le formulaire d'une zone de sasie qui se nome "add" et d'un champ caché qui se nome "action" et qui contient le mot "add".
  • Création du bouton envoye pour cette forme.

  • Si réception d'un paramètre GET (javascript ou href) avec comme indice "mod" alors
  • Sauvegarde de la valeur reçue dans le paramètre value du champ.
  • Création d'une zone de saisie appelée "mod" et d'une zone caché appelé action valeur "mod".
  • Création d'une deuxième bouton envoye.

$msg = array();
$msg["secteur"]="0";
...

Création d'un tableau pour recevoir l'ensememble des messages de la brique, initialisation du message secteur avec la valeur "0".
D'autre message viendront par la suite s'ajouter au tableau.

$_obweb->addButtons(array("print"));
$_obweb->smblock->assign("title", _l("Gestion des secteurs"));
;$_obweb->smslot->assign(array("frm" => $frm, "inter" => $secteur, "msg" => $msg ));

  • Ajout du bouton "Imprimer" à la brique.
  • Ajout du titre "Gestion des secteurs".
  • Passage de l'ensemble des paramètres à Smarty pour mise en forme à l'aide du template.
 
Le source TPL
 
Exemple de code TPL.

{{* $Id: secteur.tpl,v 0.1 2005/01/11 chautard *}}
<table>
<tr>
  <td colspan="2" class="tableheader">{{$msg.name}}</td>
  <td>&nbsp;</td>
  <td colspan="2" class="tableheader">{{$msg.name}}</td>
  <td>&nbsp;</td>
  <td colspan="2" class="tableheader">{{$msg.name}}</td>
  <td>&nbsp;</td>
  <td colspan="2" class="tableheader">{{$msg.name}}</td>
  <td>&nbsp;</td>

{{section name=i loop=$inter}}
{{if $smarty.section.i.index is div by 4}}</tr><tr>{{/if}}
<td class="tablebody">
  {{if $msg.secteur eq 1}}
    <a href="index.php?page=gestion_secteur &amp;mod={{$inter[i].1}}&amp;id={{$inter[i].0}}">{{$inter[i].1}}</a>
  {{else}}
    {{$inter[i].1}}
  {{/if}}
</td>
<td>
{{if ($inter[i].2 eq 0) and ($msg.secteur eq 1)}}
<a href="index.php?page=gestion_secteur&amp;del={{$inter[i].0}}"><img
src="common/images/core/window-delete.gif" width="16" height="16" border="0" alt=""/>
</a>
{{else}}
&nbsp;{{$inter[i].2}}
{{/if}}
</td>
<td>&nbsp;</td>
{{/section}}
</tr>
</table>

{{if $msg.mod}}
<form method="post">
<table width="80%">
<tr>
<td class="tableheader" width="20%">{{$msg.mod}}</td>
<td class="tablebody"  width="40%">{{$frm.mod}}</td>
<td class="tablebody" width="20%">{{$frm.submit2}}</td>
</tr>
</table>
</form>
{{/if}}


<form method="post">
<table width="80%">
<tr>
<td class="tableheader" width="20%">{{$msg.add}}</td>
<td class="tablebody" width="40%">{{$frm.add}}</td>
<td class="tablebody" width="20%">{{$frm.submit}}</td>
</tr>
</table>
</form>
<br/>

Explications :

<table>
<tr>
  <td colspan="2" class="tableheader">{{$msg.name}}</td>
  <td>&nbsp;</td>
  <td colspan="2" class="tableheader">{{$msg.name}}</td>
  <td>&nbsp;</td>
  <td colspan="2" class="tableheader">{{$msg.name}}</td>
  <td>&nbsp;</td>
  <td colspan="2" class="tableheader">{{$msg.name}}</td>
  <td>&nbsp;</td>

Création d'un tableau avec 4 colonnes et 3 colonnes de séparation, Chaque en-tête de colonne affichera le message contenu dans la variable $msg["name"].

{{section name=i loop=$inter}}
{{if $smarty.section.i.index is div by 4}}</tr><tr>{{/if}}
<td class="tablebody">
  {{if $msg.secteur eq 1}}
    <a href="index.php?page=gestion_secteur&amp;mod={{$inter[i].1}} &amp;id={{$inter[i].0}}">{{$inter[i].1}}</a>
  {{else}}
    {{$inter[i].1}}
  {{/if}}
</td>
<td>
{{if ($inter[i].2 eq 0) and ($msg.secteur eq 1)}}
<a href="index.php?page=gestion_secteur&amp;del={{$inter[i].0}}"><img
src="common/images/core/window-delete.gif" width="16" height="16" border="0" alt=""/>
</a>
{{else}}
&nbsp;{{$inter[i].2}}
{{/if}}
</td>
<td>&nbsp;</td>
{{/section}}

  • Création d'une section pour parcourir tous les éléments du tableau $inter avec comme indice la variable i.
  • Si la variable d'indice de section est divible par 4 alors on ferme la ligne du tableau et on en ouvre une autre.
  • Si le message secteur est égal à 1 alors on autorise la modification de l'enregistrement sinon affichage simple de l'information.
  • Si le lien secteur/appareil est égal à 0 et que la modification et authorisée alors on affiche l'icône de suppression sinon on se contante d'afficher le nombre d'etablissement du secteur.
  • Fin de la boucle section.

{{if $msg.mod}}
<form method="post">
<table width="80%">
<tr>
<td class="tableheader" width="20%">{{$msg.mod}}</td>
<td class="tablebody"  width="40%">{{$frm.mod}}</td>
<td class="tablebody" width="20%">{{$frm.submit2}}</td>
</tr>
</table>
</form>
{{/if}}

Si le message mod existe

  • Création d'un formulaire.
  • Affichage du message mod.
  • Affichage de la zone de saisie mod.
  • Affichage du bouton submit2 (Modification).
Fin de la condition.

<form method="post">
<table width="80%">
<tr>
<td class="tableheader" width="20%">{{$msg.add}}</td>
<td class="tablebody" width="40%">{{$frm.add}}</td>
<td class="tablebody" width="20%">{{$frm.submit}}</td>
</tr>
</table>
</form>

Création d'un formulaire avec :

  • Affichage du message add.
  • Création d'un zone de saisie add.
  • Affichage du bouton submit.
Le but de ce formulaire est de pouvoir ajouter des enregistrements.

 
Le résultat
 
Une fois le code de votre brique créé, l'écran devrait ressembler à :


A condition bien sûr d'avoir les droits nécessaire pour la modification des enregistrements.
Un petit lien vers secteur.zip pour vous permettre de charger ce code en compressé.

PARTIE ANNEXE  
Quelques sites utiles et utilisés : Quelques documentations sommaires extraites de www.programmez.com

Je ne suis pas un gourou PHP, TPL ou Obliquid, mais si des informations vous manquent sur ce CMS n'exitez pas à m'envoyer un mail.