Page 1 sur 1

récuperation valeur champ input (name[val][val][etc])

Posté : 17 mars 2014, 12:05
par bunk
Bonjour,

J'utilise un formulaire avec plusieurs champs regroupés. un exemple d'un des champ input :
<input id="langue[fr_FR][titre]" type="text" value="titre" name="langue[fr_FR][titre]">
Je récupère ceci à la soumission ($data) :

Code : Tout sélectionner

stdClass Object ( [id] => 1 [categorie] => cat1 [langue] => Array ( [fr_FR] => Array ( [titre] => titre [groupe] => groupe_1 [contenu] => contenu en fr ) [en_US] => Array ( [titre] => title [groupe] => groupe_2 [contenu] => contenu en en ) ) )
Je voudrais récupérer la valeur du titre en fr dans un fonction qui connait $data (le tableau complet de résultat) et le name du champ input (langue[fr_FR][titre]).

Si je devais l'écrire en entier je devrais faire : echo $data->langue['fr_FR']['titre'];
pour obtenir la valeur "titre".

Mon problème et que je ne sais pas comment m'y prendre car je voudrais pouvoir récuperer la valeur dans ce cas de figure mais également avec plus de tableau imbriqués ou moins :

exemple avec plus : langue[fr_FR][titre][detail][etc]
et avec moins : langue[fr_FR]

Je ne suis pas certain d'être sur la bonne pise mais pour l'instant j'explore (explode) le nom du champ input pour en avoir le contenu et j'ai cré une variable pour avoir le contenu de langue
$name = 'langue[fr_FR][titre]';
	$name_input = explode('[',$name);
	foreach($name_input as $k => $v){
		$name_input[$k] = str_replace(']','',$v);
		$lang = $data->$name_input[0];
	}

	/*
	$name_input =
	Array
		(
			[0] => acls_translation
			[1] => fr_FR
			[2] => acls_content
		)
	*/



j'espère avoir été assez clair. D'avance merci pour votre aide.

Re: récuperation valeur champ input (name[val][val][etc])

Posté : 17 mars 2014, 12:25
par moogli
salut,

la validation du formulaire te fournit un tableau et non un objet ce que tu nous montre ne peux pas être un var_dump($_POST) ;)

