web-dev-qa-db-ja.com

Cookieを使用して、通知や警告なしにRSFormフィールドに入力する方法

このコードを使用してRSFormデータをCookieに保存しました。ユーザーが同じフォームにもう一度入力しようとすると、以前に入力したデータがデフォルト値として読み込まれます。

フォームディスプレイで呼び出されるスクリプト:

// 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>';

フォームプロセスで呼び出されるスクリプト:

// 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']);

フィールドには、次の値があります(例として2つだけ投稿します)。

Textbox "name"デフォルト値:

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

ドロップダウン「国」デフォルト値:

//<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>

コードは、フォームフィールドを保持された値で正常に更新します。誰かがフォームにすでに入力している場合、値がロードされますが、これらの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

これらの通知と警告を回避する方法を回避する方法はありますか

2
Sukinoz

1つは、次のように宣言することです。

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

これは、rsformdatacountry Cookie値が文字列(配列ではない)であることを意味します。これは、フォームで複数の選択が許可されていない場合に適しています。

呼び出すときは、次を使用します。

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

次に、ループで比較を行うときは、別のチェックを使用します。

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

説明すると:if (strpos($options_item, $active . '|') === 0) {は、short値を完全にチェックします。 pipeを追加して、部分一致が発生しないようにします。 _=== 0_は、文字列の先頭で一致する必要があることを意味します。これらの理由により、安定していて信頼できます。

他の警告については、var_export($variable_name)を使用して、処理しているデータをより明確に理解してください。

1
mickmackusa

フォームを更新する2つの個別の手段を使用しているスニペットを投稿しました。

Javascript-leveragingスニペットは、フォーム要素がすでに生成された後でフォームを更新しています。つまり、特定のユーザーのフィールドにCookie値を適用するために、すべてのユーザーの標準フォームが最後に調整されます。これは適切なアイデアのようです。

純粋なphpスニペットは、htmlとしてレンダリングされる前に、格納されたrsformフォームデータ(パイプ構文)を修正しています。フォーム構造/オプションはすべてのユーザーによって共有されるため、ユーザーごとにフォームを修正することは可能かもしれませんが、おそらく理想的ではありません。

フォームがCookieデータで正しく更新されていて、サーバー側の手法でエラーが発生している(機能していない)場合は、サーバー側のスクリプトを削除するだけです。

コードを合理化/安定化し、多くのCookieデータ変数を個別に宣言しないようにするには、すべてのCookieデータを次のような多次元配列として取得および設定することをお勧めします。

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

そして

$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>
";

すべてのフォームフィールドを入力しませんでした-多次元データを確認してアクセスする方法を示すのに十分です。この手法は、保存された値にアポストロフィ/引用符を付けても壊れないため、うまく機能します。

1
mickmackusa

エラーメッセージは、「スクリプトがフォームプロセスで呼び出されました」で値を指定していないフィールドに関するものであるように見えます。あなたが提供する他のフィールドと同様に、あなたはそれに空の値を与えるか、まったく値を与えません。

0
Irata

これはテスト済みで問題なく実行されているソリューションです。

(PD:解決策は警告を回避するための@の使用(または乱用)のようであり、これが実際の解決策と見なされるかどうかはわかりません)

フォーム表示で呼び出されるスクリプト:

//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>';

フォームプロセスで呼び出されるスクリプト:

// 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']);

Textbox "name"デフォルト値:

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

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

//</code>

ドロップダウン「国」のデフォルト値:

//<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