web-dev-qa-db-fra.com

Comment utiliser les cookies pour remplir les champs RSForm sans notifications / avertissements?

J'ai utilisé ce code pour enregistrer les données RSForm dans un cookie et si l'utilisateur essaie de remplir à nouveau le même formulaire, les données précédemment saisies sont chargées comme valeurs par défaut:

Script appelé sur l'affichage du formulaire:

// COOKIES
$inputCookie  = JFactory::getApplication()->input->cookie;
$bdayd = $inputCookie->get('rsformdatabdayd', '', 'string');
$bdaym = $inputCookie->get('rsformdatabdaym', '', 'string');
$bdayy = $inputCookie->get('rsformdatabdayy', '', 'string');
echo '<script>
        document.getElementById("bdayd").value = "'. $bdayd .'";
        document.getElementById("bdaym").value = "'. $bdaym .'";
        document.getElementById("bdayy").value = "'. $bdayy .'";
</script>';

Script appelé sur le processus de formulaire:

// COOKIES
$inputCookie  = JFactory::getApplication()->input->cookie;
$inputCookie->set('rsformdata', $_POST['form']);
$inputCookie->set('rsformdatacountry', $_POST['form']['country']);
$inputCookie->set('rsformdataaddress-level1', $_POST['form']['address-level1']);
$inputCookie->set('rsformdatastudies', $_POST['form']['studies']);
$inputCookie->set('rsformdataemployment', $_POST['form']['employment']);
$inputCookie->set('rsformdataage', $_POST['form']['age']);
$inputCookie->set('rsformdatabdayd', $_POST['form']['bday']['d']);
$inputCookie->set('rsformdatabdaym', $_POST['form']['bday']['m']);
$inputCookie->set('rsformdatabdayy', $_POST['form']['bday']['y']);
$inputCookie->set('rsformdatasuscribe', $_POST['form']['suscribe']);

Dans les champs, j'ai ces valeurs (je n'en posterai que deux comme exemple):

Zone de texte "nom" Valeur par défaut:

//<code>
$inputCookie  = JFactory::getApplication()->input->cookie;
$value = $inputCookie->get('rsformdata', '', 'array');
return $value['name'];
//</code>

liste déroulante "pays" Valeur par défaut:

//<code>
$options = array('|País de residencia:',
'ES|España',
'MX|México',
'CO|Colombia',
'ZM|Zambia',
'ZW|Zimbabue');

$inputCookie  = JFactory::getApplication()->input->cookie;
$value = $inputCookie->get('rsformdatacountry', '', 'array');

$items = ""; 
foreach ($options as $options_item) {
 $items .= $options_item;
 $active = explode('|', $options_item);
 if (in_array($active[0], $value)) {
  $items .= "[c]\n";
 } else {
  $items .= "\n";
 }
}

return trim($items);
//</code>

Le code met à jour les champs du formulaire avec les valeurs préservées. Si quelqu'un a déjà rempli le formulaire, les valeurs sont chargées, mais je reçois ces avertissements et avis php:

