[ Index ] |
|
Code source de SPIP 1.9.2c |
1 <?php 2 3 /***************************************************************************\ 4 * SPIP, Systeme de publication pour l'internet * 5 * * 6 * Copyright (c) 2001-2007 * 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 15 //////////////////////////////////////////////////////////////////////////////////// 16 // Pour utiliser les champs "extra", il faut installer dans le fichier 17 // ecrire/mes_options un tableau definissant les champs pour chaque 18 // type d'objet que l'on veut Žtendre (article, rubrique, breve, auteur, 19 // site ou mot). Pour acceder aux valeurs des champs extra dans les 20 // squelettes du site public, utiliser la notation : 21 // [(#EXTRA|extra{nom_du_champ})] 22 // Exemples : 23 24 /* 25 26 // 27 // Definition de tous les extras possibles 28 // 29 30 $GLOBALS['champs_extra'] = Array ( 31 'auteurs' => Array ( 32 "alim" => "radio|brut|Préférences alimentaires|Veggie,Viande", 33 "habitation" => "liste|brut|Lieu|Kuala Lumpur,Cape Town,Uppsala", 34 "ml" => "case|propre|Je souhaite m'abonner à la mailinglist", 35 "age" => "ligne|propre|Âge du capitaine", 36 "biblio" => "bloc|propre|Bibliographie" 37 ), 38 39 'articles' => Array ( 40 "isbn" => "ligne|typo|ISBN", 41 "options" => "multiple|brut|Options de cet article|1,2,3,plus" 42 43 44 ) 45 ); 46 47 // Note : pour les listes et les radios on peut preciser les valeurs des labels 48 // Exemples 49 // "habitation" => "liste|brut|Lieu|San Diego,Suresnes|diego,suresnes", 50 51 52 */ 53 54 55 /* 56 57 // On peut optionnellement vouloir restreindre la portee des extras : 58 // - pour les articles/rubriques/breves en fonction du secteur ; 59 // - pour les auteurs en fonction du statut 60 // - pour les mots-cles en fonction du groupe de mots 61 // Exemples : 62 63 $GLOBALS['champs_extra_proposes'] = Array ( 64 'auteurs' => Array ( 65 // tous : par defaut 66 'tous' => 'age|alim|ml', 67 // les admins (statut='0minirezo') ont plus de champs que les auteurs 68 '0minirezo' => 'age|alim|ml|biblio|habitation' 69 ), 70 71 'articles' => Array ( 72 // tous : par defaut aucun champs extra sur les articles 73 'tous' => '', 74 // seul le champs extra "isbn" est proposé dans le secteur 1) 75 '1' => 'isbn', 76 // Dans le secteur 2 le champs "options" est proposé) 77 '2' => 'options' 78 ) 79 ); 80 81 82 */ 83 84 //////////////////////////////////////////////////////////////////////////////////// 85 86 // 87 if (!defined("_ECRIRE_INC_VERSION")) return; 88 89 // a partir de la liste des champs, generer la liste des input 90 // http://doc.spip.org/@extra_saisie 91 function extra_saisie($extra, $type, $ensemble='') { 92 if ($affiche = extra_form($extra, $type, $ensemble)) { 93 return debut_cadre_enfonce('',true) 94 . $affiche 95 . fin_cadre_enfonce(true); 96 } 97 } 98 99 // http://doc.spip.org/@extra_form 100 function extra_form($extra, $type, $ensemble='') { 101 $extra = unserialize($extra); 102 103 // quels sont les extras de ce type d'objet 104 if (!$champs = $GLOBALS['champs_extra'][$type]) 105 $champs = Array(); 106 107 // prendre en compte, eventuellement, les champs presents dans la base 108 // mais oublies dans mes_options. 109 if (is_array($extra)) 110 while (list($key,) = each($extra)) 111 if (!$champs[$key]) 112 $champs[$key] = "masque||($key?)"; 113 114 // quels sont les extras proposes... 115 // ... si l'ensemble est connu 116 if ($ensemble && isset($GLOBALS['champs_extra_proposes'][$type][$ensemble])) 117 $champs_proposes = explode('|', $GLOBALS['champs_extra_proposes'][$type][$ensemble]); 118 // ... sinon, les champs proposes par defaut 119 else if (isset($GLOBALS['champs_extra_proposes'][$type]['tous'])) { 120 $champs_proposes = explode('|', $GLOBALS['champs_extra_proposes'][$type]['tous']); 121 } 122 123 // sinon tous les champs extra du type 124 else { 125 $champs_proposes = Array(); 126 reset($champs); 127 while (list($ch, ) = each($champs)) $champs_proposes[] = $ch; 128 } 129 130 // bug explode 131 if($champs_proposes == explode('|', '')) $champs_proposes = Array(); 132 133 // maintenant, on affiche les formulaires pour les champs renseignes dans $extra 134 // et pour les champs proposes 135 reset($champs_proposes); 136 while (list(, $champ) = each($champs_proposes)) { 137 $desc = $champs[$champ]; 138 list($form, $filtre, $prettyname, $choix, $valeurs) = explode("|", $desc); 139 140 if (!$prettyname) $prettyname = ucfirst($champ); 141 $affiche .= "<b>$prettyname :</b><br />"; 142 143 switch($form) { 144 145 // complique car la valeur n'esst pas envoyee ar le nav si unchecked 146 case "case": 147 case "checkbox": 148 $affiche = ereg_replace("<br />$", " ", $affiche); 149 $affiche .= "<input type='hidden' name='suppl_$champ' value='1' /><input type='checkbox' name='suppl_{$champ}_check'"; 150 if ($extra[$champ] == 'true') 151 $affiche .= " checked"; 152 $affiche .= " />"; 153 break; 154 155 case "list": 156 case "liste": 157 case "select": 158 $choix = explode(",",$choix); 159 if (!is_array($choix)) { 160 $affiche .= "Pas de choix définis.\n"; 161 break; 162 } 163 164 // prendre en compte les valeurs des champs 165 // si elles sont renseignees 166 $valeurs = explode(",",$valeurs); 167 if($valeurs == explode(",","")) 168 $valeurs = $choix ; 169 170 $affiche .= "<select name='suppl_$champ' "; 171 $affiche .= "class='forml'>\n"; 172 $i = 0 ; 173 while (list(, $choix_) = each($choix)) { 174 $val = $valeurs[$i] ; 175 $affiche .= "<option value=\"$val\""; 176 if ($val == entites_html($extra[$champ])) 177 $affiche .= " selected"; 178 $affiche .= ">$choix_</option>\n"; 179 $i++; 180 } 181 $affiche .= "</select>"; 182 break; 183 184 case "radio": 185 $choix = explode(",",$choix); 186 if (!is_array($choix)) { 187 $affiche .= "Pas de choix définis.\n"; 188 break; 189 } 190 $valeurs = explode(",",$valeurs); 191 if($valeurs == explode(",","")) 192 $valeurs = $choix ; 193 194 $i=0; 195 while (list(, $choix_) = each($choix)) { 196 $affiche .= "<input type='radio' name='suppl_$champ' "; 197 $val = $valeurs[$i] ; 198 if (entites_html($extra[$champ])== $val) 199 $affiche .= " checked"; 200 201 // premiere valeur par defaut 202 if (!$extra[$champ] AND $i == 0) 203 $affiche .= " checked"; 204 205 $affiche .= " value='$val'>$choix_</input>\n"; 206 $i++; 207 } 208 break; 209 210 // A refaire car on a pas besoin de renvoyer comme pour checkbox 211 // les cases non cochees 212 case "multiple": 213 $choix = explode(",",$choix); 214 if (!is_array($choix)) { 215 $affiche .= "Pas de choix définis.\n"; 216 break; 217 } 218 $affiche .= "<input type='hidden' name='suppl_{$champ}' value='1' />"; 219 for ($i=0; $i < count($choix); $i++) { 220 $affiche .= "<input type='checkbox' name='suppl_$champ$i'"; 221 if (entites_html($extra[$champ][$i])=="on") 222 $affiche .= " checked"; 223 $affiche .= ">\n"; 224 $affiche .= $choix[$i]; 225 $affiche .= "</input>\n"; 226 } 227 break; 228 229 case "bloc": 230 case "block": 231 $affiche .= "<textarea name='suppl_$champ' class='forml' rows='5' cols='40'>".entites_html($extra[$champ])."</textarea>\n"; 232 break; 233 234 case "masque": 235 $affiche .= "<span style='color: #555555'>".interdire_scripts($extra[$champ])."</span>\n"; 236 break; 237 238 case "ligne": 239 case "line": 240 default: 241 $affiche .= "<input type='text' name='suppl_$champ' class='forml'\n"; 242 $affiche .= " value=\"".entites_html($extra[$champ])."\" size='40'>\n"; 243 break; 244 } 245 246 $affiche .= "<br />\n"; 247 } 248 249 return $affiche; 250 } 251 252 // recupere les valeurs postees pour reconstituer l'extra 253 // http://doc.spip.org/@extra_recup_saisie 254 function extra_recup_saisie($type, $c=false) { 255 $champs = $GLOBALS['champs_extra'][$type]; 256 if (is_array($champs)) { 257 $extra = Array(); 258 foreach($champs as $champ => $config) 259 if (($val = _request("suppl_$champ",$c)) !== NULL) { 260 list($style, $filtre, , $choix,) = explode("|", $config); 261 list(, $filtre) = explode(",", $filtre); 262 switch ($style) { 263 case "multiple": 264 $choix = explode(",", $choix); 265 $multiple = array(); 266 for ($i=0; $i < count($choix); $i++) { 267 $val2 = _request("suppl_$champ$i",$c); 268 if ($filtre && function_exists($filtre)) 269 $multiple[$i] = $filtre($val2); 270 else 271 $multiple[$i] = $val2; 272 } 273 $extra[$champ] = $multiple; 274 break; 275 276 case 'case': 277 case 'checkbox': 278 if (_request("suppl_{$champ}_check") == 'on') 279 $val = 'true'; 280 else 281 $val = 'false'; 282 // pas de break; on continue 283 284 default: 285 if ($filtre && function_exists($filtre)) 286 $extra[$champ] = $filtre($val); 287 else 288 $extra[$champ] = $val; 289 break; 290 } 291 } 292 return serialize($extra); 293 } else 294 return false; 295 } 296 297 // Retourne la liste des filtres a appliquer pour un champ extra particulier 298 // http://doc.spip.org/@extra_filtres 299 function extra_filtres($type, $nom_champ) { 300 $champ = $GLOBALS['champs_extra'][$type][$nom_champ]; 301 if (!$champ) return array(); 302 list(, $filtre, ) = explode("|", $champ); 303 list($filtre, ) = explode(",", $filtre); 304 if ($filtre && $filtre != 'brut' && function_exists($filtre)) 305 return array($filtre); 306 return array(); 307 } 308 309 // Retourne la liste des filtres a appliquer a la recuperation 310 // d'un champ extra particulier 311 // http://doc.spip.org/@extra_filtres_recup 312 function extra_filtres_recup($type, $nom_champ) { 313 $champ = $GLOBALS['champs_extra'][$type][$nom_champ]; 314 if (!$champ) return array(); 315 list(, $filtre, ) = explode("|", $champ); 316 list(,$filtre) = explode(",", $filtre); 317 if ($filtre && $filtre != 'brut' && function_exists($filtre)) 318 return array($filtre); 319 return array(); 320 } 321 322 // http://doc.spip.org/@extra_champ_valide 323 function extra_champ_valide($type, $nom_champ) { 324 return isset($GLOBALS['champs_extra'][$type][$nom_champ]); 325 } 326 327 // a partir de la liste des champs, generer l'affichage 328 // http://doc.spip.org/@extra_affichage 329 function extra_affichage($extra, $type) { 330 $extra = unserialize ($extra); 331 if (!is_array($extra)) return; 332 $champs = $GLOBALS['champs_extra'][$type]; 333 334 while (list($nom,$contenu) = each($extra)) { 335 list ($style, $filtre, $prettyname, $choix, $valeurs) = 336 explode("|", $champs[$nom]); 337 list($filtre, ) = explode(",", $filtre); 338 switch ($style) { 339 case "checkbox": 340 case "case": 341 if ($contenu=="true") $contenu = _T('item_oui'); 342 elseif ($contenu=="false") $contenu = _T('item_non'); 343 break; 344 345 case "multiple": 346 $contenu_ = ""; 347 $choix = explode (",", $choix); 348 if (is_array($contenu) AND is_array($choix) 349 AND count($choix)==count($contenu)) 350 for ($i=0; $i < count($contenu); $i++) 351 if ($contenu[$i] == "on") 352 $contenu_ .= "$choix[$i], "; 353 else if ($contenu[$i] <> '') 354 $contenu_ = "Choix incohérents, " 355 ."vérifiez la configuration... "; 356 $contenu = ereg_replace(", $", "", $contenu_); 357 break; 358 } 359 if ($filtre != 'brut' AND function_exists($filtre)) 360 $contenu = $filtre($contenu); 361 if (!$prettyname) 362 $prettyname = ucfirst($nom); 363 if ($contenu) 364 $affiche .= "<div><b>$prettyname :</b> " 365 .interdire_scripts($contenu)."<br /></div>\n"; 366 } 367 368 if ($affiche) 369 return debut_cadre_enfonce('',true) 370 . $affiche 371 . fin_cadre_enfonce(true); 372 } 373 374 // s'il y a mise a jour des extras, mixer les champs modifies 375 // avec les champs existants (car la mise a jour peut etre partielle) 376 // http://doc.spip.org/@extra_update 377 function extra_update($type, $id, $c = false) { 378 $extra = @unserialize(extra_recup_saisie($type, $c)); 379 380 // pas de mise a jour, ou erreur 381 if (!is_array($extra) OR !count($extra)) 382 return false; 383 384 // passer de 'articles' a 'article' :-( 385 $t = preg_replace(',s$,', '', $type); 386 387 $orig = spip_query("SELECT extra FROM spip_".table_objet($t)." WHERE ".id_table_objet($t)."=".intval($id)); 388 $orig = spip_fetch_array($orig); 389 390 if (isset($orig['extra']) 391 AND is_array($orig = @unserialize($orig['extra']))) { 392 $extra = array_merge($orig, $extra); 393 } 394 395 return serialize($extra); 396 } 397 398 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Wed Nov 21 10:20:27 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |