Jaki hosting dla sklepu internetowego wybrać (PrestaShop / WooCommerce)?

Na wstępie podsumowanie. Poruszyliśmy ten temat na grupach Polska PrestaShop i po głębszej analizie zaproponowanych rozwiązań zdecydowaliśmy się zarekomendować Państwu rozwiązanie od dostawcy hostingu MyDevil.net. Nasz wybór postaramy się uzasadnić w niniejszym wpisie.

MyDevil.net
MyDevil.net (pakiety przeniesione z 2ap.pl)
Administracja i Zlecenia indywidualne
MyDevil.net VPN
dhosting (hosting elastyczny) *hosting, który zawsze daje radę.

Jakie rozwiązanie hostingowe wybrać dla sklepu internetowego?

Ważnym czynnikiem jest niewątpliwie szybkość odpowiedzi serwera oraz ilość miejsca na dysku i jego rodzaj (SSD vs HDD) jak również limity plików i transferu w pakiecie hostingowym. To właśnie na te elementy najczęściej zwracamy uwagę. Są jednak również inne istotne aspekty na które warto zerknąć przed podjęciem decyzji. Przy wyborze hostingu dla sklepu internetowego należy spojrzeć również na możliwości konfiguracji ustawień php.ini.

Inne isotone czynniki to oferta generowanych przez serwer automatycznych darmowych certyfikatów SSL (zaleca się zakupienie SSL od dostawcy zewnętrznego – zwiększa wiarygodność strony) oraz stałe IP, dzięki czemu nasze wiadomości wysyłane ze sklepu nie będzie trafiać do folderu spamu.

Dodatkowo należy zwrócić uwagę na wspierane technologie. Miłym zaskoczeniem w usługach MyDevil.net. jest to, że wspierają node.js. Co jest rzadkością wśród innych dostawców usług hostingowych (Standardowo GIT, SSH i wiele więcej).

* Jeśli chcesz dowiedzieć się więcej na temat technologii jakie wpiera hosting MyDevil.net kliknij w link i rozwiń listę wszystkich dostępnych usług.

Dlaczego wybór hostingu pod sklep internetowy jest bardzo istotny i jak ta decyzja może mieć potem wpływ na funkcjonowanie twojego sklepu?

Dla przykładu nie wymieniając nazwy jednego z dostawców usług hostingowych z którego korzystaliśmy przez długi czas i byliśmy zadowoleni do momentu, kiedy to nasi klienci nie wymagali uruchamiania skryptów do importu produktów z hurtowni na sklep internetowy. Mówimy tu o liczbie koło 10 tysięcy produktów. Okazuje się, że nasz ówczesny dostawca nie pozwalał na zmianę parametru określającego czas wykonywania się zadania do jego zerwania. W efekcie plik, który potrzebował około 60s na wykonanie nie mógł się wykonać i był przerywany. Mowa o kontach hostingowych współdzielonych, które w większości przypadków wystarczyły do utrzymania sklepu ale nie potrafiły poradzić sobie z importem dużych zestawień produktów.

Dla klientów korzystających z droższych rozwiązań VPS problem nie występował. Tam zakres ustawiania parametrów php.ini jest nieograniczony. Jedyne ograniczenia to moc procesora, RAM przypisany do danego pakietu VPS. Pakiety VPS choć często wydajniejsze to są również droższe i wymagają specjalisty do ich administracji. Utrzymanie takiego rozwiązania staje się więc sporo droższe.

Jeśli mamy nielimitowane środki i zależy nam na wydajności to mamy również do wyboru rozwiązania dedykowane. Tu jednak koszty zaczynają znacząco rosnąć i na początek warto rozpocząć od czegoś tańszego. Skalowanie biznesu może odbywać się w czasie. Na strat wydaj tylko tyle i musisz by sklep był fikcjonalny i widoczny.

Według nas pakiet ofertowany przez MyDevil.net gwarantuje złoty środek zarówno w cenie jak i funkcjonalności między rozwiązaniami współdzielonymi a niezależnością konfiguracji w usługach VPS. Pakiety MD1-5 pozwalają na dość dowolną konfigurację ustawień środowiskowych silnika PHP pozwalając na swobodny import produktów do sklepu bez zmartwień o przerwanie pracy skryptu przed wykonaniem przez niego zadania. Pakiety hostingowe MyDevil.net są również szybkie i wyposażone w dyski SSD co zwiększa szybkość obsługi żądania a więc krótszy czas ładowania się strony potencjalnemu klientowi.