[28-Aug-2019 17:08:31 Europe/Berlin] PHP Warning:  Illegal string offset 'address-level2' in /home/aacom/public_html/test/administrator/components/com_rsform/helpers/field.php(67) : eval()'d code on line 4
[28-Aug-2019 17:08:31 Europe/Berlin] PHP Notice:  Uninitialized string offset: 0 in /home/aacom/public_html/test/administrator/components/com_rsform/helpers/field.php(67) : eval()'d code on line 4
[28-Aug-2019 17:08:31 Europe/Berlin] PHP Warning:  Illegal string offset 'street-address' in /home/aacom/public_html/test/administrator/components/com_rsform/helpers/field.php(67) : eval()'d code on line 4
[28-Aug-2019 17:08:31 Europe/Berlin] PHP Notice:  Uninitialized string offset: 0 in /home/aacom/public_html/test/administrator/components/com_rsform/helpers/field.php(67) : eval()'d code on line 4
[28-Aug-2019 17:08:31 Europe/Berlin] PHP Warning:  Illegal string offset 'postal-code' in /home/aacom/public_html/test/administrator/components/com_rsform/helpers/field.php(67) : eval()'d code on line 4
[28-Aug-2019 17:08:31 Europe/Berlin] PHP Notice:  Uninitialized string offset: 0 in /home/aacom/public_html/test/administrator/components/com_rsform/helpers/field.php(67) : eval()'d code on line 4 
[28-Aug-2019 17:08:31 Europe/Berlin] PHP Warning:  in_array() expects parameter 2 to be array, string given in /home/aacom/public_html/test/administrator/components/com_rsform/helpers/field.php(67) : eval()'d code on line 24
[28-Aug-2019 17:08:31 Europe/Berlin] PHP Warning:  in_array() expects parameter 2 to be array, string given in /home/aacom/public_html/test/administrator/components/com_rsform/helpers/field.php(67) : eval()'d code on line 24
[28-Aug-2019 17:08:31 Europe/Berlin] PHP Warning:  in_array() expects parameter 2 to be array, string given in /home/aacom/public_html/test/administrator/components/com_rsform/helpers/field.php(67) : eval()'d code on line 24
[28-Aug-2019 17:08:31 Europe/Berlin] PHP Warning:  in_array() expects parameter 2 to be array, string given in /home/aacom/public_html/test/administrator/components/com_rsform/helpers/field.php(67) : eval()'d code on line 24
[28-Aug-2019 17:08:31 Europe/Berlin] PHP Warning:  in_array() expects parameter 2 to be array, string given in /home/aacom/public_html/test/administrator/components/com_rsform/helpers/field.php(67) : eval()'d code on line 24
[28-Aug-2019 17:08:31 Europe/Berlin] PHP Warning:  in_array() expects parameter 2 to be array, string given in /home/aacom/public_html/test/administrator/components/com_rsform/helpers/field.php(67) : eval()'d code on line 99
[28-Aug-2019 17:08:31 Europe/Berlin] PHP Warning:  in_array() expects parameter 2 to be array, string given in /home/aacom/public_html/test/administrator/components/com_rsform/helpers/field.php(67) : eval()'d code on line 99 
[28-Aug-2019 17:08:31 Europe/Berlin] PHP Warning:  in_array() expects parameter 2 to be array, string given in /home/aacom/public_html/test/administrator/components/com_rsform/helpers/field.php(67) : eval()'d code on line 13
[28-Aug-2019 17:08:31 Europe/Berlin] PHP Warning:  in_array() expects parameter 2 to be array, string given in /home/aacom/public_html/test/administrator/components/com_rsform/helpers/field.php(67) : eval()'d code on line 13

Une idée comment éviter ces avis et avertissements?

2
Sukinoz

D'une part, vous déclarez:

$inputCookie->set('rsformdatacountry', $_POST['form']['country']);

Cela signifie que la valeur du cookie rsformdatacountry est une chaîne (pas un tableau). Cela est approprié en supposant que votre formulaire n'autorise pas les sélections multiples.

Lorsque vous l'appelez, utilisez:

$activeCountry = $inputCookie->get('rsformdatacountry', '', 'string');

Ensuite, lors de vos comparaisons dans la boucle, utilisez une vérification différente:

foreach ($options as $i => $options_item) {
    if (strpos($options_item, $activeCountry . '|') === 0) {
        $options[$i] .= "[c]";  // concatenate the selected marker
    }
}
return implode("\n", $options);

