web-dev-qa-db-fra.com

Impossible de décoder les données de formulaire en json après jinput-> post-> getArray () si un fichier est choisi

Je récupère toutes les données du formulaire avec:

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

puis décodez-le et convertissez-le dans mon tableau personnalisé avec:

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

et ensuite email avec:

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

Dans mon formulaire, il y a une entrée avec type="file" Et tout le code fonctionne si je ne touche pas cette entrée et ne remplis que les entrées avec type="text" Et vérifie les entrées avec type="radio". Cependant, si je choisis un fichier en utilisant l'entrée type="file", Le code cesse de fonctionner et je ne reçois pas d'e-mail.

Si je choisis un fichier mais envoie $formData Comme JSON sans le décoder et le convertir en tableau, par exemple. avec:

$mailer->setBody($formData);

alors je reçois un email. Sur ce, il n'y a pas de nom pour mon entrée type="file" À l'intérieur de la ligne JSON.

Il semble donc que l'entrée type="file" N'est pas poussée vers la ligne JSON, mais pourquoi le code cesse-t-il de fonctionner dans ce cas? Cela est étrange. Comment puis-je décoder les données de formulaire, les convertir dans mon tableau et envoyer un courrier électronique même si je choisis un fichier? Ou comment exclure l'entrée type="file" De ->post->getArray()?

Le code pour télécharger et envoyer un fichier:

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

Vous pouvez obtenir des données d'entrée de fichier avec ceci:

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

Vous n'êtes pas obligé d'utiliser JRegistry puis json_decode. Vous obtiendrez array de $jinput->post->getArray() en premier lieu.

Donc, votre code pourrait être

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

Mais pour ce qui est du problème avec le remplissage du fichier, cela devrait fonctionner dans les deux cas.

L'entrée de fichier n'est pas incluse dans $jinput->post->getArray(), le problème repose donc ailleurs.

Je vous suggère d'activer le rapport d'erreurs pour voir si des erreurs sont générées. Vous pouvez voir comment cela se fait dans cette réponse . Le premier point devrait le faire, en fonction de la configuration de votre serveur.

En outre, vous pouvez intégrer votre code dans try-catch, afin d’attraper les erreurs renvoyées.

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

Faites-moi savoir comment ça va aller.

2
Rene Korss