Rev 609 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/***************************************************************************\* SPIP, Systeme de publication pour l'internet ** ** Copyright (c) 2001-2005 ** Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James ** ** Ce programme est un logiciel libre distribue sous licence GNU/GPL. ** Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *\***************************************************************************/////////////////////////////////////////////////////////////////////////////////////// Pour utiliser les champs "extra", il faut installer dans le fichier// ecrire/mes_options.php3 un tableau definissant les champs en question,// pour chaque type d'objet (article, rubrique, breve, auteur ou mot) que// l'on veut ainsi etendre ; utiliser dans l'espace public avec// [(#EXTRA|nom_du_champ)]// Exemples :/*//// Definition de tous les extras possibles//$GLOBALS['champs_extra'] = Array ('auteurs' => Array ("alim" => "radio|brut|Préférences alimentaires|Veggie,Viande","habitation" => "liste|brut|Lieu|Kuala Lumpur,Cape Town,Uppsala","ml" => "case|propre|Je souhaite m'abonner à la mailinglist","age" => "ligne|propre|Âge du capitaine","biblio" => "bloc|propre|Bibliographie"),'articles' => Array ("isbn" => "ligne|typo|ISBN","options" => "multiple|brut|Options de cet article|1,2,3,plus"));// Note : pour les listes et les radios on peut preciser les valeurs des labels// Exemples// "habitation" => "liste|brut|Lieu|San Diego,Suresnes|diego,suresnes",*//*// On peut optionnellement vouloir restreindre la portee des extras :// - pour les articles/rubriques/breves en fonction du secteur ;// - pour les auteurs en fonction du statut// - pour les mots-cles en fonction du groupe de mots// Exemples :$GLOBALS['champs_extra_proposes'] = Array ('auteurs' => Array (// tous : par defaut'tous' => 'age|alim|ml',// les admins (statut='0minirezo') ont plus de champs que les auteurs'0minirezo' => 'age|alim|ml|biblio|habitation'),'articles' => Array (// tous : par defaut aucun champs extra sur les articles'tous' => '',// seul le champs extra "isbn" est proposé dans le secteur 1)'1' => 'isbn',// Dans le secteur 2 le champs "options" est proposé)'2' => 'options'));*///////////////////////////////////////////////////////////////////////////////////////// Ce fichier ne sera execute qu'une foisif (defined("_ECRIRE_INC_EXTRA")) return;define("_ECRIRE_INC_EXTRA", "1");// a partir de la liste des champs, generer la liste des inputfunction extra_saisie($extra, $type, $ensemble='') {$extra = unserialize($extra);// quels sont les extras de ce type d'objetif (!$champs = $GLOBALS['champs_extra'][$type])$champs = Array();// prendre en compte, eventuellement, les champs presents dans la base// mais oublies dans mes_options.if (is_array($extra))while (list($key,) = each($extra))if (!$champs[$key])$champs[$key] = "masque||($key?)";// quels sont les extras proposes...// ... si l'ensemble est connuif ($ensemble && isset($GLOBALS['champs_extra_proposes'][$type][$ensemble]))$champs_proposes = explode('|', $GLOBALS['champs_extra_proposes'][$type][$ensemble]);// ... sinon, les champs proposes par defautelse if (isset($GLOBALS['champs_extra_proposes'][$type]['tous'])) {$champs_proposes = explode('|', $GLOBALS['champs_extra_proposes'][$type]['tous']);}// sinon tous les champs extra du typeelse {$champs_proposes = Array();reset($champs);while (list($ch, ) = each($champs)) $champs_proposes[] = $ch;}// bug explodeif($champs_proposes == explode('|', '')) $champs_proposes = Array();// maintenant, on affiche les formulaires pour les champs renseignes dans $extra// et pour les champs proposesreset($champs_proposes);while (list(, $champ) = each($champs_proposes)) {$desc = $champs[$champ];list($form, $filtre, $prettyname, $choix, $valeurs) = explode("|", $desc);if (!$prettyname) $prettyname = ucfirst($champ);$affiche .= "<b>$prettyname :</b><br />";switch($form) {case "case":case "checkbox":$affiche = ereg_replace("<br />$", " ", $affiche);$affiche .= "<INPUT TYPE='checkbox' NAME='suppl_$champ'";if ($extra[$champ] == 'true')$affiche .= " CHECKED ";break;case "list":case "liste":case "select":$choix = explode(",",$choix);if (!is_array($choix)) {$affiche .= "Pas de choix définis.\n";break;}// prendre en compte les valeurs des champs// si elles sont renseignees$valeurs = explode(",",$valeurs);if($valeurs == explode(",",""))$valeurs = $choix ;$affiche .= "<SELECT NAME='suppl_$champ' ";$affiche .= "CLASS='forml'>\n";$i = 0 ;while (list(, $choix_) = each($choix)) {$val = $valeurs[$i] ;$affiche .= "<OPTION VALUE=\"$val\"";if ($val == entites_html($extra[$champ]))$affiche .= " SELECTED";$affiche .= ">$choix_</OPTION>\n";$i++;}$affiche .= "</SELECT>";break;case "radio":$choix = explode(",",$choix);if (!is_array($choix)) {$affiche .= "Pas de choix définis.\n";break;}$valeurs = explode(",",$valeurs);if($valeurs == explode(",",""))$valeurs = $choix ;$i=0;while (list(, $choix_) = each($choix)) {$affiche .= "<INPUT TYPE='radio' NAME='suppl_$champ' ";$val = $valeurs[$i] ;if (entites_html($extra["$champ"])== $val)$affiche .= " CHECKED";// premiere valeur par defautif (!$extra["$champ"] AND $i == 0)$affiche .= " CHECKED";$affiche .= " VALUE='$val'>$choix_</INPUT>\n";$i++;}break;// A refaire car on a pas besoin de renvoyer comme pour checkbox// les cases non cocheescase "multiple":$choix = explode(",",$choix);if (!is_array($choix)) {$affiche .= "Pas de choix définis.\n";break; }for ($i=0; $i < count($choix); $i++) {$affiche .= "<INPUT TYPE='checkbox' NAME='suppl_$champ$i'";if (entites_html($extra["$champ"][$i])=="on")$affiche .= " CHECKED";$affiche .= ">\n";$affiche .= $choix[$i];$affiche .= "</INPUT>\n";}break;case "bloc":case "block":$affiche .= "<TEXTAREA NAME='suppl_$champ' CLASS='forml' ROWS='5' COLS='40'>".entites_html($extra[$champ])."</TEXTAREA>\n";break;case "masque":$affiche .= "<font color='#555555'>".interdire_scripts($extra[$champ])."</font>\n";break;case "ligne":case "line":default:$affiche .= "<INPUT TYPE='text' NAME='suppl_$champ' CLASS='forml'\n";$affiche .= " VALUE=\"".entites_html($extra[$champ])."\" SIZE='40'>\n";break;}$affiche .= "<p>\n";}if ($affiche) {debut_cadre_enfonce();echo $affiche;fin_cadre_enfonce();}}// recupere les valeurs postees pour reconstituer l'extrafunction extra_recup_saisie($type) {$champs = $GLOBALS['champs_extra'][$type];if (is_array($champs)) {$extra = Array();while(list($champ,)=each($champs)) {list($style, $filtre, , $choix,) = explode("|", $GLOBALS['champs_extra'][$type][$champ]);list(, $filtre) = explode(",", $filtre);switch ($style) {case "multiple":$choix = explode(",", $choix);$extra["$champ"] = array();for ($i=0; $i < count($choix); $i++) {if ($filtre && function_exists($filtre))$extra["$champ"][$i] =$filtre($GLOBALS["suppl_$champ$i"]);else$extra["$champ"][$i] = $GLOBALS["suppl_$champ$i"];}break;case 'case':case 'checkbox':if ($GLOBALS["suppl_$champ"] == 'on')$GLOBALS["suppl_$champ"] = 'true';else$GLOBALS["suppl_$champ"] = 'false';default:if ($filtre && function_exists($filtre))$extra["$champ"]=$filtre($GLOBALS["suppl_$champ"]);else $extra["$champ"]=$GLOBALS["suppl_$champ"];break;}}return serialize($extra);} elsereturn '';}// Retourne la liste des filtres a appliquer pour un champ extra particulierfunction extra_filtres($type, $nom_champ) {$champ = $GLOBALS['champs_extra'][$type][$nom_champ];if (!$champ) return array();list(, $filtre, ) = explode("|", $champ);list($filtre, ) = explode(",", $filtre);if ($filtre && $filtre != 'brut' && function_exists($filtre))return array($filtre);return array();}// Retourne la liste des filtres a appliquer a la recuperation// d'un champ extra particulierfunction extra_filtres_recup($type, $nom_champ) {$champ = $GLOBALS['champs_extra'][$type][$nom_champ];if (!$champ) return array();list(, $filtre, ) = explode("|", $champ);list(,$filtre) = explode(",", $filtre);if ($filtre && $filtre != 'brut' && function_exists($filtre))return array($filtre);return array();}function extra_champ_valide($type, $nom_champ) {return isset($GLOBALS['champs_extra'][$type][$nom_champ]);}// a partir de la liste des champs, generer l'affichagefunction extra_affichage($extra, $type) {$extra = unserialize ($extra);if (!is_array($extra)) return;$champs = $GLOBALS['champs_extra'][$type];while (list($nom,$contenu) = each($extra)) {list ($style, $filtre, $prettyname, $choix, $valeurs) =explode("|", $champs[$nom]);list($filtre, ) = explode(",", $filtre);switch ($style) {case "checkbox":case "case":if ($contenu=="true") $contenu = _T('item_oui');elseif ($contenu=="false") $contenu = _T('item_non');break;case "multiple":$contenu_ = "";$choix = explode (",", $choix);if (is_array($contenu) AND is_array($choix)AND count($choix)==count($contenu))for ($i=0; $i < count($contenu); $i++)if ($contenu[$i] == "on")$contenu_ .= "$choix[$i], ";else if ($contenu[$i] <> '')$contenu_ = "Choix incohérents, "."vérifiez la configuration... ";$contenu = ereg_replace(", $", "", $contenu_);break;}if ($filtre != 'brut' AND function_exists($filtre))$contenu = $filtre($contenu);if (!$prettyname)$prettyname = ucfirst($nom);if ($contenu)$affiche .= "<div><b>$prettyname :</b> ".interdire_scripts($contenu)."<br /></div>\n";}if ($affiche) {debut_cadre_enfonce();echo $affiche;fin_cadre_enfonce();}}?>