Réponses aux principales questions sur la personnalisation des produits PrestaShop en 2017

Au moment où il y a une énorme concurrence sur le marché, seuls ceux qui réussissent sont ceux qui ont adopté les dernières tendances et techniques de l’entreprise. Les propriétaires de magasins qui facilitent le plus les clients lors de l’achat sont les plus susceptibles de réussir. La dernière tendance suivie par les propriétaires de magasins bien informés en 2017 est de permettre au client de personnaliser les attributs des produits par eux-mêmes, par exemple si le client achète une chemise, il peut y insérer un logo, écrire quelque chose, coller une image ou tout style de conception sur la chemise. Tout sera fait par les clients et lorsque toute la personnalisation est terminée, il peut le soumettre à l’administrateur sur la même page de produit. En conséquence, la même chose sera livrée aux clients. Comme les clients obtiennent un contrôle total sur leur produit, ils aiment aller dans un tel magasin.

Lorsque nous en arrivons à la mise en œuvre, PrestaShop lui-même n’est pas aussi flexible. Ici, nous ne pouvons pas dire que les développeurs de PrestaShop ne connaissent pas cette fonction. Ils le savent très bien mais pour rendre le logiciel vraiment léger, ils ne fournissent que la fonction nécessaire dans son installation. Par conséquent, il est nécessaire de concevoir votre propre module à cette fin ou d’utiliser un module de conception personnalisé PrestaShopgratuit ou payant.

Ici, dans ce guide, nous discutons de certains problèmes de base liés à la personnalisation des produits PrestaShop. Espérons que cet article de réponse à la question vous aidera beaucoup à résoudre les problèmes du magasin. Commençons donc ici;

Question n ° 1: Bonjour, je suis confronté à un problème avec le champ de personnalisation PrestaShop. Lorsque les clients téléchargent un fichier image, enregistre puis actualise la page. Il affiche une miniature corrompue. De plus, lorsque je clique sur l’image ou que je l’ouvre dans un nouvel onglet, elle passe simplement à la page d’erreur 404. Quel est le problème?

Réponse : Vous devez modifier le fichier /upload/.htaccess et supprimer le moteur de php_flag ligne. Vous trouverez ces lignes à la fin du fichier. Enregistrez le fichier et il fonctionnera bien.

Question n ° 2: Bonjour, je veux télécharger le fichier PDF sur la page de personnalisation du produit. Actuellement, je ne peux télécharger que des fichiers d’images. De quel ajustement ai-je besoin pour cela?

Réponse : Pour activer cette fonction sur votre boutique, vous devez remplacer la méthode de téléchargement du contrôleur de produit>image dans override>controllers>front . Téléchargez le code suivant, mettez-le ProductController.php et téléchargez-le sur override>controllers>front .

class ProductController extends ProductControllerCore

{

                const CUSTOMIZATION_FILE_DIR = 'customizations';

 

                protected function pictureUpload()

                {

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

                                                return false;

                                $authorized_file_fields = array();

                                foreach ($field_ids AS $field_id)

                                {

                                                if ($field_id['type'] == Product::CUSTOMIZE_FILE)

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

                                }

 

                                $indexes = array_flip($authorized_file_fields);

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

                                {

                                                if (in_array($field_name, $authorized_file_fields) AND isset($file['tmp_name']) AND !empty($file['tmp_name']))

                                                {

                                                                // If there is an upload error, let the parent handle it

                                                                if ($file['error'] != UPLOAD_ERR_OK)

                                                                                continue;

 

                                                                // If the file is not allowed, let the parent handle it

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

                                                                                continue;

 

                                                                // Unset the PDF to prevent the parent to handle this file

                                                                unset($_FILES[$field_name]);

 

                                                                // Create dir

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

 

                                                                // Mark the file as a custom upload

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

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

                                                                if (!move_uploaded_file($file['tmp_name'], $tmp_name))

                                                                {

                                                                                $this->errors[] = Tools::displayError('An error occurred during the PDF upload.');

                                                                                return false;

                                                                }

                                                                // Copy file to the upload dir

                                                                if (!copy($tmp_name, _PS_UPLOAD_DIR_.$file_name))

                                                                {

                                                                                $this->errors[] = Tools::displayError('An error occurred during the PDF upload.');

                                                                                return false;

                                                                }

                                                                // Chmod the new file

                                                                if (!chmod(_PS_UPLOAD_DIR_.$file_name, 0777))

                                                                {

                                                                                $this->errors[] = Tools::displayError('An error occurred during the PDF upload.');

                                                                                return false;

                                                                }

 

                                                                // Create a fake thumb to avoid error on delete, this hack avoids lots of core method override

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

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

 

                                                                // Register the file

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

 

                                                                // Remove tmp file

                                                                unlink($tmp_name);

                                                }

                                }

                                return parent::pictureUpload();

                }

 

