Top-Fragen und Antworten zum PrestaShop-Produktanpassungsmodul

Posted On: Sep 14, 2018

Categories:

Tags: Produktanpassung , Produktdesigner , Prestashop-Designermodul

In einer Zeit, in der der Markt sehr hart umkämpft ist, sind nur diejenigen erfolgreich, die die neuesten Trends und Techniken des Geschäfts übernommen haben. Die Ladenbesitzer, die es ihren Kunden beim Kauf am einfachsten machen, werden wahrscheinlich auch die erfolgreichsten sein. Der neueste Trend, dem erfahrene Ladenbesitzer folgen, besteht darin, den Kunden die Möglichkeit zu geben, die Produkteigenschaften selbst anzupassen. Wenn ein Kunde beispielsweise ein Hemd kauft, kann er ein Logo darauf einfügen, etwas schreiben, ein Bild oder ein beliebiges Design auf das Hemd kleben. All dies wird vom Kunden erledigt, und wenn alle Anpassungen vorgenommen wurden, kann er sie dem Administrator auf derselben Produktseite übermitteln. Als Ergebnis wird dem Kunden dasselbe geliefert. Da die Kunden die volle Kontrolle über ihr Produkt haben, gehen sie gerne in solche Geschäfte.

Bei der Implementierung ist PrestaShop selbst nicht so flexibel. Hier können wir nicht sagen, dass die Entwickler von PrestaShop diese Funktion nicht kennen. Sie kennen sie sehr gut, aber um die Software wirklich leicht zu machen, stellen sie bei der Installation nur die notwendigen Funktionen bereit. Daher ist es erforderlich, zu diesem Zweck Ihr eigenes Modul zu entwerfen oder ein kostenloses oder kostenpflichtiges PrestaShop-Modul für benutzerdefiniertes Design zu verwenden.

Hier in diesem Handbuch diskutieren wir einige grundlegende Probleme im Zusammenhang mit der Produktanpassung in PrestaShop. Hoffentlich hilft Ihnen dieser Beitrag mit Fragen und Antworten sehr dabei, die Probleme Ihres Shops zu lösen. Beginnen wir also hier:

Frage Nr. 1: Hallo, ich habe ein Problem mit dem Anpassungsfeld in PrestaShop. Wenn Kunden eine Bilddatei hochladen, speichern und dann die Seite aktualisieren, wird ein beschädigtes Miniaturbild angezeigt. Wenn ich auf das Bild klicke oder es in einem neuen Tab öffne, wird nur eine 404-Fehlerseite angezeigt. Was ist das Problem?

Antwort: Sie müssen die Datei /upload/.htaccess bearbeiten und die Zeile php_flag engine off entfernen. Sie finden diese Zeilen am Ende der Datei. Speichern Sie die Datei, dann funktioniert es einwandfrei.

Frage Nr. 2: Hallo, ich möchte eine PDF-Datei auf die Produktanpassungsseite hochladen. Derzeit kann ich nur Bilddateien hochladen. Welche Optimierung benötige ich dafür?

Antwort: Um diese Funktion in Ihrem Shop zu aktivieren, müssen Sie die Bild-Upload-Methode des Produktcontrollers in override>controllers>front überschreiben. Laden Sie den folgenden Code herunter, fügen Sie ihn in ProductController.php ein und laden Sie ihn in override>controllers>front hoch.

class ProductController extends ProductControllerCore

{

                const CUSTOMIZATION_FILE_DIR = 'customizations';

 

               protected function pictureUpload()

{

                                 if (!($field_ids = $this->product->getCustomizationFieldIds()))

                                              return falsch;

                                 $authorized_file_fields = array();

                                 foreach ($field_ids AS $field_id)

                                 {

  ... Produkt::CUSTOMIZE_FILE)

                                                                        $authorized_file_fields[(int)$field_id['id_customization_field']] = 'Datei' . (int)$field_id['id_customization_field'];

                                }

 

                                $indexes = array_flip($authorized_file_fields);

                                foreach ($_FILES AS $field_name => $file)

{

  ... !empty($file['tmp_name']))

{

                                                                    // Wenn ein Upload-Fehler auftritt, überlassen Sie die Behandlung dem übergeordneten Element es

  ... UPLOAD_ERR_OK)

weiter;

 

