Valider 08b3cde6 rédigé par marcimat@rezo.net's avatar marcimat@rezo.net
Parcourir les fichiers

Déplacement de champs extras core et interface à la racine de plugins.

parent
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours

.gitattributes

0 → 100644
+43 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
* text=auto !eol
action/iextras.php -text
action/iextras_exporter.php -text
base/iextras.php -text
formulaires/editer_champs_extras.html -text
formulaires/editer_champs_extras.php -text
formulaires/importer_champs_extras.html -text
formulaires/importer_champs_extras.php -text
/iextras_administrations.php -text
images/iextras-16.png -text
images/iextras-24.png -text
images/iextras-64.png -text
inc/iextras.php -text
inc/iextras_autoriser.php -text
lang/iextras.xml -text
lang/iextras_en.php -text
lang/iextras_es.php -text
lang/iextras_fr.php -text
lang/iextras_it.php -text
lang/iextras_sk.php -text
lang/paquet-iextras.xml -text
lang/paquet-iextras_en.php -text
lang/paquet-iextras_es.php -text
lang/paquet-iextras_fr.php -text
lang/paquet-iextras_it.php -text
lang/paquet-iextras_ru.php -text
lang/paquet-iextras_sk.php -text
/paquet.xml -text
prive/objets/contenu/champs_extras_possibles.html -text
prive/objets/contenu/champs_extras_possibles_fonctions.php -text
prive/objets/infos/champs_extras.html -text
prive/objets/liste/champs_extras_objets.html -text
prive/objets/liste/champs_extras_objets_fonctions.php -text
prive/squelettes/contenu/champs_extras.html -text
prive/squelettes/contenu/champs_extras_edit.html -text
prive/squelettes/contenu/champs_extras_exporter_importer.html -text
prive/squelettes/navigation/champs_extras.html -text
prive/squelettes/navigation/champs_extras_exporter_importer.html -text
prive/style_prive_plugin_iextras.html -text
prive/themes/spip/images/iextras-16.png -text
prive/themes/spip/images/iextras-24.png -text
prive/themes/spip/images/iextras-download-26.png -text
prive/themes/spip/images/iextras-upload-26.png -text

action/iextras.php

0 → 100644
+86 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<?php

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

function action_iextras_dist() {
	$securiser_action = charger_fonction('securiser_action', 'inc');
	$arg = $securiser_action();
	
	// droits
	include_spip('inc/autoriser');
	if (!autoriser('configurer', 'iextra')) {
		include_spip('inc/minipres');
		echo minipres();
		exit;
	}
	
	@list($arg, $id_extra_ou_table, $champ) = explode ('/', $arg);
	
	// actions possibles
	if (!in_array($arg, array(
		'associer_champ',
		'supprimer_champ'))){
			include_spip('inc/minipres');
			echo minipres(_T('iextras:erreur_action',array("action"=>$arg)));
			exit;		
	}
	
	// cas de l'association d'un champ existant
	if (($arg == 'associer_champ') and ($table = $id_extra_ou_table) and $champ){
		$extra_id = action_associer_champ_sql_comme_champ_extra($table, $champ);
	}

	// cas de la suppression d'un champ existant
	if (($arg == 'supprimer_champ') and ($table = $id_extra_ou_table) and $champ){
		action_supprimer_champ_sql($table, $champ);
	}
}


// definir un champ SQL existant comme un champ extra a prendre
// en compte par ce plugin
function action_associer_champ_sql_comme_champ_extra($table, $champ){
	// recuperer la description du champ
	include_spip('inc/cextras');
	include_spip('inc/iextras');
	$champs = extras_champs_anormaux();
	if (isset($champs[$table][$champ])) {
		
		$sql = $champs[$table][$champ];
		$saisies = iextras_champs_extras_definis($table);
		
		include_spip('inc/saisies');
		$saisies_sql = saisies_lister_disponibles_sql();
		
		$type_saisie =  'textarea';
		
		$saisies = saisies_inserer($saisies, array(
			'saisie' => $type_saisie,
			'options' => array_merge(
				$saisies_sql[$type_saisie]['defaut']['options'], array(
					'nom' => $champ,
					'label' => ucfirst($champ)
		))));

		// sauver
		ecrire_meta('champs_extras_' . $table, serialize($saisies));
		
		// supprimer la session d'edition du formulaire pour le remettre a zero
		session_set('constructeur_formulaire_champs_extras_' . $table, null);
	}	
}

// suppression de la base d'un champ d'une table donnee.
function action_supprimer_champ_sql($table, $champ) {
	// recuperer les descriptions
	// pour verifier que le champ n'est pas declare par quelqu'un
	include_spip('inc/cextras');
	$champs = extras_champs_anormaux();
	if (isset($champs[$table][$champ])) {
		// suppression
		extras_log("Suppression du champ $table/$champ par auteur ".$GLOBALS['auteur_session']['id_auteur'],true);
		
		sql_alter("TABLE $table DROP COLUMN ".$champ);			
	}
}
 No newline at end of file
+282 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<?php

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