                protected function isUploadTypeAllowed($file)

                {

                                /* Detect mime content type */

                                $mime_type = false;

                                $types = array('application/pdf',); // Extra mime types can be added here

 

                                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 == 'regular file')

                                {

                                                $mime_type = $file['type'];

                                }

 

                                if (($pos = strpos($mime_type, ';')) !== false)

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

                                // is it allowed?

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

                }

    }

}

Clear the cache.

  1.  
  2.  
  3. if isset($pictures.$key)}
  4.       <divclass="customizationUploadBrowse">
  5.             {if substr(basename($pictures.$key), 0, 1) == 'P'}
  6.                   <ahref="{$pic_dir}{$pictures.$key}"target="_blank">{l s='View the file'}
  7.             {else}
  8.                   <imgsrc="{$pic_dir}{$pictures.$key}_small"alt=""/>
  9.             {/if}
  10.             <ahref="{$link->getProductDeletePictureLink($product, $field.id_customization_field)|escape:'html':'UTF-8'}" title="{l s='Delete'}" >
  11.                   <imgsrc="{$img_dir}icon/delete.gif"alt="{l s='Delete'}"class="customization_delete_icon"width="11"height="13"/>
  12.            
  13.      
  14. {/if}

En outre, vous devez corriger l’aperçu du fichier à l’avant-plan du magasin. Dans product.tpl, utilisez le code suivant :{if isset($pictures.$key)}

     

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

                      {l s='View the file'}

              {else}

                     

              {/if}

             

                      {l s='Delete'}

             

     

{/if}

Ouvrez « order-payment.tpl », « order-detail.tpl », « order-return.tpl » et recherchez « customizationUploaded », commentez le div et collez ce code au-dessus:

{foreach  $custom_data  as  $picture}
{if  substr(nom debase($picture. valeur),   0,   1)   ==   'P'}
<a href=« {$pic_dir}{$picture.value} »  target=« _blank »>Ouvrir le fichier jointun>
{else}
<img src=« {$pic_dir}{$picture.value}_small »  alt=« »   />
{/si}
<a href=« {$link->getProductDeletePictureLink($product, $field.id_customization_field)|escape:'html':'UTF-8'} »  title=« {l s='Delete'} »   >
<img src=« {$img_dir}icon/delete.gif »  alt=« {l s='Delete'} »   class=« customization_delete_icon »  width=« 11 »  height=« 13 »   />
une>
{/foreach}

- Maintenant, dernière étape: ouvrez « /ps-admin/themes/default/template/controllers/orders/_customized_data.tpl », recherchez « Product::CUSTOMIZE_FILE », commentez le premier foreach et collez ce code ci-dessus:

              {foreach   from=$datasitem=data}
                      < div  class=« form-group »>
                             < span  class=« col-lg-4 control-label »><fort>{if  $data['name']}{$data['name']}{else}{ls='Picture #'}{$data@iteration}{/if}strong>span> 
                             < div  classe=« col-lg-8 »>
                                     {if  substr(nom debase($data. valeur),   0,   1)   ==   'P'}
                                             <a href=« {$pic_dir}{$data.value} »  target=« _blank »>Ouvrir le fichier jointun>
                                     {else}
                                             <a href=« displayImage.php?img={$data['value']}&name={$order->id|intval}-file{$data@iteration} »   class=« _blank »>
                                                    < img  class=« img-thumbnail »  src=« {$smarty.const._THEME_PROD_PIC_DIR_}{$data['value']}_small »  alt=« »/>
                                             une>
                                     {/si}
                             div>
                      div>
              {/foreach}

