Principali risposte alle domande sulla personalizzazione del prodotto PrestaShop nel 2017
Nel momento in cui c'è un'enorme concorrenza nel mercato, solo i di successo sono quelli che hanno adottato le ultime tendenze e tecniche del business. I proprietari dei negozi che stanno più facilitando i clienti durante l'acquisto hanno maggiori probabilità di avere successo. L'ultima tendenza seguita dai proprietari di negozi esperti nel 2017 è quella di consentire al cliente di personalizzare gli attributi dei prodotti in base ai propri, ad esempio se il cliente sta acquistando una camicia, può inserire un logo su di esso, scrivere qualcosa, incollare un'immagine o qualsiasi stile di design sulla camicia. Tutto sarà fatto dai clienti e quando tutta la personalizzazione è fatta, può inviarlo all'amministratore sulla stessa pagina del prodotto. Di conseguenza, la stessa cosa verrà consegnata ai clienti. Man mano che i clienti ottengono il pieno controllo sul loro prodotto, a loro piace andare in tale negozio.
Quando entriamo nell'implementazione, PrestaShop stesso non è così flessibile. Qui non possiamo dire che gli sviluppatori di PrestaShop non conoscano questa funzione. Lo sanno molto bene, ma per rendere il software davvero leggero, stanno fornendo solo la funzione necessaria nella sua installazione. Pertanto, è necessario progettare il proprio modulo per questo scopo o utilizzare un modulo di progettazione personalizzato PrestaShopgratuito oa pagamento .
Qui in questa guida, stiamo discutendo alcuni problemi di base relativi alla personalizzazione del prodotto PrestaShop. Speriamo che questo post di risposta alla domanda ti aiuti molto a risolvere i problemi del negozio. Quindi iniziamo da qui;
Domanda n. 1: Ciao, sto affrontando un problema con il campo di personalizzazione di PrestaShop. Quando i client caricano un file di immagine, salva e quindi aggiorna la pagina. Mostra una miniatura danneggiata. Inoltre, quando faccio clic sull'immagine o la amo in una nuova scheda, va semplicemente alla pagina di errore 404. Qual è il problema?
Risposta: Devi modificare il file /upload/.htaccess e rimuovere il motore di php_flag riga spento. Troverai queste righe alla fine del file. Salva il file e poi funzionerà bene.
Domanda n. 2: Ciao, voglio caricare il file PDF sulla pagina di personalizzazione del prodotto. Attualmente, sono in grado di caricare solo file di immagini. Di quale modifica ho bisogno per questo?
Risposta: Per abilitare questa funzione sul tuo negozio, devi ignorare il metodo di caricamento del controller del prodotto>picture in override>controllers>front
. Scarica il seguente codice, inseriscilo e caricalo in ProductController.php
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.
if isset($pictures.$key)}
<divclass="customizationUploadBrowse">
{if substr(basename($pictures.$key), 0, 1) == 'P'}
<ahref="{$pic_dir}{$pictures.$key}"target="_blank">{l s='View the file'}
{else}
<imgsrc="{$pic_dir}{$pictures.$key}_small"alt=""/>
{/if}
<ahref="{$link->getProductDeletePictureLink($product, $field.id_customization_field)|escape:'html':'UTF-8'}" title="{l s='Delete'}" >
<imgsrc="{$img_dir}icon/delete.gif"alt="{l s='Delete'}"class="customization_delete_icon"width="11"height="13"/>
{/if}
Inoltre è necessario correggere l'anteprima del file al frontend del negozio. In product.tpl utilizzare il codice seguente:{if isset($pictures.$key)}
{if substr(basename($pictures.$key),0,1)=='P'}
{else}
{/if}
{/if}
Apri "order-payment.tpl", "order-detail.tpl", "order-return.tpl" e cerca "customizationUploaded", commenta il div e incolla questo codice sopra di esso:
{foreach $custom_data as $picture}
{if substr(nomeso base($picture. valore), 0, 1) == 'P'}
<a href="{$pic_dir}{$picture.value}" target="_blank">Apri file allegatoun>
{else}
<img src="{$pic_dir}{$picture.value}_small" alt="" />
{/se}
<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" />
un>
{/foreach}
- Ora ultimo passaggio: apri "/ps-admin/themes/default/template/controllers/orders/_customized_data.tpl", cerca "Product::CUSTOMIZE_FILE", commenta il primo foreach e incolla questo codice sopra:
{foreach from=$datasitem=data}
< div class="form-group">
< span class="col-lg-4 control-label"><strong>{if $data['name']}{$data['name']}{else}{ls='Picture #'}{$data@iteration}{/if}strong>span>
< div class="col-lg-8">
{if substr(nomeso base($data. valore), 0, 1) == 'P'}
<a href="{$pic_dir}{$data.value}" target="_blank">Apri file allegatoun>
{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=""/>
un>
{/se}
>
>
{/foreach}
Domanda n. 3: Ho creato 2 nuovi file nelle pagine di personalizzazione del prodotto ma non sono contento dopo averlo creato. Come utente devono andare in fondo e fare clic sulle schede aggiuntive. Posso spostare questi campi nello stesso punto in cui esiste il menu a discesa della combinazione di prodotti? Ho provato a farlo spostando il codice dal piè di pagina ad altri posti come product.tpl ma non aiuta.
Risposta: Puoi farlo con il seguente metodo.
File:
/themes/your-template/product.tpl
Trovare ed eliminare il codice seguente:
{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:
{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}
Incolla questo codice:
{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}
*}
Nota: per modificare product.tpl, è necessario forzare la compilazione.
Domanda n. 4: Voglio mostrare la scheda di personalizzazione del prodotto accanto alla scheda Ulteriori informazioni. Al momento, viene visualizzato sotto le schede predefinite.
Risposta: Ciao!
Modifica product.tpl
Cambiare
{if $product->description || $features || $accessories || $HOOK_PRODUCT_TAB || $attachments}
A
{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}
{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}