You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
395 lines
12 KiB
395 lines
12 KiB
<?php |
|
|
|
/** |
|
* Déclarations de balises pour les squelettes |
|
* |
|
* @package SPIP\Cextras\Fonctions |
|
**/ |
|
|
|
// sécurité |
|
if (!defined("_ECRIRE_INC_VERSION")) return; |
|
|
|
/** |
|
* Retourne la description de la saisie du champ demandé |
|
* permettant ainsi d'exploiter ses données. |
|
* |
|
* @example |
|
* ``` |
|
* <BOUCLE_x(TABLE)> |
|
* - #CHAMP_EXTRA{nom_du_champ} |
|
* - #CHAMP_EXTRA{nom_du_champ, label} |
|
* </BOUCLE_x> |
|
* ``` |
|
* |
|
* @balise |
|
* @note |
|
* Lève une erreur de squelette si le nom de champs extras |
|
* n'est pas indiqué en premier paramètre de la balise |
|
* |
|
* @param Champ $p |
|
* AST au niveau de la balise |
|
* @return Champ |
|
* AST complété par le code PHP de la balise |
|
**/ |
|
function balise_CHAMP_EXTRA_dist($p) { |
|
// prendre nom de la cle primaire de l'objet pour calculer sa valeur |
|
$id_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle; |
|
$objet = $p->boucles[$id_boucle]->id_table; |
|
|
|
// recuperer les parametres : colonne sql (champ) |
|
if (!$colonne = interprete_argument_balise(1, $p)) { |
|
$msg = array('zbug_balise_sans_argument', array('balise' => ' CHAMP_EXTRA')); |
|
erreur_squelette($msg, $p); |
|
} |
|
|
|
$demande = sinon(interprete_argument_balise(2, $p), "''"); |
|
$p->code = "calculer_balise_CHAMP_EXTRA('$objet', $colonne, $demande)"; |
|
return $p; |
|
} |
|
|
|
/** |
|
* Retourne la description d'un champ extra indiqué |
|
* |
|
* Retourne le tableau de description des options de saisies |
|
* ou un des attributs de ce tableau |
|
* |
|
* @param string $objet |
|
* Type d'objet |
|
* @param string $colonne |
|
* Nom de la colonne SQL |
|
* @param string $demande |
|
* Nom du paramètre demandé. On cherche un nom de clé dans la description : |
|
* - dans le tableau 'options'; |
|
* - sinon à la racine (ie. si 'saisie', retourne le type de saisie). |
|
* Non renseigné, tout le tableau de description est retourné |
|
* @return mixed |
|
* - Tableau si toute la description est demandée |
|
* - Indéfini si un élément spécifique de la description est demandé. |
|
* - Chaine vide si le champs extra n'est pas trouvé |
|
*/ |
|
function calculer_balise_CHAMP_EXTRA($objet, $colonne, $demande='') { |
|
// Si la balise n'est pas dans une boucle, on cherche un objet explicite dans le premier argument |
|
// de la forme "trucs/colonne" ou "spip_trucs/colonne" |
|
if (!$objet and $decoupe = explode('/', $colonne) and count($decoupe) == 2){ |
|
$objet = $decoupe[0]; |
|
$colonne = $decoupe[1]; |
|
} |
|
|
|
// recuperer la liste des champs extras existants |
|
include_spip('cextras_pipelines'); |
|
if (!$saisies = champs_extras_objet( $table = table_objet_sql($objet) )) { |
|
return ''; |
|
} |
|
|
|
include_spip('inc/saisies'); |
|
if (!$saisie = saisies_chercher($saisies, $colonne)) { |
|
return ''; |
|
} |
|
|
|
if (!$demande) { |
|
return $saisie['options']; // retourne la description de la saisie... |
|
} |
|
|
|
if (array_key_exists($demande, $saisie['options'])) { |
|
return $saisie['options'][$demande]; |
|
} elseif (array_key_exists($demande, $saisie)) { |
|
return $saisie[$demande]; |
|
} |
|
|
|
return ''; |
|
} |
|
|
|
|
|
/** |
|
* Retourne les choix possibles d'un champ extra donné |
|
* |
|
* @example |
|
* ``` |
|
* #LISTER_CHOIX{champ} |
|
* #LISTER_CHOIX{champ, " > "} |
|
* // ** pour retourner un tableau (cle => valeur), |
|
* // ou tableau groupe => tableau (cle => valeur) si déclaration de groupements. |
|
* #LISTER_CHOIX**{champ} |
|
* ``` |
|
* |
|
* @balise |
|
* @param Champ $p |
|
* AST au niveau de la balise |
|
* @return Champ |
|
* AST complété par le code PHP de la balise |
|
**/ |
|
function balise_LISTER_CHOIX_dist($p) { |
|
// prendre nom de la cle primaire de l'objet pour calculer sa valeur |
|
$id_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle; |
|
|
|
// s'il n'y a pas de nom de boucle, on ne peut pas fonctionner |
|
if (!isset($p->boucles[$id_boucle])) { |
|
$msg = array('zbug_champ_hors_boucle', array('champ' => ' LISTER_CHOIX')); |
|
erreur_squelette($msg, $p); |
|
$p->code = "''"; |
|
return $p; |
|
} |
|
|
|
$objet = $p->boucles[$id_boucle]->id_table; |
|
|
|
// recuperer les parametres : colonne sql (champ) |
|
if (!$colonne = interprete_argument_balise(1, $p)) { |
|
$msg = array('zbug_balise_sans_argument', array('balise' => ' LISTER_CHOIX')); |
|
erreur_squelette($msg, $p); |
|
$p->code = "''"; |
|
return $p; |
|
} |
|
|
|
$separateur = interprete_argument_balise(2, $p); |
|
if (!$separateur) $separateur = "', '"; |
|
|
|
// generer le code d'execution |
|
$applatir = ($p->etoile == "**") ? 'false' : 'true'; |
|
$p->code = "calculer_balise_LISTER_CHOIX('$objet', $colonne, $applatir)"; |
|
|
|
// retourne un array si #LISTER_CHOIX** |
|
// sinon fabrique une chaine avec le separateur designe. |
|
if ($p->etoile != "**") { |
|
$p->code = "(is_array(\$a = $p->code) ? join($separateur, \$a) : " . $p->code . ")"; |
|
} |
|
|
|
return $p; |
|
} |
|
|
|
|
|
/** |
|
* Retourne les choix possibles d'un champ extra indiqué |
|
* |
|
* @note |
|
* Le plugin saisies tolère des sélections avec |
|
* un affichage par groupe (optgroup / options) avec une syntaxe |
|
* spécifique. Ici nous devons pouvoir applatir |
|
* toutes les cle => valeur. |
|
* |
|
* @param string $objet |
|
* Type d'objet |
|
* @param string $colonne |
|
* Nom de la colonne SQL |
|
* @param bool $applatir |
|
* true pour applatir les choix possibles au premier niveau |
|
* même si on a affaire à une liste de choix triée par groupe |
|
* @return string|array |
|
* - Tableau des couples (clé => valeur) des choix |
|
* - Chaîne vide si le champs extra n'est pas trouvé |
|
*/ |
|
function calculer_balise_LISTER_CHOIX($objet, $colonne, $applatir = true) { |
|
if ($options = calculer_balise_CHAMP_EXTRA($objet, $colonne)) { |
|
if ( |
|
!empty($options['datas']) |
|
or !empty($options['data']) |
|
) { |
|
include_spip('inc/saisies'); |
|
$choix = !empty($options['datas']) ? $options['datas'] : $options['data']; |
|
$choix = saisies_chaine2tableau($choix); |
|
// applatir les sous-groupes si présents |
|
if ($applatir) { |
|
$masquer_sous_groupe = isset($options['vue_masquer_sous_groupe']) ? $options['vue_masquer_sous_groupe'] : false; |
|
$choix = saisies_aplatir_tableau($choix, $masquer_sous_groupe); |
|
} |
|
return $choix; |
|
} |
|
} |
|
return ''; |
|
} |
|
|
|
|
|
|
|
/** |
|
* Liste les valeurs des champs de type liste (enum, radio, case) |
|
* |
|
* Ces champs enregistrent en base la valeur de la clé |
|
* Il faut donc transcrire clé -> valeur |
|
* |
|
* @example |
|
* ``` |
|
* #LISTER_VALEURS{champ} |
|
* #LISTER_VALEURS{champ, " > "} |
|
* #LISTER_VALEURS**{champ} // retourne un tableau cle/valeur |
|
* ``` |
|
* |
|
* @note |
|
* Pour des raisons d'efficacité des requetes SQL |
|
* le paramètre "champ" ne peut être calculé |
|
* ``#LISTER_VALEURS{#GET{champ}}`` ne peut pas fonctionner. |
|
* |
|
* Si cette restriction est trop limitative, on verra par la suite |
|
* pour l'instant, on laisse comme ca... |
|
* |
|
* @balise |
|
* @param Champ $p |
|
* AST au niveau de la balise |
|
* @return Champ |
|
* AST complété par le code PHP de la balise |
|
*/ |
|
function balise_LISTER_VALEURS_dist($p) { |
|
// prendre nom de la cle primaire de l'objet pour calculer sa valeur |
|
$id_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle; |
|
|
|
// s'il n'y a pas de nom de boucle, on ne peut pas fonctionner |
|
if (!isset($p->boucles[$id_boucle])) { |
|
$msg = array('zbug_champ_hors_boucle', array('champ' => ' LISTER_VALEURS')); |
|
erreur_squelette($msg, $p); |
|
$p->code = "''"; |
|
return $p; |
|
} |
|
|
|
$objet = $p->boucles[$id_boucle]->id_table; |
|
$_id_objet = $p->boucles[$id_boucle]->primary; |
|
$id_objet = champ_sql($_id_objet, $p); |
|
|
|
// recuperer les parametres : colonne sql (champ) |
|
if (!$colonne = interprete_argument_balise(1, $p)) { |
|
$msg = array('zbug_balise_sans_argument', array('balise' => ' LISTER_VALEURS')); |
|
erreur_squelette($msg, $p); |
|
$p->code = "''"; |
|
return $p; |
|
} |
|
|
|
$separateur = interprete_argument_balise(2, $p); |
|
if (!$separateur) $separateur = "', '"; |
|
|
|
// demander la colonne dans la requete SQL |
|
// $colonne doit etre un texte 'nom_du_champ' |
|
if ($p->param[0][1][0]->type != 'texte') { |
|
$msg = array('cextras:zbug_balise_argument_non_texte', array('nb'=>1, 'balise' => ' LISTER_VALEURS')); |
|
erreur_squelette($msg, $p); |
|
$p->code = "''"; |
|
return $p; |
|
} |
|
|
|
$texte_colonne = $p->param[0][1][0]->texte; |
|
|
|
$valeur = champ_sql($texte_colonne, $p); |
|
|
|
// generer le code d'execution |
|
$p->code = "calculer_balise_LISTER_VALEURS('$objet', $colonne, $valeur)"; |
|
|
|
// retourne un array si #LISTER_VALEURS** |
|
// sinon fabrique une chaine avec le separateur designe. |
|
if ($p->etoile != "**") { |
|
$p->code = "(is_array(\$a = $p->code) ? join($separateur, \$a) : " . $p->code . ")"; |
|
} |
|
|
|
return $p; |
|
} |
|
|
|
|
|
/** |
|
* Retourne liste des valeurs choisies pour un champ extra indiqué |
|
* |
|
* @param string $objet |
|
* Type d'objet |
|
* @param string $colonne |
|
* Nom de la colonne SQL |
|
* @param string $cles |
|
* Valeurs enregistrées pour ce champ dans la bdd pour l'objet en cours |
|
* |
|
* @return string|array |
|
* - Tableau des couples (clé => valeur) des choix |
|
* - Chaîne vide si le champs extra n'est pas trouvé |
|
**/ |
|
function calculer_balise_LISTER_VALEURS($objet, $colonne, $cles) { |
|
//A-t-on une fonction spécifique pour ce type de saisie ? |
|
$saisie = calculer_balise_CHAMP_EXTRA($objet, $colonne, 'saisie'); |
|
if ($f = charger_fonction("calculer_balise_LISTER_VALEURS_$saisie", 'champs_extras/', true)) { |
|
return $f($objet, $colonne, $cles); |
|
} |
|
|
|
// exploser les cles ! |
|
$cles = explode(',', $cles); |
|
|
|
// pas de valeur vide '', (ou d’espace … peu probable) ! |
|
$cles = array_filter($cles, 'trim'); |
|
|
|
// si pas de cles, on part aussi gentiment |
|
if (!$cles) return array(); |
|
|
|
// recuperer les choix possibles |
|
$choix = calculer_balise_LISTER_CHOIX($objet, $colonne); |
|
|
|
// sortir gentiment si pas de champs declares |
|
// on ne peut pas traduire les cles |
|
if (!$choix) { |
|
return $cles; |
|
} |
|
// correspondances... |
|
$vals = array_intersect_key($choix, array_flip($cles)); |
|
|
|
// et voici les valeurs ! |
|
return $vals ? $vals : $cles; |
|
} |
|
|
|
|
|
/** |
|
* Retourne le HTML de la vue des champs extras de la table |
|
* |
|
* @example |
|
* ``` |
|
* <BOUCLE_x(TABLE)> |
|
* #VOIR_CHAMPS_EXTRAS |
|
* </BOUCLE_x> |
|
* ``` |
|
* |
|
* @balise |
|
* @param Champ $p |
|
* AST au niveau de la balise |
|
* @return Champ |
|
* AST complété par le code PHP de la balise |
|
**/ |
|
function balise_VOIR_CHAMPS_EXTRAS_dist($p) { |
|
// prendre nom de la cle primaire de l'objet pour calculer sa valeur |
|
$id_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle; |
|
$objet = $p->boucles[$id_boucle]->id_table; |
|
$_id_objet = $p->boucles[$id_boucle]->primary; |
|
$id_objet = champ_sql($_id_objet, $p); |
|
|
|
$p->code = "champs_extras_voir_saisies('$objet', $id_objet)"; |
|
return $p; |
|
} |
|
|
|
/** |
|
* Retourne le HTML des vues des champs extras d'un objet |
|
* |
|
* @param string $objet Type d'objet |
|
* @param int $id_objet Identifiant de l'objet |
|
* @param array $contexte Contexte éventuel |
|
* @return string Code HTML |
|
*/ |
|
function champs_extras_voir_saisies($objet, $id_objet, $contexte = array()) { |
|
include_spip('cextras_pipelines'); |
|
if ($saisies = champs_extras_objet( $table = table_objet_sql($objet) )) { |
|
include_spip('inc/cextras'); |
|
// ajouter au contexte les noms et valeurs des champs extras |
|
$saisies_sql = champs_extras_saisies_lister_avec_sql($saisies); |
|
$valeurs = sql_fetsel(array_keys($saisies_sql), $table, id_table_objet($table) . '=' . sql_quote($id_objet)); |
|
if (!$valeurs) { |
|
$valeurs = array(); |
|
} else { |
|
$valeurs = cextras_appliquer_traitements_saisies($saisies_sql, $valeurs); |
|
} |
|
|
|
// restreindre la vue selon les autorisations |
|
$saisies = champs_extras_autorisation('voir', $objet, $saisies, array( |
|
'objet' => $objet, |
|
'id_objet' => $id_objet, |
|
'contexte' => $contexte, |
|
)); |
|
|
|
// insérer la classe CSS pour crayons |
|
$saisies = champs_extras_saisies_inserer_classe_crayons($saisies, $objet, $id_objet); |
|
|
|
$contexte = array_merge($contexte, $valeurs, array( |
|
'saisies' => $saisies, |
|
'valeurs' => $valeurs, |
|
)); |
|
|
|
// ajouter les vues |
|
return recuperer_fond('inclure/voir_saisies', $contexte); |
|
} |
|
return ''; |
|
}
|
|
|