Najważniejsze odpowiedzi na pytania dotyczące modułu dostosowywania produktów PrestaShop

W czasach, gdy na rynku panuje ogromna konkurencja, sukces odnoszą tylko ci, którzy przyjęli najnowsze trendy i techniki biznesowe. Właściciele sklepów, którzy najbardziej ułatwiają klientom zakupy, mają największe szanse na sukces. Najnowszym trendem, który podążają dobrze zorientowani właściciele sklepów, jest umożliwienie klientowi dostosowania atrybutów produktów według własnego uznania, np. jeśli klient kupuje koszulkę, może wstawić na nią logo, coś napisać, wkleić zdjęcie lub dowolny styl projektowania na koszulce. Wszystko zostanie wykonane przez klientów, a gdy cała personalizacja zostanie wykonana, może przesłać ją do administratora na tej samej stronie produktu. W rezultacie to samo zostanie dostarczone klientom. Ponieważ klienci uzyskują pełną kontrolę nad swoim produktem, więc lubią odwiedzać taki sklep.
Kiedy wchodzimy w implementację, sam PrestaShop nie jest tak elastyczny. Tutaj nie możemy powiedzieć, że programiści PrestaShop nie znają tej funkcji. Znają ją bardzo dobrze, ale aby oprogramowanie było naprawdę lekkie, dostarczają tylko niezbędne funkcje w swojej instalacji. Dlatego konieczne jest zaprojektowanie własnego modułu w tym celu lub skorzystanie z bezpłatnego lub płatnego modułu niestandardowego projektu PrestaShop.
W tym przewodniku omawiamy podstawowe kwestie związane z dostosowywaniem produktów PrestaShop. Mamy nadzieję, że ten post z odpowiedziami na pytania pomoże Ci rozwiązać problemy sklepu. Zacznijmy więc od tego;
Pytanie nr 1: Cześć, mam problem z polem dostosowywania PrestaShop. Kiedy klienci przesyłają plik obrazu, zapisuje, a następnie odświeża stronę. Wyświetla uszkodzoną miniaturę. Ponadto, kiedy klikam na obraz lub otwieram go w nowej karcie, po prostu przechodzę do strony błędu 404. Jaki jest problem?
Odpowiedź: Musisz edytować plik /upload/.htaccess i usunąć wiersz php_flag engine off. Znajdziesz te wiersze na końcu pliku. Zapisz plik, a wtedy będzie działał poprawnie.
Pytanie nr 2: Cześć, chcę przesłać plik PDF na stronie dostosowywania produktu. Obecnie mogę przesyłać tylko pliki obrazów. Jakiej poprawki potrzebuję?
Odpowiedź: Aby włączyć tę funkcję w swoim sklepie, musisz zastąpić metodę product controller>picture upload w override>controllers>front
. Pobierz poniższy kod, umieść go w ProductController.php
i prześlij do 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 JAK $field_id)
{
if ($field_id['type'] == Product::CUSTOMIZE_FILE)
$authorized_file_fields[(int)$field_id['id_customization_field']] = 'plik' . (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']))
{
// Jeśli wystąpi błąd przesyłania, pozwól, aby zajął się nim rodzic
if ($file['error'] != UPLOAD_ERR_OK)
// Jeśli plik nie jest dozwolony, pozwól uchwytowi nadrzędnemu to
...// Wyłącz plik PDF, aby uniemożliwić rodzicowi obsługę tego pliku
unset($_FILES[$field_name]);
// Utwórz dir
mkdir(_PS_UPLOAD_DIR_ . ProductController::CUSTOMIZATION_FILE_DIR.'/'.$this->context->cart->id, 0777, true);
// Oznacz plik jako niestandardowy prześlij
$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('Wystąpił błąd podczas pobierania pliku PDF prześlij.');
return false;
// Kopiuj plik do katalogu przesyłania
if (!copy($tmp_name, _PS_UPLOAD_DIR_.$file_name))
{
$this->errors[] = Tools::displayError('Wystąpił błąd podczas pobierania pliku PDF prześlij.');
return false;
// Zmień uprawnienia nowego pliku na chmod
if (!chmod(_PS_UPLOAD_DIR_.$file_name, 0777))
{
$this->errors[] = Tools::displayError('Wystąpił błąd podczas pobierania pliku PDF prześlij.');
return false;
// Utwórz fałszywy miniaturę, aby uniknąć błędu przy usuwaniu. Ten hack omija wiele nadpisywań metod rdzeniowych
file_put_contents(_PS_UPLOAD_DIR_ . $file_name . '_small', '');
chmod(_PS_UPLOAD_DIR_ . $file_name . '_small', 0777);
// Zarejestruj plik
$this->context->cart->addPictureToProduct($this->product->id, $indexes[$field_name], Product::CUSTOMIZE_FILE, $file_name);
// Usuń tmp plik
unlink($tmp_name);
return parent::pictureUpload();
protected function isUploadTypeAllowed($file)
{
/* Wykryj typ zawartości MIME */
$mime_type = false;
$types = array('application/pdf',); // Tutaj można dodać dodatkowe typy MIME
if (function_exists('finfo_open'))
{
$finfo = finfo_open(FILEINFO_MIME);
$mime_type = finfo_file($finfo, $file['tmp_name']);
finfo_close($finfo);
elseif (funkcja_istnieje('mime_content_type'))
{
$mime_type = mime_content_type($file['tmp_name']);
elseif (funkcja_istnieje('exec'))
{
$mime_type = trim(exec('plik -b --mime-type '.escapeshellarg($file['tmp_name'])));
jeśli (pusty($mime_type) || $mime_type == 'zwykły plik')
{
$mime_type = $file['type'];
if (($pos = strpos($mime_type, ';')) !== false)
$mime_type = substr($mime_type, 0, $pos);
// czy jest to dozwolone?
return $mime_type && in_array($mime_type, $types);
Wyczyść pamięć podręczną.
if isset($pictures.$key)
<divclass="customizationUploadBrowse">
{if substr(basename($pictures.$key), 0, 1) == 'P'
{l s='Wyświetl plik'
{else
<imgsrc="{$pic_dir}{$pictures.$key}_small"alt=""/>
if
Musisz także naprawić podgląd pliku w interfejsie sklepu. W product.tpl użyj następującego kodu:{if isset($pictures.$key)
{if substr(basename($pictures.$key),0,1)=='P'
{l s='Wyświetl plik'
{else
if
Otwórz „order-payment.tpl”, „order-detail.tpl”, „order-return.tpl” i wyszukaj „customizationUploaded”, skomentuj div i wklej nad nim ten kod:
{foreach $custom_data as $picture
{jeśli substr(nazwa_podstawowa($obrazek.wartość), 0, 1) == 'P'
<a href="{$pic_dir}{$picture.value}" target="_blank">Otwórz załączony plika>
{else
<źródło obrazu="{$pic_dir}{$picture.value}_small" alt="" />
<jeśli
<a href="{$link->getProductDeletePictureLink($product, $field.id_customization_field)|escape:'html':'UTF-8'}" tytuł="{l s='Usuń'}" >
<źródło obrazu="{$img_dir}ikona/usuń.gif" alt="{l s='Usuń'}" klasa="customization_delete_icon" szerokość="11" wysokość="13" />
a>
foreach
- Teraz ostatni krok: otwórz "/ps-admin/themes/default/template/controllers/orders/_customized_data.tpl", wyszukaj "Product::CUSTOMIZE_FILE", zakomentuj pierwszy foreach i wklej ten kod powyżej:
{foreach from=$datas item=data
<div klasa="grupa-formularza">
span klasa="etykieta-kontrolki-col-lg-4"><silne>{jeśli $data['nazwa']}{$data['nazwa']}{inaczej}{l s='Numer obrazu'}{$data@iteration}{/if}strong>span>
<div klasa="col-lg-8">
{jeśli substr(nazwa_bazowa($data.wartość), 0, 1) == 'P'
<a href="{$pic_dir}{$data.value}" cel="_blank">Otwórz załączony plika>
{inaczej
<a href="displayImage.php?img={$data['value']}&name={$order->id|intval}-file{$data@iteration}" klasa="_blank">
<img klasa="img-thumbnail" src="{$smarty.const._THEME_PROD_PIC_DIR_}{$data['value']}_small" alt=""/>
a>
<jeśli
div>
div>
<foreach
Pytanie nr 3: Utworzyłem 2 nowe pliki na stronach dostosowywania produktów, ale nie jestem zadowolony po ich utworzeniu. Ponieważ użytkownik musi przejść na dół i kliknąć dodatkowe zakładki. Czy mogę przenieść te pola w to samo miejsce, w którym znajduje się rozwijane menu kombinacji produktów? Próbowałem to zrobić, przenosząc kod ze stopki w inne miejsca, takie jak product.tpl, ale to nie pomaga.
Odpowiedź: Możesz to zrobić w następujący sposób.
Plik:
/themes/your-template/product.tpl
Znajdź i usuń następujący kod:
{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='Po zapisaniu spersonalizowanego produktu pamiętaj, aby dodać go do koszyka.'
{if $product->uploadable_files}
{l s='Dozwolone formaty plików to: GIF, JPG, PNG'} }
{if $product->uploadable_files|intval
<divclass="customizableProductsFile">
{l s='Zdjęcia'
<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=""/>
<imgsrc="{$img_dir}ikona/usuń.gif"alt="{l s='Usuń'}"class="customization_delete_icon"width="11"height="13"/>
<divclass="customizationUploadBrowse">
<labelclass="customizationUploadBrowseDescription">{if !empty($field.name)}{$field.name}{else}{l s='Wybierz plik obrazu ze swojego komputera'}. $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="text_fields">
{counter start=0 assign='customizationField'
{foreach from=$customizationFields item='field' name='customizationFields'
{if $field.type == 1
<liclass="customizationUploadLine{if $field.required} wymagane
<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}*
<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
<pid="customizedDatas"&g t;
<inputtype="hidden"name="quantityBackup"id="quantityBackup"value=""/>
<inputtype="hidden"name="submitCustomizedDatas"value="1"/>
<inputtype="button"class="button"value="{l s='Zapisz'}"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
-------
A przed tym wierszem:
{if (isset($product) && $product->description) || (isset($features) i $features) || (isset($accessories) i $accessories) || (isset($HOOK_PRODUCT_TAB) i $HOOK_PRODUCT_TAB) || (isset($attachments) i $attachments) || isset($product) && $product->customizable
Wklej ten kod:
{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='Po zapisaniu spersonalizowanego produktu pamiętaj, aby dodać go do koszyka.'
{if $product->uploadable_files}
{l s='Dozwolone formaty plików to: GIF, JPG, PNG'} }
{if $product->uploadable_files|intval}
<divclass="customizableProductsFile">
{l s='Zdjęcia'} }
<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="{$img_dir}ikona/delete.gif"alt="{l s='Usuń'}"class="customization_delete_icon"width="11"height="13"/>
{/if
<divclass="customizationUploadBrowse">
<labelclass="customizationUploadBrowseDescription">{if !empty($field.name)}{$field.name}{else}{l s='Wybierz plik obrazu ze swojego komputera'} ...
{counter
if
foreach
{if $product->text_fields|intval
<divclass="customizableProductsText">
{l s='Tekst'
<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 $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='Zapisz'}"onclick="javascript:saveCustomization()"/>
<spanid="ajax-loader"style="display:none"><imgsrc="{$img_ps_dir}loader.gif"alt="loader"/>
<pclass="wyczyść wymagane">* {l s='wymagane pola'
if
----
Po wyszukiwaniu:
{if isset($product)&& $product->customizable
{l s='Dostosowywanie produktu'
if
zmień o
{* {if isset($product)&& $product->customizable
{l s='Dostosowywanie produktu'
if
*
Uwaga: Aby zmodyfikować product.tpl, musisz aby wykonać wymuszoną kompilację.
Pytanie nr 4: Chcę wyświetlić kartę dostosowywania produktu obok karty więcej informacji. W tym momencie jest ona wyświetlana poniżej domyślnych kart.
Odpowiedź: Cześć!
Edytuj product.tpl
Zmień
{if $product->description || $features || $accessories || $HOOK_PRODUCT_TAB || $attachments
aby
{if $product->description || $features || $accessories || $HOOK_PRODUCT_TAB || $attachments || $product->customizable
W
, powyżej {$HOOK_PRODUCT_TAB} wstaw wiersz:
{if $product->customizable
{l s='Dostosowywanie produktu'
if
W
, powyżej {$HOOK_PRODUCT_TAB_CONTENT} wstaw :
{if $product->customizable
{l s='Po zapisaniu spersonalizowanego produktu pamiętaj, aby dodać go do cart.'
{if $product->uploadable_files}
{l s='Dozwolone formaty plików to: GIF, JPG, PNG'}
{if $product->uploadable_files|intval
{l s='Obrazy'}
{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)
{counter
{/if
{/foreach
{/if
{if $product->text_fields|intval
{l s='Teksty'
{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 $field.required}*