Comment télécharger des fichiers sur différentes pages de PrestaShop - Principales questions et réponses sur la programmation

PrestaShop est le panier d’achat le plus simple qui convient aux petites entreprises. Si vous cherchez à ouvrir une nouvelle boutique, PrestaShop devrait être votre première option. La raison en est qu’il est entièrement open source et que l’on peut le modifier en fonction de ce propre choix.

Le sujet que nous avons sélectionné aujourd’hui pour la session de réponses aux questions est essentiellement une fonctionnalité avancée de PrestaShop et c’est l’option de téléchargement de fichiers sur différentes pages de PrestaShop. En tant que commerçant, vous devez parfois obtenir des fichiers de clients sous forme de PDF, Excel, vidéo, MP3, JPEG ou tout autre format de fichier. Il n’est pas préférable d’avoir des serveurs de clouding tiers pour obtenir des fichiers. Pourquoi ne pas le faire via votre propre serveur de boutique? De même, vous devez parfois envoyer un fichier à vos clients, cela peut être fait via PrestaShop lui-même et donc réduire le besoin de services externes.

Le post d’aujourd’hui cible la même chose. En utilisant cette fonctionnalité, les gens obtiennent des erreurs ou des bogues et ils cherchent une solution pour eux. Nous avons essayé aujourd’hui de donner toutes les solutions possibles à ces problèmes. Donc, donné ici Top Questions et réponses de programmation sur l’option de téléchargement de fichiers dans PrestaShop;

Question n°1: Bonjour, je souhaite désactiver l’option de téléchargement sur le formulaire de contact afin que personne ne puisse m’envoyer les fichiers via cette option ?

Réponse: Vous pouvez désactiver cette option à partir du back-office. Accédez à Clients>Services à la clientèle. Où vous pouvez activer ou désactiver l’option selon votre choix.

Question n°2: Bonjour, je souhaite créer un champ de saisie sur le formulaire d’inscription client. Grâce à ces champs, les visiteurs doivent télécharger un fichier contenant la preuve qu’il a le droit d’accéder au magasin. Je souhaite vérifier cette preuve puis permettre son inscription. Comment est-ce possible?

Réponse: Vous devez modifier le formulaire d’inscription. Vous pouvez accéder au formulaire d’inscription via ./themes/YOUR-THEME/authentication.tpl. Juste après le champ du jour de naissance autour de la ligne 130, vous devez ajouter ceci;

<divclass="form-group">

    <labelfor="fileUpload">{l s='Select file'} <sup>*</sup></label>

    <inputtype="hidden"name="MAX_FILE_SIZE"value="2000000"/>

    <inputtype="file"class="required form-control"id="fileUpload"name="fileUpload"/>

</div>

Vous pouvez ajouter le classé dans la classe client et les contrôleurs (AdminCustomersController.php, AuthController.php, Customer.php).

Tout d’abord, nommez un champ 'fileupload' à travers lequel vous déclarez et créez le champ.

Exécuteons cette instruction sur SQL pour créer le champ dans la table customer afin de stocker le nom de fichier.

ALTERTABLE’ps_customer’ADD’fileUpload' VARCHAR(100)NOTNULL;

Dans ./classes/Customer.php autour de la ligne ~30, nous trouverons les variables déclarées. Ajoutez le nouveau comme ceci:

  1. classCustomerCoreextendsObjectModel
  2. {
  3. public $id;
  4. public $fileUpload;
  5. public $id_shop;
  6. ...

puis à la ligne ~192 ajouter le nouveau champ comme ceci:

  1. 'date_add'=> array('type'=>self::TYPE_DATE,'validate'=>'isDate','copy_post'=>false),
  2. 'date_upd'=> array('type'=>self::TYPE_DATE,'validate'=>'isDate','copy_post'=>false),
  3. 'fileUpload'=> array('type'=>self::TYPE_STRING,'validate'=>'isGenericName'),
  4. ),

Maintenant, à l’intérieur de ./controllers/front/AuthController.php autour de la ligne ~379, nous préparons les informations:

  1. // Preparing customer
  2. $customer =newCustomer();
  3. $lastnameAddress =Tools::getValue('lastname');
  4. $firstnameAddress =Tools::getValue('firstname');
  5. $_POST['lastname']=Tools::getValue('customer_lastname', $lastnameAddress);
  6. $_POST['firstname']=Tools::getValue('customer_firstname', $firstnameAddress);
  7.  
  8. // Add this line
  9. $fileUpload =Tools::getValue('fileUpload');
  10.  
  11. ... 

