8768 sujets

Développement web côté serveur, CMS

EDIT: Ce sujet à été ré-ouvert en tentant d'apporter des explications plus claires et pertinentes. Consulter le topic.

Bonjour à toutes et à tous,

Je suis en train sécher sur problème pour lequel je n'en vois pas le bout.

Je dispose d'une variable $data qui est un tableau associatif multi-dimensionnel.

Je génère à partir de cette variable un formulaire sous forme liste et d'éléments Input.
Ces éléments Input servent à modifier les valeurs de la variable $data.

La génération de la liste ne me pose aucun problème, je pars d'une fonction qui contient une boucle et qui s'auto-rappelle.

Là où la question à 3 mille dollars se pose c'est comment faire pour récupérer le chemin qui conduit à une valeur perdue au fond de ma variable $data afin de la transmettre via l'attribut Name de mon Input ?

En effet, la boucle ne me permet de récupérer que la clé de la valeur visée mais pas le cheminement vers cette clé.

Ainsi pour une valeur correspondant par exemple à $datas['level1']['level2']['level3'], ma boucle me renvoi uniquement "level3" au lieu de récupérer tous les levels.

J'avais penser utiliser une variable de type string qui se concatène au fur et à mesure de la progression dans la boucle mais justement lorsqu'on boucle un sous-niveau et qu'on revient à son parent, la dernière clé est préservée dans la variable string donnant comme résultat quelque-chose comme level1-level2-level2-sub1-.

J'ai l'impression d'être dans une impasse, quelqu'un n'aurait-il pas un début de piste pour moi ?

Merci et bonne journée.


Pour l'instant voici où j'en suis:
(j'ai enlevé du code toute vérification et éléments Html (liste) afin de se concentrer sur l'essentiel)

<?php
fonction boucle(&$array){
static $out='';

foreach($array as $key=>$value){
if(is_array($value)){
$out.='<input type="text" id="'" name="Modifier_cle['.$key.']" PLACEHOLDER="'.$value.'">';// ici à la place de key c'est le chemin de clé qu'il faudrait identifier

boucle($value);

}else{
$out.='<input type="text" id="" name="Modifier_cle['.$key.']" PLACEHOLDER="'.$value.'">';

}

}if(!empty($out)){return $out;}return;}

?>

Modifié par Greg_Lumiere (18 Feb 2016 - 13:52)
Bonjour,

Pourquoi pas un hidden ayant le même nom que les inputs avec un préfixe devant et comme valeur le chemin jusqu'à la clef correspondante:

<input type="hidden" name="info_modifier_cle(['level3'])" value="level1_level2">
Il y a de l'idée mais toute la difficulté reste dans la façon d'obtenir la valeur du champs Hidden ; le fameux level1_level2.

un exemple avec cette table:


$datas=array(
array(
 nom'=>'name',
 'age'=>'tresage',
 'sexe'=>'oui',
 'phobie'=>array(
      'grave'=>'25',
      'pasgrave'=>'2')
 ,'autre'=>'rien'),
array(etc))

Dans cet exemple, quelle valeur prendrait ton champs caché si je souhaite modifier la valeur 25 ?
Soit $datas['0']['phobie']['grave'].
<input type="text" name="modifier_cle['grave']" value="25">
<input type="hidden" name="info_modifier_cle['grave']" value="nom_phobie">

Modifié par loicbcn (27 Jan 2016 - 15:43)
Ah oui, tu as un array de arrays,
alors peut être comme ça:
<input type="text" name="modifier_cle['grave'][]" value="25">
<input type="hidden" name="info_modifier_cle['grave'][]" value="nom_phobie">

En validant le formulaire, tu vas recevoir les infos ainsi:
modifier_cle['grave'][0]
modifier_cle['grave'][1]
modifier_cle['grave'][2]
modifier_cle['grave'][3]
...
modifier_cle['grave'][n]
Modifié par loicbcn (27 Jan 2016 - 15:52)
Ou comme ça, sans hidden:
<input type="text" name="modifier_cle[]['nom']" value="name">
<input type="text" name="modifier_cle[]['age']" value="tresage">
<input type="text" name="modifier_cle[]['sexe']" value="rose">
<input type="text" name="modifier_cle[]['phobie']['grave']" value="tresage">


Codepen si tu valides le formulaire, codepen t'affiche les valeurs postées: tu recevras le paramètre modifier_cle avec la valeur:
[{"'nom'"=>"name", "'age'"=>"tresage", "'sexe'"=>"rose", "'phobie'"=>{"'grave'"=>"tresage"}}, {"'nom'"=>"name", "'age'"=>"tresage", "'sexe'"=>"rose", "'phobie'"=>{"'grave'"=>"tresage"}}]
Modifié par loicbcn (27 Jan 2016 - 16:00)
EDIT: cette réponse fait suite à l'avant dernière réponse.

Heu...

Je crois au contraire que je vais obtenir
$_POST['modifier_cle']['grave']='25';
et
$_POST['info_modifier_cle']['grave']['0']='nom_phobie';


J'essai de comprendre comment exploiter ces données mais surtout comment les assigner. EN effet, lors du passage dans ma boucle (à la création des input) au moment où $value=25, la seule clé qu'il me reste en mémoire est la dernière clé parente (soit 'grave').

Je ne vois pas comment récupérer du premier index jusqu'à 'grave'.

J'ai l'impression de ne pas être tout à fait translucide.

Si je peux me permettre une analogie, je prendrais celle d'une arborescence de fichiers ; les clé seraient des répertoires et les valeurs des fichiers, le tableau de départ représentant un disque.
Ainsi avec
c:\
c:\windows
c:\windows\temp
c:\windows\temp\repA
c:\windows\temp\repB
J'avais pensé récupérer le chemin par une variable qui se concatène au fur et à mesure ($chem=$chem.SEPARATEUR)
Voici ce que j'obtiens en parcourant cet exemple avec des dossiers:
$chem=windows.SEPARATEUR <- nous sommes dans le dossier 'windows'
$chem=windows.SEPARATEUR.temp.SEPARATEUR <- pour le dossier suivant on reprend $var et on ajoute son sous-dossier
$chem=windows.SEPARATEUR.temp.SEPARATEUR.repA <- jusqu'ici tout va bien
$chem=windows.SEPARATEUR.temp.SEPARATEUR.repA.SEPARATEUR.repB <- et là c'est la ca, c'est la ca-ca, c'est la catastrophe car pour un fichier contenu dans repB le chemin retourné est incorrecte.

C'est la seule méthode qui me vienne à l'esprit car si on ne conserve pas l'historique du chemin, la seule réponse que renvoi $chem est la clé directement parente à la valeur (le dossier père) car la boucle foreach ne me renvoi que le couple parent-enfant mais ne m'indique pas l'ascendance.

N'y a-t-il pas une fonction qui permettre de retrouver les coordonnées complète d'une valeur utilisable pendant le traitement d'un array ?

ou alors c'est que ma façon d'appréhender le problème est carrément sur orbite.
Modifié par Greg_Lumiere (27 Jan 2016 - 16:19)