it-swarm.com.de

Kann Formulardaten nach jinput-> post-> getArray () nicht als json dekodieren, wenn eine Datei ausgewählt ist

Ich erhalte alle Formulardaten mit:

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

dann dekodiere es und konvertiere es in mein benutzerdefiniertes Array mit:

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

und dann mailen mit:

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

In meinem Formular gibt es eine Eingabe mit type="file" Und der gesamte Code funktioniert, wenn ich diese Eingabe nicht berühre und nur Eingaben mit type="text" Fülle und Eingaben mit type="radio" Prüfe. Wenn ich jedoch eine Datei mit der Eingabe type="file" Auswähle, funktioniert der Code nicht mehr und ich erhalte keine E-Mail.

Wenn ich eine Datei wähle, aber $formData Als JSON sende, ohne sie zu dekodieren und in ein Array zu konvertieren, z. mit:

$mailer->setBody($formData);

dann bekomme ich eine email. Dabei gibt es in der JSON-Zeile keinen Namen für meine Eingabe type="file".

Es sieht also so aus, als würde die Eingabe type="file" Nicht in die JSON-Zeile übertragen, aber warum funktioniert der Code in diesem Fall nicht mehr? Das ist merkwürdig. Wie kann ich Formulardaten dekodieren, in mein Array konvertieren und eine E-Mail senden, selbst wenn ich eine Datei auswähle? Oder wie kann man die Eingabe type="file" Von ->post->getArray() ausschließen?

Der Code zum Hochladen und Senden einer Datei:

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

Sie können die Daten für die Dateieingabe folgendermaßen abrufen:

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

Sie müssen nicht JRegistry und dann json_decode Verwenden. Sie erhalten array von $jinput->post->getArray() an erster Stelle.

So könnte Ihr Code sein

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

Aber was das Problem mit der Eingabe von Dateien angeht, sollte es so oder so funktionieren.

Die Dateieingabe ist in $jinput->post->getArray() nicht enthalten, daher liegt das Problem an einer anderen Stelle.

Ich empfehle Ihnen, die Fehlerberichterstattung zu aktivieren, um zu überprüfen, ob Fehler aufgetreten sind. Sie können sehen, wie es gemacht wird in diese Antwort . Der erste Punkt sollte dies tun, abhängig von Ihrer Serverkonfiguration.

Sie können Ihren Code auch in try-catch einbinden, um alle ausgelösten Fehler abzufangen.

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

Lass mich wissen, wie es geht.

2
Rene Korss