Topvragen Antwoorden over PrestaShop Product Customization Module

In een tijd waarin er enorme concurrentie is op de markt, zijn alleen degenen die succesvol zijn degenen die de nieuwste trends en technieken van het bedrijf hebben overgenomen. De winkeleigenaren die de klanten het meest faciliteren bij het kopen, zijn waarschijnlijk het meest succesvol. De nieuwste trend die wordt gevolgd door ervaren winkeleigenaren, is om de klant toe te staan de productkenmerken naar eigen inzicht aan te passen, bijvoorbeeld als de klant een shirt koopt, kan hij er een logo op plaatsen, iets schrijven, een afbeelding of een andere stijl van ontwerp op het shirt plakken. Alles wordt gedaan door de klanten en wanneer alle aanpassingen zijn gedaan, kan hij deze indienen bij de beheerder op dezelfde productpagina. Als resultaat wordt hetzelfde geleverd aan de klanten. Omdat klanten volledige controle over hun product krijgen, gaan ze graag naar zo'n winkel.
Als we in de implementatie komen, is PrestaShop zelf niet zo flexibel. Hier kunnen we niet zeggen dat ontwikkelaars van PrestaShop deze functie niet kennen. Ze kennen het heel goed, maar om software echt lichtgewicht te maken, bieden ze alleen de noodzakelijke functie in de installatie. Daarom is het nodig om uw eigen module voor dit doel te ontwerpen of om een gratis of betaalde PrestaShop custom design module te gebruiken.
In deze gids bespreken we enkele basisproblemen met betrekking tot PrestaShop-productaanpassing. Hopelijk zal deze vraag-antwoordpost u veel helpen om de problemen van de winkel op te lossen. Laten we hier beginnen;
Vraag nr. 1: Hallo, ik heb een probleem met het PrestaShop-aanpassingsveld. Wanneer klanten een afbeelding uploaden, opslaan en vervolgens de pagina vernieuwen. Het toont een beschadigde miniatuur. Ook wanneer ik op de afbeelding klik of deze in een nieuw tabblad open, gaat het gewoon naar de 404-foutpagina. Wat is het probleem?
Antwoord: U moet het bestand /upload/.htaccess bewerken en de regel php_flag engine off verwijderen. U vindt deze regels aan het einde van het bestand. Sla het bestand op en dan werkt het goed.
Vraag nr. 2: Hallo, ik wil een PDF-bestand uploaden op de productaanpassingspagina. Momenteel kan ik alleen afbeeldingen uploaden. Welke aanpassing heb ik hiervoor nodig?
Antwoord: Om deze functie in uw winkel in te schakelen, moet u de productcontroller>picture upload-methode in override>controllers>front
overschrijven. Download de volgende code, plaats deze in ProductController.php
en upload deze naar 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)
{
als ($field_id['type'] == Product::CUSTOMIZE_FILE)
$authorized_file_fields[(int)$field_id['id_customization_field']] = 'bestand' . (int)$veld_id['id_customization_veld'];
$indexes = array_flip($authorized_file_fields);
foreach ($_FILES AS $field_name => $file)
{
if (in_array($veldnaam, $geautoriseerde_bestandsvelden) EN isset($bestand['tmp_naam']) EN !empty($file['tmp_name']))
{
// Als er een uploadfout is, laat de bovenliggende het
if ($file['error'] != UPLOAD_ERR_OK)
doorgaan;
// Als het bestand niet is toegestaan, laat de bovenliggende het
... (!$this->isUploadTypeAllowed($file))
...// Schakel de PDF uit om te voorkomen dat de bovenliggende map dit bestand verwerkt
unset($_FILES[$veldnaam]);
// Maken dir
mkdir(_PS_UPLOAD_DIR_ . ProductController::CUSTOMIZATION_FILE_DIR.'/'.$this->context->cart->id, 0777, true);
// Markeer het bestand als een aangepast uploaden
$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('Er is een fout opgetreden tijdens het PDF-bestand uploaden.');
... false;
// Kopieer bestand naar de upload dir
if (!copy($tmp_name, _PS_UPLOAD_DIR_.$bestandsnaam))
{
$this->errors[] = Tools::displayError('Er is een fout opgetreden tijdens het PDF-bestand uploaden.');
... false;
// Chmod de nieuwe bestand
if (!chmod(_PS_UPLOAD_DIR_.$bestandsnaam, 0777))
{
$this->errors[] = Tools::displayError('Er is een fout opgetreden tijdens het PDF-bestand uploaden.');
... false;
// Maak een nep-thumb om fouten bij het verwijderen te voorkomen, deze hack vermijdt veel kernmethoden overschrijven
file_put_contents(_PS_UPLOAD_DIR_ . $file_name . '_small', '');
... 0777);
// Registreer de bestand
$this->context->cart->addPictureToProduct($this->product->id, $indexes[$veldnaam], Product::CUSTOMIZE_FILE, $file_name);
// Verwijder tmp bestand
unlink($tmp_name);
return parent::pictureUpload();
}
protected function isUploadTypeAllowed($file)
{
/* Detecteer MIME-inhoudstype */
$mime_type = false;
$types = array('application/pdf',); // Extra mime-typen kunnen hier worden toegevoegd
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'])));
als (leeg($mime_type) || $mime_type == 'normaal bestand')
{
$mime_type = $file['type'];
if (($pos = strpos($mime_type, ';')) !== false)
$mime_type = substr($mime_type, 0, $pos);
// is het toegestaan?
return $mime_type && in_array($mime_type, $types);
}
}
}
Wis de cache.
if isset($pictures.$key)}
<divclass="customizationUploadBrowse">
{if substr(basename($pictures.$key), 0, 1) == 'P'}
{l s='Bestand weergeven'}
{else}
<imgsrc="{$pic_dir}{$pictures.$key}_small"alt=""/>
{/if}
{/if}
Verder moet je de bestandsvoorvertoning aan de voorkant van de winkel repareren. Gebruik in product.tpl de volgende code:{if isset($pictures.$key)}
{if substr(basename($pictures.$key),0,1)=='P'}
{l s='Bestand weergeven'}
{else}
{/if}
Open "order-payment.tpl", "order-detail.tpl", "order-return.tpl" en zoek naar "customizationUploaded", plaats een opmerking bij de div en plak deze code erboven:
{foreach $custom_data as $picture}
{als substr(basisnaam($picture.waarde), 0, 1) == 'P'}
<a href="{$pic_dir}{$picture.value}" doel="_blank">Open bijgevoegd bestanda>
{anders}
<img bron="{$pic_dir}{$picture.value}_small" alt="" />
{/if}
<a href="{$link->getProductDeletePictureLink($product, $field.id_customization_field)|escape:'html':'UTF-8'}" titel="{l s='Verwijderen'}" >
<img bron="{$img_dir}pictogram/verwijderen.gif" alt="{l s='Verwijderen'}" klasse="customization_delete_icon" breedte="11" hoogte="13" />
a>
{/foreach}
- Nu de laatste stap: open "/ps-admin/themes/default/template/controllers/orders/_customized_data.tpl", zoek naar "Product::CUSTOMIZE_FILE", voeg commentaar toe aan de eerste foreach en plak deze code hierboven:
{foreach van=$datas item=data}
<div klasse="form-group">
<span klasse="col-lg-4 control-label"><sterk>{als $data['naam']}{$data['naam']}{anders}{l s='Afbeelding #'}{$data@iteratie}{/als}sterk>span>
<div klasse="col-lg-8">
{als substr(basisnaam($data.waarde), 0, 1) == 'P'}
<a href="{$pic_dir}{$data.value}" doel="_blank">Open bijgevoegd bestanda>
{anders}
<a href="displayImage.php?img={$data['value']}&name={$order->id|intval}-file{$data@iteration}" class="_blank">
<img klasse="img-thumbnail" src="{$smarty.const._THEME_PROD_PIC_DIR_}{$data['value']}_small" alt=""/>
a>
{/if}
div>
div>
{/foreach}
Vraag nr. 3: Ik heb 2 nieuwe bestanden gemaakt op productaanpassingspagina's, maar ik ben niet tevreden nadat ik ze heb gemaakt. Omdat de gebruiker naar beneden moet gaan en op de extra tabbladen moet klikken. Kan ik deze velden verplaatsen naar dezelfde plek waar het vervolgkeuzemenu voor productcombinaties bestaat? Ik heb geprobeerd het te doen door de code van de voettekst naar andere plaatsen te verplaatsen, zoals product.tpl, maar het helpt niet.
Antwoord: U kunt het doen met de volgende methode.
Bestand:
/themes/your-template/product.tpl
Zoek en verwijder de volgende 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='Nadat u uw aangepaste product hebt opgeslagen, vergeet het dan niet toe te voegen aan uw winkelwagen.'
{if $product->uploadable_files}
{l s='Toegestane bestandsindelingen zijn: 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' waarde='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}pictogram/verwijderen.gif"alt="{l s='Verwijderen'}"class="customization_delete_icon"width="11"height="13"/>
{/if}
<divclass="customizationUploadBrowse">
<labelclass="customizationUploadBrowseDescription">{if !empty($field.name)}{$field.name}{else}{l s='Selecteer een afbeeldingsbestand van uw 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}
{/if}
{/if}
{if $product->text_fields|intval}
<divclass="customizableProductsText">
{l s='Text'}
<ulid="text_fields">
{counter start=0 assign='customizationField'}
{foreach from=$customizationFields item='veld' name='customizationFields'}
{als $field.type == 1}
<liclass="customizationUploadLine{als $field.required} vereist is{/if}">
<labelfor="textField{$customizationField}">{assign var='key' value='textFields_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field} {als !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="verborgen"name="quantityBackup"id="quantityBackup"value=""/>
<inputtype="verborgen"name="submitCustomizedDatas"value="1"/>
<inputtype="button"class="button"value="{l s='Opslaan'}"onclick="javascript:saveCustomization()"/>
<spanid="ajax-loader"style="display:none"><imgsrc="{$img_ps_dir}loader.gif"alt="loader"/>
<pclass="clear required">* {l s='verplichte velden'}
{/if}
-------
En vóór deze regel:
{if (isset($product) && $product->description) || (isset($features) && $features) || (isset($accessoires) && $accessoires) || (isset($HOOK_PRODUCT_TAB) && $HOOK_PRODUCT_TAB) || (isset($bijlagen) && $bijlagen) || isset($product) && $product->customizable}
Plak deze 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='Nadat u uw aangepaste product, vergeet niet om het toe te voegen aan uw winkelwagen.'
{if $product->uploadable_files}
{l s='Toegestane bestandsformaten zijn: GIF, JPG, PNG' } ...<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' waarde='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='Delete'}"class="customization_delete_icon"width="11"height="13"/>
{/if}
<divclass="customizationUploadBrowse">
<labelclass="customizationUploadBrowseDescription">{if !empty($field.name)}{$field.name}{else}{l s='Selecteer een afbeeldingsbestand van uw 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='Tekst'}
<ulid="tekstvelden">
{counter start=0 assign='customizationField'}
{foreach from=$customizationFields item='veld' 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="verborgen"name="quantityBackup"id="quantityBackup"value=""/>
<inputtype="verborgen"name="submitCustomizedDatas"value="1"/>
<inputtype="button"class="button"value="{l s='Opslaan'}"onclick="javascript:saveCustomization()"/>
<spanid="ajax-loader"style="display:none"><imgsrc="{$img_ps_dir}loader.gif"alt="loader"/>
<pclass="clear required">* {l s='verplichte velden'}
{/if}
----
Na zoeken:
{if isset($product)&& $product->customizable}
{l s='Product customization'}
{/if}
wijzigen door
{* {if isset($product)&& $product->customizable}
{l s='Product customization'}
{/if}
*}
Let op: om product.tpl te wijzigen, moet u forceren compilatie.
Vraag nr. 4: Ik wil het tabblad Productaanpassing naast het tabblad Meer informatie weergeven. Op dit moment wordt het onder de standaardtabbladen weergegeven.
Antwoord: Hallo!
Bewerk product.tpl
Wijzigen
{if $product->description || $features || $accessories || $HOOK_PRODUCT_TAB || $attachments
naar
{if $product->description || $features || $accessories || $HOOK_PRODUCT_TAB || $attachments || $product->customizable}
In
, boven {$HOOK_PRODUCT_TAB} regel invoegen:
{if $product->customizable}
{l s='Product customization'}
{/if}
In
, boven {$HOOK_PRODUCT_TAB_CONTENT} invoegen :
{if $product->customizable}
{l s='Nadat u uw aangepaste product hebt opgeslagen, vergeet het dan niet toe te voegen aan uw winkelwagen.'}
{if $product->uploadable_files}
{l s='Toegestane bestandsformaten zijn: GIF, JPG, PNG'}{/if}
{if $product->uploadable_files|intval}
{l s='Afbeeldingen'}
{counter start=0 assign='customizationField'}
{foreachfrom=$customizationFields item='field' name='customizationFields'}
{if $field.type ==0}
{assign var='key' value='pictures_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field}
{if isset($pictures.$key)}
{/if}
{counter}
{/if}
{/foreach}
{/if}
{if $product->text_fields|intval}
{l s='Teksten'}
{counter start=0 assign='customizationField'}
{foreachfrom=$customizationFields item='field' name='customizationFields'}
{if $field.type ==1}
{assign var='key' waarde='textFields_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field
{if!empty($field.name)}{$field.name}{/if}{if $field.required}*{/if}