Valider 10c5249c rédigé par esj's avatar esj
Parcourir les fichiers

Le formulaire d'édition d'un article est à présent un filtre appelable d'un...

Le formulaire d'édition d'un article est à présent un filtre appelable d'un squelette, sous le nom de inc_editer_article_dist (et sous réserve qu'il a été préalablement chargé dans mes_fonctions et assimilés). Il a été purgé de toutes ses variables globales (car elles n'ont de sens que dans l'espace privé) qui sont passées dans un tableau qu'on peut remplir différemment à partir de l'espace public. Mais il faut surtout donner une url de retour pour le script qui enregistre les données. Evidemment, il faut avoir les droits d'accès en écriture sur l'article pour que la validation ne soit pas refusée.

L'intention première de cette nouvelle fonctionnalité est de permettre l'inscription libre de rédacteur dans un site géré par LDAP: il n'est en effet pas souvent possible ni souhaitable de laisser en libre écriture un tel annuaire, aussi la technique des formulaires accessibles de l'espace public est ici indispensable. Mais on peut utiliser cette fonctionnalité pour d'autres raisons, en particulier des squelettes assez proches d'un Wiki, 

Comme pour l'arrivée du filtre de calendrier, la chose est actuellement encore assee brute, l'ergonomie et la présentation sont à améliorer.
parent fffcfeb9
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+37 −23
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -19,39 +19,53 @@ include_spip('inc/documents');
// http://doc.spip.org/@exec_articles_edit_dist
function exec_articles_edit_dist()
{
	$id_article = _request('id_article');
	$id_rubrique = _request('id_rubrique');
	$lier_trad = intval(_request('lier_trad'));
	$new = _request('new');
  articles_edit(_request('id_article'), // intval plus tard
		intval(_request('id_rubrique')),
		intval(_request('lier_trad')),
		intval(_request('id_version')),
		((_request('new') == 'oui') ? 'new' : ''),
		articles_edit_config());
}

function articles_edit_config()
{
	global $champs_extra, $spip_ecran, $options, $spip_lang;

	$config = $GLOBALS['meta'];
	if ($options != 'avancees') {
		$config['articles_surtitre'] = 'non';
		$config['articles_descriptif'] = "non";
		$config['articles_urlref'] = "non";
		$config['articles_ps'] = "non";
	}
	$config['afficher_barre'] = $spip_display != 4;
	$config['langue'] = $spip_lang;
	$config['lignes'] = ($spip_ecran == "large")? 8 : 5;

	if ($champs_extra) {
		include_spip('inc/extra');
		$config['extra'] = true;
	} else $config['extra'] = false;

	return $config;
}

