web-dev-qa-db-ja.com

一部のファイルが選択されている場合、jinput-> post-> getArray()の後にフォームデータをjsonとしてデコードできません

私はすべてのフォームデータを取得します:

_$jinput = JFactory::getApplication()->input;
$formData = new JRegistry($jinput->post->getArray());
_

次にそれをデコードし、次のコマンドでカスタム配列に変換します。

_$formDataAsJson = json_decode($formData);
$arrayOfFields = array();
foreach($formDataAsJson as $name => $value) {
    if(!empty($value) && $name !== 'submit') {
        $arrayOfFields[] = '<strong>'.$name.'</strong>: '.$value;
    }
}
_

次にメールで送信:

_$mailer = JFactory::getMailer();
...
$mailer->setBody(implode('<br/>',$arrayOfFields));
_

私のフォームには_type="file"_の1つの入力があり、この入力に触れず、_type="text"_で入力のみを入力し、_type="radio"_で入力を確認すると、すべてのコードが機能します。ただし、入力_type="file"_を使用してファイルを選択すると、コードが機能しなくなり、メールが届きません。

ファイルを選択したが、デコードして配列に変換せずに_$formData_をJSONとして送信した場合と:

_$mailer->setBody($formData);
_

それから私は電子メールを受け取ります。そのとき、JSON行の中に入力_type="file"_の名前はありません。

したがって、入力_type="file"_がJSON行にプッシュされていないように見えますが、この場合にコードが機能しなくなるのはなぜですか?変ですね。ファイルを選択した場合でも、フォームデータをデコードして配列に変換し、メールを送信するにはどうすればよいですか?または、入力_type="file"_を->post->getArray()から除外するにはどうすればよいですか?

ファイルをアップロードおよび送信するためのコード:

_jimport('joomla.filesystem.file');
$file = $jinput->files->get('nameOfFileInput');
if(!empty($file['name'])) {
    $filename = JFile::makeSafe($file['name']);
    $src = $file['tmp_name'];
    $dest = JPATH_SITE . DIRECTORY_SEPARATOR . "tmp" . DIRECTORY_SEPARATOR . $filename;
    if(JFile::upload($src, $dest)) {
        $mailer->addAttachment($dest);
    }
}
_

Joomla 3.5.1

1
stckvrw

これでファイル入力データを取得できます:

_$files = $input->files->get('inputName');
_

JRegistryを使用してから_json_decode_を使用する必要はありません。最初に$jinput->post->getArray()からarrayを取得します。

だからあなたのコードは

_$jinput = JFactory::getApplication()->input;
$formData = $jinput->post->getArray();
$arrayOfFields = array();
foreach($formData as $name => $value) {
    if(!empty($value) && $name !== 'submit') {
        $arrayOfFields[] = '<strong>'.$name.'</strong>: '.$value;
    }
}
_

しかし、ファイル入力の入力に関する問題については、どちらの方法でも機能するはずです。

ファイル入力は$jinput->post->getArray()に含まれていないため、問題は別の場所に依存しています。

エラー報告をオンにして、エラーがスローされていないか確認することをお勧めします。どのように行われるかは この答え で確認できます。サーバーの構成に応じて、最初のポイントでそれを行う必要があります。

また、コードをtry-catchにラップして、スローされたエラーをキャッチできます。

_try {
    // Your code here
    // Create arrayOfFields and send email 
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
_

どうなるか教えてください。

2
Rene Korss