Come caricare file su una pagina diversa di PrestaShop - Le migliori domande e risposte di programmazione
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'} *
<inputtype="hidden"name="MAX_FILE_SIZE"value="2000000"/>
<inputtype="file"class="required form-control"id="fileUpload"name="fileUpload"/>
È 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:
classCustomerCoreextendsObjectModel
{
public $id;
public $fileUpload;
public $id_shop;
...
quindi nella riga ~192 aggiungi il nuovo campo in questo modo:
'date_add'=> array('type'=>self::TYPE_DATE,'validate'=>'isDate','copy_post'=>false),
'date_upd'=> array('type'=>self::TYPE_DATE,'validate'=>'isDate','copy_post'=>false),
'fileUpload'=> array('type'=>self::TYPE_STRING,'validate'=>'isGenericName'),
),
Ora, all'interno di ./controllers/front/AuthController.php intorno alla linea ~379 prepariamo le informazioni:
// Preparing customer
$customer =newCustomer();
$lastnameAddress =Tools::getValue('lastname');
$firstnameAddress =Tools::getValue('firstname');
$_POST['lastname']=Tools::getValue('customer_lastname', $lastnameAddress);
$_POST['firstname']=Tools::getValue('customer_firstname', $firstnameAddress);
// Add this line
$fileUpload =Tools::getValue('fileUpload');
...
intorno alla riga ~423 troverai la convalida del compleanno, quindi devi fare il campo di convalida.
$customer->firstname =Tools::ucwords($customer->firstname);
$customer->birthday =(empty($_POST['years'])?'':(int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));
if(!Validate::isBirthDate($customer->birthday))
$this->errors[]=Tools::displayError('Invalid date of birth.');
// Add this code...
//$customer->fileUpload = 'N/A';
// If you want the uploader as OPTIONAL, remove the comment of the line above.
$file = $_FILES['fileUpload'];
$allowed = array('txt','rtf','doc','docx','pdf','png','jpeg','gif','jpg');
$extension = pathinfo($file['name'], PATHINFO_EXTENSION);
if( file_exists($file['tmp_name'])&& in_array($extension, $allowed))
{
$filename = uniqid()."-".basename($file['name']);
$filename = str_replace(' ','-', $filename);
$filename = strtolower($filename);
$filename = filter_var($filename, FILTER_SANITIZE_STRING);
$file['name']= $filename;
$uploader =newUploaderCore();
$uploader->upload($file);
$customer->fileUpload = $filename;
}
Allo stesso modo, nella riga ~552, lasciandola così:
$customer->birthday =(empty($_POST['years'])?'':(int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));
if(!Validate::isBirthDate($customer->birthday))
$this->errors[]=Tools::displayError('Invalid date of birth');
// Add this code...
//$customer->fileUpload = 'N/A';
// If you want the uploader as OPTIONAL, remove the comment of the line above.
$file = $_FILES['fileUpload'];
$allowed = array('txt','rtf','doc','docx','pdf','png','jpeg','gif','jpg');
$extension = pathinfo($file['name'], PATHINFO_EXTENSION);
if( file_exists($file['tmp_name'])&& in_array($extension, $allowed))
{
$filename = uniqid()."-".basename($file['name']);
$filename = str_replace(' ','-', $filename);
$filename = strtolower($filename);
$filename = filter_var($filename, FILTER_SANITIZE_STRING);
$file['name']= $filename;
$uploader =newUploaderCore();
$uploader->upload($file);
$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.
<divclass="form-group">
<labelfor="fileUpload">{l s='Select file'} *
<inputtype="hidden"name="MAX_FILE_SIZE"value="2000000"/>
<inputtype="file"class="required form-control"id="fileUpload"name="fileUpload"/>
Non dimenticare di configurare il modulo per inviare informazioni multimediali su ogni
<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:
'connect'=> array(
'title'=> $this->l('Last visit'),
'type'=>'datetime',
'search'=>false,
'havingFilter'=>true
),
'fileUpload'=> array(
'title'=> $this->l('Uploaded File'),
'type'=>'text',
'search'=>true,
'havingFilter'=>true
)
));
Nello stesso file, circa ~821:
// Connections
'connections'=> $connections,
// Uploaded File
'fileUpload'=> $fileUpload,
// Referrers
'referrers'=> $referrers,
'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.