Samx Here
n1udSecurity


Server : Apache
System : Linux webd348.cluster026.gra.hosting.ovh.net 5.15.148-ovh-vps-grsec-zfs-classid #1 SMP Thu Feb 8 09:41:04 UTC 2024 x86_64
User : hednacluml ( 122243)
PHP Version : 8.3.9
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
Directory :  /home/hednacluml/unichild/plugins/auto/saisies/inc/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/hednacluml/unichild/plugins/auto/saisies/inc/saisies_data.php
<?php

/**
 * Trouver et manipuler les data des saisies,
 * qu'elles soient sous forme tabulaire ou sous forme de liste
 *
 * @package SPIP\Saisies\Data
 **/

// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}

/**
 * Aplatit une description chaînée, en supprimant les sous-groupes.
 * @param string $chaine La chaîne à aplatir
 * @return string
 */
function saisies_aplatir_chaine($chaine) {
	$chaine = explode("\n", trim($chaine));
	$chaine = array_filter($chaine, function ($ligne) {
		if (substr($ligne, 0, 2) === '/*' || substr($ligne, 0, 1) === '*') {
			return false;
		} else {
			return true;
		}
	});
	return implode("\n", $chaine);
}
/**
 * Transforme une chaine en tableau avec comme principe :
 *
 * - une ligne devient une case
 * - si la ligne est de la forme truc|bidule alors truc est la clé et bidule la valeur
 * - si la ligne commence par * alors on commence un sous-tableau
 * - si la ligne est égale à /*, alors on finit le sous-tableau
 *
 * @param string $chaine Une chaine à transformer
 * @param string $separateur Séparateur utilisé
 * @return array Retourne un tableau PHP
 */
function saisies_chaine2tableau($chaine, $separateur = "\n") {
	if ($chaine && is_string($chaine)) {
		$tableau = [];
		$soustab = false;

		// On découpe d'abord en lignes
		$lignes = explode($separateur, $chaine);
		foreach ($lignes as $i => $ligne) {
			$ligne = trim(trim($ligne), '|');
			// Si ce n'est pas une ligne sans rien
			if ($ligne !== '') {
				// si ca commence par * c'est qu'on va faire un sous tableau
				if (strpos($ligne, '*') === 0) {
					$soustab = true;
					$soustab_cle = _T_ou_typo(substr($ligne, 1), 'multi');
					if (!isset($tableau[$soustab_cle])) {
						$tableau[$soustab_cle] = [];
					}
				} elseif ($ligne == '/*') {//si on finit sous tableau
					$soustab = false;
				} else {
					//sinon c'est une entrée normale
					// Si on trouve un découpage dans la ligne on fait cle|valeur
					if (strpos($ligne, '|') !== false) {
						list($cle,$valeur) = explode('|', $ligne, 2);
						// permettre les traductions de valeurs au passage
						if ($soustab == true) {
							$tableau[$soustab_cle][$cle] = _T_ou_typo($valeur, 'multi');
						} else {
							$tableau[$cle] = _T_ou_typo($valeur, 'multi');
						}
					} else {
						// Sinon on génère la clé
						if ($soustab == true) {
							$tableau[$soustab_cle][$i] = _T_ou_typo($ligne, 'multi');
						} else {
							$tableau[$i] = _T_ou_typo($ligne, 'multi');
						}
					}
				}
			}
		}
		return $tableau;
	} elseif (is_array($chaine)) {
		return $chaine;
	} else {
		return [];
	}
}

/**
 * Transforme un tableau en chaine de caractères avec comme principe :
 *
 * - une case devient une ligne de la chaine
 * - chaque ligne est générée avec la forme cle|valeur
 * - si une entrée du tableau est elle même un tableau, on met une ligne de la forme *clef
 * - pour marquer que l'on quitte un sous-tableau, on met une ligne commencant par /*, sauf si on bascule dans un autre sous-tableau.
 *
 * @param array $tableau Tableau à transformer
 * @return string Texte représentant les données du tableau
 */