autour de la ligne ~423, vous trouverez la validation d’anniversaire, vous devez donc créer le champ de validation.

  1. $customer->firstname =Tools::ucwords($customer->firstname);
  2. $customer->birthday =(empty($_POST['years'])?'':(int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));
  3. if(!Validate::isBirthDate($customer->birthday))
  4.     $this->errors[]=Tools::displayError('Invalid date of birth.');
  5.  
  6. // Add this code...
  7. //$customer->fileUpload = 'N/A';
  8. // If you want the uploader as OPTIONAL, remove the comment of the line above.
  9. $file = $_FILES['fileUpload'];
  10. $allowed = array('txt','rtf','doc','docx','pdf','png','jpeg','gif','jpg');
  11. $extension = pathinfo($file['name'], PATHINFO_EXTENSION);
  12. if( file_exists($file['tmp_name'])&& in_array($extension, $allowed))
  13. {
  14. $filename = uniqid()."-".basename($file['name']);
  15. $filename = str_replace(' ','-', $filename);
  16. $filename = strtolower($filename);
  17. $filename = filter_var($filename, FILTER_SANITIZE_STRING);
  18.  
  19. $file['name']= $filename;
  20.  
  21. $uploader =newUploaderCore();
  22. $uploader->upload($file);
  23.  
  24. $customer->fileUpload = $filename;
  25. }

 

De la même manière, dans la ligne ~552, en le laissant comme ceci:

  1. $customer->birthday =(empty($_POST['years'])?'':(int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));
  2. if(!Validate::isBirthDate($customer->birthday))
  3.                $this->errors[]=Tools::displayError('Invalid date of birth');
  4.  
  5. // Add this code...
  6. //$customer->fileUpload = 'N/A';
  7. // If you want the uploader as OPTIONAL, remove the comment of the line above.
  8. $file = $_FILES['fileUpload'];
  9. $allowed = array('txt','rtf','doc','docx','pdf','png','jpeg','gif','jpg');
  10. $extension = pathinfo($file['name'], PATHINFO_EXTENSION);
  11. if( file_exists($file['tmp_name'])&& in_array($extension, $allowed))
  12. {
  13. $filename = uniqid()."-".basename($file['name']);
  14. $filename = str_replace(' ','-', $filename);
  15. $filename = strtolower($filename);
  16. $filename = filter_var($filename, FILTER_SANITIZE_STRING);
  17.  
  18. $file['name']= $filename;
  19.  
  20. $uploader =newUploaderCore();
  21. $uploader->upload($file);
  22.  
  23. $customer->fileUpload = $filename;

De cette façon, les fichiers seront téléchargés dans le dossier ./upload/, si vous souhaitez spécifier un autre sous-dossier, insérez simplement le chemin d’accès dans $uploader->upload('my-path/'.$_FILES['fileUpload']);

 

Pour ajouter les champs de saisie dans le formulaire d’inscription, ouvrez ./themes/YOUR-THEME/authentication.tpl autour de ~182 et ~509 juste après les champs d’anniversaire.

  1. <divclass="form-group">
  2.     <labelfor="fileUpload">{l s='Select file'} <sup>*</sup></label>
  3.     <inputtype="hidden"name="MAX_FILE_SIZE"value="2000000"/>
  4.     <inputtype="file"class="required form-control"id="fileUpload"name="fileUpload"/>
  5. </div>

N’oubliez pas de configurer le formulaire pour envoyer des informations multimédias sur chaque <form>tags comme le code suivant : (dépend du thème)

  1. <formmethod="post"id="create-account_form" ... enctype="multipart/form-data">

Pour afficher le nom de fichier dans la liste des clients, ouvrez ./controllers/admin/AdminCustomersController.php autour de la ligne ~159 et ajoutez :

  1. 'connect'=> array(
  2.         'title'=> $this->l('Last visit'),
  3.         'type'=>'datetime',
  4.         'search'=>false,
  5.         'havingFilter'=>true
  6. ),
  7. 'fileUpload'=> array(
  8.         'title'=> $this->l('Uploaded File'),
  9.         'type'=>'text',
  10.         'search'=>true,
  11.         'havingFilter'=>true
  12. )
  13. ));

Dans le même fichier, autour de ~821 :

  1. // Connections
  2. 'connections'=> $connections,
  3. // Uploaded File
  4. 'fileUpload'=> $fileUpload,
  5. // Referrers
  6. 'referrers'=> $referrers,
  7. 'show_toolbar'=>true

Nettoyez le cache après la mise à jour des fichiers.

Si vous souhaitez afficher les fichiers dans la vue client, vous devez modifier ./admin/themes/default/template/controllers/customers/helpers/view/view.tpl

placez ce code juste après la validation $customer->birthday aux lignes ~550 et ~420 pour exécuter le téléchargeur dans AuthController.php

if(isset($_FILES['fileUpload']['name'])&&!empty($_FILES['fileUpload']['name'])&&!empty($_FILES['fileUpload']['tmp_name']))

{

      $extension = array('.txt','.rtf','.doc','.docx','.pdf','.png','.jpeg','.gif','.jpg');

      $filename = uniqid().basename($_FILES['fileUpload']['name']);

      $filename = str_replace(' ','-', $filename);

      $filename = strtolower($filename);

      $filename = filter_var($filename, FILTER_SANITIZE_STRING);

 

      $_FILES['fileUpload']['name']= $filename;

 

      $uploader =newUploaderCore();

      $uploader->upload($_FILES['fileUpload']);

 

      $customer->fileUpload = $filename;

}