                                                                        // Wenn die Datei nicht zulässig ist, lass das übergeordnete Element sie verarbeiten es

                                                                           wenn (!$this->isUploadTypeAllowed($file))

  ...// Deaktivieren Sie das PDF, um zu verhindern, dass das übergeordnete Element diese Datei verarbeitet

unset($_FILES[$field_name]);

 

                                                                     // Erstellen dir

                                                                   mkdir(_PS_UPLOAD_DIR_ . ProductController::CUSTOMIZATION_FILE_DIR.'/'.$this->context->cart->id, 0777, true);

 

                                                                        // Markiere die Datei als benutzerdefiniert hochladen

                                                                      $file_name = ProductController::CUSTOMIZATION_FILE_DIR.'/'.$this->context->cart->id.'/P'. md5(uniqid(rand(), true));

                                                                        $tmp_name = tempnam(_PS_TMP_IMG_DIR_, 'PS');

  ... $tmp_name))

{

                                                                                     $this->errors[] = Tools::displayError('Während der PDF-Datei ist ein Fehler aufgetreten hochladen.');

  ... falsch;

}

                                                                   // Datei zum Upload kopieren dir

  ... _PS_UPLOAD_DIR_.$Dateiname))

{

                                                                                     $this->errors[] = Tools::displayError('Während der PDF-Datei ist ein Fehler aufgetreten hochladen.');

  ... falsch;

}

                                                                   // Chmod das neue Datei

  ... 0777))

{

                                                                                     $this->errors[] = Tools::displayError('Während der PDF-Datei ist ein Fehler aufgetreten hochladen.');

  ... falsch;

}

 

                                                                        // Erstellen Sie einen falschen Daumen, um Fehler beim Löschen zu vermeiden. Dieser Hack vermeidet viele Kernmethoden überschreiben

                                                                 file_put_contents(_PS_UPLOAD_DIR_ . $file_name . '_small', '');

                                                                 chmod(_PS_UPLOAD_DIR_ . $Dateiname . '_small', 0777);

 

                                                                     // Registrieren Sie die Datei

                                                                        $this->context->cart->addPictureToProduct($this->product->id, $indexes[$field_name], Product::CUSTOMIZE_FILE, $file_name);

 

                                                                     // Temporäre Datei entfernen Datei

unlink($tmp_name);

                                               }

}

                             return parent::pictureUpload();

                }

 

                geschützte Funktion isUploadTypeAllowed($file)

{

                               /* MIME-Inhaltstyp erkennen */

                                 $mime_type = false;

                                   $types = array('application/pdf',); // Hier können zusätzliche MIME-Typen hinzugefügt werden

 

                                     if (function_exists('finfo_open'))

                                  {

$finfo = finfo_open(FILEINFO_MIME);

                                                      $mime_type = finfo_file($finfo, $file['tmp_name']);

                                               finfo_close($finfo);

}

                                  elseif (function_exists('mime_content_type'))

{

                                                  $mime_type = mime_content_type($file['tmp_name']);

}

                                  elseif (function_exists('exec'))

{

                                                 $mime_type = trim(exec('file -b --mime-type '.escapeshellarg($file['tmp_name'])));

}

                                  if (empty($mime_type) || $mime_type == 'reguläre Datei')

                                  {

                                              $mime_type = $file['Typ'];

                                 }

  ... false)

                                                 $mime_type = substr($mime_type, 0, $pos);

                                  // ist es erlaubt?

                               return $mime_type && in_array($mime_type, $types);

                }

    }

}

Cache leeren.

  1.  
  2.  
  3. wenn isset($pictures.$key)}
  4.       <divclass="customizationUploadBrowse">
  5.             {if substr(basename($pictures.$key), 0, 1) == 'P'}
  6.                  {l s='Datei anzeigen'}
  7. {else}
  8.                   <imgsrc="{$pic_dir}{$pictures.$key}_small"alt=""/>
  9.             {/if}
  10.            
  11.       
  12.       
  13. {/if}

