2017-09-26 5 views
1

Pour mon composant backend, j'ai besoin de télécharger l'image pour mes articles. Tout fonctionne très bien, j'ajouter le champ pour l'image:Joomla définit la valeur du champ `file` après l'enregistrement

<field 
    type="file" 
    name="category_image" 
    accept="image/*" 
    label="COM_SKYCATALOG_ITEM_CATEGORY_IMAGE_LABEL" 
    directory="" 
    preview="false" 
/> 

puis mettre à jour la méthode save() pour contrôler le téléchargement:

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

$fileinfo =pathinfo($files['category_image']['name']); 

$ext = $fileinfo['extension']; 
$filename = time().".$ext";  

$tmp_file = $files['category_image']['tmp_name']; 

$dest = "../media/com_xxxxx/upload/".$filename; 

if (JFile::upload($tmp_file, $dest)) { 
     // successed :) 
} else {    
    // failed :(
echo "FAAAIL!!!"; 
die(); 
}   

Lorsque je choisis le fichier et enregistrer l'article, le fichier téléchargé dans le dossier, mais la catégorie Le champ d'image est vide. Et aussi le champ pour category_image dans la table mysql n'a pas été mis à jour, mais quand j'utilise le type de champ media cela fonctionne très bien.

Qu'est-ce qui est erroné ici?

Je n'ai pas aimé que le gestionnaire de médias ralentisse pour travailler avec.

+1

Ok, je trouve une solution partielle - https://stackoverflow.com/questions/12927464/how-to-save-uploaded-files-name-on-database maintenant il enregistre dans le nom de fichier téléchargé db, mais n'a pas encore le charger quand j'ouvre l'article –

Répondre

1

Je parviens à résoudre ce problème. Vous ne pouvez pas définir la valeur de input tag avec le type file, pour des raisons de sécurité. Je veux dire que vous pouvez définir l'attribut value mais le champ sera affiché en blanc.

Je viens donc de créer un champ personnalisé comme celui-ci:

class JFormFieldSkyupload extends JFormField 
{ 
    /** 
    * The field type. 
    * 
    * @var   string 
    */ 
    protected $type = 'Skyupload'; 

    /** 
    * Method to get a list of options for a list input. 
    * 
    * @return array An array of JHtml options. 
    */ 
    public function getInput() { 
     return '<div class="filename_labe">'.$this->value.'</div><input name="'.$this->name.'" id="'.$this->id.'" accept="image/*" aria-invalid="false" type="file" value="'.$this->value.'">'; 
     // code that returns HTML that will be shown as the form field 
    } 

} 

Et aussi je fait quelques changements dans le code de téléchargement, même si aucun nouveau fichier sélectionné je suis en mesure d'enregistrer sous forme sans erreur:

if ($files['category_image']['name']!="") 
{ 
    $fileinfo =pathinfo($files['category_image']['name']); 

    $ext = JFile::getExt($files['category_image']['name']); 
    $filename = time().".$ext"; 

    $tmp_file = $files['category_image']['tmp_name']; 

    $dest = "../media/com_skycatalog/upload/".$filename; 

    if (JFile::upload($tmp_file, $dest)) { 
    // successed :) 
    } else {     
    // failed :(
    echo "FAAAIL!!!"; 
    die();  
    }   

$data = JRequest::getVar('jform', null, 'post', 'array'); 
$data['category_image'] = strtolower($filename); 
JRequest::setVar('jform', $data); 

}

maintenant, il mettra à jour le nom du fichier dans DB uniquement si je télécharger nouveau fichier.