Pour expliquer: if (strpos($options_item, $active . '|') === 0) { il vérifiera entièrement la valeur courte. il ajoute un pipe pour éviter les correspondances partielles. le === 0 signifie que la correspondance doit se produire au tout début de la chaîne. Pour ces raisons, il sera stable et fiable.

Comme pour tout autre avertissement, utilisez var_export($variable_name) pour mieux comprendre les données que vous traitez.

1
mickmackusa

Vous avez publié des extraits qui utilisent deux moyens distincts pour mettre à jour le formulaire.

L'extrait de levier javascript met à jour le formulaire APRÈS que les éléments du formulaire ont déjà été générés. Cela signifie que le formulaire standard pour tous les utilisateurs est ajusté au dernier moment pour appliquer les valeurs des cookies aux champs de cet utilisateur spécifique - semble être la bonne idée.

L'extrait de php pur modifie les données de formulaire rsform stockées (la syntaxe canalisée) AVANT qu'il ne soit rendu en html. La structure/les options du formulaire sont partagées par tous les utilisateurs, donc la modifier pour chaque utilisateur peut être possible, ce n'est probablement pas idéal.

Si votre formulaire est correctement mis à jour avec les données des cookies ET que la technique côté serveur génère des erreurs (ne fonctionne pas), vous devez simplement supprimer les scripts côté serveur.

Pour aider à rationaliser/stabiliser votre code et éviter de déclarer vos nombreuses variables de données de cookie individuellement, je recommande d'obtenir et de définir toutes les données de cookie sous la forme d'un tableau multidimensionnel comme ceci: (non testé)

JFactory::getApplication()->input->cookie->set('rsformdata', $_POST['form']);

et

$cookieData = JFactory::getApplication()->input->cookie->get('rsformdata', [], 'array');
$cookieJson = json_encode($cookieData);

echo "
<script>
let cookieObj = $cookieJson;
if (cookieObj.country !== undefined) {
    document.getElementById('country').value = cookieObj.country;
}
if (cookieObj.bday !== undefined) {
    if (cookieObj.bday.d !== undefined) {
        document.getElementById('bdayd').value = cookieObj.bday.d;
    }
    if (cookieObj.bday.m !== undefined) {
        document.getElementById('bdaym').value = cookieObj.bday.m;
    }
    if (cookieObj.bday.y !== undefined) {
        document.getElementById('bdayy').value = cookieObj.bday.y;
    }
}
</script>
";

Je n'ai pas saisi tous vos champs de formulaire - juste assez pour vous montrer comment vérifier et accéder aux données multidimensionnelles. Cette technique va bien vous servir car elle ne se cassera pas lorsque vous apostrophiez/citez dans vos valeurs préservées.

1
mickmackusa

Les messages d'erreur semblent être pour les champs pour lesquels vous n'avez pas fourni de valeur dans votre "Script appelé sur le processus de formulaire:" tels que l'adresse-niveau2, donc je m'attends à ce que com_rsforms/helper/field.php attend une valeur dans un tableau, comme les autres champs que vous fournissez, mais vous lui donnez une valeur vide ou aucune valeur.

0
Irata

c'est une solution testée et fonctionnant bien.

(PD: La solution semble être l'utilisation (ou l'abus) du @ pour éviter les avertissements, et je ne sais pas si cela peut être considéré comme une vraie solution ou non)

Script appelé sur l'affichage du formulaire:

//COOKIES
$inputCookie = JFactory::getApplication()->input->cookie;
$bdayd = $inputCookie->get('rsformdatabdayd', '');
$bdaym = $inputCookie->get('rsformdatabdaym', '');
$bdayy = $inputCookie->get('rsformdatabdayy', '');

echo '<script>
        jQuery( document ).ready( function() {
            document.getElementById("bdayd").value = "'. $bdayd .'";
            document.getElementById("bdaym").value = "'. $bdaym .'";
            document.getElementById("bdayy").value = "'. $bdayy .'";
        } );

</script>';

Script appelé sur le processus de formulaire:

// COOKIES
$inputCookie = JFactory::getApplication()->input->cookie;
@$inputCookie->set('rsformdata', $_POST['form']);
@$inputCookie->set('rsformdatacountry', $_POST['form']['country']);
@$inputCookie->set('rsformdataaddress-level1', $_POST['form']['address-level1']);
@$inputCookie->set('rsformdatastudies', $_POST['form']['studies']);
@$inputCookie->set('rsformdataemployment', $_POST['form']['employment']);
@$inputCookie->set('rsformdataage', $_POST['form']['age']);
@$inputCookie->set('rsformdatabdayd', $_POST['form']['bday']['d']);
@$inputCookie->set('rsformdatabdaym', $_POST['form']['bday']['m']);
@$inputCookie->set('rsformdatabdayy', $_POST['form']['bday']['y']);
@$inputCookie->set('rsformdatasuscribe', $_POST['form']['suscribe']);

Zone de texte "nom" Valeur par défaut:

//<code>
$inputCookie  = JFactory::getApplication()->input->cookie;
$value = $inputCookie->get('rsformdata', '', 'array');

if(isset($value['name'])){
       return $value['name'];
}else{
       return '';
}

//</code>

Liste déroulante "pays" Valeur par défaut:

//<code>
$options = array('|País de residencia:',
'ES|España',
'MX|México',
'YE|Yemen',
'DJ|Yibuti',
'ZM|Zambia',
'ZW|Zimbabue');

$inputCookie  = JFactory::getApplication()->input->cookie;
$value = $inputCookie->get('rsformdatacountry', '', 'array');

$items = ""; 
foreach ($options as $options_item) {
 $items .= $options_item;
 $active = explode('|', $options_item);
 if (@in_array($active[0], $value)) {
  $items .= "[c]\n";
 } else {
  $items .= "\n";
 }
}

return trim($items);

//</code>
0
Sukinoz