pour traiter ce genre de cas on utilise foreach qui te fournira l'index courante et le sont contenu.
si tu as une arboresence "infinie" il te faut une fonction récursive pour parcourir le tableau fournit par le formulaire (pourquoi pas en utilisant array_walk_recursive

la, comme ça, je flaire un problème de conception mais je peux me tromper (cela ressemble à un système de traduction et tu indique qu'une langue peu ne pas avoir de traduction, mais vouloir travailler dessus, et pire avoir une arborescence dans les termes et ça c'est clairement, pour moi, une erreur).

@+

Re: récuperation valeur champ input (name[val][val][etc])

Posté : 17 mars 2014, 12:45
par bunk
je suis d'accord sur le fait que la "validation du formulaire te fournit un tableau et non un objet", je n'ai pas collé tous le code ici mais juste ce que j'ai en sortie. Donc j'ai bien un object contenant l'ensemble de mes champs.

c'est effectivement un système de traduction et toutes les langues doivent avoir une traduction je me suis mal exprimé. Je voulais juste donner d'autres exemple au cas ou je voudrais utiliser ce système dans un autre contexte, par exemple dans un autre formulaire. (rien à voir avec la langue).
mais je n'aurais pas du en parler car si cela fonctionne qu'il y ai un ou plusieurs tableau imbriqués ne devrait pas changer grand chose.

Restons sur le système de langue. Je valide mon formulaire qui me donne un object des champs soumis.
je connais le nom du champ dont je cherche la valeur.
avec ce bout de code je connais la clé $data->$name_input[0]
$name = 'langue[fr_FR][titre]';
        $name_input = explode('[',$name);
        $lang = $data->$name_input[0];
        foreach($name_input as $k => $v){
                $name_input[$k] = str_replace(']','',$v);
        }
je connais aussi la dernière position du pointeur se rapprochant le plus de ma valeur : $last = $name_input[count($name_input)-1]

mais comment connaître ce qui se trouve antre le premier et le dernier (ici : fr_FR) sachant qu'il pourrait y'en avoir d'autres pour enfin obtenir la valeur depuis l'objet ?

autrement dit : $data->$lang[????][$last]

Re: récuperation valeur champ input (name[val][val][etc])

Posté : 17 mars 2014, 13:20
par sirakawa
<input id="langue[fr_FR][titre]" type="text" value="titre" name="langue[fr_FR][titre]">
me laisse perplexe:
j'aurais écrit pour éviter d'avoir des constantes qui peuvent être définies par ailleurs, par hasard, comme index de mes tableaux.
<input id="langue[fr_FR][titre]" type="text" value="titre" name="langue['fr_FR']'[titre']">
et est-ce que l'id sert à quelque chose?
Ccei étant dit, pour avoir eu des situations de ce genre, j'ai abouti à
<input id="langue[fr_FR][titre]" type="text" value="titre" name="langue[0][0]">
etc...

Re: récuperation valeur champ input (name[val][val][etc])

Posté : 17 mars 2014, 14:22
par bunk
non l'id ne sert à rien dans ce cas présent, il est automatique car je gère mes champs input via une class et j'aurais pus préciser de ne pas le mettre (mais je ne l'ai pas fait).

je pense avoir compris ce que je voulais au final mais je ne vois pas bien comment le mettre en place. Je m'explique :

j'ai ceci : $lang = $data->$name_input[0];
et au final pour avoir la valeur du titre en fr je devrais faire ça : $lang['fr_FR'][$name_input[count($name_input)-1]]

mon problème c'est le fr_FR dans ce cas présent, en fait il faudrait que je boucle pour savoir si c'est un tableau pour arriver à la valeur finale.
dans l’idée :
$lang = $data->$name_input[0];
foreach($lang as $k => $v){
	if(is_array($v)){
		// continuer à boucler jusqu'à ce que $v ne soit plus un tableau !
	}else{
		$value = $v;
	}
}
suis-je plus clair ?

Re: récuperation valeur champ input (name[val][val][etc])

Posté : 17 mars 2014, 17:39
par moogli
la base de ce que tu demande c'est
<?php
foreach($obj->langue as $lang => $trad) {
    // travail sur la langue $lang avec le tableau des données dans $trad
}
maintenant tu parle de récursivité et tu ne l'obtiendra que par la création d'une fonction récursive.

tu parle en même temps de générique et de spécifique c'est pas compréhensible, nous ne somme si dans ta tête ni ton projet n ne peux pas comprendre ce que tu veux exactement si ne l'explique pas clairement.

ce que tu propose est utilisable pour la traduction 'un terme.
S'il y en a plusieurs en même temps il te faut un niveau en plus ([][langue][etc]).
et au final pour avoir la valeur du titre en fr je devrais faire ça : $lang['fr_FR'][$name_input[count($name_input)-1]]
non $lang['fr_FR']['titre']
[langue] => Array
(
[fr_FR] => Array
(
[titre] => titre
pourquoi chercher a faire un truc complexe alors que tu peux faire simple ?

D'ailleurs tu n'as pas le nom du champs comme s'est écrit dans le html tu as un tableau contenant le index (alphabetique en l'occurence).

@sirakawa : ce ne sont pas de constante cela finira par un index alphabétique dans dans le tableau $_POST ;)


@+

Re: récuperation valeur champ input (name[val][val][etc])

Posté : 17 mars 2014, 17:47
par bunk
je savais que ça allait être compliqué à expliquer. En fait si je connais le nom du champ parce-que les champs sont généré via un class dédiée.

en ce qui concerne le : $lang['fr_FR'][$name_input[count($name_input)-1]]
c'était dans le cas ou je trouverais une solution pour atteindre dynamiquement les niveau entre "lang" et "titre", dans mon exemple il n'y en à qu'un seul fr_FR et donc la je suis d'accord pour faire simple avec ce qu'écrit Moogli mais dans le cas ou il y aurait d'autres niveau je ne sais pas le faire.

En tout cas merci pour vos réponse je vais encore creuser.

Re: récuperation valeur champ input (name[val][val][etc])

Posté : 18 mars 2014, 10:46
par moogli
je ne vois pas l’intérêt de ne pas maîtriser cette chaîne (même avec un ou deux niveaux de plus) car tu risque de ne plus savoir à quoi correspond la donnée.

ensuite, et je me répète, il te faut une fonction de parcourt récursif de ton tableau (une fonction qui s'appelle elle même).
c'est la seule solution envisageable ;)


@+