Außerdem müssen Sie die Dateivorschau im Frontend von speichern. Verwenden Sie in product.tpl den folgenden Code:{if isset($pictures.$key)}

     

 

               {if substr(basename($pictures.$key),0,1)=='P'}

                      {l s='Datei anzeigen'}

{else}

                      

 

     

{/if}

Öffnen Sie „order-payment.tpl“, „order-detail.tpl“, „order-return.tpl“ und suchen Sie nach „customizationUploaded“, kommentieren Sie das div und fügen Sie diesen Code darüber ein:

{foreach $custom_data als $picture}
{wenn substr(Basisname($picture.Wert), 0, 1) == 'P'}
<a href="{$pic_dir}{$picture.value}" Ziel="_blank">Öffnen angehängte Dateia>
{else}
<img src="{$pic_dir}{$picture.value}_small" alt="" />
{/wenn}
<eine Seite="{$link->getProductDeletePictureLink($product, $field.id_customization_field)|escape:'html':'UTF-8'}" Titel="{l s='Löschen'}" >
<Bildquelle="{$img_dir}icon/delete.gif" Alt="{l s='Löschen'}" Klasse="customization_delete_icon" Breite="11" Höhe="13" />
a>
{/foreach}

- Jetzt letzter Schritt: Öffnen Sie  "/ps-admin/themes/default/template/controllers/orders/_customized_data.tpl", suchen Sie nach "Product::CUSTOMIZE_FILE", kommentieren Sie das erste foreach und fügen Sie diesen Code oben ein:

              {foreach von=$datas-Element=Daten}
                       <div Klasse="Formulargruppe">
                             <span Klasse="col-lg-4 Kontrolllabel"><stark>{wenn $data['Name']}{$data['Name']}{else}{l s='Bild Nr.'}{$data@iteration}{/if}strong>span>
                               <div Klasse="col-lg-8">
                                        {wenn substr(Basisname($data.Wert), 0, 1) == 'P'}
                                               <a href="{$pic_dir}{$data.value}" Ziel="_blank">Öffnen angehängte Dateia>
                                       {else}
                                               <eine Seite="displayImage.php?img={$data['value']}&name={$order->id|intval}-file{$data@iteration}" Klasse="_blank">
                                                     <img Klasse="img-thumbnail" src="{$smarty.const._THEME_PROD_PIC_DIR_}{$data['value']}_small" alt=""/>
                                                  a>
                                       {/wenn}
                              div>
                       div>
              {/foreach}

Frage Nr. 3: Ich habe 2 neue Dateien auf den Produktanpassungsseiten erstellt, bin aber nach der Erstellung nicht zufrieden. Als Benutzer muss ich nach unten gehen und auf die zusätzlichen Registerkarten klicken. Kann ich diese Felder an dieselbe Stelle verschieben, an der sich das Dropdown-Menü für Produktkombinationen befindet? Ich habe versucht, dies zu tun, indem ich den Code aus der Fußzeile an andere Stellen wie product.tpl verschoben habe, aber das hat nicht geholfen.

Antwort: Sie können dies mit der folgenden Methode tun.

Datei:

/themes/your-template/product.tpl



Suchen und löschen Sie den folgenden Code:

 

{if isset($product) && $product->customizable}

<divid="idTab10"class="bullet customization_block">

<formmethod="post"action="{$customizationFormTarget}"enctype="multipart/form-data"id="customizationForm"class="clearfix">

<pclass="infoCustomizable">

{l s='Denken Sie daran, Ihr personalisiertes Produkt nach dem Speichern in Ihren Warenkorb zu legen.'}

{if $product->uploadable_files}
{l s='Zulässige Dateiformate sind: GIF, JPG, PNG'}{/if}

 

{if $product->uploadable_files|intval}

<divclass="customizableProductsFile">

{l s='Bilder'}

<ulid="uploadable_files"class="clearfix">

{counter start=0 assign='customizationField'}

{foreach from=$customizationFields item='field' name='customizationFields'}

{if $field.type == 0}