function articles_edit($id_article, $id_rubrique,$lier_trad,  $id_version, $new, $config)
{

	pipeline('exec_init',array('args'=>array('exec'=>'articles_edit','id_article'=>$id_article),'data'=>''));
	
	$row = article_select($id_article, $id_rubrique, $lier_trad, $new);
	$row = article_select($id_article ? $id_article : $new, $id_rubrique,  $lier_trad, $id_version);
	if (!$row) die ("<h3>"._T('info_acces_interdit')."</h3>");

	$id_article = $row['id_article'];

	// si une ancienne revision est demandee, la charger
	// en lieu et place de l'actuelle ; attention les champs
	// qui etaient vides ne sont pas vide's. Ca permet de conserver
	// des complements ajoutes "orthogonalement", et ca fait un code
	// plus generique.
	if ($id_version = intval(_request('id_version'))) {
		include_spip('inc/revisions');
		if ($textes = recuperer_version($id_article, $id_version)) {
			foreach ($textes as $champ => $contenu)
				$row[$champ] = $contenu;
		}
	}

	$id_rubrique = $row['id_rubrique'];
	$titre = $row['titre'];

	if ($id_version) $titre.= ' ('._T('version')." $id_version)";
	else $titre = $row['titre'];

	$commencer_page = charger_fonction('commencer_page', 'inc');
	echo $commencer_page(_T('titre_page_articles_edit', array('titre' => $titre)),
			"naviguer", "articles", $id_rubrique);
	echo $commencer_page(_T('titre_page_articles_edit', array('titre' => $titre)), "naviguer", "articles", $id_rubrique);

	debut_grand_cadre();
	echo afficher_hierarchie($id_rubrique);
@@ -86,7 +100,7 @@ function exec_articles_edit_dist()
	
	debut_cadre_formulaire();
	$editer_article = charger_fonction('editer_article', 'inc');
	echo $editer_article($row, $lier_trad, $new, $GLOBALS['meta']);
	echo $editer_article($new, $id_rubrique, $lier_trad, generer_url_ecrire("articles"), $config, $row);
	fin_cadre_formulaire();

	echo fin_page();
+2 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -12,6 +12,8 @@

if (!defined("_ECRIRE_INC_VERSION")) return;

include_spip('inc/minipres');

// http://doc.spip.org/@inc_aider_dist
function inc_aider_dist($aide='') {
	global $spip_lang, $spip_lang_rtl, $spip_display;
+32 −32
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -19,38 +19,47 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
// lier_trad = l'associer a l'article numero $lier_trad
// new=oui = article a creer si on valide le formulaire
// http://doc.spip.org/@article_select
function article_select($id_article, $id_rubrique, $lier_trad, $new) {
function article_select($id_article, $id_rubrique=0, $lier_trad=0, $id_version=0) {
	global $connect_id_auteur, $connect_id_rubrique, $spip_lang; 
  $id_article = intval($id_article);
  $id_rubrique =  intval($id_rubrique);
  $lier_trad =  intval($lier_trad);

	include_spip('inc/autoriser');

if ($id_article) {
	if (is_numeric($id_article)) {

		if (!autoriser('modifier','article',$id_article))
		return false;

	$result = spip_query("SELECT * FROM spip_articles WHERE id_article=$id_article");

	if ($row = spip_fetch_array($result)) {
		$titre = $row["titre"];
		$id_rubrique = $row["id_rubrique"];
		$id_secteur = $row['id_secteur'];
		$statut = $row['statut'];
			return array();

// marquer le fait que l'article est ouvert en edition par toto a telle date
// une alerte sera donnee aux autres redacteurs sur exec=articles
		if ($GLOBALS['meta']['articles_modif'] != 'non') {
			include_spip('inc/drapeau_edition');
			signale_edition ($id_article,  $GLOBALS['auteur_session'], 'article');
		}
		$row = spip_fetch_array(spip_query("SELECT * FROM spip_articles WHERE id_article=$id_article"));
	// si une ancienne revision est demandee, la charger
	// en lieu et place de l'actuelle ; attention les champs
	// qui etaient vides ne sont pas vide's. Ca permet de conserver
	// des complements ajoutes "orthogonalement", et ca fait un code
	// plus generique.
		if ($id_version) {
			include_spip('inc/revisions');
			if ($textes = recuperer_version($id_article, $id_version)) {
				foreach ($textes as $champ => $contenu)
					$row[$champ] = $contenu;
			}
else if ($new=='oui') {
	// Nouvel article : titre par defaut
	$row['titre'] = filtrer_entites(_T('info_nouvel_article'));
	$row['onfocus'] = " onfocus=\"if(!antifocus){this.value='';antifocus=true;}\"";
	$row['id_rubrique'] = $id_rubrique;
		}
		return $row;

	} else if ($id_article !='new') return array(); // anormal

	// Si c'est une demande de nouvelle traduction, on procede autrement
	// Si c'est une demande de nouvelle traduction, init specifique
	if ($lier_trad)
		$row = article_select_trad($lier_trad);
	else {
		$row['titre'] = filtrer_entites(_T('info_nouvel_article'));
		$row['onfocus'] = " onfocus=\"if(!antifocus){this.value='';antifocus=true;}\"";
		$row['id_rubrique'] = $id_rubrique;
	}

	// appel du script a la racine, faut choisir 
	// admin restreint ==> sa premiere rubrique
@@ -69,15 +78,6 @@ else if ($new=='oui') {
		$row_rub = spip_fetch_array(spip_query("SELECT id_secteur FROM spip_rubriques WHERE id_rubrique=$id_rubrique"));
		$row['id_secteur'] = $row_rub['id_secteur'];
	}
}

	// marquer le fait que l'article est ouvert en edition par toto a telle date
	// une alerte sera donnee aux autres redacteurs sur exec=articles
	if ($GLOBALS['meta']['articles_modif'] != 'non') {
		include_spip('inc/drapeau_edition');
		if ($id_article)
			signale_edition ($id_article,  $GLOBALS['auteur_session'], 'article');
	}

	return $row;
}
+58 −51
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -13,20 +13,26 @@
if (!defined("_ECRIRE_INC_VERSION")) return;

include_spip('inc/actions');
include_spip('inc/barre');

// http://doc.spip.org/@inc_editer_article
function inc_editer_article($row, $lier_trad, $new, $champs_article) {
function inc_editer_article_dist($new, $id_rubrique=0, $lier_trad=0, $retour='', $config=array(), $row=array()) {

	global $champs_extra, $spip_lang, $options, $spip_ecran, $spip_display;
	$articles_soustitre = $config['articles_soustitre'] != "non";
	$articles_surtitre = $config['articles_surtitre'] != 'non';
	$articles_urlref = $config['articles_urlref'] != "non";
	$articles_descriptif = $config['articles_descriptif'] != "non";
	$articles_chapeau = $config['articles_chapeau'] != "non";
	$articles_ps = $config['articles_ps'] != "non";

	$articles_surtitre = $champs_article['articles_surtitre'] != 'non';
	$articles_soustitre = $champs_article['articles_soustitre'] != "non";
	$articles_descriptif = $champs_article['articles_descriptif'] != "non";
	$articles_urlref = $champs_article['articles_urlref'] != "non";
	$articles_chapeau = $champs_article['articles_chapeau'] != "non";
	$articles_ps = $champs_article['articles_ps']  != "non";
	if ($afficher_barre = $config['afficher_barre'])
		include_spip('inc/barre');

	// Appel en tant que filtre d'un squelette 
	if (!$row) {
		include_spip('inc/presentation');
		include_spip('inc/article_select');
		$row = article_select($new, $id_rubrique, $lier_trad);
	}
	$id_trad = $row['id_article'];
	$gros_titre = $row['titre'];
	// Gaffe: sans ceci, on ecrase systematiquement l'article d'origine
@@ -54,16 +60,14 @@ function inc_editer_article($row, $lier_trad, $new, $champs_article) {
	elseif ($id_secteur == $id_rubrique) $logo = "secteur-24.gif";
	else $logo = "rubrique-24.gif";

	if ($spip_ecran == "large") $rows = 28;	else $rows = 20;
	$rows = $config['ligne'] +15;
	$att_text = " class='formo' ".$GLOBALS['browser_caret']." rows='$rows' cols='40'";
	if (strlen($texte)>29*1024) { // texte > 32 ko -> decouper en morceaux
	  list($texte, $sup) = articles_edit_recolle($texte, $att_text);
	} else $sup='';

	if ($champs_extra) include_spip('inc/extra');

	$chercher_rubrique = charger_fonction('chercher_rubrique', 'inc');
	$redirect = generer_url_ecrire("articles");
	$aider = charger_fonction('aider', 'inc');

	$form = "<input type='hidden' name='editer_article' value='oui' />\n" .
		 (!$lier_trad ? '' :
@@ -71,20 +75,20 @@ function inc_editer_article($row, $lier_trad, $new, $champs_article) {
		  $lier_trad .
		  "' />" .
		  "\n<input type='hidden' name='changer_lang' value='" .
		  $spip_lang .
		  $config['langue'] .
		  "' />")) .

		(!(($options == "avancees" AND $articles_surtitre) OR $surtitre)?
		(!($articles_surtitre OR $surtitre)?
			("\n<input type='hidden' name='surtitre' value=\"$surtitre\" />") :
			( "<b>" .
			  _T('texte_sur_titre') .
			  "</b>" .
			  aide ("arttitre") .
			  $aider ("arttitre") .
			  "<br />\n<input type='text' name='surtitre' class='forml' value=\"" .
			  $surtitre .
			  "\" size='40' /><p>")) .
		_T('texte_titre_obligatoire') .
		aide ("arttitre") .
		$aider ("arttitre") .
		"\n<br /><input type='text' name='titre' style='font-weight: bold; font-size: 13px;' class='formo' value=\"" .
		$titre .
		"\" size='40' " .
@@ -95,84 +99,90 @@ function inc_editer_article($row, $lier_trad, $new, $champs_article) {
		 ("<b>" .
		  _T('texte_sous_titre') .
		  "</b>" .
		  aide ("arttitre") .
		  $aider ("arttitre") .
		  "\n<br /><input type='text' name='soustitre' class='forml' value=\"" .
		  $soustitre .
		  "\" size='40' /><br /><br /></p>\n") :
		 '') .

		debut_cadre_couleur($logo, true, "", _T('titre_cadre_interieur_rubrique'). aide("artrub")) .
		debut_cadre_couleur($logo, true, "", _T('titre_cadre_interieur_rubrique'). $aider("artrub")) .

		$chercher_rubrique($id_rubrique, 'article', ($statut == 'publie')) .

		fin_cadre_couleur(true) .
	
		((($options == "avancees" AND $articles_descriptif) OR strlen($descriptif))?
		(($articles_descriptif OR strlen($descriptif))?
		 ("\n<p><b>" ._T('texte_descriptif_rapide') ."</b>" .
		  aide ("artdesc") .
		  $aider ("artdesc") .
		  "<br />" ._T('texte_contenu_article') ."<br />\n" .
		  "<textarea name='descriptif' class='forml' rows='2' cols='40'>" .
		  $descriptif .
		  "</textarea>\n") :
		 '') .

		((($options == "avancees" AND $articles_urlref) OR $nom_site OR $url_site) ?
		 (_T('entree_liens_sites') ."<br />\n" .
		(($articles_urlref OR $nom_site OR $url_site) ?
		 ('<br />' . _T('entree_liens_sites') ."<br />\n" .
		  _T('info_titre') ." " .
		  "\n<input type='text' name='nom_site' class='forml' width='40' value=\"$nom_site\"/><br />\n" .
		  _T('info_url') .
		  "\n<input type='text' name='url_site' class='forml' width='40' value=\"$url_site\"/>\n") : '') .

		chapo_articles_edit($chapo, $articles_chapeau) .
		chapo_articles_edit($chapo, $articles_chapeau, $config['lignes']) .

		"</p><p><b>" ._T('info_texte') ."</b>" . 
		aide ("arttexte") . "<br />\n" .
		$aider ("arttexte") . "<br />\n" .
		_T('texte_enrichir_mise_a_jour') .
		aide("raccourcis") .
		$aider("raccourcis") .
		'<br />' .
		$sup .
		($spip_display==4 ? '' : afficher_barre('document.formulaire.texte')) .
		(!$afficher_barre ? '' : afficher_barre('document.formulaire.texte')) .
		"<textarea id='text_area' name='texte'$att_text>$texte</textarea>\n"
		."<script type='text/javascript'><!--\njQuery(hauteurTextarea);\n//--></script>\n"

		.

		((($articles_ps AND $options == "avancees") OR strlen($ps)) ?
		(($articles_ps OR strlen($ps)) ?
		 ("\n</p><p><b>" . _T('info_post_scriptum') ."</b><br />" . "<textarea name='ps' class='forml' rows='5' cols='40'>" . $ps . "</textarea>\n") :
		 '') .

		(!$champs_extra ? '': extra_saisie($extra, 'articles', $id_secteur)) .
		(!$config['extra'] ? '': extra_saisie($extra, 'articles', $id_secteur)) .

		"<div align='right'><input class='fondo' type='submit' value='" . _T('bouton_enregistrer') . "' /></div></p>";
		"<div align='right'><input class='fondo' type='submit' value='"
		. _T('bouton_enregistrer')
		. "' /></div></p>";

	$oups = _DIR_RESTREINT ? ''
	  : ($lier_trad ?
	     generer_url_ecrire("articles","id_article=$lier_trad")
	     : ($new
		? generer_url_ecrire("naviguer","id_rubrique=$id_rubrique")
		: generer_url_ecrire("articles","id_article=$id_trad")
		));
	return
		"\n<table cellpadding='0' cellspacing='0' border='0' width='100%'>" .
		"<tr>" .
		"\n<td>" .
		($lier_trad ?
		 icone(_T('icone_retour'), generer_url_ecrire("articles","id_article=$lier_trad"), "article-24.gif", "rien.gif", '',false) :
		 icone(_T('icone_retour'),
			$new=='oui'
				? generer_url_ecrire("naviguer","id_rubrique=$id_rubrique")
				: generer_url_ecrire("articles","id_article=$id_trad"),
			"article-24.gif", "rien.gif",'',false)) .
		(!$oups ? '' : icone(_T('icone_retour'), $oups, "article-24.gif", "rien.gif", '',false)) .
		"</td>\n<td>" .
		http_img_pack('rien.gif', " ", "width='10'") .
		"<img src='" .
	  	_DIR_IMG_PACK .	"rien.gif' width='10' />" .
		"</td>\n" .
		"<td width='100%'>" .
	 	_T('texte_modifier_article') .
		gros_titre($gros_titre,'',false) . 
		"</td></tr></table><hr />\n<p>" .
	  generer_action_auteur("editer_article", $new ? $new : $id_article, $redirect, $form, " method='post' name='formulaire'");
	  generer_action_auteur("editer_article", $new ? $new : $id_article, $retour, $form, " method='post' name='formulaire'");

}


//
// Gestion des textes trop longs (limitation brouteurs)
//
// utile pour les textes > 32ko

// http://doc.spip.org/@coupe_trop_long
function coupe_trop_long($texte){	// utile pour les textes > 32ko
function coupe_trop_long($texte){
	$aider = charger_fonction('aider', 'inc');
	if (strlen($texte) > 28*1024) {
		$texte = str_replace("\r\n","\n",$texte);
		$pos = strpos($texte, "\n\n", 28*1024);	// coupe para > 28 ko
@@ -215,10 +225,9 @@ function articles_edit_recolle($texte, $att_text)


// http://doc.spip.org/@chapo_articles_edit
function chapo_articles_edit($chapo, $articles_chapeau)
function chapo_articles_edit($chapo, $articles_chapeau, $rows)
{
	global $spip_ecran;

	$aider = charger_fonction('aider', 'inc');
	if (substr($chapo, 0, 1) == '=') {
		$virtuel = substr($chapo, 1);
		$chapo = "";
@@ -230,7 +239,7 @@ function chapo_articles_edit($chapo, $articles_chapeau)
			"<tr><td valign='top'>" .
			"<font face='Verdana,Arial,Sans,sans-serif' size=2>" .
			"<b><label for='confirme-virtuel'>"._T('info_redirection')."&nbsp;:</label></b>" .
			aide ("artvirt") .
			$aider ("artvirt") .
			"</font>" .
			"</td>" .
			"<td width=10>&nbsp;</td>" .
@@ -246,10 +255,8 @@ function chapo_articles_edit($chapo, $articles_chapeau)
	} else {

		if (($articles_chapeau) OR strlen($chapo)) {
			if ($spip_ecran == "large") $rows = 8;
			else $rows = 5;
			return "<br /><b>"._T('info_chapeau')."</b>" .
				aide ("artchap") .
				$aider ("artchap") .
				"\n<br />"._T('texte_introductif_article')."<br />\n" .
				"<textarea name='chapo' class='forml' rows='$rows' cols='40'>" .
				$chapo .