Bestanden uploaden op verschillende pagina's van PrestaShop-Top programmeervragen en antwoorden

PrestaShop is de meest eenvoudige winkelwagen die geschikt is voor kleine bedrijven. Als u een nieuwe winkel wilt openen, zou PrestaShop uw eerste optie moeten zijn. De reden hiervoor is dat het volledig open source is en u het naar eigen inzicht kunt aanpassen.
Het onderwerp dat we vandaag hebben geselecteerd voor de vragen- en antwoordensessie is in principe een geavanceerde functionaliteit van PrestaShop en dat is Bestand uploaden optie op verschillende pagina's van PrestaShop. Als handelaar moet u soms bestanden van klanten ophalen in de vorm van PDF, Excel, video, MP3, JPEG of een ander bestandsformaat. Het is niet beter om externe cloudservers te gebruiken om bestanden op te halen.
Waarom doet u het niet via uw eigen winkelserver?
Op dezelfde manier moet u soms een bestand naar uw klanten sturen, dit kan via PrestaShop zelf en vermindert zo de behoefte aan externe services.
De post van vandaag is gericht op hetzelfde. Bij het gebruik van deze functie krijgen mensen fouten of bugs en zoeken ze naar een oplossing hiervoor. We hebben vandaag geprobeerd om alle mogelijke oplossingen voor dergelijke problemen te geven. Daarom hier de beste programmeervragen en antwoorden over de optie Bestand uploaden in PrestaShop;
Vraag nr. 1
Hallo, ik wil de uploadoptie op het contactformulier uitschakelen, zodat niemand mij de bestanden via deze optie kan sturen?
Antwoord: U kunt deze optie uitschakelen via de backoffice. Ga naar klanten>Klantenservice. Waar u de optie naar eigen keuze aan of uit kunt zetten.
Vraag nr. 2
Hallo, ik wil een invoerveld maken op het registratieformulier van de klant. Via deze velden moeten bezoekers een bestand uploaden met het bewijs dat hij recht heeft om de winkel te bezoeken. Ik wil dit bewijs controleren en vervolgens zijn registratie toestaan. Hoe is dit mogelijk?
Antwoord: U moet het registratieformulier aanpassen. U kunt het registratieformulier openen via ./themes/YOUR-THEME/authentication.tpl. Direct na het geboortedatumveld rond regel 130 moet u dit toevoegen;
<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"/>
U kunt het veld toevoegen in de klantklasse en Controllers(AdminCustomersController.php, AuthController.php, Customer.php).
Noem eerst een veld 'fileupload' waarmee u het veld declareert en aanmaakt. Laten we deze instructie uitvoeren op SQL om het veld in de klantentabel te maken om de bestandsnaam op te slaan.
ALTERTABLE`ps_customer`ADD`fileUpload` VARCHAR(100)NOTNULL;
In ./classes/Customer.php rond regel ~30 vinden we de gedeclareerde variabelen. Voeg de nieuwe toe als volgt:
classCustomerCoreextendsObjectModel
{
public $id;
public $fileUpload;
public $id_shop;
...
voeg vervolgens in regel ~192 het nieuwe veld toe als volgt:
'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'),
),
Nu, binnen ./controllers/front/AuthController.php rond regel ~379 prepare de informatie:
// Klant voorbereiden
$customer =newCustomer();
$lastnameAddress =Tools::getValue('lastname');
$firstnameAddress =Tools::getValue('firstname');
$_POST['lastname']=Tools::getValue('customer_lastname', $lastnameAddress);
$_POST['firstname']=Tools::getValue('customer_firstname', $firstnameAddress);
// Deze regel toevoegen
$fileUpload =Tools::getValue('fileUpload');
rond regel ~423 vindt u de verjaardagsvalidatie, dus u moet het validatieveld maken.
$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.');
// Voeg deze code toe...
//$customer->fileUpload = 'N/A';
// Als u de uploader OPTIONEEL wilt, verwijdert u de opmerking van de regel hierboven.
$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;
}
Op dezelfde manier, in de regel ~552, laat het er zo uitzien:
$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('Ongeldige datum van geboorte');
// Voeg deze code toe...
//$customer->fileUpload = 'N/A';
// Als u de uploader OPTIONEEL wilt, verwijdert u de opmerking van de regel hierboven.
$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;
}
Op deze manier worden de bestanden geüpload in de map ./upload/. Als u een andere submap wilt opgeven, voert u gewoon het pad in in $uploader->upload('my-path/'.$_FILES['fileUpload']);
Om de invoervelden in het registratieformulier toe te voegen, opent u ./themes/YOUR-THEME/authentication.tpl rond ~182 en ~509 direct na de verjaardagsvelden.
<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"/>
Vergeet niet het formulier te configureren om multimedia-informatie te verzenden op elke tag, zoals in de volgende code: (afhankelijk van het thema)
<formmethod="post"id="create-account_form" ... enctype="multipart/form-data">
Om de bestandsnaam in de clientlijst te tonen, opent u./controllers/admin/AdminCustomersController.php rond regel ~159 en voeg toe:
'connect'=> array(
'title'=> $this->l('Laatste bezoek'),
'type'=>'datetime',
'search'=>false,
'havingFilter'=>true
),
'fileUpload'=> array(
'title'=> $this->l('Geüpload bestand'),
'type'=>'text',
'search'=>true,
'havingFilter'=>true
)
));
In hetzelfde bestand, rond ~821:
// Verbindingen
'connections'=> $connections,
// Geüpload bestand
'fileUpload'=> $fileUpload,
// Verwijzers
'referrers'=> $referrers,
'show_toolbar'=>true
Maak de cache leeg nadat u de bestanden hebt bijgewerkt. Als u de bestanden in de Customer View wilt weergeven, moet u ./admin/themes/default/template/controllers/customers/helpers/view/view.tpl.aanpassen.plaats deze code direct na de $customer->birthday-validatie op de regels ~550 en ~420 om de uploader in AuthController.php
uit te voeren.
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;
}
Vraag nr. 3: Hallo, ik wil dat de bestelgegevens op één pagina worden afgedrukt en ik moet de optie hebben om te selecteren welk deel op de afdrukpagina moet verschijnen en welk materiaal niet. Standaard wordt er op 3 pagina's afgedrukt, wat een beetje nutteloos is.
Antwoord: Ga naar override.css in /admin/themes/default/css/override.css van waaruit u de afdrukstijl naar wens kunt wijzigen.
@media print {
p {text-indent: 10%}
}
U moet aanpassen met css-actie "display:none" met het tabblad Paypal en het andere tabblad.
Vraag nr. 4
Ik gebruik PrestaShop 1.6 en ik wil import.csv gebruiken. We hebben de afbeeldingen en tekst geïmporteerd en de optie voor het uploaden van bestanden op 1 gezet. Leg me nu uit hoe ik een PDF-bestand kan uploaden en bijvoegen als een gegevensblad met producten.
Antwoord: Voeg dus in AdminImportController.php die twee regels toe aan de lijst met velden voor productenimport (case $this->entities[$this->l('Products')])
'delete_existing_attachments'=> array('label'=> $this->l('Bestaande bijlagen verwijderen (0 = Nee, 1 = Ja)')),
'attachment'=> array('label'=> $this->l('attachment')),
Dan aan het einde van de functie productImport(), na deze regels:
else{
VoorraadBeschikbaar::setHoeveelheid((int)$product->id,0,(int)$product->hoeveelheid,(int)$this->context->winkel->id);
}
};
voeg dit toe:
// Bijlagebestanden importeren
// verwijder bestaande bijlagen als "delete_existing_attachments" is ingesteld op 1
if(isset($product->verwijder_bestaande_bijlagen))
if((bool)$product->verwijder_bestaande_bijlagen)
$product->verwijderAttachments();
$attachments = get_object_vars($product);
if(isset($attachments['bijlage'])&&!empty($attachments['bijlage']))
foreach(explode($this->meervoudige_waarde_scheidingsteken, $attachments['bijlage'])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)Bijlage::addAttachmentImport($bijlage_bestandsnaam, $bijlage_naam, $bijlage_beschrijving);
Bijlage::addAttchmentProductImport($product->id, $id_attachment);
Product::updateCacheAttachment($product->id);
}
}
Voeg in het bijlageklassebestand (classes/Attachment.php) aan het einde deze twee functies toe:
publicstaticfunction addAttachmentImport($filename, $name, $description)
{
$attachment =newAttachment();
$languages =Taal::getLanguages();
foreach($languages als $taal)
$attachment->name[$language['id_lang']]= strval($name);
$attachment->beschrijving[$language['id_lang']]= $beschrijving;
$attachment->bestand = sha1($bestandsnaam);
$attachment->bestandsnaam = $bestandsnaam;
$path_file = _PS_DOWNLOAD_DIR_.$filename;
$attachment->bestandsgrootte = bestandsgrootte($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.')
');
}
verwijder het cachebestand: /cache/class_index.php U moet uw bestanden in de map /Download plaatsen. In uw cvs-bestand kan de kolom "attachment" het volgende bevatten:
myfile1.doc|Naam van mijn bestand Of als u meerdere bestanden aan één product wilt toevoegen:
myfile1.doc|Naam van mijn bestand%myfile2.pdf| Naam van mijn bestand
Vraag nr. 5
Is er een manier om bezoekers te binden aan het uploaden van een bedrijfsdocument op de registratiepagina? Tijdens het zoeken op internet vond ik dergelijke uploadmodules die het uploaden op de bestel-, product- en winkelwagenpagina mogelijk maken, maar hoe doe ik dat bij de registratie?
Antwoord: Helaas is er al een module beschikbaar voor dit doel. U moet dus een kernwijziging doorvoeren of uw eigen module schrijven. Als u echter geen code-expert bent, neem dan contact op met een moduleontwikkelingsbedrijf.
Opmerking: Deze vragen worden beantwoord door top community-ontwikkelaars en weerspiegelen niet FME-modules.
Optie voor het uploaden van bestanden in WooCommerce:
Bestandsuploader voor WooCommerce stelt klanten in staat om bestanden rechtstreeks te uploaden op product-, winkelwagen- en afrekenpagina's, wat de aanpassing en het orderbeheer verbetert.