<liclass="customizationUploadLine{if $field.required} erforderlich{/if}">{assign var='Schlüssel' value='pictures_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field}

{if isset($pictures.$key)}

<divclass="customizationUploadBrowse">

<imgsrc="{$pic_dir}{$pictures.$key}_small"alt=""/>

 

<imgsrc="{$img_dir}icon/delete.gif"alt="{l s='Löschen'}"class="customization_delete_icon"width="11"height="13"/>

 

 

{/if}

<divclass="customizationUploadBrowse">

<labelclass="customizationUploadBrowseDescription">{if !empty($field.name)}{$field.name}{else}{l s='Bitte wählen Sie eine Bilddatei von Ihrem Computer aus'}{/if}{if $field.required}*{/if}

<inputtype="file"name="file{$field.id_customization_field}"id="img{$customizationField}"class="customization_block_input {if isset($pictures.$key)}gefüllt{/if}"/>

 

 

{counter}

{/if}

{/foreach}

 

 

{/if}

{if $product->text_fields|intval}

<divclass="customizableProductsText">

{l s='Text'}

<ulid="text_fields">

{counter start=0 assign='customizationField'}

{foreach from=$customizationFields item='field' name='customizationFields'}

{if $field.type == 1}

<liclass="customizationUploadLine{if $field.required} erforderlich{/if}">

<labelfor="textField{$customizationField}">{assign var='key' value='textFields_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field} {if !empty($field.name)}{$field.name}{/if}{if $field.erforderlich}*{/if}

<textareatype="text"name="textField{$field.id_customization_field}"id="textField{$customizationField}"rows="1"cols="40"class="customization_block_input">{if isset($textFields.$key)}{$textFields.$key|stripslashes}{/if}

 

{counter}

{/if}

{/foreach}

 

 

{/if}

<pid="customizedDatas"&g t;

<inputtype="hidden"name="quantityBackup"id="quantityBackup"value=""/>

<inputtype="hidden"name="submitCustomizedDatas"value="1"/>

<inputtype="button"class="button"value="{l s='Speichern'}"onclick="javascript:saveCustomization()"/>

<spanid="ajax-loader"style="display:none"><imgsrc="{$img_ps_dir}loader.gif"alt="loader"/>

 

 

<pclass="clear required">* {l s='required fields'}

 

{/if}


-------

Und vor dieser Zeile:

{if (isset($product) && $product->description) || (isset($features) && $features) || (isset($accessories) && $accessories) || (isset($HOOK_PRODUCT_TAB) && $HOOK_PRODUCT_TAB) || (isset($attachments) && $attachments) || isset($product) && $product->customizable}


Fügen Sie diesen Code ein:

{if isset($product) && $product->customizable}

  <divclass="bullet customization_block">

   <formmethod="post"action="{$customizationFormTarget}"enctype="multipart/form-data"id="customizationForm"class="clearfix">

      <pclass="infoCustomizable">

       {l s='Denken Sie daran, Ihr personalisiertes Produkt nach dem Speichern in Ihren Warenkorb zu legen.'}

       {if $product->uploadable_files}
{l s='Zulässige Dateiformate sind: GIF, JPG, PNG'}{/if}

     

      {if $product->uploadable_files|intval}

      <divclass="customizableProductsFile">

       

{l s='Bilder'}

       <ulid="uploadable_files"class="clearfix">

        {counter start=0 assign='customizationField'}

        {foreach from=$customizationFields item='field' name='customizationFields'}

         {if $field.type == 0}

              <liclass="customizationUploadLine{if $field.required} erforderlich{/if}">{assign var='key' value='pictures_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field}

                {if isset($pictures.$key)}

                <divclass="customizationUploadBrowse">

                

                

                  <imgsrc="{$img_dir}icon/delete.gif"alt="{l s='Löschen'}"class="customization_delete_icon"width="11"height="13"/>

                

               {/if}

               <divclass="customizationUploadBrowse">

                <labelclass="customizationUploadBrowseDescription">{if !empty($field.name)}{$field.name}{else}{l s='Bitte wählen Sie eine Bilddatei von Ihrem Computer aus'}{/if}{if $field.required}*{/if}

                 <inputtype="file"name="file{$field.id_customization_field}"id="img{$customizationField}"class="customization_block_input {if isset($pictures.$key)}gefüllt{/if}"/>

                

              

{counter}

         {/if}

        {/foreach}

       

     

      {/if}

      {if $product->text_fields|intval}

      <divclass="customizableProductsText">

{l s='Text'}

       <ulid="text_fields">

       {counter start=0 assign='customizationField'}

       {foreach from=$customizationFields item='field' name='customizationFields'}

        {if $field.type == 1}

        <liclass="customizationUploadLine{if $field.required} erforderlich{/if}">

         <labelfor="textField{$customizationField}">{assign var='key' value='textFields_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field} {if !empty($field.name)}{$field.name}{/if}{if $field.erforderlich}*{/if}

         <textareatype="text"name="textField{$field.id_customization_field}"id="textField{$customizationField}"rows="1"cols="40"class="customization_block_input">{if isset($textFields.$key)}{$textFields.$key|stripslashes}{/if}

       

        {counter}

        {/if}

       {/foreach}

       

     

      {/if}

<pid="customizedDatas">

       <inputtype="hidden"name="quantityBackup"id="quantityBackup"value=""/>

       <inputtype="hidden"name="submitCustomizedDatas"value="1"/>

       <inputtype="button"class="button"value="{l s='Speichern'}"onclick="javascript:saveCustomization()"/>

       <spanid="ajax-loader"style="display:none"><imgsrc="{$img_ps_dir}loader.gif"alt="loader"/>

     

  

   <pclass="erforderlich löschen">* {l s='erforderliche Felder'}

 

{/if}


----

Nach der Suche:

  {if isset($product)&& $product->customizable}

  • {l s='Produktanpassung'}

{/if}

 


ändern durch

{*   {if isset($product)&& $product->customizable}

  • {l s='Produkt Anpassung'}

{/if}

 

*}

Hinweis: Um product.tpl zu ändern, müssen Sie die Kompilierung erzwingen.

Frage Nr. 4: Ich möchte die Registerkarte „Produktanpassung“ neben der Registerkarte „Weitere Informationen“ anzeigen. Derzeit wird sie unter den Standardregisterkarten angezeigt.

Antwort: Hallo!

product.tpl bearbeiten

Ändern

{if $product->description || $features || $accessories || $HOOK_PRODUCT_TAB || $attachments}


in

{if $product->description || $Funktionen || $Zubehör || $HOOK_PRODUCT_TAB || $Anhänge || $product->customizable}



In

    , über {$HOOK_PRODUCT_TAB} Zeile einfügen:

    {if $product->customizable}

    • {l s='Product customization'}

    {/if}

     


    In

     

    , über {$HOOK_PRODUCT_TAB_CONTENT} einfügen :

    {if $product->customizable}

     

     

     

      

     

          Informations

          {l s='Denken Sie nach dem Speichern Ihres personalisierten Produkts daran, es zu Ihrem Warenkorb.'}

          {if $product->uploadable_files}
    {l s='Erlaubte Dateiformate sind: GIF, JPG, PNG'}{/if}

      

       {if $product->uploadable_files|intval}

      

    {l s='Bilder'}

      

            {counter start=0 zuweisen='Anpassungsfeld'}

            {foreachfrom=$customizationFields item='Feld' name='Anpassungsfeld'}

             {wenn $field.type ==0}

             

      • {zuweisen var='Schlüssel' Wert='Bilder_'|cat:$Produkt->id|cat:'_'|cat:$field.id_customization_field}

       

               {wenn isset($pictures.$key)}

       

                      

                      

                       {l s='Löschen'}

                      

                    {/if}

              

      {if $field.required}*{/if}

              

      {if!empty($field.name)}{$field.name}{else}{l s='Bitte wählen Sie eine Bilddatei von Ihrer Festplatte aus. Laufwerk'}{/if}

             

              {counter}

             {/if}

            {/foreach}

        

         {/if}

        

       

         {if $product->text_fields|intval}

        

      {l s='Texte'}

        

              {counter start=0 assign='customizationField'}

              {foreachfrom=$customizationFields item='field' name='customizationFields'}

               {if $field.type ==1}

               

        • {assign var='key' value='textFields_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field}

         

                 {if!empty($field.name)}{$field.name}{/if}{if $field.required}*{/if}