web-dev-qa-db-fra.com

Comment enregistrer une image dans le dossier spécifié du répertoire joomla et enregistrer le nom du fichier dans la base de données

Je travaille sur un composant personnalisé où, à l’interface dorsale, nous souhaitons que l’administrateur puisse télécharger une image et la laisser enregistrer directement dans un dossier spécifié -/images/uploads/variants/et également enregistrer le nom du fichier, par exemple. - 1327171407s_Rubytoys.jpg dans la colonne "colonne" - v_small_img

ce que nous avons fait à l'heure actuelle Dans le répertoire chemin /administrator/component/models/form/variant.xml, le champ est défini avec les autres champs du fichier variant.xml

 <field name="v_name" type="text" label="Variant" description="COM_NEWTOY_FORM_DESC_VARIANT_V_NAME" hint="COM_NEWTOY_FORM_LBL_VARIANT_V_NAME"/>
 <field name="v_descr" type="editor" filter="safehtml" label="COM_NEWTOY_FORM_LBL_VARIANT_V_DESCR" description="COM_NEWTOY_FORM_DESC_VARIANT_V_DESCR" hint="COM_NEWTOY_FORM_LBL_VARIANT_V_DESCR"/>
 <field name="v_price" type="text" label="Price" description="COM_NEWTOY_FORM_DESC_VARIANT_V_PRICE" hint="COM_NEWTOY_FORM_LBL_VARIANT_V_PRICE"/>    
 <field name="v_small_img" type="file" label="COM_NEWTOY_FORM_LBL_VARIANT_V_SMALL_IMG" description="COM_NEWTOY_FORM_DESC_VARIANT_V_SMALL_IMG" hint="COM_NEWCAR_FORM_LBL_VARIANT_V_SMALL_IMG"/>

Le champ v_small_img affiche un bouton de téléchargement. Mais je ne sais pas:

  1. Comment définir le chemin du fichier de téléchargement à enregistrer dans - public_html/images/uploads/variants /

  2. Comment enregistrer le nom de fichier uniquement dans la base de données - v_small_img (seul le nom de fichier doit être enregistré, pas le fichier car il doit être chargé dans un répertoire séparé -/images/uploads/variants /)

J'ai essayé de modifier la fonction de sauvegarde dans le fichier controller/variants.php, mais cela ne m'aide pas non plus.

    public function saveOrderAjax()
{
    // Get the input
    $input = JFactory::getApplication()->input;
    $pks   = $input->post->get('cid', array(), 'array');
    $order = $input->post->get('order', array(), 'array');

    $files = $input->files->get('jform');
    $file = $files['image'];
    $filename = JFile::makeSafe($file['name']);
    $src = $file['tmp_name'];
    $dest = JPATH_SITE."images/uploads/variants/".$filename;
    if (JFile::upload($src, $dest)) {
        $thisID = JRequest::getVar('id');
        $db = JFactory::getDbo();
        $query = $db->getQuery(true);
        $v_small_img = array($db->quoteName('image') . " = " . $db->quote($filename));
        $conditions = array($db->quoteName('id') . " = " . $thisID);
        $query->update($db->quoteName('#__NEWTOY_variants'))->set($v_small_img)->where($conditions);
        $db->setQuery($query);
        $db->execute($query);
    } else {
          //Redirect and throw an error message
    }


    // Sanitize the input
    ArrayHelper::toInteger($pks);
    ArrayHelper::toInteger($order);

    // Get the model
    $model = $this->getModel();

    // Save the ordering
    $return = $model->saveorder($pks, $order);



    if ($return)
    {
        echo "1";
    }

    // Close the application
    JFactory::getApplication()->close();
}
3
Ruchika

Vous pouvez étendre la méthode save () pour obtenir cette fonctionnalité:

public function save($data = array(), $key = 'id')
{
    // Neccesary libraries and variables
    jimport('joomla.filesystem.file');

    //Debugging 
    ini_set("display_error" , 1);
    error_reporting(E_ALL);

    // Get input object
    $jinput = JFactory::getApplication()->input;

    // Get posted data
    $data  = $jinput->get('jform', null, 'raw');
    $file  = $jinput->files->get('jform');

    // renaming the file 
    $file_ext=strtolower(end(explode('.',JFile::makeSafe($file['pdf_file_path']['name']))));
    $filename = round(microtime(true)) . '.' . $file_ext;
    // Move the uploaded file into a permanent location.
    if ( $filename != '' ) {

        // Make sure that the full file path is safe.
        $filepath = JPath::clean( JPATH_ROOT."/images/uploads/variants/". $filename );

        // Move the uploaded file.
        if (JFile::upload( $file['pdf_file_path']['tmp_name'], $filepath )) {
              //DB save method
        } else {              
              //Error Reporting
        }        
    }

    JRequest::setVar('jform', $data, 'post');
    $return = parent::save($data);
    return $return;
}

j'espère que ça va aider

1
Joomler

Pour moi, cela semble être presque une copie un à une du backend "liste des éléments/modifier un élément" vues de com_banners. Sauf que vous souhaitez télécharger une image au lieu d'utiliser le gestionnaire de médias interne.

  1. Créez ces 2 vues et les tâches et méthodes nécessaires avec le champ d'image sous forme de champ de texte normal.
  2. Lorsque cela fonctionne comme vous le souhaitez, vous ajoutez le téléchargement d'image.
  3. La partie la plus difficile consiste à vérifier le fichier physique téléchargé. (Ne vous fiez pas aux en-têtes ou autres informations) - erreurs, - taille min et max en octets et pixels, - types MIME autorisés. Soyez conscient de tout problème de dénomination de fichier (caractères autorisés et conflits).
  4. Si tout va bien, déplacez le fichier dans le bon dossier, ajoutez le nom du fichier à l'enregistrement db et insérez-le.
  5. Désinfecter l'image? Les pouces?
  6. Découvrez comment vous souhaitez gérer les modifications et les suppressions des enregistrements de la base de données. Garder ou supprimer les images?
  7. Vous aurez probablement besoin de certains utilitaires pour vérifier la corrélation entre la table de la base de données et les fichiers d’images physiques dans un avenir proche, s’il s’agit de plus de quelques images.

N'ajoutez aucune fonctionnalité Ajax jusqu'à ce que cela fonctionne à 100%.

Vous pouvez utiliser les méthodes de la classe Joomlas JImage.

1
schnuti