/**
 * Exporte des champs extras
 *
 * Crée un fichier PHP contenant des informations relatives (array)
 * aux saisies utilisées par les champs extras sur un ou plusieurs objets
 *
 * Paramètres d'action :
 *
 * - yaml/tous                       Tous les champs extras de tous les objets
 * - php/tous                        Tous les champs extras de tous les objets (export PHP)
 * - yaml/objet/{type}/tous          Tous les champs extras de l'objet {type}. {@example: `yaml/objet/auteur/tous`}
 * - yaml/objet/{type}/champ/{nom}   Le champ {nom} de l'objet {type}. {@example: `yaml/objet/auteur/champ/date_naissance`}
 * 
**/
function action_iextras_exporter_dist() {
	$securiser_action = charger_fonction('securiser_action', 'inc');
	$arg = $securiser_action();

	// droits
	include_spip('inc/autoriser');
	if (!autoriser('configurer', 'iextra')) {
		include_spip('inc/minipres');
		echo minipres();
		exit;
	}

	list($format, $quoi, $objet, $quoi_objet, $champ) = array_pad(explode('/', $arg), 5, null);

	// formats possibles
	if (!in_array($format, array('yaml', 'php'))) {
		include_spip('inc/minipres');
		echo minipres(_T('iextras:erreur_format_export',array("format" => $format)));
		exit;
	}

	// actions possibles
	if (!in_array($quoi, array('tous','objet'))) {
		include_spip('inc/minipres');
		echo minipres(_T('iextras:erreur_action',array("action" => $quoi)));
		exit;
	}

	// liste des champs extras par table SQL array(table sql => array(saisies))
	$champs = array();
	$titre = "";

	if ($quoi == 'tous') {
		$titre  = 'tous';
		$champs = iextras_exporter_tous();
	}
	elseif ($quoi_objet == 'tous') {
		$titre = $objet;
		$champs = iextras_exporter_objet_tous($objet);
	}
	else {
		$titre = "$objet-$champ";
		$champs = iextras_exporter_objet_champ($objet, $champ);
	}

	return iextras_envoyer_export($champs, $titre, $format);
}


/**
 * Retourne tous les champs extras par table SQL
**/
function iextras_exporter_tous() {
	include_spip('inc/iextras');
	$tables = lister_tables_objets_sql();
	$champs = array();
	foreach ($tables as $table => $desc) {
		if ($liste = iextras_champs_extras_definis($table)) {
			$champs[$table] = $liste;
		}
	}
	return $champs;
}


/**
 * Retourne tous les champs extras d'un objet
 *
 * @param string $objet
**/
function iextras_exporter_objet_tous($objet) {
	include_spip('inc/iextras');
	$champs = array();
	$table = table_objet_sql($objet);
	if ($liste = iextras_champs_extras_definis($table)) {
		$champs[$table] = $liste;
	}
	return $champs;
}


/**
 * Retourne un champ extra d'un objet
 *
 * @param string $objet
 * @param string $champ
**/
function iextras_exporter_objet_champ($objet, $champ) {
	include_spip('inc/iextras');
	$champs = array();
	$table = table_objet_sql($objet);
	if ($liste = iextras_champs_extras_definis($table)) {
		include_spip('inc/saisies');
		$liste = saisies_lister_par_nom($liste);
		if (!empty($liste[$champ])) {
			$champs[$table] = array();
			$champs[$table][] = $liste[$champ];
		}
	}
	return $champs;
}


/**
 * Exporte un contenu (description de champs extras) au format YAML
 *
 * Envoie les données au navigateur !
 *
 * @param array $export
 * @param string $nom_fichier
 * @param string $format
 *     Format d'export (yaml ou php)
**/
function iextras_envoyer_export($export, $nom_fichier, $format = 'yaml') {

	switch ($format) {
		case 'php':
			$export = iextras_preparer_export_php($export);
			$export = iextras_ecrire_export_php($export);
			
			break;

		case 'yaml':
		default:
			// On envode en yaml
			include_spip('inc/yaml');
			$export = yaml_encode($export);
			break;
	}


	$date = date("Ymd-His");
	Header("Content-Type: text/x-yaml;");
	Header("Content-Disposition: attachment; filename=champs_extras_export-$date-$nom_fichier.$format");
	Header("Content-Length: " . strlen($export));
	echo $export;
	exit;
}


/**
 * Prépare les saisies (les simplifie) pour un export au format PHP
 *
 * @param array $export
 *     Liste des saisies, par table SQL
 * @return array
 *     Idem, simplifié
**/
function iextras_preparer_export_php($export) {
	include_spip('inc/saisies');
	foreach ($export as $table => $champs) {
		if (!$champs) {
			unset($export[$table]);
			continue;
		}

		// simplifier chaque champ
		foreach ($champs as $i => $champ) {
			$export[$table][$i] = iextras_preparer_export_php_saisie($champ);
		}
	}

	return $export;
}

