Valider 6b78cc2f rédigé par Maïeul's avatar Maïeul
Parcourir les fichiers

feat(288): Une fonction `saisies_supprimer_sans_reponse()` pour supprimer les

saisies sans réponse dans `_request()` (ou ailleurs).

Des tests unitaires sont joints.

Fix: #288
parent 48129396
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+42 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -613,3 +613,45 @@ function saisies_fieldsets_en_onglets($saisies, $identifiant_prefixe = '', $vert
	}
	return $saisies;
}

/**
 * Prend un tableau de saisies
 * Enlève les saisies qui n'ont rien dans _request
 * Ou dont l'ensemble des sous-saisies sont vides
 * @param array $saisies
 * @param optional $tableau (tableau pour chercher dans request)
 * @return array
 **/
function saisies_supprimer_sans_reponse(array $saisies, array $tableau = []): array {
	// On gère les options de saisies
	if (isset($saisies['options'])) {
		$options_generales = $saisies['options'];
		unset($saisies['options']);
	}
	foreach ($saisies as $key => $saisie) {
		// Cas 1: c'est une saisies avec sous_saisies, dans ce cas on analyse d'abord les sous_saisies, puis on filtre
		if (isset($saisie['saisies'])) {
			$saisie['saisies'] = saisies_supprimer_sans_reponse($saisie['saisies'], $tableau);
			if (empty($saisie['saisies'])) {
				unset($saisies[$key]);
			}
		} else {
			// Cas deux, c'est une saisie terminale, dans ce cas on vérifie si présente
			$valeur = saisies_request($saisie['options']['nom']);
			if (is_string($valeur)) {
				$valeur = vider_date($valeur);
			}
			if (
				($valeur === '' || is_null($valeur))
				&& !saisies_request_from_FILES($saisie['options']['nom'])
			) {// Notons la très stricte égalité ppur ne pas supprimer une saisie dont la valeur serait 0
				unset($saisies[$key]);
			}
		}
	}
	$saisies = array_values($saisies);
	if (isset($options_generales)) {
		$saisies['options'] = $options_generales;
	}
	return $saisies;
}
+158 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<?php

namespace Spip\Saisies\Tests;

use PHPUnit\Framework\TestCase;

/**
 * @covers saisies_supprimer_sans_reponse()
 * @internal
 */

class SupprimerSansReponseTest extends TestCase {
	public static function setUpBeforeClass(): void {
		require_once dirname(__DIR__) . '/inc/saisies.php';
		require_once dirname(__DIR__) . '/inc/saisies_manipuler.php';
		require_once dirname(__DIR__) . '/inc/saisies_name.php';
		require_once dirname(__DIR__) . '/inc/saisies_request.php';
	}

	public static function dataSansReponse() {
		set_request('ca_disparait', '');
		set_request('ca_reste', 'chewingum');
		set_request('ca_reste_malgres_tout', 0);
		set_request('input_dans_fieldset_qui_disparait', '');
		set_request('input_dans_fieldset_qui_reste', 'on reste');
		set_request('date_vide', '0000-00-00 00:00:00');
		$GLOBALS['_FILES']['fichier_qui_reste'] = [
			'name' => 'toto.jpg',
			'type' => 'image/jpg',
			'tmp_name' => 'xyz.jpg',
			'size' => 222,
			'error' => 0
		];
		return [
			'test1' =>
			[
				//Sortie
				[
					[
						'saisie' => 'input',
						'options' =>
						[
							'nom' => 'ca_reste',
						]
					],
					[
						'saisie' => 'fichiers',
						'options' =>
						[
							'nom' => 'fichier_qui_reste',
						]
					],
					[
						'saisie' => 'input',
						'options' =>
						[
							'nom' => 'ca_reste_malgres_tout',
						]
					],
					[
						'saisie' => 'fieldset',
						'options' => [
							'nom' => 'fieldset_qui_reste'
						],
						'saisies' => [
							[
								'saisie' => 'input',
								'options' => [
									'nom' => 'input_dans_fieldset_qui_reste'
								]
							]
						]
					],
					'options' => [
						'option_globale' => 'toto'
					]
				],
				// Entrée
				[
					[
						'saisie' => 'input',
						'options' =>
						[
							'nom' => 'ca_disparait',
						]
					],
					[
						'saisie' => 'input',
						'options' =>
						[
							'nom' => 'ca_disparait',
						]
					],
					[
						'saisie' => 'input',
						'options' =>
						[
							'nom' => 'ca_reste',
						]
					],
					[
						'saisie' => 'fichiers',
						'options' =>
						[
							'nom' => 'fichier_qui_reste',
						]
					],
					[
						'saisie' => 'input',
						'options' =>
						[
							'nom' => 'ca_reste_malgres_tout',
						]
					],
					[
						'saisie' => 'fieldset',
						'options' => [
							'nom' => 'fieldset_qui_reste'
						],
						'saisies' => [
							[
								'saisie' => 'input',
								'options' => [
									'nom' => 'input_dans_fieldset_qui_reste'
								]
							]
						]
					],
					[
						'saisie' => 'fieldset',
						'options' => [
							'nom' => 'fieldset_qui_disparait'
						],
						'saisies' => [
							[
								'saisie' => 'input',
								'options' => [
									'nom' => 'input_dans_fieldset_qui_disparait'
								]
							]
						]
					],
					'options' => [
						'option_globale' => 'toto'
					]
				],
			]
		];
	}

	/**
	 * @dataProvider dataSansReponse
	 */
	public function testSansReponse($expected, $provided, $tableau = []) {
		$actual = saisies_supprimer_sans_reponse($provided, $tableau);
		$this->assertEquals($expected, $actual);
	}
}
+30 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -116,3 +116,33 @@ if (!function_exists('_T')) {
	}
}


if (!defined('vider_date')) {
	/**
	 * Pompé depuis SPIP 5 dev
	 *
	 * @param string $letexte
	 * @param bool $verif_format_date
	 * @return string
	 *     - La date entrée (si elle n'est pas considérée comme nulle)
	 *     - Une chaine vide
	 **/
	function vider_date($letexte, $verif_format_date = false): string {
		$letexte ??= '';
		if (
			!$verif_format_date
			|| in_array(strlen($letexte), [10,19]) && preg_match('/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}:\d{2})?$/', $letexte)
		) {
			if (strncmp('0000-00-00', $letexte, 10) == 0) {
				return '';
			}
			if (strncmp('0001-01-01', $letexte, 10) == 0) {
				return '';
			}
			if (strncmp('1970-01-01', $letexte, 10) == 0) {
				return '';
			}  // eviter le bug GMT-1
		}
		return $letexte;
	}
}