[SPIP] v3.2.1-->v3.2.3
[lhc/web/www.git] / www / plugins-dist / vertebres / public / vertebrer.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2019 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 /**
14 * Échafaudage du contenu du d'un squelette présentant le contenu d'une table SQL
15 *
16 * Production dynamique d'un squelette lorsqu'il ne figure pas dans les dossiers
17 * de squelettes mais que son nom est celui d'une table SQL:
18 * on produit une table HTML montrant le contenu de la table SQL
19 *
20 * Le squelette produit illustre quelques possibilites de SPIP:
21 * - pagination automatique
22 * - tri ascendant et descendant sur chacune des colonnes
23 * - critere conditionnel donnant l'extrait correspondant a la colonne en URL
24 *
25 * @package SPIP\Vertebres\Fonctions
26 **/
27
28 if (!defined("_ECRIRE_INC_VERSION")) {
29 return;
30 }
31
32
33 /**
34 * Retourne un morceau de squelette pour ajouter les noms des colonnes
35 * et des tris possibles dessus
36 *
37 * @param array $fields
38 * Liste des champs de la table
39 * @return string
40 * Ligne de tableau
41 **/
42 function vertebrer_sort($fields) {
43 $res = '';
44 foreach ($fields as $n => $t) {
45 $res .= "\n\t\t<th scope='col'>[(#TRI{" . "$n,$n,ajax})]</th>";
46 }
47
48 return $res;
49 }
50
51 /**
52 * Retourne un morceau de squelette pour ajouter des recherches sur chaque champ de la table
53 *
54 * Autant de formulaire que de champs (pour les criteres conditionnels)
55 *
56 * @param array $fields
57 * Liste des champs de la table
58 * @return string
59 * Ligne de tableau
60 **/
61 function vertebrer_form($fields) {
62 $res = '';
63 $url = join('|', array_keys($fields));
64 $url = "#SELF|\n\t\t\tparametre_url{'$url',''}";
65 foreach ($fields as $n => $t) {
66 $s = sql_test_int($t) ? 11
67 : (preg_match('/char\s*\((\d)\)/i', $t, $r) ? $r[1] : '');
68
69 if (!in_array($n, array('date', 'date_redac', 'lang'))) {
70 $res .= "\n\t\t<td>
71 [(#ENV{" . $n . "}|non)
72 <a href='#' onclick=\"jQuery(this).toggle('fast').siblings('form').toggle('fast');return false;\">[(#CHEMIN_IMAGE{rechercher-20.png}|balise_img)]</a>
73 ]
74 <form class='[(#ENV{" . $n . "}|non)none-js]' action='./' method='get'>"
75 . "<div>"
76 . "\n\t\t\t<input name='$n'"
77 . ($s ? " size='$s'" : '')
78 . "value=\"[(#ENV{" . $n . "}|entites_html)]\""
79 . " />\n\t\t\t[($url|\n\t\t\tform_hidden)]"
80 . "\n\t\t</div></form></td>";
81 } else {
82 $res .= "<td></td>";
83 }
84 }
85
86 return $res;
87 }
88
89 /**
90 * Retourne un morceau de squelette pour ajouter les critères à la boucle
91 *
92 * Autant de criteres conditionnels que de champs
93 *
94 * @param array $fields
95 * Liste des champs de la table
96 * @return string
97 * Critères de boucles
98 **/
99 function vertebrer_crit($fields) {
100 $res = "";
101 foreach ($fields as $n => $t) {
102 if (!in_array($n, array('date', 'date_redac', 'lang', 'recherche', 'logo'))) {
103 $res .= "\n\t\t{" . $n . " ?}";
104 }
105 }
106
107 return $res;
108 }
109
110
111 /**
112 * Retourne un morceau de squelette pour afficher le contenu de chaque
113 * champ SQL dans une ligne d'un tableau
114 *
115 * Class CSS en fonction de la parité du numero de ligne.
116 * Style text-align en fonction du type SQL (numerique ou non).
117 *
118 * Filtre de belle date sur type SQL signalant une date ou une estampillé.
119 *
120 * Si une colonne référence une table, ajoute un href sur sa page dynamique
121 * (il faudrait aller chercher sa def pour ilustrer les jointures en SPIP)
122 *
123 * @param array $fields
124 * Liste des champs de la table
125 * @return string
126 * Ligne de tableau
127 **/
128 function vertebrer_cell($fields) {
129 $res = "";
130 foreach ($fields as $n => $t) {
131 $texte = "#CHAMP_SQL{" . $n . "}";
132 if (preg_match('/\s+references\s+([\w_]+)/', $t, $r)) {
133 $url = "[(#SELF|parametre_url{page,'" . $r[1] . "'})]";
134 $texte = "<a href='$url'>" . $texte . "</a>";
135 }
136 if (sql_test_int($t)) {
137 $s = " style='text-align: right;'";
138 } else {
139 $s = '';
140 if (sql_test_date($t)) {
141 $texte = "[($texte|affdate_heure)]";
142 }
143 }
144 $res .= "\n\t\t<td$s>$texte</td>";
145 }
146
147 return $res;
148 }
149
150 /**
151 * Calcule le contenu d'un squelette pour lister le contenu d'une
152 * table SQL à partir de la description de cette table.
153 *
154 * @see base_trouver_table_dist()
155 * @uses vertebrer_form()
156 * @uses vertebrer_crit()
157 * @uses vertebrer_cell()
158 * @uses vertebrer_sort()
159 *
160 * @param array $desc
161 * Descrption de la table, telle que retournéer par trouver_table.
162 * @return string
163 * Contenu du squelette pour la table
164 **/
165 function public_vertebrer_dist($desc) {
166 $nom = $desc['table'];
167 $surnom = $desc['id_table'];
168 $connexion = $desc['connexion'];
169 $field = $desc['field'];
170 $key = $desc['key'];
171
172 $defaut_tri = array_keys($field);
173 $defaut_tri = reset($defaut_tri);
174
175 //ksort($field);
176
177 $form = vertebrer_form($field);
178 $crit = vertebrer_crit($field);
179 $cell = vertebrer_cell($field);
180 $sort = vertebrer_sort($field);
181 $distant = !$connexion ? '' : "&amp;connect=$connexion";
182
183 return
184 "#CACHE{0}
185 <B1>
186 <h2>[(#GRAND_TOTAL|singulier_ou_pluriel{vertebres:1_donnee,vertebres:nb_donnees})]</h2>
187 [<p class='pagination'>(#PAGINATION)</p>]
188 <div style='overflow: scroll;overflow-y: auto'>
189 <table class='spip'>
190 <thead>
191 <tr class='row_first'>
192 <th>
193 <p class='tri'>#TRI{'>',#CHEMIN_IMAGE{tri-asc-16.png}|balise_img{up},ajax} #TRI{'<',#CHEMIN_IMAGE{tri-desc-16.png}|balise_img{desc},ajax}</p>
194 </th>
195 $sort
196 </tr>
197 <tr>
198 <td></td>$form
199 </tr>
200 </thead>
201 <tbody>
202 <BOUCLE1($surnom){pagination}
203 {tri $defaut_tri, direct}$crit>
204 <tr class='[row_(#COMPTEUR_BOUCLE|alterner{'odd','even'})]'>
205 <td style='text-align: right;'>#COMPTEUR_BOUCLE</td>$cell
206 </tr>
207 </BOUCLE1>
208 </tbody>
209 <tfoot>
210 <tr>
211 <th>
212 <p class='tri'>#TRI{'>',#CHEMIN_IMAGE{tri-asc-16.png}|balise_img{up},ajax} #TRI{'<',#CHEMIN_IMAGE{tri-desc-16.png}|balise_img{desc},ajax}</p>
213 </th>
214 $sort
215 </tr>
216 </tfoot>
217 </table>
218 </B1>
219 <div style='overflow: scroll;overflow-y: auto'>
220 <h2><:texte_vide:></h2>
221 <table class='spip'>
222 <thead>
223 <tr class='row_first'>
224 <th>
225 <p class='tri'>#TRI{'>',#CHEMIN_IMAGE{tri-asc-16.png}|balise_img{up},ajax} #TRI{'<',#CHEMIN_IMAGE{tri-desc-16.png}|balise_img{desc},ajax}</p>
226 </th>
227 $sort
228 </tr>
229 <tr>
230 <td></td>$form
231 </tr>
232 </thead>
233 </table>
234 <//B1>
235 </div>
236 ";
237 }