2012-10-17 2 views
4

Cont. - Add File Uploader to Joomla Admin ComponentComment enregistrer le nom du fichier téléchargé dans la base de données

Je pourrais télécharger le fichier et l'enregistrer sur le disque. Mais ce n'est pas son nom de fichier sur la base de données.

Comment puis-je le faire?

Voici le contrôleur -

class InvoiceManagerControllerInvoiceManager extends JControllerForm 
{ 
    function save(){ 
     $file = JRequest::getVar('jform', null, 'files', 'array'); 
     $path = JPATH_BASE; 

     // Make the file name safe. 
     jimport('joomla.filesystem.file'); 
     $file['name']['invoice'] = JFile::makeSafe($file['name']['invoice']); 

     // Move the uploaded file into a permanent location. 
     if (isset($file['name']['invoice'])) { 
      // Make sure that the full file path is safe. 
      $filepath = JPath::clean($path. DS ."components". DS ."com_invoicemanager". DS ."files". DS .strtolower($file['name']['invoice'])); 
      // Move the uploaded file. 
      JFile::upload($file['tmp_name']['invoice'], $filepath); 
     } 

     return parent::save(); 
    } 
} 

champ de formulaire XML -

<field name="invoice" type="file"/> 

MISE À JOUR: a travaillé après avoir ajouté les lignes suivantes, prises à partir du code @Andras Gera

$data = JRequest::getVar('jform', null, 'post', 'array'); 
$data['invoice'] = strtolower($file['name']['invoice']); 

JRequest::setVar('jform', $data); 

Répondre

7

J'ai rencontré le même problème, peut-être que nous pouvons aller de l'avant ensemble. Voici mes codes:

/administrator/components/com_comp_name/models/forms/edit.xml

<?xml version="1.0" encoding="utf-8"?> 
<form addrulepath="/administrator/components/com_gonewsletter/models/rules"> 
    <fieldset name="details"> 
     <field 
      name="id" 
      type="hidden" 
     /> 
     <field 
      name="title" 
      type="text" 
      label="COM_GONEWSLETTER_EDIT_TITLE_LABEL" 
      description="COM_GONEWSLETTER_EDIT_TITLE_DESC" 
      size="40" 
      class="inputbox" 
      required="true" 
      default="" 
     /> 
     <field 
      name="date" 
      type="calendar" 
      label="COM_GONEWSLETTER_EDIT_DATE_LABEL" 
      description="COM_GONEWSLETTER_EDIT_DATE_DESC" 
      size="40" 
      class="inputbox" 
      required="true" 
      default="" 
      format="%Y-%m-%d" 
     /> 
     <field 
      name="published" 
      type="list" 
      label="JSTATUS" 
      description="COM_GONEWSLETTER_EDIT_PUBLISHED_DESC" 
      class="inputbox" 
      size="1" 
      default="0"> 
      <option 
       value="1">JPUBLISHED</option> 
      <option 
       value="0">JUNPUBLISHED</option> 
     </field> 
     <field 
      type="file" 
      name="pdf_file" 
      label="COM_GONEWSLETTER_EDIT_FILE_LABEL" 
      default="" 
      description="COM_GONEWSLETTER_EDIT_FILE_DESC" 
      size="40" 
      accept="application/pdf" 
      class="fileuploader" 
     /> 
     <field 
      name="file" 
      type="hidden" 
     /> 
    </fieldset> 
</form> 

et /administrator/components/com_comp_name/controllers/edit.php

<?php 
// No direct access to this file 
defined('_JEXEC') or die('Restricted access'); 

// import Joomla controllerform library 
jimport('joomla.application.component.controllerform'); 

/** 
* GoNewsletter Controller 
*/ 
class GoNewsletterControllerEdit extends JControllerForm 
{ 
    function __construct($config = array()) { 
     $this->view_list = 'List'; 
     parent::__construct($config); 
    } 

    function save(){ 
     // ---------------------------- Uploading the file --------------------- 
     // Neccesary libraries and variables 
     jimport('joomla.filesystem.folder'); 
     jimport('joomla.filesystem.file'); 
     $data = JRequest::getVar('jform', null, 'post', 'array'); 

     // Create the gonewsleter folder if not exists in images folder 
     if (!JFolder::exists(JPATH_SITE . DS . "images" . DS . "gonewsletter")) { 
      JFolder::create(JPATH_SITE . DS . "images" . DS . "gonewsletter"); 
     } 

     // Get the file data array from the request. 
     $file = JRequest::getVar('jform', null, 'files', 'array'); 

     // Make the file name safe. 
     $filename = JFile::makeSafe($file['name']['pdf_file']); 

     // Move the uploaded file into a permanent location. 
     if ($filename != '') { 
      // Make sure that the full file path is safe. 
      $filepath = JPath::clean(JPATH_SITE . DS . 'images' . DS . 'gonewsletter' . DS . strtolower($filename)); 

      // Move the uploaded file. 
      JFile::upload($file['tmp_name']['pdf_file'], $filepath); 
      // Change $data['file'] value before save into the database 
      $data['file'] = strtolower($filename); 
     } 
     // ---------------------------- File Upload Ends ------------------------ 

     JRequest::setVar('jform', $data); 

     return parent::save(); 
    } 

} 