Szybkość ładowania strony ma ogromny wpływ na konwersję w sklepie oraz na pozycjonowanie sklepu w wyszukiwarce Google.

Dobry i tani hosting dla sklepu internetowego

To naszym zdaniem pakiet usług MyDevil.net spełnia większość wymagań każdego sklepu internetowego.
MyDevil.net (pakiety przeniesione z 2ap.pl)
Administracja i Zlecenia indywidualne
MyDevil.net VPN
dhosting (hosting elastyczny)


PrestaShop zmiana kategorii produktów MySQL

nr 1 backup

Przykładowy skrypt testowy. Jeśli w zapytaniu nie pominiemy START TRANSACTION i ROLLBACK; będziemy mogli zobaczyć co zrobi nasze zapytanie a wszystkie zmiany zostaną przywrócone do stanu z przed zapytania. Zanim dokonasz zmiany w bazie upewnij się, że zapytanie zrobiło dokładnie to czego chciałeś.

SELECT * FROM `ps_product`

Jakie tabele nas interesują? Tabela ps_product

SELECT c.id_category, cl.name
FROM `ps_category` c
LEFT JOIN `ps_category_lang` cl
ON c.id_category = cl.id_category WHERE cl.id_lang = 1;

START TRANSACTION;
UPDATE `ps_product` SET `id_category_default` = '6' ; #zmienia kategorię wszystkich produktów
UPDATE `ps_product` SET `id_category_default` = '6' WHERE `ps_product`.`id_category_default` = 2; #zmienia kategorię produktów o danej kategorii.
UPDATE `ps_product` SET `id_category_default` = '6' WHERE `ps_product`.`id_product` = 1858; #zmienia kategorię konkretnego produktu

SELECT * FROM ps_product;
ROLLBACK;

Jeśli interesuje cię bardziej zaawansowane zapytania, które są uodpornione na obecność jednego produktu w wielu kategoriach przy i ch przenoszeniu oraz usuwanie produktu z przenoszonej kategorii gdy już istnieje w bazie można znaleźć na tej stronie:
https://devwl.pl/prestashop-how-to-reassign-products-from-one-category-to-another/

PrestaShop 1.7 database schema

Niestety nie ma jeszcze przygotowanej dokumentacji dla PrestaShop 1.7. Możemy jednak podejrzeć budowę bazy analizując plik dostępny na repozytorium GitHub presty:
https://github.com/PrestaShop/PrestaShop/blob/1.7.7.x/install-dev/data/db_structure.sql

Narzędzia:
https://dev.mysql.com/downloads/workbench/

Przydatne źródła:
https://devdocs.prestashop.com/1.7/development/database/structure/

Możemy jednak posiłkować się strukturą opisaną w basie 1.6. Większość tabel oraz relacji pozostaje nienaruszona.

Forum:
https://www.prestashop.com/forums/topic/372412-list-of-all-table-referencing-by-foreign-key-ps_productid_product/

Hurtownia + PrestaShop + BaseLinker +[ Allegro, Inpost, Integracja Księgowa ]

Czyli jak zintegrować sklep z hurtowniami, systemem BaseLinker oraz Allegro.

Integracja z hurtowaniami odbywa się za pośrednictwem modułów integrujących. Na rynku mamy w tym zakresie kilka rozwiązań. Osobiście omówię jedynie kilka z nich.

anymag.pl – To obecnie nowa aplikacja i choć ich oferta jest obiecująca to nie zapewnia jeszcze kompletnej integracji produktów i kategorii. Być może w chili kiedy czytasz ten artykuł kilka miesięcy lub lat później tego problemu już nie ma. Warto zatem zadzwonić do obsługi i dopytać o listę możliwości ich rozwiązania.

presta-mod.pl – Oferuje integrację pod daną hurtownię. Wysłaliśmy do nich zapytanie i oczekujemy na odpowiedź. Ich moduł wydaje się wyglądać troszkę lepiej do tego prezentowanego przez x13 z którego mieliśmy już przyjemność korzystać integrując jedną z hurtowni.
Link do modułu: https://presta-mod.pl/pl/moduly-prestashop/114-prestashop-import-produktow-xml-xml-new.html.

prestadev.pl – Prezentuje podobne rozwiązanie jak presta-mod.pl. W naszym przypadku pisząc wiadomość e-mail otrzymaliśmy odpowiedź kilka sekund później więc można założyć, że firma jest bardzo aktywna. Rozwiązanie wygląda podobnie do tego prezentowanego przez x13 oraz presta-mod.pl.
Link do modułu: https://prestadev.pl/pl/60-import-xml-hurtowania-prestashop.html#pd_aap_send_custommer_form

