Newer
Older
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('inc/formidable_fichiers');
define(
'_RACCOURCI_MODELE_FORMIDABLE',
'(<(formulaire\|formidable|formidable|form)' # <modele
.'([0-9]*)\s*' # id
.'([|](?:<[^<>]*>|[^>])*)?' # |arguments (y compris des tags <...>)
.'>)' # fin du modele >
.'\s*(<\/a>)?' # eventuel </a>
/**
* Ajouter la protection NoSpam de base a formidable (jeton)
*
* @param $formulaires
* @return array
*/
function formidable_nospam_lister_formulaires($formulaires) {
$formulaires[] = 'formidable';
return $formulaires;
}
/**
* Trouver les liens <form
* @param $texte
* @return array
*/
function formidable_trouve_liens($texte) {
if (preg_match_all(','._RACCOURCI_MODELE_FORMIDABLE.',ims', $texte, $regs, PREG_SET_ORDER)) {
foreach ($regs as $r) {
$id_formulaire = 0;
$id_formulaire = sql_getfetsel(
'id_formulaire',
'spip_formulaires',
'identifiant='.sql_quote('form'.$r[3])
);
} elseif ($r[2] == 'formulaire|formidable') {
$args = ltrim($r[4], '|');

nicod@lerebooteux.fr
a validé
if(strpos($args,'=')!==false) {
$args = explode('=', $args);
$args = $args[1];
}
if(strpos($args,'|')!==false) {
$args = explode('|', $args);
$args = trim(reset($args));
}
$id_formulaire = intval($args);
$id_formulaire = sql_getfetsel(
'id_formulaire',
'spip_formulaires',
'identifiant='.sql_quote($args)
);
if ($id_formulaire = intval($id_formulaire)) {
$formulaires[$id_formulaire] = $id_formulaire;
}
}
return $formulaires;
}
/**
* Associer/dissocier les formulaires a un objet qui les utilise (ou ne les utilise plus)
* @param $flux
* @return mixed
*/
function formidable_post_edition($flux) {
if (isset($flux['args']['table'])
and $table = $flux['args']['table']
and $id_objet = intval($flux['args']['id_objet'])
and $primary = id_table_objet($table)
and $row = sql_fetsel('*', $table, "$primary=".intval($id_objet))
) {
RastaPopoulos
a validé
// On cherche les modèles insérés dans les textes du contenu
$formulaires = formidable_trouve_liens($contenu);
RastaPopoulos
a validé
// On cherche les liaisons "vu dans le texte" qui étaient là avant
RastaPopoulos
a validé
$deja = objet_trouver_liens(array('formulaire' => '*'), array($objet => $id_objet), array('vu="oui"'));
// On compare pour savoir quelles liaisons "dans le texte" n'est plus là désormais
if (count($deja)) {
foreach ($deja as $l) {
if (!isset($formulaires[$l['id_formulaire']])) {
$del[] = $l['id_formulaire'];
RastaPopoulos
a validé
// Pour les liens trouvés dans la dernière version des textes
RastaPopoulos
a validé
objet_associer(array('formulaire' => $formulaires), array($objet => $id_objet), array('vu' => 'oui'));
objet_qualifier_liens(array('formulaire' => $formulaires), array($objet => $id_objet), array('vu' => 'oui'));
RastaPopoulos
a validé
// Pour les liens qui étaient avant dans le texte mais qui n'y sont plus
// => on garde toujours la liaison mais avec vu=non, à chacun de retirer la liaison si on ne veut plus du tout, comme pour les docs
RastaPopoulos
a validé
objet_qualifier_liens(array('formulaire' => $del), array($objet => $id_objet), array('vu' => 'non'));
RastaPopoulos
a validé
return $flux;
}
/**
* Afficher les formulaires utilises par un objet
* @param $flux
* @return mixed
*/
function formidable_affiche_droite($flux) {
if ($e = trouver_objet_exec($flux['args']['exec'])
and isset($e['type'])
and $objet = $e['type']
and isset($flux['args'][$e['id_table_objet']])
and $id = $flux['args'][$e['id_table_objet']]
and sql_countsel('spip_formulaires_liens', 'objet='.sql_quote($objet).' AND id_objet='.intval($id))) {
$flux['data'] .= recuperer_fond(
'prive/squelettes/inclure/formulaires_lies',
array('objet' => $objet, 'id_objet' => $id)
);
}
return $flux;
}

rastapopoulos@spip.org
a validé
/**
* Afficher l'édition des liens sur les objets configurés
* + les dernières réponses sur la page d'accueil (si configurée)

rastapopoulos@spip.org
a validé
**/
function formidable_affiche_milieu($flux) {
//Afficher l'édition des liens sur les objets configurés

rastapopoulos@spip.org
a validé
include_spip('inc/config');

rastapopoulos@spip.org
a validé
$e = trouver_objet_exec($flux['args']['exec']);
if ($e and !$e['edition'] and isset($flux['args'][$e['id_table_objet']]) and in_array($e['table_objet_sql'], lire_config('formidable/objets', array()))) {

rastapopoulos@spip.org
a validé
$texte .= recuperer_fond('prive/objets/editer/liens', array(
'table_source' => 'formulaires',
'objet' => $e['type'],
'id_objet' => $flux['args'][$e['id_table_objet']]
));
}

rastapopoulos@spip.org
a validé
if ($texte) {
if ($p=strpos($flux['data'], '<!--affiche_milieu-->')) {
$flux['data'] = substr_replace($flux['data'], $texte, $p, 0);

rastapopoulos@spip.org
a validé
$flux['data'] .= $texte;
}
}
if (in_array($flux['args']['exec'], array('accueil', 'suivi_edito'))
and lire_config('formidable/reponses_page_accueil')
) {
$flux['data'] .= recuperer_fond('prive/objets/liste/formulaires_reponses', $contexte, array('ajax' => true));
}

rastapopoulos@spip.org
a validé
return $flux;
}
/**
* Optimiser la base de donnée en enlevant les liens de formulaires supprimés
* @pipeline optimiser_base_disparus
* @param array $flux
* Données du pipeline
* @return array
* Données du pipeline
*/
function formidable_optimiser_base_disparus($flux) {
// Les formulaires qui sont à la poubelle
$res = sql_select(
'id_formulaire AS id',
'spip_formulaires',
'statut='.sql_quote('poubelle')
);
$res2 = sql_select(
'id_formulaire AS id',
'spip_formulaires',
'statut='.sql_quote('poubelle')
);//Copie pour supprimer les fichiers
// On génère la suppression
$flux['data'] += optimiser_sansref('spip_formulaires', 'id_formulaire', $res);
$flux['data'] += formidable_effacer_fichiers_formulaire($reponse['id']);
}
// les reponses qui sont associees a un formulaire inexistant
$res = sql_select(
'R.id_formulaire AS id',
'spip_formulaires_reponses AS R LEFT JOIN spip_formulaires AS F ON R.id_formulaire=F.id_formulaire',
'R.id_formulaire > 0 AND F.id_formulaire IS NULL'
);
$flux['data'] += optimiser_sansref('spip_formulaires_reponses', 'id_formulaire', $res);
// Les réponses qui sont à la poubelle
$res = sql_select(
'id_formulaires_reponse AS id, id_formulaire AS form',
'statut='.sql_quote('poubelle')
$res2 = sql_select(
'id_formulaires_reponse AS id, id_formulaire AS form',
'spip_formulaires_reponses',

maieul@maieul.net
a validé
'statut='.sql_quote('poubelle')
); //Copie pour la suppression des fichiers des réponses, c'est idiot de pas pouvoir faire une seule requete
// On génère la suppression
$flux['data'] += optimiser_sansref('spip_formulaires_reponses', 'id_formulaires_reponse', $res);
$flux['data'] += formidable_effacer_fichiers_reponse($reponse['form'], $reponse['id']);
}
// les champs des reponses associes a une reponse inexistante
$res = sql_select(
'C.id_formulaires_reponse AS id',
'spip_formulaires_reponses_champs AS C
LEFT JOIN spip_formulaires_reponses AS R ON C.id_formulaires_reponse=R.id_formulaires_reponse',
'C.id_formulaires_reponse > 0 AND R.id_formulaires_reponse IS NULL'
);
$flux['data'] += optimiser_sansref('spip_formulaires_reponses_champs', 'id_formulaires_reponse', $res);

maieul@maieul.net
a validé
/**
* S'assurer que le traitement email ait lieu après le traitement enregistrement

maieul@maieul.net
a validé
* @pipeline formidable_traitements

maieul@maieul.net
a validé
* @return array $flux
**/
function formidable_formidable_traitements($flux) {
if (isset($flux['data']['email']) and isset($flux['data']['enregistrement'])) {

maieul@maieul.net
a validé
$position_email = array_search('email', $keys);
$position_enregistrement = array_search('enregistrement', $keys);
if ($position_enregistrement > $position_email) { // si enregistrement après email
$nouveau_tab = array();
foreach ($keys as $key) { //on reconstruit le tableau, en inversant simplement email et enregistrement

maieul@maieul.net
a validé
if ($key == 'email') {
$nouveau_tab['enregistrement'] = $flux['data']['enregistrement'];
} elseif ($key == 'enregistrement') {
$nouveau_tab['email'] = $flux['data']['email'];
} else {
$nouveau_tab[$key] = $flux['data'][$key];
}
}
$flux['data'] = $nouveau_tab;
}
}
return $flux;
}
/** Hasher les ip régulièrement
* @param array $flux
* @return array $flux
**/
function formidable_taches_generales_cron($flux) {
$flux['formidable_hasher_ip'] = 24*3600;

maieul@maieul.net
a validé
$flux['formidable_effacer_fichiers_email'] = 24*3600;

maieul@maieul.net
a validé
$flux['formidable_effacer_enregistrements'] = 24*3600;
* au plugin corbeille
* @param array $flux;
* @return array $flux;
**/
$flux['formulaires']= array(
'statut'=>'poubelle',

maieul@maieul.net
a validé
'tableliee'=>array('spip_formulaires_liens')
);
$flux['formulaires_reponses']= array(
'statut'=>'poubelle',
'table'=>'formulaires_reponses'
);
return $flux;
}
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
/**
* Définir une fonction de contrôleur pour Crayons si on tente d'éditer un champ d'une réponse de formulaire.
*
* Si on édite un champ d'une réponse de formulaires avec Crayons, sans avoir créé manuellement de contrôleur spécifique
* pour le champ en question, Crayons propose soit un textarea, soit un input.
*
* Vu que l'on connaît les déclarations de nos champ , on va les utiliser pour créer
* un formulaire d'édition plus adapté à notre champ.
*
* @pipeline crayons_controleur
* @param array $flux
* @return array
*/
function formidable_crayons_controleur($flux) {
// si Crayons a déjà trouvé de contrôleur PHP, on ne fait rien
if ($flux['data'] != 'controleur_dist') {
return $flux;
}
$type = $flux['args']['type'];
if ($type === 'formulaires_reponses_champ') {
$flux['data'] = charger_fonction('formulaires_reponses_champ', 'controleurs');
}
return $flux;
}
/**
* Vérifier une saisie envoyée depuis un formulaire de Crayons.
*
* @pipeline crayons_verifier
* @param array $flux
* @return array
*/
function formidable_crayons_verifier($flux) {
// Le nom du modèle envoyé par le controleur/formulaires_reponses_champs.
if ($flux['args']['modele'] !== 'valeur' and $flux['args']['type'] !== 'formulaires_reponses_champ') {
return $flux;
}
include_spip('inc/saisies');
$id = $flux['args']['id'];
$valeur = $flux['args']['content']['valeur'];
$data = sql_fetsel('nom,saisies', 'spip_formulaires_reponses_champs JOIN spip_formulaires_reponses JOIN spip_formulaires', "id_formulaires_reponses_champ=$id AND spip_formulaires_reponses.id_formulaires_reponse = spip_formulaires_reponses_champs.id_formulaires_reponse AND spip_formulaires.id_formulaire = spip_formulaires_reponses.id_formulaire");
$saisies = unserialize($data['saisies']);
$saisie = saisies_chercher($saisies, $data['nom']);
set_request($data['nom'], $valeur);
$erreur = saisies_verifier(array($saisie), false);
if ($erreur) {
$flux['data']['erreurs']['valeur'] = implode('<br />',$erreur);
} elseif (_request($data['nom']) !== $valeur) {
$flux['data']['normaliser']['valeur'] = $normaliser;
return $flux;
}