function vues_dist($type, $modele, $id, $content, $wid) { // pour ce qui a une {lang_select} par defaut dans la boucle, // la regler histoire d'avoir la bonne typo dans le propre() // NB: ceci n'a d'impact que sur le "par defaut" en bas list($distant, $table) = distant_table($type); if (colonne_table($type, 'lang')) { $b = valeur_colonne_table($type, 'lang', $id); lang_select($a = array_pop($b)); } else { lang_select($a = $GLOBALS['meta']['langue_site']); } // chercher vues/article_toto.html // sinon vues/toto.html if (find_in_path(($fond = 'vues/' . $type . '_' . $modele) . '.html') or find_in_path(($fond = 'vues/' . $modele) . '.html') or find_in_path(($fond = 'vues/' . $type) . '.html')) { $primary = function_exists('id_table_objet') ? id_table_objet($table) : 'id_' . $table; $contexte = array($primary => $id, 'crayon_type' => $type, 'crayon_modele' => $modele, 'champ' => $modele, 'class' => _request('class_' . $wid), 'self' => _request('self'), 'lang' => $GLOBALS['spip_lang']); $contexte = array_merge($contexte, $content); include_spip('public/assembler'); return recuperer_fond($fond, $contexte); } else { // Par precaution on va rechercher la valeur // dans la base de donnees (meme si a priori la valeur est // ce qu'on vient d'envoyer, il y a nettoyage des caracteres et // eventuellement d'autres filtres de saisie...) $bdd = valeur_colonne_table($type, $modele, $id); if (count($bdd)) { $valeur = array_pop($bdd); } else { // les champs n'ont pas ete retrouves dans la base // ce qui signifie a priori que nous sommes en face d'une cle primaire compose // et qu'un crayon a modifie un element de cette cle (c'est pas malin !) // dans ce cas, on reaffiche a minima ce qu'on vient de publier // mais il sera impossible de le reediter dans la foulee avec le meme crayon // (car l'identifiant du crayon se base sur l'id). // Il faudra donc recharger la page pour pouvoir reediter. if (is_scalar($id)) { $valeur = $content[$modele]; } } if ($valeur) { // seul spip core sait rendre les donnees if (function_exists('appliquer_traitement_champ')) { $valeur = appliquer_traitement_champ($valeur, $modele, table_objet($table)); } else { if (in_array($modele, array('chapo', 'texte', 'descriptif', 'ps', 'bio'))) { $valeur = propre($valeur); } else { $valeur = typo($valeur); } } } return $valeur; } }
function controleur_dist($regs, $c=null) { list( , $nomcrayon, $type, $champ, $id, $class) = $regs; $options = array( 'class' => $class ); list($distant,$table) = distant_table($type); // Si le controleur est un squelette html, on va chercher // les champs qu'il lui faut dans la table demandee // Attention, un controleur multi-tables ne fonctionnera // que si les champs ont le meme nom dans toutes les tables // (par exemple: hyperlien est ok, mais pas nom) if (($fichier = find_in_path( ($controleur = 'controleurs/' . $type . '_' . $champ) . '.html')) || ($fichier = find_in_path( ($controleur = 'controleurs/' . $champ) .'.html'))) { if (!lire_fichier($fichier, $controldata)) die('erreur lecture controleur'); if (preg_match_all('/\bname=(["\'])#ENV\{name_(\w+)\}\1/', $controldata, $matches, PREG_PATTERN_ORDER)) { $champ = $matches[2]; } } else { $controleur = ''; } $valeur = valeur_colonne_table($type, $champ, $id); #spip_log("$valeur = valeur_colonne_table($type, $champ, $id);"); #spip_log($champ); if ($valeur === false) { return array("$type $id $champ: " . _U('crayons:pas_de_valeur'), 6); } /* if (is_scalar($valeur)) { $valeur = array($champ => $valeur); }*/ // type du crayon (a revoir quand le core aura type ses donnees) $inputAttrs = array(); if ($controleur) { $options['hauteurMini'] = 80; // base de hauteur mini $option['inmode'] = 'controleur'; $options['controleur'] = $controleur; } else // si la valeur fait plusieurs lignes on doit mettre un textarea // derogation specifique pour descriptif_site de spip_metas if ( preg_match(",[\n\r],", $valeur[$champ]) OR (($champ == 'valeur') && ($id == 'descriptif_site')) OR // on regarde le type tel que defini dans serial // (attention il y avait des blob dans les vieux spip) ($sqltype = colonne_table($type, $champ)) && ( in_array($sqltype['type'] , array('mediumtext', 'longblob', 'longtext')) || (($sqltype['type'] == 'text' || $sqltype['type'] == 'blob') && in_array($champ, array('descriptif', 'bio'))))) { $options['hauteurMini'] = 80; // hauteur mini d'un textarea $option['inmode'] = 'texte'; } else { // ligne, hauteur naturelle $options['hauteurMaxi'] = 0; $option['inmode'] = 'ligne'; if ($sqltype['long']) { $inputAttrs['maxlength'] = is_array($sqltype['long']) ? $sqltype['long'][0] : $sqltype['long']; } } $crayon = new Crayon($nomcrayon, $valeur, $options, $c); $inputAttrs['style'] = join($crayon->styles); if (!$controleur) { $inputAttrs['style'] .= 'width:' . $crayon->largeur . 'px;' . ($crayon->hauteur ? ' height:' . $crayon->hauteur . 'px;' : ''); } $html = $controleur ? $crayon->formulaire(null, $inputAttrs) : $crayon->formulaire($option['inmode'], $inputAttrs); $status = NULL; return array($html,$status); }