https://prestadev.pl/

x13.pl – Ich moduły integracyjne są na rynku od dawna i wielu użytkowników ceni sobie ich rozwiązania. Nie ma jednak rozwiązań bez wad. W przypadku usługi od x13 kupujemy sztywną integrację pod określony format pliku. Jeśli kluczowa struktura pliku zmieni się integracja będzie wymagała wprowadzenia zmian. Jesteśmy więc narażeni na przerwę techniczną i choć takie przypadki nie są najczęstsze to jednak zdążają się i trzeba mieć je na uwadze. W naszym przypadku jedna z integracji była wyceniona na kilka tyś zł netto choć na swojej stronie sprzedają moduł za około 500 zł netto. Kolejna hurtownia miała zwyczajnie nie zostać zintegrowana. Być może firma 13 miała swoje powody, to z perspektywy konsumenta nie mają one wielkiego znaczenia. Nie da się znaczy, że się nie da.

prestashow.pl – Kolejny polski moduł pozwalający nam na przeprowadzenie integracji samodzielnie. Po zainstalowaniu wtyczki pliki XML muszą zostać zmapowane we własnym zakresie. Takie rozwiązanie daje nam więcej możliwości integracyjnych i choć droższe na początku to z perspektywy czasu przy integracji kilku hurtowni pozwala zaoszczędzić pare zł.

prestashopmanager.com – Na uwagę może zasłużyć również. Jest to nieco bardziej rozbudowany produkt i jego funkcjonalność nie kończy się na integracji hurtowni XML z naszym sklepem PrestaShop. Częściowo prestashopmanager spełnia funkcje integracyjne z marketplace na podobieństwo Baselinkera, jednakże jest to rozwiązanie zagraniczne i o ile może doskonale spełnić się na rynku zagranicznym tak już nie możemy liczyć na integracje do najpopularniejszych na polskim rynku rozwiązań jak np. Allegro czy Olx.

Module; https://www.prestashopmanager.com/order/

Integracja PrestaShop z BaseLinker

Base linker to produkt oferujący wiele integracji pod jednym systemem w module subskrypcyjnym. Bardzo popularny na polskim rynku. Pozwala on na wiele rodzajów integracji kurierskich, księgowych jak również zarządzanie sprzedażą z poziomu panelu Baselinkera. To naprawdę fajne narzędzie i potrzebuje wiele fajnego
http://pomoc.baselinker.com/pomoc/integracja-sklepu-przez-plik/

BaseLinker jest systemem do usprawniania i zarządzania procesem sprzedaży w Internecie oraz integracji z zewnętrznymi marketplace takimi jak Allegro, Ebay, OLX czy Amazon. Nie jest to jednak rozwiązanie idealne. Importując produkty do allegro na dzień dzisiejszy BaseLinker nie daje nam możliwości ustawiania osobnej marży dla poszczególnej kategorii. Jak wiemy Allegro opiera swój sposób naliczania prowizji na różnych stawkach prowizji podzielonej względem różnych kategorii. Aby więc osiągnąć ceny idealne musielibyśmy ustalać ceny indywidualnie dla każdego produktu co jest niemożliwe przy dużej ilości asortymentu lub modyfikować nasze ceny w sklepie (który jest magazynem głównym przy imporcie produktów z hurtowni jeśli nasze rozwiązanie importujące na to pozwala) w celu ustawienia preferowanej marży dla produktów wystawionych na allegro. Zgłosiliśmy ten problem do Baselinkera i otrzymaliśmy odpowiedź, że ta funkcjonalność jest obecnie testowana i niebawem powinna zostać wdrożona. Na dzień dzisiejszy jednak ta funkcjonalność jest niedostępna i może sprawić sporo kłopotów przy ustalaniu cen produktów.

Jedyne rozwiązanie jaki widzimy to posiadać dwa zewnętrzne magazyny i ustalać na nich ceny niezależnie. Czyli np. katalog produktów na PrestaShop oraz oddzielny magazyn / sklep PrestaShop do handlu detalicznego.

Z poziomu Baselinkera można również przeprowadzać integracje bezpośrednio do magazynu Baselinkera pomijając sklep. Nie jest to jednak rozwiązanie idealne. Posiadając własny sklep możemy oferować klientom lepsze ceny niż te wystawiane na allegro.

Czy są jakieś alternatywy dla BaseLinkera? Na rynku istnieją jeszcze takie rozwiązania jak https://sellasist.pl/, https://www.erpbox.pl/. Być może w przyszłości napiszemy o nich wpis porównawczy.

