web-dev-qa-db-fra.com

Comment créer un téléchargeur d'image simple pour un composant personnalisé

Je développe un composant personnalisé pour créer, éditer et sauvegarder des données d'enregistrements simples, y compris des images. Je sais que dans admin/models/forms/record.xml il doit y avoir un champ name="image" type="file" accept="image/*" Mais comment et où dois-je écrire le simple code php pour télécharger des images dans un dossier spécifique, dans quel fichier et comment? Où écrire le code de l'exemple par le lien https://docs.joomla.org/How_to_use_the_filesystem_package ?

EDITED: Maintenant, j'ai ajouté dans mon admin/com_mycom/controllers/record.php le code:

public function save($data = array(), $key = 'id')
    {
        $file = JRequest::getVar('image', null, 'files', 'array');
        $filename = JFile::makeSafe($file['name']);
        $src = $file['tmp_name'];
        $dest = "media/com_mycom/img/".$filename;
        if (JFile::upload($src, $dest)) {
              //Redirect to a page of your choice
        } else {
              //Redirect and throw an error message
        }
        parent::save();
    }

$ data = array (), $ key = 'id' obtenu de la fonction allowEdit ()

RÉSOLU MAIS ... Le problème était donc dans le nom de l'entrée. JRequest :: getVar contient 'image' mais le type d'entrée = "fichier" a pour nom = " jform [image] ". J'ai trouvé le code:

$jinput = JFactory::getApplication()->input;
$files = $jinput->files->get('jform');
$file = $files['image'];

au lieu de

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

et maintenant le fichier est en cours de téléchargement mais son nom n'est malheureusement pas mis à jour dans la base de données

Ok, j'ai ajouté sous if (JFile::upload($src, $dest)) { le code:

$thisID = JRequest::getVar('id');
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$fields = array($db->quoteName('image') . " = " . $db->quote($filename));
$conditions = array($db->quoteName('id') . " = " . $thisID);
$query->update($db->quoteName('#__mycom'))->set($fields)->where($conditions);
$db->setQuery($query);
$db->execute($query);

mais existe-t-il un moyen plus simple de mettre à jour le nom de fichier dans la base de données?

4
stckvrw

Vous devriez l’ajouter à votre contrôleur, probablement controllers/record.php. Remplace la fonction save.

public function save($key = NULL, $urlVar = NULL)
{
  // Upload your image

  // Save item
  parent::save();
}

MISE À JOUR

erreur "Impossible de déplacer le fichier"

Cela venait d'un mauvais $dest valeur. La destination doit être le chemin complet.

Wrong:

$dest = "media/com_mycom/img/".$filename;

Correct:

$dest = JPATH_SITE."/media/com_mycom/img/".$filename;
4
Rene Korss

Je vous suggère de renvoyer une partie administrateur de com_media _ composant. Toutes les fonctionnalités liées au téléchargement de fichiers sont développées.

Il inclut également la gestion des erreurs et d’autres vérifications liées au système de fichiers.

1
SD.