/**
 * Simplifie l'écriture d'une saisie de champs extras
 *
 * @param array Description de saisie
 * @return array
**/
function iextras_preparer_export_php_saisie($saisie) {

	// 1 mettre 'saisie' en tout premier, c'est plus pratique !
	$saisie = array('saisie' => $saisie['saisie']) + $saisie;

	// 2 mettre 'saisies' en dernier
	if (isset($saisie['saisies'])) {
		$saisies = $saisie['saisies'];
		unset($saisie['saisies']);
		$saisie['saisies'] = $saisies;
		// 2 bis : traiter toutes les saisies enfants
		foreach ($saisie['saisies'] as $k => $s) {
			$saisie['saisies'][$k] = iextras_preparer_export_php_saisie($s);
		}
	}

	// 3 pas besoin d'identifiant
	unset($saisie['identifiant']);
	// 4 nettoyage de quelques champs souvent vides
	if (isset($saisie['options']['restrictions'])) {
		if (empty($saisie['options']['restrictions']['secteurs'])) {
			unset($saisie['options']['restrictions']['secteurs']);
		}
		if (empty($saisie['options']['restrictions']['branches'])) {
			unset($saisie['options']['restrictions']['branches']);
		}
		if (empty($saisie['options']['restrictions']['voir']['auteur'])) {
			unset($saisie['options']['restrictions']['voir']['auteur']);
		}
		if (empty($saisie['options']['restrictions']['modifier']['auteur'])) {
			unset($saisie['options']['restrictions']['modifier']['auteur']);
		}
		if (empty($saisie['options']['restrictions']['voir'])) {
			unset($saisie['options']['restrictions']['voir']);
		}
		if (empty($saisie['options']['restrictions']['modifier'])) {
			unset($saisie['options']['restrictions']['modifier']);
		}
		if (empty($saisie['options']['restrictions'])) {
			unset($saisie['options']['restrictions']);
		}
	}

	// 5 les datas doivent être des tableaux
	if (isset($saisie['options']['datas'])) {
		if (!is_array($saisie['options']['datas'])) {
			$saisie['options']['datas'] = saisies_chaine2tableau($saisie['options']['datas']);
		}
	}

	return $saisie;
}

/**
 * Écrit le code PHP de l'export PHP
 *
 * @param array $export
 *     Liste des saisies, par table SQL
 * @return string
 *     Code PHP
**/
function iextras_ecrire_export_php($export) {
	$contenu = <<<EOF
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;

function monplugin_declarer_champs_extras(\$champs = array()) {
EOF;
	foreach ($export as $table => $champs) {
		$contenu .= "

	// Table : $table
	if (!is_array(\$champs['$table'])) {
		\$champs['$table'] = array();
	}
";
		foreach ($champs as $champ) {
			$nom = $champ['options']['nom'];
			$desc = var_export($champ, true);
			$desc = explode("\n", $desc);
			$desc = implode("\n\t\t", $desc);
			$contenu .= "\n\t\$champs['$table']['$nom'] = $desc;\n";
		}
	}

	$contenu .= <<<EOF

	return \$champs;
}
EOF;

	return $contenu;
}

base/iextras.php

0 → 100644
+20 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;

function iextras_declarer_champs_extras($saisies_tables=array()) {
	include_spip('inc/iextras');
	
	// lors du renouvellement de l'alea, au demarrage de SPIP
	// les chemins de plugins ne sont pas encore connus.
	// il faut se mefier et charger tout de meme la fonction, sinon page blanche.
	if (!function_exists('iextras_champs_extras_definis')) {
		spip_log("ERREUR : inclusion inc/iextras non executee", 'iextras');
		include_once(dirname(__file__).'/../inc/iextras.php');
	}
	
	// recuperer le tableau de champ et les ajouter.
	$extras = iextras_champs_extras_definis();
	$saisies_tables = array_merge_recursive($saisies_tables, $extras);
	return $saisies_tables;
}
 No newline at end of file
+38 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<div class="formulaire_spip formulaire_editer formulaire_#FORM">
	[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
	[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]

	[(#ENV*{message_erreur}|non)
	<div class="ajax">
		#FORMULAIRE_CONSTRUIRE_FORMULAIRE{champs_extras_#ENV{table}, #ENV{_saisies}, #ENV{_options}}
	</div>
	]
	
	<BOUCLE_si_editable(CONDITION){si #ENV{editable}}>
	<form method='post' action='#ENV{action}'><div>
		#ACTION_FORMULAIRE{#ENV{action}}

		[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
		<!--extra-->
		<p class="boutons">
			<span class="image_loading"></span>
			[(#ENV*{message_erreur}|non)
			<em class="attention"><:saisies:construire_attention_enregistrer:></em>
			<button type="submit" class="submit">
				<img src="#CHEMIN{images/formulaire-enregistrer-16.png}" alt="" />
				<:bouton_enregistrer:>
			</button>
			]
			[(#ENV*{message_erreur}|oui)
			<button type="submit" class="link" name="annulation" value="oui">
				<:bouton_annuler:>
			</button>
			<button type="submit" class="submit" name="confirmation" value="oui">
				<img src="#CHEMIN{images/formulaire-enregistrer-16.png}" alt="" />
				<:bouton_enregistrer:>
			</button>
			]
		</p>
	</div></form>
	</BOUCLE_si_editable>
</div>