Po integracji Baselinkera z Allegro Baselinker uzyska dostęp do następujących funkcji:

Zarządzanie ofertami
Odczyt danych o ofertach. Tworzenie, edycja, łączenie i zamykanie ofert.

Ustawienia sprzedaży
Odczyt ustawień sprzedaży. Zarządzanie ustawieniami sprzedaży.

Promowanie ofert
Zarządzanie kampaniami Allegro Ads. Zgłaszanie ofert do oznaczeń i programów specjalnych.

Zamówienia i obsługa posprzedażowa
Odczyt informacji o zamówieniach. Zarządzanie zamówieniami. Obsługa ocen i komentarzy. Obsługa sporów transakcyjnych.

Finanse i płatności
Odczyt salda i opłat na koncie. Odczyt historii płatności. Obsługa zwrotów wpłat.

Dane osobowe
Odczyt danych osobowych z konta. Edycja danych osobowych na koncie.

Licytacje i zakupy
Składanie ofert kupna w licytacjach.

Twój pierwszy sklep w PrestaShop

Masz już swój pierwszy sklep w PrestaShop? Dowiedz się o nim więcej. Naucz się jego obsługi. PrestaShop Udostępnia wiele materiałów, które pomogą ci poznać jego możliwości oraz funkcjonalność.

Zacznij tutaj:
http://doc.prestashop.com/display/PS17/Getting+Started

Jeśli masz jakieś trudności, możliwe, że nie jesteś pierwszy. Sprawdź forum PrestaShop i zobacz czy nie rozwiązano już wcześniej twojego problemu.
https://www.prestashop.com/forums/

PrestaShop posiada również odpłatne kursy i szkolenia oraz wydarzenia, w których możesz wziąć udział. Szkolenia są podzielona dwie kategorie dla: Sprzedawców oraz Developerów.
https://www.prestashop.com/en/training

PrestaShop posiada również oficjalny kanał YouTube na którym można znaleźć więcej informacji o funkcjonalności tego rozwiązania:
https://www.youtube.com/channel/UCqDSbqSbkboMBARlYrhNa7g

PrestaShop Module Development – Where to start?

Developing a PrestaShop plugin or theme is not an easy task. There fore you need to find the right resources to start learning development of a custom module.

Where to find video tutorials: https://beautifulweb.pl/prestashop-module-development-where-to-start/

PrestaShop Module Development Tutorial

Developing a custom module may bring a lot of cool features to your PrestaShop site. Lest start here:
https://prestapros.com/blog/jak-napisac-modul-prestashop
The code in above article present a bare minimum for a plugin to work in PrestaShop environment.
There are module templet generators that can help us to set up proper folder hierarchy. Lets have a look at module generator:

PrestaShop module skeleton generator

https://validator.prestashop.com/generator

Above online generator allow us to create a quick template for our plugin including database setup, hook declaration and many more.

PrestaShop Module development documentation:

To be able to understand the code given by the generator we need to work closely with a documentation https://devdocs.prestashop.com/1.7/modules/

It is also possible to learn more about PrestaShop from online tutorials. Unfortunately there are not many resources available online. Here is few tutorials that we where able to find for PrestaShop 1.7.:

PrestaShop Smarty Global Variables and Twig conversion

Smarty Doc. | Twig Doc. | PrestaShop Theme Development Doc 1. && Doc 2| PrestaShop Module Development Doc.

PrestaShop uses .twig template, but many themes from the themes repository such as themeforest uses php smarty engine to power their view pages. (.tpl). There are some global SMARTY variables available by default in PrestaShop. Here is a list of them:

General info about your online store

{$shop.name} Store name
{$shop.email} Store Email
{$shop.logo} Store logo
{$shop.favicon} Store icon (map, title of the browser window, etc.)
{$shop.address.address1} Store address 1
{$shop.address.address2} Store address 2
{$shop.address.postcode} Store Zip Code
{$shop.address.city} Store City
{$shop.address.state} Store State (Province)
{$shop.address.country} Store Country
{$shop.phone} Store Telephone
{$shop.fax} Store Fax

Language

{$language.name} Name of the language in use (example: English) 
{$language.iso_code} ISO code of the language in use (it for Italian, fr for French, etc.)
{$language.language_code} Code of the language in use (it for Italian, en-us for American English, etc.)
{$language.is_rtl} (1 when language is written from right to left; 0 if from left to right)
{$language.id} ID value of the language in use

Currency