Question n°3 : J’ai créé 2 nouveaux fichiers sur les pages de personnalisation des produits mais je ne suis pas content après l’avoir créé. En tant qu’utilisateur doit aller en bas et cliquer sur les onglets supplémentaires. Puis-je déplacer ces champs au même endroit où existe le menu déroulant de la combinaison de produits ? J’ai essayé de le faire en déplaçant le code du pied de page vers d’autres endroits comme product.tpl, mais cela n’aide pas.

Réponse : Vous pouvez le faire par la méthode suivante.

Lime:

/themes/your-template/product.tpl



Recherchez et supprimez le code suivant :

 

{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='After saving your customized product, remember to add it to your cart.'}

{if $product->uploadable_files}
{l s='Allowed file formats are: GIF, JPG, PNG'}{/if}

{if $product->uploadable_files|intval}

<divclass="customizableProductsFile">

{l s='Pictures'}

<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} required{/if}">{assign var='key' value='pictures_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field}

{if isset($pictures.$key)}

<divclass="customizationUploadBrowse">

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

<ahref="{$link->getProductDeletePictureLink($product, $field.id_customization_field)}" title="{l s='Delete'}" >

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

{/if}

<divclass="customizationUploadBrowse">

<labelclass="customizationUploadBrowseDescription">{if !empty($field.name)}{$field.name}{else}{l s='Please select an image file from your computer'}{/if}{if $field.required}*{/if}

<inputtype="file"name="file{$field.id_customization_field}"id="img{$customizationField}"class="customization_block_input {if isset($pictures.$key)}filled{/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} required{/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.required}*{/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='Save'}"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}


-------

And before this line:

description et caractéristiques de

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


Collez ce code :

{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='After saving your customized product, remember to add it to your cart.'}

       {if $product->uploadable_files}
{l s='Allowed file formats are: GIF, JPG, PNG'}{/if}

     

      {if $product->uploadable_files|intval}

      <divclass="customizableProductsFile">

       

{l s='Pictures'}

       <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} required{/if}">{assign var='key' value='pictures_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field}

               {if isset($pictures.$key)}

               <divclass="customizationUploadBrowse">

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

                <ahref="{$link->getProductDeletePictureLink($product, $field.id_customization_field)}" title="{l s='Delete'}" >

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

               

               

               {/if}

               <divclass="customizationUploadBrowse">

                <labelclass="customizationUploadBrowseDescription">{if !empty($field.name)}{$field.name}{else}{l s='Please select an image file from your computer'}{/if}{if $field.required}*{/if}

                <inputtype="file"name="file{$field.id_customization_field}"id="img{$customizationField}"class="customization_block_input {if isset($pictures.$key)}filled{/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} required{/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.required}*{/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='Save'}"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}


----

After search:

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

{/if}


change by

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

{/if}

*}

Remarque: Pour modifier product.tpl, vous devez forcer la compilation.

Question n ° 4: Je veux afficher l’onglet de personnalisation du produit à côté de l’onglet plus d’informations. À ce moment-là, il s’affiche sous les onglets par défaut.

Réponse: Bonjour !

Modifier product.tpl

Changement

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


À

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



In

    , above {$HOOK_PRODUCT_TAB} insert line:

    {if $product->customizable}

    {/if}


    In

    , above {$HOOK_PRODUCT_TAB_CONTENT} insert :

    {if $product->customizable}

     

     

      

          Informations

          {l s='After saving