So laden Sie Dateien auf verschiedene Seiten von PrestaShop hoch-Top-Fragen und Antworten zur Programmierung

Posted On: Sep 14, 2018

Categories:

Tags: Datei-Upload , Dateien hochladen , Medien hochladen

PrestaShop ist der einfachste Einkaufswagen, der für kleine Unternehmen geeignet ist. Wenn Sie einen neuen Shop eröffnen möchten, sollte PrestaShop Ihre erste Wahl sein. Der Grund dafür ist, dass es vollständig Open Source ist und man es nach eigenem Ermessen ändern kann.

Das Thema, das wir heute für die Frage-Antwort-Sitzung ausgewählt haben, ist im Grunde eine erweiterte Funktion von PrestaShop, und zwar die Option Datei-Upload auf verschiedenen Seiten von PrestaShop. Als Händler müssen Sie manchmal Dateien von Kunden in Form von PDF, Excel, Video, MP3, JPEG oder einem anderen Dateiformat erhalten. Es ist nicht besser, Cloud-Server von Drittanbietern zu verwenden, um Dateien abzurufen.

Warum erledigen Sie dies nicht über Ihren eigenen Shop-Server?

Ebenso müssen Sie manchmal eine Datei an Ihre Kunden senden. Dies kann über PrestaShop selbst erfolgen und macht so externe Dienste überflüssig.

Der heutige Beitrag zielt auf dasselbe ab. Bei der Verwendung dieser Funktion treten Fehler oder Bugs auf und man sucht nach einer Lösung dafür. Wir haben heute versucht, alle möglichen Lösungen für solche Probleme zu finden. Hier finden Sie die wichtigsten Programmierfragen und -antworten zur Datei-Upload-Option in PrestaShop;

Frage Nr. 1

Hallo, ich möchte die Upload-Option im Kontaktformular deaktivieren, damit mir niemand über diese Option Dateien senden kann?

Antwort: Sie können diese Option im Backoffice deaktivieren. Gehen Sie zu Kunden>Kundenservice. Hier können Sie die Option nach Belieben ein- oder ausschalten.

Frage Nr. 2

Hallo, ich möchte ein Eingabefeld im Kundenregistrierungsformular erstellen. Über dieses Feld müssen Besucher eine Datei hochladen, die den Nachweis enthält, dass sie das Recht haben, auf den Shop zuzugreifen. Ich möchte diesen Nachweis prüfen und dann seine Registrierung zulassen. Wie ist das möglich?

Antwort: Sie müssen das Registrierungsformular ändern. Sie können über ./themes/IHR-THEME/authentication.tpl auf das Registrierungsformular zugreifen. Direkt nach dem Feld für den Geburtstag in Zeile 130 müssen Sie Folgendes hinzufügen:

<divclass="form-group">

    <labelfor="fileUpload">{l s='Datei auswählen'} *

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

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

Sie können das Feld in der Kundenklasse und in den Controllern (AdminCustomersController.php, AuthController.php, Customer.php) hinzufügen.

Nennen Sie zunächst ein Feld „fileupload“, über das Sie das Feld deklarieren und erstellen. Lassen Sie uns diese Anweisung in SQL ausführen, um das Feld in der Kundentabelle zum Speichern des Dateinamens zu erstellen.

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

In ./classes/Customer.php finden wir ungefähr in Zeile ~30 die deklarierten Variablen. Fügen Sie das neue Feld wie folgt hinzu:

classCustomerCoreextendsObjectModel

{

public $id;

public $fileUpload;

public $id_shop;

...

fügen Sie dann in Zeile ~192 das neue Feld wie folgt hinzu:

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

),

Jetzt führen wir in ./controllers/front/AuthController.php um Zeile ~379 herum vorInformationen zusammenfassen:

// Kunde wird vorbereitet

$customer =newCustomer();

$lastnameAddress =Tools::getValue('lastname');

$firstnameAddress =Tools::getValue('firstname');

$_POST['lastname']=Tools::getValue('customer_lastname', $lastnameAddress);

$_POST['firstname']=Tools::getValue('customer_firstname', $firstnameAddress);

// Diese Zeile hinzufügen

$fileUpload =Tools::getValue('fileUpload');

Ungefähr in Zeile ~423 finden Sie die Geburtstagsvalidierung, Sie müssen also das Validierungsfeld erstellen.

$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('Ungültiges Geburtsdatum.');

// Fügen Sie diesen Code hinzu...

//$customer->fileUpload = 'N/A';

// Wenn Sie den Uploader OPTIONAL haben möchten, entfernen Sie den Kommentar der Zeile oben.

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

}

Genau so, in Zeile ~552, und so belassen:

$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('Ungültiges Geburtsdatum');

// Fügen Sie dies hinzu Code...

//$customer->fileUpload = 'N/A';

// Wenn Sie den Uploader OPTIONAL haben möchten, entfernen Sie den Kommentar in der Zeile oben.

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

Auf diese Weise werden die Dateien in den Ordner ./upload/ hochgeladen. Wenn Sie einen anderen Unterordner angeben möchten, fügen Sie den Pfad einfach in $uploader->upload('my-path/'.$_FILES['fileUpload']);

Um die Eingabefelder im Registrierungsformular hinzuzufügen, öffnen Sie ./themes/IHR-THEME/authentication.tpl bei ~182 und ~509 direkt nach den Geburtstagsfeldern.