Question No. 3: Hi, I want that the order information will be printed on a single page and I should have option to select which part should appear on print page and which material not. By default, it prints on 3 pages which is a bit useless.

Réponse: Accédez à override.css dans /admin/themes/default/css/override.css à partir duquel vous pouvez modifier le style d’impression si nécessaire.

@media print {

 p {text-indent: 10%}

}

Vous devez adjest avec l’action css « display: none » avec PayPal onglet et autre onglet.

Question n°4: J’utilise PrestaShop 1.6 et je souhaite utiliser import.csv. Nous avons importé les images et le texte et défini l’option de téléchargement de fichier sur 1. Maintenant, guidez-moi sur la façon de télécharger et de joindre un fichier PDF sous forme de fiche technique avec des produits.

Réponse: Donc, dans le .php AdminImportController, ajoutez ces deux lignes dans la liste des champs pour l’importation de produits (cas $this->entities[$this->l('Products')])

'delete_existing_attachments'=> array('label'=> $this->l('Delete existing attachments (0 = No, 1 = Yes)')),

'attachment'=> array('label'=> $this->l('attachment')),

Then at the end of the function productImport(), after those lines:

else{

                        StockAvailable::setQuantity((int)$product->id,0,(int)$product->quantity,(int)$this->context->shop->id);

                    }

                };

add this:

 // Attachment files import

                

        //delete existing attachments if "delete_existing_attachments" is set to 1

                if(isset($product->delete_existing_attachments))

                    if((bool)$product->delete_existing_attachments)

                        $product->deleteAttachments();

                

                

                $attachments = get_object_vars($product);

 

                if(isset($attachments['attachment'])&&!empty($attachments['attachment']))

                    foreach(explode($this->multiple_value_separator, $attachments['attachment'])as $single_attachment)

                    {

                    

                        $tab_attachment = explode('|', $single_attachment);

                        $attachment_filename = isset($tab_attachment[0])? $tab_attachment[0]:'';

                        $attachment_name = isset($tab_attachment[1])? trim($tab_attachment[1]): $attachment_filename ;

                        $attachment_description = isset($tab_attachment[2])? trim($tab_attachment[2]):'';

 

                        if(!empty($attachment_filename))

                        {

                            $id_attachment =(int)Attachment::addAttachmentImport($attachment_filename, $attachment_name, $attachment_description);

 

                            Attachment::addAttchmentProductImport($product->id, $id_attachment);

                            Product::updateCacheAttachment($product->id);

                        }

                    

                    }

 

Dans le fichier de classe de pièce jointe (classes/Pièce jointe.php)

ajoutez à la fin ces deux fonctions :

          publicstaticfunction addAttachmentImport($filename, $name, $description)

    {

            $attachment =newAttachment();

            

            $languages =Language::getLanguages();

            foreach($languages as $language)

            $attachment->name[$language['id_lang']]= strval($name);

            $attachment->description[$language['id_lang']]= $description;

 

            $attachment->file = sha1($filename);

            $attachment->file_name = $filename;

            

            $path_file = _PS_DOWNLOAD_DIR_.$filename;

            $attachment->file_size = filesize($path_file);

 

            $finfo = finfo_open(FILEINFO_MIME_TYPE);

            $attachment->mime = finfo_file($finfo, $path_file);

 

            $attachment->addAttachment();

 

            return(int)$attachment->id;        

    }

    

    

    publicstaticfunction addAttchmentProductImport($id_product, $id_attachment)

    {

        returnDb::getInstance()->execute('

            INSERT INTO `'._DB_PREFIX_.'product_attachment` (`id_attachment`, `id_product`)

            VALUES ('.(int)$id_attachment.', '.(int)$id_product.')

        ');

 

    }

supprimer le fichier cache : /cache/class_index.php

 

Vous devez placer vos fichiers dans le dossier /Download.

Dans votre fichier cvs, la colonne « pièce jointe » peut contenir ceci :
monfichier1.doc| Nom de mon fichier

Ou si vous souhaitez joindre plusieurs fichiers à un produit :

monfichier1.doc| Nom de mon fichier%monfichier2.pdf| Nom de mon fichier

Question n° 5: Existe-t-il un moyen de lier les visiteurs à télécharger un document d’entreprise sur la page d’inscription? En cherchant sur Internet, j’y ai trouvé de tels modules de téléchargement qui permettent de télécharger sur la page de commande, de produit et de panier, mais comment le faire lors de l’inscription?

Réponse: Malheureusement, il existe déjà un module disponible à cet effet. Vous devez donc faire une modification de base ou écrire votre propre module. Cependant, si vous n’êtes pas un expert en code, contactez une société de développement de modules.

Remarque : Les meilleurs développeurs de la communauté répondent à ces questions et ne reflètent pas FMEModules.