function saisies_tableau2chaine($tableau) {
	if ($tableau && is_array($tableau)) {
		$chaine = '';
		$avant_est_tableau = false;

		foreach ($tableau as $cle => $valeur) {
			if (is_array($valeur)) {
				$avant_est_tableau = true;
				$ligne = trim("*$cle");
				$chaine .= "$ligne\n";
				$chaine .= saisies_tableau2chaine($valeur) . "\n";
			} else {
				if ($avant_est_tableau == true) {
					$avant_est_tableau = false;
					$chaine .= "/*\n";
				}
				$ligne = trim("$cle|$valeur");
				$chaine .= "$ligne\n";
			}
		}
		$chaine = trim($chaine);

		return $chaine;
	}
	elseif (is_string($tableau)) {
		// Si c'est déjà une chaine on la renvoie telle quelle
		return $tableau;
	}
	else {
		return '';
	}
}

/**
 * Transforme une valeur en tableau d'élements si ce n'est pas déjà le cas
 *
 * @param mixed $valeur
 * @param array $data
 *	Options `data` de la saisie
 * @return array Tableau de valeurs
 **/
function saisies_valeur2tableau($valeur, $data = []) {
	$data = saisies_aplatir_tableau($data);
	$tableau = [];

	if ($valeur === null) {
		$tableau = [];
	} elseif (is_array($valeur)) {
		$tableau = $valeur;
	} elseif (strlen($valeur)) {
		$tableau = saisies_chaine2tableau($valeur);

		// Si qu'une seule valeur, c'est qu'elle a peut-être un separateur à virgule
		// et a donc une clé 0 dans ce cas la d'ailleurs
		if (count($tableau) == 1 && isset($tableau[0])) {
			$tableau = saisies_chaine2tableau($tableau[0], ',');
		}
	}

	// On vérifie la pertinence des valeurs pour s'assurer d'avoir le choix alternatif dans sa clé à part
	if (is_array($data) && $data) {
		foreach ($tableau as $cle => $valeur) {
			if (!in_array($valeur, array_keys($data))) {
				$choix_alternatif = $valeur;
				unset($tableau[$cle]);
				$tableau['choix_alternatif'] = $valeur;
			}
		}
	}

	return $tableau;
}

/**
 * Pour les saisies multiples (type checkbox) proposant un choix alternatif,
 * retrouve à partir des data de choix proposés
 * et des valeurs des choix enregistrés
 * le texte enregistré pour le choix alternatif.
 *
 * @param array $data
 * @param array $valeur
 * @return string choix_alternatif
 **/
function saisies_trouver_choix_alternatif($data, $valeur) {
	if (!is_array($valeur)) {
		$valeur = saisies_valeur2tableau($valeur);
	}
	if (!is_array($data)) {
		$data = saisies_chaine2tableau($data) ;
	}

	$choix_theorique = array_keys($data);
	$choix_alternatif = array_values(array_diff($valeur, $choix_theorique));
	if (isset($choix_alternatif[0])) {
		return $choix_alternatif[0]; //on suppose que personne ne s'est amusé à proposer deux choix alternatifs
	} else {
		return '';
	}
}


/**
 * Aplatit une description tabulaire en supprimant les sous-groupes.
 * Ex : les data d'une saisie de type select
 *
 * @param array $tab            Le tableau à aplatir
 * @param bool  $masquer_sous_groupe mettre à true pour ne pas montrer le sous-groupe dans les label humain
 *
 * @return array
 */
function saisies_aplatir_tableau($tab, $masquer_sous_groupe = false) {
	$nouveau_tab = [];
	if (is_string($tab)) {
		$tab = saisies_chaine2tableau($tab);
	}
	if (is_array($tab)) {
		foreach ($tab as $entree => $contenu) {
			if (is_array($contenu)) {
				foreach ($contenu as $cle => $valeur) {
					if ($masquer_sous_groupe) {
						$nouveau_tab[$cle] = $valeur;
					} else {
						$nouveau_tab[$cle] = _T('saisies:saisies_aplatir_tableau_montrer_groupe', ['valeur' => $valeur, 'groupe' => $entree]);
					}
				}
			} else {
				$nouveau_tab[$entree] = $contenu;
			}
		}
	}

	return $nouveau_tab;
}


