Modification formulaire d'inscription

Re: Modification formulaire d'inscription

par Quentin Ventura,
Nombre de réponses : 0
Merci pour les réponses, ca m'a aidé à régler mon probleme !
Grosso modo ca venait de addElement ... Enfin un peu plus complexe

Si ca peut aider des gens, pour le chargement dynamique des données, j'ai chargé que les états en "dur" (requette dans la bdd, y'a que 27 états)

Ensuite j'ai modifié une fonction du fichier hierselect.php de la librairie quickform

function _hs_replaceOptions(ctl, state)
{
var j = 0;
ctl.options.length = 0;
var params = "state="+state;
json = $.ajax({ type: "POST", url: "../lib/pear/HTML/QuickForm/init_list_cities_by_state.php", data: params , async: false }).responseText;
var optionList = eval('('+json+')');
console.log(optionList);
for (i in optionList) {
var optionText = (-1 == optionList[i].indexOf('&'))? optionList[i]: _hs_unescapeEntities(optionList[i]);
ctl.options[j++] = new Option(optionText, optionText, false, false);
}
}

Oui je sais, c'est sale !
Mais c'est pas définitif, seulement implanté en local, je pense que je créerai une classe hierselect_state_city spécifique, sinon le hierselect ne sera plus utilisable hors de ce context

Sinon pour que ca apparaisse lors d'une édition, pour le premier champs, pas de probleme

function onQuickFormEvent($event, $arg, &$caller)
{
if ('updateValue' == $event)
{
$value = null;
if( isset($caller->_defaultValues["state"]))
{
$value[] = $caller->_defaultValues["state"];
$value[] = $caller->_defaultValues["city"];
}
if (null !== $value)
{
$this->setValue($value);
}
} else {
...

Ensuite dans user/editavanced.php je rajoute ces deux lignes
$usernew->state = $usernew->city[0];
$usernew->city = $usernew->city[1];
afin que lors de l'update les données soeint rajoutées
Probleme, j'ai du rajouter un champ state a la table "user"... C'est un peu moche...

Le probleme est que ca ne charge pas automatiquement pour 'city', puisque les données de la 2nd combo box n'existent pas (chargées dynamiquement apres changement d'état) j'ai donc du modifier le fichier user/editlib.php

$userTmp = get_record('user', 'id', $_GET['id']);

$query = " SELECT state
FROM {$CFG->prefix}geolocalisation_city_br
GROUP BY state";

$states = get_records_sql($query);
$arrStates = array();
$arrStates[] = get_string('choose_a_state','dashboard');

foreach($states as $state)
{
$arrStates[$state->state] = $state->state;
}
$city = array();


if(!empty($userTmp->state))
{
echo 'pas vide';
$query = " SELECT city
FROM {$CFG->prefix}geolocalisation_city_br
where state = \"".$userTmp->state."\"";

$cities= get_records_sql($query);
$city[$userTmp->state][] = get_string('choose_a_city','dashboard');
foreach($cities as $c)
{
$city[$userTmp->state][$c->city] = $c->city;
}
}
// add hierselect element
$attribs = array('size' => '1');
$hier = &$mform->addElement('hierselect', 'city', get_string('categories', 'modulename'), $attribs);
$hier->setOptions(array($arrStates, $city));
$mform->setType('city', PARAM_MULTILANG);
$mform->addRule('city', $strrequired, 'required', null, 'client');

En tout cas ca fonctionne !

C'est un peu moche, et mal expliqué... Si ca interesse des gens, je dois faire une documentation précise des modifications a effectuées pour avoir un chargement dynamique, je pourrais vous faire partager tout ca

Merci de ton aide Patrick !

Et pour ce que ca interesse, j'ai une liste exhaustive des villes brésiliennes, par état, avec latitude et longitude associée... Ca peut accélérer grandement la vitesse d'affichage d'une map (en cas de geolocalisation) et les hierselect permet de s'assurer que y'ai pas de fautes d'orthographe dans les noms des villes (Surtout pour des noms avec tant d'accents...) Mais ca n'empeche pas de toute facon certaines personnes d'habiter au Bhoutan tout en travaillant au Brésil sourire
Tout est fait, c'est une requette SQL, y'a qu'a copier / coller

Voilà, bonnes fêtes de fin d'année sourire