web-dev-qa-db-fra.com

Composant personnalisé - JInput ne reçoit pas l'entrée de formulaire

J'ai un formulaire de saisie dans la vue administrateur:

<form name="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file_upload" />
    <input type="submit" value="Upload Image" />
    <input type="hidden" name="option" value="com_newsshowcase" />
    <input type="hidden" name="task" value="upload" />
    <?php echo JHtml::_( 'form.token' ); ?>
</form>

Ce formulaire appelle la fonction upload () dans le contrôleur:

public function upload()
{
    // Check for request forgeries
    JSession::checkToken('request') or jexit(JText::_('JINVALID_TOKEN'));
    $app = JFactory::getApplication()->input;
    $file = $app->files->get('file_upload');
    $filename = JFile::makeSafe($file['name']);
}

J'ai répété (débogage) les variables $filename Et $file, Mais aucune valeur n'a été répercutée. Quand je répète quelque chose comme:

echo '<pre>',print_r($file,1),'</pre>';

rien n'est répercuté. Je suppose que cela signifie que le fichier à télécharger par cette fonction n'est pas transmis de la vue au contrôleur?

Mise à jour: J’ai aussi importé explicitement JInput (lors de mes recherches, j’ai vu des choses mitigées dire que ce n’était pas nécessaire, mais que cela ne ferait pas de mal). Mon contrôleur d'origine étendu JController, j'ai essayé de changer cela en JControllerForm et de modifier la dépendance d'importation en conséquence et toujours rien.

Mise à jour # 2: Quand je fais un var_dump Sur $_POST, Je peux voir les données du formulaire, mais quand je fais un var_dump Sur $_FILES Il montre un tableau vide.

Mise à jour n ° 3: La taille de l'image que je tente de télécharger, à titre de test, est de 345 octets (très petite).

Mise à jour n ° 4: J'ai dupliqué le formulaire (j'ai supprimé les champs spécifiques à Joomla) dans un fichier autonome séparé PHP) lié à un PHP point final qui a effectué une var_dump($_FILES) et qui a affiché les données de téléchargement.

Mise à jour n ° 5: Je ne suis pas sûr que cela compte, mais le formulaire HTML réside dans la section "default_body" de la page d'administration.

4
Eric

Un certain nombre de choses. Tout d’abord, vérifiez qu’il s’agit d’un bogue en utilisant JRequest, qui est obsolète mais qui fonctionne toujours, pour obtenir les données du fichier. J'ai récemment eu recours à cette méthode moi-même pour un besoin de téléchargement de fichier.

$file = JRequest::getVar('file_upload', null, 'files', 'array'); 

Si cela ne fonctionne toujours pas, essayez simplement de vider la variable de demande $ _FILES ['file_upload'] pour confirmer que le fichier est envoyé. Ma pensée utilise JRequest fonctionnera.

Deuxièmement, vous devez associer la méthode de téléchargement au contrôleur spécifique de la vue. Bien que vous deviez et puissiez atteindre une méthode publique dans votre point d’entrée principal, vous devez créer et attacher un contrôleur qui utilisera le modèle/la vue.

De plus, une fois la tâche migrée vers le contrôleur approprié, il n'est pas nécessaire de récupérer un objet JInput en tant que partie intégrante de la classe parente.

Par exemple, disons que la vue est Fichiers, le contrôleur ressemble à ceci:

NewsShowcaseControllerFiles extends JControllerLegacy {

    public function upload() {
        jimport('joomla.filesystem.file');
        jimport('joomla.filesystem.folder');
        // Check for request forgeries
        JSession::checkToken('request') or jexit(JText::_('JINVALID_TOKEN'));

        // Notice in the controllers context, no need to instansiate Application Object
        $file = $this->input->files->get('file_upload');
        $filename = JFile::makeSafe($file['name']);

        // logic to save file or dump data to verify success
    }

}

Dans le point d'entrée du contrôleur principal situé dans le site des composants/racine administrateur, ajoutez la ligne suivante à votre méthode d'affichage pour enregistrer votre tâche:

$this->registerTask('files.upload', 'upload');

Enfin, vous devez modifier l'URL du noeud final pour le formulaire ou AJAX demander le traitement de la soumission du formulaire:

JRoute::_('index.php?option=com_newsshowcase&task=files.upload');
2
Brian Bolli