function formulaires_editer_champs_extras_traiter_dist($objet, $redirect = '') { $retour = array('redirect' => $redirect); $table = table_objet_sql($objet); include_spip('inc/iextras'); $saisies = iextras_champs_extras_definis($table); $nouvelles_saisies = session_get('constructeur_formulaire_champs_extras_' . $table); $diff = saisies_comparer_par_identifiant($saisies, $nouvelles_saisies); $extras = array(); include_spip('inc/cextras'); // supprimer les champs supprimes champs_extras_supprimer($table, $diff['supprimees']); // ajouter les nouveaux champs; champs_extras_creer($table, $diff['ajoutees']); // modifier les champs modifies; if ($diff['modifiees']) { $anciennes = saisies_lister_par_identifiant($saisies); $anciennes = array_intersect_key($anciennes, $diff['modifiees']); champs_extras_modifier($table, $diff['modifiees'], $anciennes); } # champs_extras_modifier($table, # modifiees nouvelles, # modifiees anciennes); ecrire_meta("champs_extras_" . $table, serialize($nouvelles_saisies)); $retour['message_ok'] = 'Super !'; return $retour; }
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; }
/** * Compter les saisies extras d'une table * * @param String $table Table sql * @return Int Nombre d'éléments. **/ function compter_champs_extras($table) { static $tables = array(); if (!count($tables)) { include_spip('inc/saisies'); $saisies_tables = iextras_champs_extras_definis(); foreach ($saisies_tables as $t => $s) { if ($s = saisies_lister_par_nom($s)) { $tables[$t] = count($s); } } } if (isset($tables[$table])) { return $tables[$table]; } }
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); } }
/** * Vérifié une valeur comme devant être un nom de champ extra * * Ce champ ne doit pas être utilisé par SPIP ou un plugin, * et ne doit pas être un mot clé de mysql. * * Si c'est bon, doit aussi vérifier une expression régulière donnée * * Options : * - modele : chaine représentant l'expression régulière tolérée * * @param string $valeur * La valeur à vérifier. * @param array $options * Contient une chaine représentant l'expression. * @return string * Retourne une chaine vide si c'est valide, sinon une chaine expliquant l'erreur. */ function verifier_nom_champ_extra_dist($valeur, $options = array()) { include_spip('base/objets'); include_spip('inc/iextras'); include_spip('inc/saisies'); $erreur = ''; $table = $options['table']; $valeur = strtolower($valeur); // Champs extras (interface) / Saisies gérent déjà l'unicité des champs extras // déclarés dans une table : on ne peut créer 2 champs extras de même nom. // Ici on vérifie en plus que ce champ n'existe pas hors de champs extras. $tables_spip = lister_tables_objets_sql($table); $champs_declares = array_keys($tables_spip['field']); $champs_declares = array_filter($champs_declares, 'strtolower'); // precaution $champs_iextras = iextras_champs_extras_definis($table); $champs_iextras = array_keys(saisies_lister_avec_sql($champs_iextras)); $champs_iextras = array_filter($champs_iextras, 'strtolower'); // precaution // les champs utilisés en dehors de champs extras, sont la différence $champs_utilises = array_diff($champs_declares, $champs_iextras); if (in_array($valeur, $champs_utilises)) { $erreur = _T('iextras:erreur_nom_champ_utilise'); } // vérifier que le champ n'est pas un mot clé sql if (!$erreur) { if (in_array(strtoupper($valeur), iextras_sql_reserved_keywords())) { $erreur = _T('iextras:erreur_nom_champ_mysql_keyword'); } } // vérifier que le champ est bien formaté (expression régulière) if (!$erreur) { $verifier = charger_fonction('verifier', 'inc'); $options += array('modele' => '/^[\\w]+$/'); $erreur = $verifier($valeur, 'regex', $options); } return $erreur; }
/** * 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; }
/** * Importe une description de champs extras donnée * * @param array $description * description des champs extras (table sql => liste des champs extras) * @param string $message * message de retour, rempli par cette fonction * @param bool $fusionner_doublons * true si on fusionne les champs présents dans la sauvegarde et aussi présents sur le site. False pour les ignorer. * @return bool * true si tout s'est bien passé, false sinon **/ function iextras_importer_description($description, &$message, $fusionner_doublons = false) { include_spip('inc/iextras'); include_spip('inc/saisies'); include_spip('inc/texte'); include_spip('inc/cextras'); $tables_sql_presentes = array_keys(lister_tables_objets_sql()); $message = ''; $nbt = count($description); $message .= "{{Fichier importé :}}\n"; $message .= "- {$nbt} objets éditoriaux.\n"; $nbc = 0; foreach ($description as $table => $saisies) { $nbc += count($saisies); } $message .= "- {$nbc} champs extras.\n"; foreach ($description as $table => $saisies) { if (!in_array($table, $tables_sql_presentes)) { $message .= "\nTable {{ {$table} }} absente sur le site\n"; $message .= count($saisies) . " champs extras ignorés !!\n"; continue; } $champs_presents = $champs_futurs = iextras_champs_extras_definis($table); $champs_presents_par_nom = saisies_lister_par_nom($champs_presents); $objet = objet_type($table); $titre = _T(objet_info($objet, 'texte_objets')); $message .= "\n{{ {$titre} :}}\n"; $message .= count($saisies) . " champs extras\n"; foreach ($saisies as $saisie) { $nom = isset($saisie['options']['nom']) ? $saisie['options']['nom'] : ''; if (!$nom) { $message .= "- !! Saisie sans nom ignorée\n"; continue; } // champ déjà présent ? if (isset($champs_presents_par_nom[$nom])) { if ($fusionner_doublons) { $message .= "- {{ {$nom} :}} modifié (déjà présent)\n"; $champs_futurs = saisies_modifier($champs_futurs, $nom, $saisie); } else { $message .= "- {{ {$nom} :}} ignoré (déjà présent)\n"; } } else { $message .= "- {{ {$nom} :}} ajouté\n"; $champs_futurs = saisies_inserer($champs_futurs, $saisie); } } $diff = saisies_comparer_par_identifiant($champs_presents, $champs_futurs); // ajouter les nouveaux champs; if ($diff['ajoutees']) { $message .= count($diff['ajoutees']) . " champs ajoutés.\n"; champs_extras_creer($table, $diff['ajoutees']); } // modifier les champs modifies; if ($diff['modifiees']) { $message .= count($diff['modifiees']) . " champs modifiés.\n"; $anciennes = saisies_lister_par_identifiant($champs_presents); $anciennes = array_intersect_key($anciennes, $diff['modifiees']); champs_extras_modifier($table, $diff['modifiees'], $anciennes); } // enregistrer la nouvelle config if ($diff['ajoutees'] or $diff['modifiees']) { ecrire_meta("champs_extras_" . $table, serialize($champs_futurs)); } else { $message .= "Aucune modification !\n"; } } $message = propre($message); return true; }