<divclass="form-group">

    <labelfor="fileUpload">{l s='Datei auswählen'} *

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

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

Vergessen Sie nicht, das Formular so zu konfigurieren, dass es Multimedia-Informationen zu jedem Tag sendet, wie im folgenden Code: (je nach Thema)

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

Um den Dateinamen in der Clientliste anzuzeigen, öffnen Sie./controllers/admin/AdminCustomersController.php um Zeile ~159 herum und füge hinzu:

'connect'=> array(

        'title'=> $this->l('Letzter Besuch'),

        'type'=>'datetime',

        'search'=>false,

        'havingFilter'=>true

),

'fileUpload'=> array(

        'title'=> $this->l('Hochgeladene Datei'),

        'type'=>'text',

        'search'=>true,

        'havingFilter'=>true

)

));

In derselben Datei, ungefähr ~821:

// Verbindungen

'connections'=> $connections,

// Hochgeladene Datei

'fileUpload'=> $fileUpload,

// Referrer

'referrers'=> $referrers,

'show_toolbar'=>true

Leeren Sie den Cache, nachdem Sie die Dateien aktualisiert haben. Wenn Sie die Dateien in der Kundenansicht anzeigen möchten, müssen Sie ./admin/themes/default/template/controllers/customers/helpers/view/view.tpl. ändern. Fügen Sie diesen Code direkt nach der $customer->birthday Validierung in den Zeilen ~550 und ~420 ein, um den Uploader in AuthController.php

auszuführen.

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;

}

Frage Nr. 3: Hallo, ich möchte, dass die Bestellinformationen auf einer einzigen Seite gedruckt werden und ich sollte die Möglichkeit haben, auszuwählen, welcher Teil auf der Druckseite erscheinen soll und welcher nicht. Standardmäßig wird auf 3 Seiten gedruckt, was ein bisschen nutzlos ist.

Antwort: Gehen Sie zu override.css in /admin/themes/default/css/override.css, wo Sie den Druckstil nach Bedarf ändern können. 

@media print {

 p {text-indent: 10%}

}

Sie müssen die CSS-Aktion „display:none“ mit der Registerkarte „PayPal“ und der anderen Registerkarte anpassen.

Frage Nr. 4

Ich verwende PrestaShop 1.6 und möchte import.csv nutzen. Wir haben die Bilder und den Text importiert und die Option zum Hochladen der Datei auf 1 gesetzt. Jetzt zeigen Sie mir, wie ich eine PDF-Datei als Datenblatt mit Produkten hochladen und anhängen kann.

Antwort: Fügen Sie also in AdminImportController.php diese beiden Zeilen in die Feldliste für den Produktimport ein (Fall $this->entities[$this->l('Products')])

'delete_existing_attachments'=> array('label'=> $this->l('Vorhandene Anhänge löschen (0 = Nein, 1 = Ja)')),

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

Dann am Ende der Funktion productImport(), nach diesen Zeilen:

else{

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

                     }

                };

Fügen Sie Folgendes hinzu:

 //Anhangdateien importieren     

        //Vorhandene Anhänge löschen, wenn „delete_existing_attachments“ auf 1 gesetzt ist

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

                        }

                    

                    }

 

 Fügen Sie in der Anhangsklassendatei (classes/Attachment.php) am Ende diese beiden Funktionen hinzu:

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

    {

            $attachment =newAttachment();

            

            $languages ​​=Sprache::getLanguages();

            foreach($sprachen als $sprache)

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

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

 

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

            $attachment->file_name = $filename;

            

            $Pfaddatei = _PS_DOWNLOAD_DIR_.$Dateiname;

            $attachment->file_size = Dateigröße($Pfaddatei);

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

');

    }

Löschen Sie die Cache-Datei: /cache/class_index.php. Sie müssen Ihre Dateien im Ordner /Download ablegen. In Ihrer CVS-Datei könnte die Spalte „Anhang“ Folgendes enthalten:

myfile1.doc|Name meiner Datei Oder wenn Sie mehrere Dateien an ein Produkt anhängen möchten:

myfile1.doc|Name meiner Datei%myfile2.pdf| Name meiner Datei

Frage Nr. 5

Gibt es eine Möglichkeit, die Besucher dazu zu zwingen, auf der Registrierungsseite ein Firmendokument hochzuladen? Beim Suchen im Internet habe ich solche Upload-Module gefunden, die das Hochladen auf Bestell-, Produkt- und Warenkorbseiten ermöglichen, aber wie funktioniert das bei der Registrierung?

Antwort: Leider gibt es für diesen Zweck bereits ein verfügbares Modul. Sie müssen also eine Kernänderung vornehmen oder Ihr eigenes Modul schreiben. Wenn Sie jedoch kein Code-Experte sind, wenden Sie sich an eine Modulentwicklungsfirma.

Hinweis: Diese Fragen werden von den besten Entwicklern der Community beantwortet und spiegeln nicht FME-Module wider.

Datei-Upload-Option in WooCommerce:

Datei-Uploader für WooCommerce ermöglicht Kunden das Hochladen von Dateien direkt auf Produkt-, Warenkorb- und Checkout-Seiten, was die Anpassung und Auftragsverwaltung verbessert.