{$currency.name} Name of the currency in use (Euro, American Dollar, etc.)
{$currency.iso_code} Currency ISO code of the currency in use (Eur, USD, etc.)
{$currency.sign} Symbol of the currency in use (€, $, etc.)
{$currency.iso_code_num} ISO code number of the currency in use (978 for Euro, 840 for American Dollar, etc.)

Pages and elements of the e-commerce site

{$urls.base_url} Store web address (example: https://www.themebooster.com)
{$urls.current_url} Current web address (url), the page we are viewing
{$urls.shop_domain_url} Store domain
{$urls.img_ps_url} Image root directory url
{$urls.img_cat_url} Url of the categories images directory
{$urls.img_lang_url} Url of the languages images directory
{$urls.img_prod_url} Url of the products images directory
{$urls.img_manu_url} Url of manufacturers images directory
{$urls.img_sup_url} Url of providers images directory
{$urls.img_ship_url} Url of carriers images directory
{$urls.img_store_url} Url of physical store images directory
{$urls.img_url} Url of theme images directory
{$urls.css_url} Url of css files directory used by the theme
{$urls.js_url} Url of javascript files directory used by the theme
{$urls.pic_url} Url of file uploaded directory
{$page.page_name} Page Name (file template)
{$page.meta.title} Page Title (SEO)
{$page.meta.description} Tag description content (SEO)
{$page.meta.keywords} Tag keywords content (SEO)
{$page.meta.robots} Rule for search engines: blocks or not the page indexing (SEO)
{$page.canonical} Indicates the canonical (main) URL to avoid duplication of contents (SEO)
{$urls.pages.address} Url of the "My Address" section (registered user)
{$urls.pages.addresses} Url of the "My addresses" section (registered user)
{$urls.pages.authentication} Url of the authentication page
{$urls.pages.cart} Url of cart page (order summary)
{$urls.pages.category} Url of the category
{$urls.pages.cms} Url of the page (type CMS)
{$urls.pages.contact} Url of the contact page
{$urls.pages.discount} Url of the discount voucher page
{$urls.pages.guest_tracking} Tracking url for unregistered clients
{$urls.pages.history} Url of the "Order History" page (registered user)
{$urls.pages.identity} Url of the "Personal data" page (registered user)
{$urls.pages.index} Home page url
{$urls.pages.my_account} Url of "My Account" page (registered user)
{$urls.pages.order_confirmation} Url of the "Order Confirmation" page
{$urls.pages.order_follow} Url in the "Order Tracking" (registered user)
{$urls.pages.order} Url of the "Order" page
{$urls.pages.order_return} Url of the "Order Return" page
{$urls.pages.order_slip} Url of the "Order Slip" page
{$urls.pages.pagenotfound} Url of the "404 - Page not found"
{$urls.pages.password} Url of "Recover Password" page
{$urls.pages.pdf_invoice} Url of Pdf invoice
{$urls.pages.pdf_order_return} Url of Pdf order return
{$urls.pages.pdf_order_slip} Url of Pdf order slip
{$urls.pages.prices_drop} Url of "Our Offers" page
{$urls.pages.product} Url of the "Product" page
{$urls.pages.search} Url of the "Search" page
{$urls.pages.sitemap} Url of thr "Site Map" page
{$urls.pages.stores} Url of the "Shops/Our stores" page
{$urls.pages.supplier} Url of the "Suppliers" page
{$urls.pages.register} Url of the "Register" page
{$urls.pages.order_login} Url of the "Login" page
{$urls.theme_assets} Url of the "assets" directory of the theme
{$urls.actions.logout} Url to disconnect from the site (registered user)

Cart

{$cart.totals.total.amount}The total amount of the cart without currency (ex: 45,00)
{$cart.totals.total.value} The total amount of the cart with currency (ex: 45,00 €)
{$cart.totals.total_including_tax.amount} The total amount of the cart, including taxes, without currency (ex: 45,00)
{$cart.totals.total_including_tax.value} The total amount of the cart, including taxes, with currency (ex: 45,00 €)
{$cart.totals.total_excluding_tax.amount} The total amount of the cart, excluding taxes, without currency (esempio: 35,70)
{$cart.totals.total_excluding_tax.value} The total amount of the cart, excluding taxes, with currency (esempio: 35,70 €)
{$cart.products_count} Number of products in the cart
{$cart.subtotals.products.amount} The amount of products in the cart without currency
{$cart.subtotals.products.value} The amount of products in the cart withcurrency
{$cart.subtotals.shipping.amount} The amount of shipping in the cart without currency
{$cart.subtotals.shipping.value} The amount of shipping in the cart with currency

Customers

{$customer.lastname} Customer Last Name
{$customer.firstname} Customer First Name
{$customer.email} Customer Email (provided during the registration)
{$customer.birthday} Customer Birthday
{$customer.newsletter} Subscribed to the newsletter (1 if subscribed, 0 if unsubscribed)
{$customer.newsletter_date_add} Newsletter subscription date
{$customer.ip_registration_newsletter} IP of Customers at the newsletter registration
{$customer.optin} Subscribed to offers from partners (1 if subscribed, 0 if unsubscribed)
{$customer.date_add} Customer registration
{$customer.date_upd} Last updated (customer registration)
{$customer.id} Customer ID
{$customer.id_default_group} ID group to which the client is associated
{$customer.is_logged} Check if the client is "logged in" (1 yes, 0 no)
{$customer.gender.name[$customer.gender.id]} Client Gender (example: Ms, Mr, etc.)
{$customer.addresses[AddressID].city} Client City of address with an ID (AddressID, example 8, where 8 is the ID of the customer's address), because a client could have multiple addresses)
{$customer.addresses[AddressID].alias} Address alias
{$customer.addresses[AddressID].firstname} Address Holder first name
{$customer.addresses[AddressID].lastname} Address Holder last name
{$customer.addresses[AddressID].company} Address Holder company
{$customer.addresses[AddressID].address1} Address Holder address 1
{$customer.addresses[AddressID].address2} Address Holder address 2
{$customer.addresses[AddressID].postcode} Address Holder ZIP code
{$customer.addresses[AddressID].id_state} Address Holder ID state
{$customer.addresses[AddressID].state} Address Holder state name
{$customer.addresses[AddressID].state_iso} Address Holder state ISO code
{$customer.addresses[AddressID].id_country} Address Holder ID country
{$customer.addresses[AddressID].country} Address Holder country name
{$customer.addresses[AddressID].country_iso} Address Holder ISO country
{$customer.addresses[AddressID].phone} Address Holder telephone
{$customer.addresses[AddressID].phone_mobile} Address Holder mobile phone
{$customer.addresses[AddressID].dni} Address Holder DNI
{$customer.addresses[AddressID].vat_number} Address Holder VAT number
{$customer.addresses[AddressID].formatted} Address Holder formatted address

Prestashop 1.7: examples of conditions

Now, with the smarty variables used by Prestashop, you can display an element based on a condition or not.

Show an item if the page you are viewing is the home page

{if $page.page_name == 'index'}
  content to show
{/if}

Show an item if the page you are viewing is a content page (CMS)

{if $page.page_name == 'cms'}
  content to show
{/if}

Show an item if the page you are viewing is the cart page

{if $page.page_name == 'cart'}
  content to show
{/if}

Show an item if the user is logged in (login)

{if $customer.is_logged}
  content to show
{/if}

Show a translatable welcome message and the name if the user has logged in

{if $customer.is_logged && $customer.firstname} 
  {l s='Hi' d='Shop.Theme.Global'} {$customer.firstname}
{/if}

Show a translatable message depending on whether the user is registered or not to the Newsletter

{if $customer.newsletter == 0}
  {l s='Sign up to our newsletter!' d='Shop.Theme.Customeraccount'}
{else}
  {l s='You are already subscribed to our newsletter' d='Shop.Theme.Customeraccount'}
{/if}

Src: https://www.themebooster.com/prestashop-tutorials/prestashop-1-7-smarty-global-variables/

Convert Smarty to Twig

If you need to convert above variable to twig, there is PrestaShop documentation explaining the this process:
https://devdocs.prestashop.com/1.7/development/architecture/migration-guide/templating-with-twig/

Custom Pretty URL in module PrestaShop

Wycena sklepu internetowego

Ile kosztuje sklep internetowy?

Ceny sklepu internetowego są dość rozbieżne. W internecine znajdą Państwo oferty od 1600 do 8000 zł, kilku dziesięciu a nawet kilku set tysięcy złotych. Jakie są różnice i co można kupić w tych różnych przedziałach cenowych?

Proszę mieć świadomość, że cena zazwyczaj idzie w parze z zakresem usługi oraz rodzajem, wyglądem i funkcjonalnością rozwiązania. Bardzo prosty sklep można postawić za stosunkowo niewielkie pieniądze, ale jak coś ma wyglądać być funkcjonalne i jeszcze oczekuje Pani jakiejś pomocy oraz wprowadzenia produktów na sklep czy integracji z hurtowniami zewnętrznymi to trzeba zapłacić więcej. W zamian ma Pani spokojną głowę jak i nie musi marnować czasu na czynności, które można zautomatyzować. Zapłaci dwa razy bo pierwszy sklep nie spełnia oczekiwań to żadna oszczędność.

Jaki sklep internetowy?

Na początku trzeba skonsultować własne wymagania i potrzeby a następnie złożyć zapytanie o wycenę, już konkretniej ze szczegółami. Inaczej wpadną Państwo w pułapkę tanio i byle jak, czyli straci pani pieniądze na rozwiązanie, które nie spełnia Państwa oczekiwań.

Nie deklarując pewnych funkcjonalności na początku nie mogą Państwo również oczekiwać, że takie rozwiązania zostaną dostarczone w trakcie realizacji. Czasami może okazać się, że dana funkcjonalność nie jest dostępna we wdrażanym systemie a jej indywidualna implementacja może znacznie przewyższyć cenę budowy samego sklepu.

Jaka platforma e-commerce

Na rynku mamy dostępne wiele rozwiązań z różnymi modelami płatności. Płatność za wynajem sklepu lub koszt wdrożenia sklepu na jednej z popularnych platform e-commerce. Ewentualnie budowa własnego sklepu (ta opcja jest już bardzo droga i przeznaczona głównie dla dużych firm mających duży budżet inwestycyjny)

Wynajem sklepu:
– https://www.shopify.com (cena w tabeli poniżej)
– https://sky-shop.pl

Basic ShopifyAll the basics for starting a new businessShopifyEverything you need for a growing businessAdvanced ShopifyAdvanced features for scaling your business
USD $29 per month/moUSD $79 per month/moUSD $299 per month/mo
Shopify Plany / koszt na miesiąc na dzień 8/03/2021


Basic Dynamicznie rozwijający się e-sklep

99 zł miesiąc / netto
Business Pakiet idealny dla Allegrowiczów i Dropshippingu

187 zł miesiąc / netto
Advance Większe możliwości dla rosnącego sklepu internetowego

299 zł miesiąc / netto
Shopify Plany / koszt na miesiąc na dzień 8/03/2021

* Łatwo policzyć, że roczny koszt to minimum 1500 zł zł netto za najuboższą opcję / płatność roczna. Czyli bardzo bliski koszt wdrożenia sklepu w systemie WooCommerce w najuboższej wersji (patrz lista poniżej) / płatność jednorazowa.

Własny sklep:
Wdrożenie jednego z systemów:
– WooCommerce (2000 – XX XXX zł w zależności od wymagań klienta)
– PrestaShop (3500 – XX XXX zł w zależności od wymagań klienta)
– Magento (8000 – XXX XXX zł w zależności od wymagań klienta)
* Należy pamiętać, że przy cenie startowej otrzymujemy jedynie działający system bez dodatkowej funkcjonalności czy też wyszukanego szablonu graficznego.

Budowa własnego rozwiązania w oparciu o specyficzne technologie i frameworki (tylko dla dużych firm):
LAMP lub MEAN
React, Angular, Symfony
MySQL, Mongo, Firebase
Cena od 60 000 zł do X XXX XXX w zależności od wymagań klienta)

Z reguły implementacje sklepu na znanej platformie jest początkowo droższa ale tańsza na przestrzeni czasu. Nie należy jednak nastawiać się na jazdę próbną na jednym rozwiązaniu i przejście na drugie bo często takie transfery są trudne lub nawet niemożliwe albo zwyczajnie kosztowne pochłaniają nie tylko środki ale i czas.

Dobrze wiec obrać dobrą strategię na samym początku.

PrestaShop dodawania kolumny brutto w widoku admina – produktu. (dla wersji 1.7.5 ta funkcja jest wbudowana)

Dodajemy dodatkową kolumnę z ceną ostateczną obok ceny netto
https://www.prestashop.com/forums/topic/888500-prestashop-1742-ceny-netto-brutto/

Works with: Prestashop 1.7.0-4 (tested up to 1.7.5.5) – W wersji 1.7.5 ta pozycja jest już wdrożona przez autorów PrestaShop. Jeśli więc zrobisz aktualizację to nie musisz robić ego ręcznie. Nie mniej jednak dobrze wiedzieć jak takie rzeczy zrobić samemu. Może się przydać przy innej okazji.


Navigate to:  yousite/src/PrestaShopBundle/Resources/views/Admin/Product/CatalogPage/Lists/products_table.html.twig
Find:

<th scope="col" class="text-center" style="width: 9%"> {{ ps.sortable_column_header("Price (tax excl.)"|trans({}, 'Admin.Catalog.Feature'), 'price', orderBy, sortOrder) }} </th>

Add below:

<th scope="col" class="text-center" style="width: 9%"> {{ ps.sortable_column_header("Final price"|trans({}, 'Admin.Catalog.Feature'), 'price_final', orderBy, sortOrder) }} </th>

Navigate to: 
yoursite/src/PrestaShopBundle/Resources/views/Admin/Product/CatalogPage/Lists/list.html.twig
Find:

<td class="text-center"> <a href="{{ product.url|default('') }}#tab-step2">{{ product.price|default('N/A'|trans({}, 'Admin.Global')) }}</a> </td>

Add below:

<td class="text-center"> <a href="{{ product.url|default('') }}#tab-step2">{{ product.price_final|default('N/A'|trans({}, 'Admin.Global')) }}</a> </td>

źródło:

https://www.prestashop.com/forums/topic/637522-how-to-add-extra-fields-to-back-office-to-display-the%C2%A0%C2%A0prices-tax-excl-and-tax-incl/

Export produktów w PrestaShop 1.7

PrestaShop 1.7 – I bez pluginu się da jak ktoś troszkę techniczny – w zaawansowanych klikamy w bazę danych > dodajemy zapytanie SQL > Piszemy kod SQL

SELECT p.id_product, p.active, pl.name, GROUP_CONCAT(DISTINCT(cl.name) SEPARATOR ",") as categories, p.price, p.id_tax_rules_group, p.wholesale_price, p.reference, p.supplier_reference, p.id_supplier, p.id_manufacturer, p.upc, p.ecotax, p.weight, p.quantity, pl.description_short, pl.description, pl.meta_title, pl.meta_keywords, pl.meta_description, pl.link_rewrite, pl.available_now, pl.available_later, p.available_for_order, p.date_add, p.show_price, p.online_only, p.condition, p.id_shop_default
FROM ps_product p
LEFT JOIN ps_product_lang pl
ON (p.id_product = pl.id_product)
LEFT JOIN ps_category_product cp
ON (p.id_product = cp.id_product)
LEFT JOIN ps_category_lang cl
ON (cp.id_category = cl.id_category)
LEFT JOIN ps_category c
ON (cp.id_category = c.id_category)
LEFT JOIN ps_product_tag pt
ON (p.id_product = pt.id_product)
WHERE pl.id_lang = 1
AND cl.id_lang = 1
AND p.id_shop_default = 1
AND c.id_shop_default = 1
GROUP BY p.id_product

Zapisujemy (lub dowolnie modyfikujemy). Jeśli przy tworzeniu sklepu dodaliśmy przedrostek do bazy to musimy go teraz dodać przed nazwą każdej tabeli.. np „v2_” lub coś innego. Naciskamy chmurkę i pobiera się nam CSV.. do otwierania używamy najlepiej Open Office (bo ten pozwala nam skonfigurować odczyt pliku CSV właśnie) lub Google Docs. Mam nadzieje, że tym trochę technicznym pomogłem.

Zapytanie pisane pod 1.7 i nie testowałem pod 1.6 ale może działa … kto wie

Otrzymywaniem emaila z PrestaShop po złożeniu zamówienia przez klienta

Wbrew pozorom ta niewinna funkcjonalność nie jest tak zwyczajnie dostępna w instalacji naszego kochanego sklepu. Jak możemy poczytać nie jedna osoba miała z tym problem. Można jednak dojść do wniosku, że jest to wykonalne. Trzeba pobrać moduł i za jego pomocą dodać tak banalną funkcjonalność. Poczytajmy na forum jak wygląda batalia o dodanie tej funkcjonalności trwająca od 2017 roku.

https://www.prestashop.com/forums/topic/602813-where-to-set-admin-email-address-for-new-order-notifications/

No i właśnie tak wygląda praca przy PrestaShop 🙂 Wiecznie coś trzeba kombinować. Chociaż naszym skromnym zdaniem tak banalne funkcjonalności powinny być dostępne po podstawowej instalacji bez konieczności jakichkolwiek modernizacji systemu.

Tymczasem musimy pobrać wtyczkę z github, zainstalować i odpowiednio skonfigurować

github link: https://github.com/PrestaShop/ps_emailalerts

Jeśli jesteś developerem to sam możesz dopisać sobie taką funkcjonalność korzystając z wbudowanej funkcji email w PrestaShop (jeśli nim jesteś to już o tym wiesz i ten wpis jest ci mało pomocny).

https://devdocs.prestashop.com/1.7/development/mail/