Si vous imprimez les données $ avant de les envoyer à parent :: save ($ data), elles contiennent les bons champs que vous voulez enregistrer, mais ce n'est pas le cas. J'ai essayé d'utiliser une entrée type = text au lieu de type = file et il enregistre correctement.

J'ai essayé d'une autre manière comme: input type = fichier et name = pdf_file, après j'ai ajouté un nom de champ caché = file default = "". Et puis j'ai mis cette valeur de champ caché au nom de fichier sans succès. Peut-être que je faisais quelque chose de mal. Continuez à comprendre quelque chose.

+0

Je pense que nous devrions renvoyer la donnée $ modifiée à la méthode POST, car le parent :: save() revient au système save(). D'une façon ou d'une autre, si j'ajoute $ data à save(), la fonction n'est pas bonne. Enregistre tout, mais seul le champ de fichier est vide dans la base de données. –

+0

avez-vous trouvé de toute façon de le faire? – ChamingaD

+0

Oui, c'est résolu! Merci à Irfan de mentionner la fonction setVar. Sa solution ne fonctionne pas car elle crée un autre enregistrement au lieu de placer la variable nécessaire dans le tableau jform dans le tableau $ _REQUEST. Ma solution remplace la variable jform. –

1

Vous peut utiliser php move_uploaded_file() fonction

+0

Le fichier a été enregistré avec succès sur le disque. J'ai juste besoin de stocker son nom sur la base de données après le téléchargement. – ChamingaD

1
//import joomlas filesystem functions, we will do all the filewriting with joomlas functions 
     jimport('joomla.filesystem.file'); 
     jimport('joomla.filesystem.folder'); 

     //this is the name of the field in the html form, filedata is the default name for swfupload 
    $fieldName = 'Filedata'; 

     //the name of the file in PHP's temp directory that we are going to move to our folder 
     $fileTemp = $_FILES[$fieldName]['tmp_name']; 


     //always use constants when making file paths, to avoid the possibilty of remote file inclusion 
     $uploadPath = JPATH_SITE.DS.'path'.DS.'path'.DS.$fileName; 

     if(!JFile::upload($fileTemp, $uploadPath)) 
     { 
       echo JText::_('ERROR MOVING FILE'); 
       return; 
     } 
     else 
     { 
     //Updating the db with the $fileName. 
     $db =& JFactory::getDBO(); 
     $query = $db->getQuery(true); 
     $query->update($db->nameQuote(TABLE_PREFIX.'table_name')); 
     $query->set($column.' = '.$db->quote($fileName)); 
     $query->where($db->nameQuote('id').'='.$db->quote($id));    
     $db->setQuery($query); 
     $db->query(); 
     } 

colonne $ - nom de colonne db du fichier $ fileName - nom de fichier

Query est couru si le fichier est téléchargé avec succès.

+0

Merci Dasun, Téléchargement de fichier maintenant ok. Je suis bloqué à la mise à jour de la base de données:/ – ChamingaD

+0

vérifier les modifications – Techie

+0

je l'ai fait comme vous l'avez mentionné. mais cela ne fonctionne pas:/voici la partie de sauvegarde de fichier dans mon composant - http://pastebin.com/yKiiBigu .. remplacé $ column avec $ facture qui VARCHAR dans ma table. var_dump de $ db - http: // pastebin.com/MyCdKrAB – ChamingaD

1

nom de fichier de jeu dans la variable de requête car il est maintenant un _FILES variable $

JRequest::setVar('jform[invoice]',$file['name']['invoice']); 

// code complet

class InvoiceManagerControllerInvoiceManager extends JControllerForm 
    { 
     function save(){ 
      $file = JRequest::getVar('jform', null, 'files', 'array'); 
      $path = JPATH_BASE; 

      // Make the file name safe. 
      jimport('joomla.filesystem.file'); 
      $file['name']['invoice'] = JFile::makeSafe($file['name']['invoice']); 

      // Move the uploaded file into a permanent location. 
      if (isset($file['name']['invoice'])) { 
       // Make sure that the full file path is safe. 
       $filepath = JPath::clean($path. DS ."components". DS ."com_invoicemanager". DS ."files". DS .strtolower($file['name']['invoice'])); 
       // Move the uploaded file. 
       JFile::upload($file['tmp_name']['invoice'], $filepath); 

       JRequest::setVar('jform[invoice]',$file['name']['invoice']); 
      } 



      return parent::save(); 
     } 

} 
+0

hmm ne fonctionne pas. la colonne pour le nom de fichier est toujours vide:/ – ChamingaD

+0

@ChamingaD: Est-ce que votre code télécharge le fichier? – Irfan

+0

oui il télécharge le fichier avec succès :) – ChamingaD

0

Sur joomla 3.2.x, je dois passer outre la fonction d'économie de ma classe de modèle pour enregistrer le nom de fichier téléchargé sur db, comme ceci

public function save($data){ 
    $input = JFactory::getApplication()->input;  
    $files = $input->files->get('jform'); 
    $fieldName = 'thumbnail'; 
    $data['thumbnail'] = $files[$fieldName]['name'];    
    return parent::save($data); 
} 
Questions connexes