L'exemple décrit ci-dessous s'applique à un site découpé en n ressources classées en 3 rubriques (par exemple, un produit accessible par vendeur / acheteur / point de vente)
Ces fonctions décrivent la méthode de navigation permettant d'accéder à une liste de ressources restreinte alphabétiquement grâce à l'emploi de liens du type (# A B ... Z).
Une lettre n'est cliquable que si une ressource est disponible. La rubrique en consultation doit être conservée.
Pré-requis :
1/ Créer deux patrons "category_alpha.php" et category_liste.php (descriptions ci-dessous)
2/ Créer 27 catégories identifiée par # A B C D .... Z (# est pris pour 0..9) associés au patron category_alpha.php
3/ Utiliser la catégorie "lettre" comme catégorie secondaire de l'article ou de la news (par exemple, pour la news
Savon, la catégorie secondaire doit être "
S")
Fonctionnement : (Le code décrit ci-dessous est placé dans la div
content des templates)
1/ La template
category_liste.php sert de point d'entrée à
category_alpha.php et affiche la totalité des ressources d'une rubrique
<div id=
"content">
<div id=
"actualites">
<?php pxSingleCatTree
('<ol class="tree">%s</ol>');
?>
<?
/* Boucle listant les lettres disponibles */
$classement =
array("#",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z");
foreach ($classement as $lettre){
($lettre ==
'#') ?
$compSql =
"between 0 and 9" :
$compSql =
"= '".
$lettre.
"'";
$sql =
"SELECT DISTINCT(SUBSTRING(category_name,1,1)) as category_letter FROM ".
$con->
pfx.
"categories
WHERE ".
$con->
pfx.
"categories.category_parentid = ".
$GLOBALS['_PX_render']['cat']->
f('category_id').
"
AND SUBSTRING(category_name,1,1) ".
$compSql.
"
GROUP BY category_letter";
$rs =
$con->
select($sql);
if($rs->
f('category_letter') ==
$lettre)
echo "<a href=".config::
f('rel_url').
'/?/'.
$lettre.
"><b>".
$lettre.
"</b></a> ";
else if(ereg('([0-9]{1})',
$rs->
f('category_letter')))
echo "<b>#</b> ";
else
echo $lettre.
" ";
}
?>
<p
class=
"bandeau">Liste des ressources</p>
<?php
$rs = pxSitemapCategoriesList
($GLOBALS['_PX_render']['cat']->
f('category_id'));
while (list
($titre,
$val) =
each($rs)){
echo "<a href=".
$val['path'].
">".
$titre.
"</a><br />";
}
?>
</div>
<p id=
"pagination"></p>
</div> <!-- fin content -->
2/ La template
category_alpha.php n'affiche que la liste restreinte pour la rubrique concernée.
Afin d'éviter d'impacter le code de Plume et donc conserver le bénéfice des mises à jour, le passage de variable se fait au travers d'un cookie et d'une table Mysql de type MEMORY (anciennement HEAP)
Le CREATE TABLE est porté ci-dessous en commentaire (
plume_swap)
<div id=
"content">
<div id=
"actualites">
<?php pxSingleCatTree
('<ol class="tree">%s</ol>');
?>
<? /*
CREATE TABLE `plume_swap` (
`session` VARCHAR( 40 ) NOT NULL ,
`request` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `session` )
) ENGINE = memory; */
$catTemp =
$GLOBALS['_SERVER']['HTTP_REFERER'];
$cat =
explode("/",
$catTemp);
$selection =
explode("/",
$GLOBALS['_SERVER']['REQUEST_URI']);
$cat_len =
count($cat);
$selection_len =
count($selection);
if (strlen($cat[$cat_len-
2]) ==
1){ /*on repasse le formulaire. Récupération de la catégorie*/
$sql =
"SELECT ".
$con->
pfx.
"swap.request FROM ".
$con->
pfx.
"swap
WHERE ".
$con->
pfx.
"swap.session_identifier LIKE '".
$_COOKIE['lolib_nav'].
"'";
$rsRequest =
$con->
select($sql);
$stringCategory =
$rsRequest->
f('request');
}
else { /*premier passage. Insertion en table HEAP du TimeRand et du type de catégorie*/
/* 1°) Effacer les anciennes données avec ce TimeRand */
$sql =
"DELETE FROM ".
$con->
pfx.
"swap WHERE ".
$con->
pfx.
"swap.session_identifier = '".
$_COOKIE['lolib_nav'].
"'";
$rsDelete =
$con->
execute($sql);
setcookie("lolib_nav",
"");
/* 2°) Inserer nouvelle valeur et deposer un cookie */
$valeur =
time().rand
(1,
250);
// Temps concaténé à nombre aléatoire
setcookie('lolib_nav',
$valeur,
time() 1296000);
$sql =
"INSERT INTO ".
$con->
pfx.
"swap (session_identifier,request) VALUES ('".
$valeur.
"','".
$cat[$cat_len-
2].
"')";
$rsInsert =
$con->
execute($sql);
$stringCategory =
$cat[$cat_len-
2];
}
$sql =
"SELECT category_id FROM ".
$con->
pfx.
"categories
WHERE ".
$con->
pfx.
"categories.category_path LIKE '/".
$stringCategory.
"/'";
$rs =
$con->
select($sql);
$classement =
array("#",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z");
foreach ($classement as $lettre){
($lettre ==
'#') ?
$compSql =
"between 0 and 9" :
$compSql =
"= '".
$lettre.
"'";
$sql =
"SELECT DISTINCT(SUBSTRING(category_name,1,1)) as category_letter FROM ".
$con->
pfx.
"categories
WHERE ".
$con->
pfx.
"categories.category_parentid = ".
$rs->
f('category_id').
"
AND SUBSTRING(category_name,1,1) ".
$compSql.
"
GROUP BY category_letter";
$rsAlpha =
$con->
select($sql);
if($rsAlpha->
f('category_letter') ==
$lettre)
echo "<a href=".config::
f('rel_url').
'/?/'.
$lettre.
"><b>".
$lettre.
"</b></a> ";
else if(ereg('([0-9]{1})',
$rsAlpha->
f('category_letter')))
echo "<b>#</b> ";
else
echo $lettre.
" ";
}
?>
<p
class=
"bandeau">Tri en
<?php echo $cat[$cat_len-
2];?></p>
<?php
$sql =
"SELECT * FROM ".
$con->
pfx.
"categories
WHERE ".
$con->
pfx.
"categories.category_parentid = ".
$rs->
f('category_id').
"
AND ".
$con->
pfx.
"categories.category_name LIKE '".
$selection[$selection_len-
2].
"%'
ORDER BY ".
$con->
pfx.
"categories.category_name";
$rsListe =
$con->
select($sql);
while(!
$rsListe->
EOF()){
echo $rsListe->
f('category_name').
"<br />";
$rsListe->
moveNext();
}
?>
</div>
<p id=
"pagination"></p>
</div>