/**
 * Trouve le champ data ou datas (pour raison historique)
 * parmi les paramètres d'une saisie
 * et le retourne après avoir l'avoir transformé en tableau si besoin
 * @param array $description description de la saisie
 * @bool $disable_choix : si true, supprime les valeurs contenu dans l'option disable_choix des data
 * @return array data
 **/
function saisies_trouver_data($description, $disable_choix = false) {
	$options = $description['options'];
	if (isset($options['data'])) {
		$data = $options['data'];
	} elseif (isset($options['datas'])) {
		$data = $options['datas'];
	} else {
		$data = [];//normalement on peut pas mais bon
	}
	$data = saisies_chaine2tableau($data);

	if ($disable_choix == true && isset($options['disable_choix'])) {
		$disable_choix = array_flip(saisies_normaliser_liste_choix($options['disable_choix']));
		$data = array_diff_key($data, $disable_choix);
	}
	return $data;
}

/**
 * Prend une liste de choix (clés de tableau data) en entrée
 * Si tableau, renvoi presque tel quel
 * Si chaine, l'explose au niveau des virgules
 * Trim dans tous les cas les différents choix
 * @param array|string $liste
 * @return array
 **/
function saisies_normaliser_liste_choix($liste): array {
	if (is_array($liste)) {
		// nothing to do
	} elseif ($liste === null) {
		$liste = [];
	} elseif (strlen($liste)) {
		$liste = explode(',', trim($liste));
	} else {
		$liste = [];
	}
	$liste = array_map('trim', $liste);
	$liste = array_filter($liste);
	return $liste;
}

/**
 * @deprecated
 * Ancien nom de la fonction saisies_normaliser_liste_choix
 * @param array|string $liste
 * @return array
**/
function saisies_normaliser_disable_choix($liste): array {
	trigger_error('La fonction `saisies_normaliser_disable_choix()` est depréciée et sera supprimée en v7 du plugin. Utiliser `saisies_normaliser_liste_choix()` à la place', E_USER_DEPRECATED);
	spip_log('La fonction `saisies_normaliser_disable_choix()` est depréciée et sera supprimée en v7 du plugin. Utiliser `saisies_normaliser_liste_choix()` à la place', 'saisies');
	return saisies_normaliser_liste_choix($liste);
}

/**
 * Prend un tableau de data
 * enlève les choix dépubliés
 * sauf si la valeur courante de la saisie
 * @param $data
 * @param array|string $depublie_choix
 * @param array|string $valeur
 * @return array
**/
function saisies_depublier_data(?array $data = [], $depublie_choix = [], $valeur = []): array {
	if (!$data) {
		return [];
	}
	$depublie_choix = saisies_normaliser_liste_choix($depublie_choix);
	if (!is_array($valeur)) {
		$valeur = [$valeur];
	}
	$depublie_choix = array_diff($depublie_choix, $valeur);
	$depublie_choix = array_flip($depublie_choix);

	$data = array_diff_key($data, $depublie_choix);

	// Le cas des data structurés en sous liste
	foreach ($data as $key => &$value) {
		if (is_array($value)) {
			$value = array_diff_key($value, $depublie_choix);
		}
	}
	$data = array_filter($data);// Ne pas laisser de sous-groupe vide

	return $data;
}

/**
 * Return la liste des saisies qui nécessite qu'on insère un hidden avec les précédentes valeurs.
 * C'est à dire : uniquement les saisies qui sont des depublies et sousmis à test de valeurs_acceptables
 * @param array $saisies description complète de saisies
 * @return array $liste_saisies
**/
function saisies_lister_necessite_retenir_ancienne_valeur(array $saisies): array {
	$liste = [];
	$depublie_choix = saisies_lister_avec_option('depublie_choix', $saisies);
	if ($saisies['options']['verifier_valeurs_acceptables'] ?? '') {
		return array_keys($depublie_choix);
	}
	foreach ($depublie_choix as $saisie => $config) {
		if (($config['verifier']['type'] ?? '') === 'valeurs_acceptables') {
			$liste[] = $saisie;
		} elseif (isset($config['verifier'])) {
			$verifier_type = array_column($config['verifier'], 'type');
			if (in_array('valeurs_acceptables', $verifier_type)) {
				$liste[] = $saisie;
			}
		}
	}
	return $liste;
}

SAMX