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;
    }
}
Example #2
0
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);
}