Come caricare file su una pagina diversa di PrestaShop - Le migliori domande e risposte di programmazione

Posted On: Sep 14, 2018

Categories:

Tags: prestashop , modulo , caricamento file

PrestaShop è il carrello della spesa più semplice che si adatta alle piccole imprese. Se stai cercando di aprire un nuovo negozio, PrestaShop dovrebbe essere la tua prima opzione. Il motivo è che è completamente open source e si può modificarlo secondo questa propria scelta.

L'argomento che abbiamo selezionato oggi per la sessione di risposte alle domande è fondamentalmente una funzionalità avanzata di PrestaShop e cioè l'opzione di caricamento dei file in diverse pagine di PrestaShop. Essendo un commerciante, a volte è necessario ottenere alcuni file dai clienti sotto forma di PDF, Excel, video, MP3, JPEG o qualsiasi altro formato di file. Non è meglio avere server di clouding di terze parti per ottenere file. Perché non farlo attraverso il tuo server del negozio? Allo stesso modo, a volte è necessario inviare un file ai propri clienti, può essere fatto tramite PrestaShop stesso e quindi riducendo la necessità di servizi esterni.

Il post di oggi si rivolge alla stessa cosa. Durante l'utilizzo di questa funzione, le persone ottengono alcuni errori o bug e cercano una soluzione per loro. Oggi abbiamo cercato di dare ogni possibile soluzione a tali problemi. Quindi dato qui Le migliori domande e risposte di programmazione sull'opzione di caricamento dei file in PrestaShop;

Domanda n. 1: Ciao, voglio disabilitare l'opzione di caricamento nel modulo di contatto in modo che nessuno possa inviarmi i file tramite questa opzione?

Risposta: È possibile disattivare questa opzione dal back office. Vai a clienti>Servizi clienti. Dove puoi attivare o disattivare l'opzione secondo la tua scelta.

Domanda n. 2: Ciao, voglio creare un campo di input sul modulo di registrazione del cliente. Attraverso questi campi, i visitatori devono caricare un file contenente la prova che ha il diritto di accedere al negozio. Voglio controllare questa prova e quindi consentire la sua registrazione. Come è possibile?

Risposta: È necessario modificare il modulo di registrazione. È possibile accedere al modulo di registrazione tramite ./themes/YOUR-THEME/authentication.tpl. Subito dopo il campo del giorno di nascita intorno alla riga 130, devi aggiungere questo;

<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>

È possibile aggiungere il file nella classe cliente e controller (AdminCustomersController.php, AuthController.php, Customer.php).

Prima di tutto, assegna un nome a un campo 'fileupload' attraverso il quale stai dichiarando e creando il campo.

Eseguiamo questa istruzione su SQL per creare il campo nella tabella del cliente per archiviare il nome del file.

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

In ./classes/Customer.php intorno alla riga ~30 troveremo le variabili dichiarate. Aggiungi quello nuovo in questo modo:

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

quindi nella riga ~192 aggiungi il nuovo campo in questo modo:

  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. ),

Ora, all'interno di ./controllers/front/AuthController.php intorno alla linea ~379 prepariamo le informazioni:

  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. ... 

intorno alla riga ~423 troverai la convalida del compleanno, quindi devi fare il campo di convalida.

  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. }

 

Allo stesso modo, nella riga ~552, lasciandola così:

  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;

In questo modo i file verranno caricati nella cartella ./upload/, se si desidera specificare un'altra sottocartella basta inserire il percorso in $uploader->upload('my-path/'.$_FILES['fileUpload']);

 

Per aggiungere i campi di input nel modulo di registrazione, apri ./themes/YOUR-THEME/authentication.tpl intorno a ~182 e ~509 subito dopo i campi di compleanno.

  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>

Non dimenticare di configurare il modulo per inviare informazioni multimediali su ogni <form>tag come il seguente codice: (dipende dal tema)

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

Per visualizzare il nome del file nell'elenco dei client, aprire ./controllers/admin/AdminCustomersController.php intorno alla riga ~159 e aggiungere:

  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. ));

Nello stesso file, circa ~821:

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

Pulire la cache dopo aver aggiornato i file.

Se si desidera mostrare i file all'interno della Customer View è necessario modificare ./admin/themes/default/template/controllers/customers/helpers/view/view.tpl

inserisci questo codice subito dopo la convalida $customer-> compleanno alle righe ~550 e ~420 per eseguire l'uploader in 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.

Risposta: Vai a override.css in /admin/themes/default/css/override.css da dove puoi cambiare lo stile di stampa secondo necessità.

@media print {

 p {text-indent: 10%}

}

È necessario adjest con l'azione css "display: none" con PayPal scheda e altra scheda.

Domanda n. 4: Sto usando PrestaShop 1.6 e voglio fare uso di import.csv. Abbiamo importato le immagini e il testo e impostato l'opzione di caricamento del file su 1. Ora guidami su come caricare e allegare un file PDF come scheda tecnica con i prodotti.

Risposta: Quindi, nell'adminImportController.php, aggiungi quelle due righe nell'elenco dei campi per l'importazione dei prodotti (caso $this->entities[$this->l('Prodotti')])

'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);

                        }

                    

                    }

 

Nel file di classe attachment (classes/Attachment.php)

aggiungi alla fine queste due funzioni:

          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.')

        ');

 

    }

eliminare il file di cache: /cache/class_index.php

 

È necessario inserire i file nella cartella /Download.

Nel tuo file cvs, la colonna "allegato" potrebbe contenere questo:
myfile1.doc| Nome del mio file

Oppure, se si desidera allegare più file a un prodotto:

myfile1.doc| Nome del mio file%myfile2.pdf| Nome del mio file

Domanda n. 5: C'è un modo per vincolere i visitatori a caricare un documento aziendale sulla pagina di registrazione. Durante la ricerca su internet, ho trovato tali moduli di caricamento lì che consente il caricamento su ordine, prodotto e pagina del carrello, ma come farlo al momento della registrazione?

Risposta: Purtroppo, c'è già un modulo disponibile per questo scopo. Quindi è necessario apportare una modifica di base o scrivere il proprio modulo. Tuttavia, se non sei un esperto di codice, contatta qualche società di sviluppo di moduli.

Nota: queste domande trovano risposta dai principali sviluppatori della community e non riflettono FMEModules.