{"id":18401,"date":"2025-01-30T14:09:01","date_gmt":"2025-01-30T13:09:01","guid":{"rendered":"https:\/\/www.lh.pl\/pomoc\/?p=18401"},"modified":"2025-01-30T14:09:02","modified_gmt":"2025-01-30T13:09:02","slug":"jak-zaczac-tworzyc-moduly-do-prestashop","status":"publish","type":"post","link":"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/","title":{"rendered":"Jak zacz\u0105\u0107 tworzy\u0107 modu\u0142y do PrestaShop?"},"content":{"rendered":"\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly-1024x576.jpg\" alt=\"\" class=\"wp-image-18404\" srcset=\"https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly-1024x576.jpg 1024w, https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly-300x169.jpg 300w, https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly-768x432.jpg 768w, https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly.jpg 1280w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Czym s\u0105 modu\u0142y w PrestaShop i dlaczego warto je tworzy\u0107?<\/h2>\n\n\n\n<p>Modu\u0142y w PrestaShop to rozszerzenia, kt\u00f3re umo\u017cliwiaj\u0105 dostosowanie sklepu do indywidualnych potrzeb. Dzi\u0119ki nim mo\u017cesz dodawa\u0107 nowe funkcje, integrowa\u0107 zewn\u0119trzne systemy, modyfikowa\u0107 wygl\u0105d strony czy usprawnia\u0107 dzia\u0142anie sklepu bez ingerencji w kod \u017ar\u00f3d\u0142owy platformy. Modu\u0142y dzia\u0142aj\u0105 niezale\u017cnie, co sprawia, \u017ce s\u0105 \u0142atwe w zarz\u0105dzaniu i aktualizacji.<\/p>\n\n\n\n<p><strong>Dlaczego warto tworzy\u0107 modu\u0142y? <\/strong>Przede wszystkim dlatego, \u017ce pozwalaj\u0105 one wprowadza\u0107 spersonalizowane rozwi\u0105zania, kt\u00f3re wyr\u00f3\u017cni\u0105 Tw\u00f3j sklep na tle konkurencji. Dla w\u0142a\u015bcicieli sklep\u00f3w to szansa na unikalne funkcje, a dla programist\u00f3w \u2013 okazja do rozwijania swoich umiej\u0119tno\u015bci i tworzenia warto\u015bciowych rozwi\u0105za\u0144, kt\u00f3re mog\u0105 by\u0107 sprzedawane jako produkty na platformach takich jak PrestaShop Addons.<\/p>\n\n\n\n<p>Aby rozpocz\u0105\u0107 prac\u0119 nad modu\u0142ami, wystarczy podstawowa znajomo\u015b\u0107 PHP, HTML, CSS, JavaScript oraz MySQL. CSS i JavaScript pozwalaj\u0105 na tworzenie atrakcyjnych i interaktywnych element\u00f3w, kt\u00f3re mo\u017cna zintegrowa\u0107 z funkcjami modu\u0142u. MySQL z kolei umo\u017cliwia zarz\u0105dzanie danymi w bazie, co jest szczeg\u00f3lnie przydatne w przypadku bardziej zaawansowanych modu\u0142\u00f3w, takich jak integracje z zewn\u0119trznymi systemami czy dynamiczne raporty.<\/p>\n\n\n\n<p>Nie musisz by\u0107 ekspertem w tych technologiach \u2013 wystarczy znajomo\u015b\u0107 podstaw, kt\u00f3re b\u0119d\u0105 rozwijane wraz z post\u0119pem prac nad modu\u0142em. <strong>W tym poradniku znajdziesz wszystkie niezb\u0119dne kroki, kt\u00f3re pomog\u0105 Ci stworzy\u0107 sw\u00f3j pierwszy modu\u0142 i w pe\u0142ni wykorzysta\u0107 mo\u017cliwo\u015bci PrestaShop.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podstawowa struktura modu\u0142u<\/h2>\n\n\n\n<p>Ka\u017cdy modu\u0142 w PrestaShop opiera si\u0119 na precyzyjnie zdefiniowanej strukturze plik\u00f3w i folder\u00f3w, kt\u00f3ra umo\u017cliwia jego prawid\u0142owe dzia\u0142anie w systemie. Zrozumienie tej struktury to kluczowy krok w procesie tworzenia w\u0142asnych modu\u0142\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tworzenie katalogu modu\u0142u<\/h3>\n\n\n\n<p>Pierwszym krokiem jest utworzenie katalogu dla modu\u0142u w folderze \/modules\/ Twojej instalacji PrestaShop. Nazwa katalogu powinna by\u0107 unikalna i oparta na konwencji, np. mymodule. Wa\u017cne jest, aby u\u017cywa\u0107 wy\u0142\u0105cznie ma\u0142ych liter i unika\u0107 spacji.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Plik g\u0142\u00f3wny modu\u0142u<\/h3>\n\n\n\n<p>Kluczowym plikiem ka\u017cdego modu\u0142u jest plik PHP, kt\u00f3rego nazwa musi odpowiada\u0107 nazwie katalogu modu\u0142u, np. <strong>mymodule.php<\/strong>. Plik ten zawiera klas\u0119 modu\u0142u, kt\u00f3ra dziedziczy po klasie Module dostarczonej przez PrestaShop. W tej klasie definiowane s\u0105 wszystkie podstawowe informacje o module, takie jak nazwa, opis czy wersja.<\/p>\n\n\n\n<p><strong>Przyk\u0142ad podstawowego pliku g\u0142\u00f3wnego mymodule.php:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class MyModule extends Module\r\n{\r\n\tpublic function __construct()\r\n\t{\r\n\t\t$this->name = 'mymodule';\r\n\t\t$this->tab = 'front_office_features';\r\n\t\t$this->version = '1.0.0';\r\n\t\t$this->author = 'Twoje Imi\u0119';\r\n\t\t$this->need_instance = 0;\r\n\r\n\t\tparent::__construct();\r\n\r\n\t\t$this->displayName = $this->l('M\u00f3j modu\u0142');\r\n\t\t$this->description = $this->l('Opis modu\u0142u.');\r\n\t}\r\n\r\n\tpublic function install()\r\n\t{\r\n\t\treturn parent::install();\r\n\t}\r\n\r\n\tpublic function uninstall()\r\n\t{\r\n\t\treturn parent::uninstall();\r\n\t}\r\n}\r\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Kluczowe elementy pliku config.xml<\/h3>\n\n\n\n<p>Dodatkowo modu\u0142 powinien zawiera\u0107 plik <strong>config.xml<\/strong>, kt\u00f3ry przechowuje metadane takie jak kompatybilno\u015b\u0107 z wersjami PrestaShop czy wymagania modu\u0142u. Plik ten nale\u017cy umie\u015bci\u0107 w katalogu g\u0142\u00f3wnym modu\u0142u.<\/p>\n\n\n\n<p><strong>Przyk\u0142ad zawarto\u015bci config.xml:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;module>\r\n\t&lt;name>mymodule&lt;\/name>\r\n\t&lt;displayName>M\u00f3j modu\u0142&lt;\/displayName>\r\n\t&lt;version>1.0.0&lt;\/version>\r\n\t&lt;description>Opis modu\u0142u.&lt;\/description>\r\n\t&lt;author>Twoje Imi\u0119&lt;\/author>\r\n\t&lt;compatibility>\r\n\t\t&lt;min>1.7.0.0&lt;\/min>\r\n\t\t&lt;max>1.7.8.0&lt;\/max>\r\n\t&lt;\/compatibility>\r\n&lt;\/module>\r<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Struktura katalog\u00f3w<\/h3>\n\n\n\n<p>Przyk\u0142adowa struktura katalogu modu\u0142u:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mymodule\/\r\n\u251c\u2500\u2500 mymodule.php\r\n\u251c\u2500\u2500 config.xml\r\n\u251c\u2500\u2500 views\/\r\n\u2502   \u251c\u2500\u2500 templates\/\r\n\u2502   \u2502   \u251c\u2500\u2500 front\/\r\n\u2502   \u2502   \u2514\u2500\u2500 admin\/\r\n\u2502   \u251c\u2500\u2500 css\/\r\n\u2502   \u2502   \u2514\u2500\u2500 mymodule.css\r\n\u2502   \u251c\u2500\u2500 js\/\r\n\u2502   \u2502   \u2514\u2500\u2500 mymodule.js\r\n\u2502   \u2514\u2500\u2500 img\/\r\n\u2502\t   \u2514\u2500\u2500 myimage.png\r\n\u2514\u2500\u2500 controllers\/\r\n\t\u251c\u2500\u2500 front\/\r\n\t\u2514\u2500\u2500 admin\/\r<\/code><\/pre>\n\n\n\n<p>Wszystkie grafiki, kt\u00f3re chcesz wykorzysta\u0107 w module (np. ikony, banery, obrazy do frontendu), powinny by\u0107 przechowywane w katalogu<strong> views\/img\/<\/strong>. Dzi\u0119ki temu b\u0119d\u0105 one \u0142atwe do zarz\u0105dzania i mo\u017cna je \u0142atwo za\u0142adowa\u0107 za pomoc\u0105 odpowiednich \u015bcie\u017cek w module.<\/p>\n\n\n\n<p>Na przyk\u0142ad, aby za\u0142adowa\u0107 obraz w pliku szablonu, mo\u017cesz u\u017cy\u0107 \u015bcie\u017cki:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;img src=\"{$module_dir}views\/img\/myimage.png\" alt=\"M\u00f3j obraz\" \/&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Generowanie podstawy modu\u0142u<\/h2>\n\n\n\n<p><strong>Proces tworzenia modu\u0142u w PrestaShop mo\u017cna znacz\u0105co upro\u015bci\u0107, korzystaj\u0105c z generator\u00f3w modu\u0142\u00f3w <\/strong>lub tworz\u0105c struktur\u0119 r\u0119cznie.<strong> <\/strong>Dzi\u0119ki temu mo\u017cesz szybko rozpocz\u0105\u0107 prac\u0119 nad swoim projektem i skupi\u0107 si\u0119 na dodawaniu unikalnych funkcji.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Korzystanie z generatora modu\u0142\u00f3w<\/h3>\n\n\n\n<p>PrestaShop udost\u0119pnia narz\u0119dzie online \u2013 <strong>PrestaShop Module Generator<\/strong>, kt\u00f3re umo\u017cliwia automatyczne wygenerowanie podstawowego szkieletu modu\u0142u. Wystarczy wype\u0142ni\u0107 kilka p\u00f3l, takich jak nazwa modu\u0142u, wersja czy autor, a generator utworzy kompletn\u0105 struktur\u0119 plik\u00f3w i folder\u00f3w, gotow\u0105 do dalszej pracy.<\/p>\n\n\n\n<p>Aby skorzysta\u0107 z generatora:<\/p>\n\n\n\n<ol>\n<li>Otw\u00f3rz stron\u0119 <a href=\"https:\/\/validator.prestashop.com\/generator\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>PrestaShop Module Generator<\/strong><\/a>.<\/li>\n\n\n\n<li>Wprowad\u017a wymagane dane, takie jak nazwa modu\u0142u, opis i wersja.<\/li>\n\n\n\n<li>Pobierz wygenerowany plik ZIP i rozpakuj go w folderze \/modules\/ Twojej instalacji PrestaShop.<\/li>\n<\/ol>\n\n\n\n<p>Narz\u0119dzie to idealnie nadaje si\u0119 dla pocz\u0105tkuj\u0105cych, poniewa\u017c eliminuje konieczno\u015b\u0107 r\u0119cznego tworzenia struktury modu\u0142u, a jednocze\u015bnie pozwala szybko rozpocz\u0105\u0107 prac\u0119.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">R\u0119czne tworzenie struktury modu\u0142u<\/h3>\n\n\n\n<p>Je\u015bli wolisz pe\u0142n\u0105 kontrol\u0119 nad procesem, mo\u017cesz stworzy\u0107 modu\u0142 r\u0119cznie. W tym celu:<\/p>\n\n\n\n<p>Utw\u00f3rz nowy katalog w folderze <strong>\/modules\/ <\/strong>swojej instalacji PrestaShop. Nazwij go np. <strong>mymodule<\/strong>.<\/p>\n\n\n\n<p>W katalogu utw\u00f3rz plik PHP o nazwie <strong>mymodule.php<\/strong>. Ten plik b\u0119dzie zawiera\u0142 klas\u0119 modu\u0142u, kt\u00f3ra dziedziczy po klasie Module.<\/p>\n\n\n\n<p>Dodaj plik <strong>config.xml <\/strong>z metadanymi modu\u0142u.<\/p>\n\n\n\n<p>Utw\u00f3rz foldery, takie jak <strong>views\/<\/strong>, <strong>controllers\/<\/strong>, czy <strong>translations\/<\/strong>, zgodnie z potrzebami modu\u0142u.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Rejestrowanie hook\u00f3w i dodawanie funkcji<\/h2>\n\n\n\n<p>Hooki w PrestaShop to kluczowy element umo\u017cliwiaj\u0105cy integracj\u0119 modu\u0142\u00f3w z platform\u0105. S\u0142u\u017c\u0105 one do:<\/p>\n\n\n\n<ul>\n<li>Wywo\u0142ywania przy konkretnej akcji: Na przyk\u0142ad po z\u0142o\u017ceniu zam\u00f3wienia, aktualizacji statusu lub dodaniu nowego u\u017cytkownika.<\/li>\n\n\n\n<li>Wy\u015bwietlania tre\u015bci w okre\u015blonym miejscu: Na przyk\u0142ad w nag\u0142\u00f3wku strony, stopce lub na stronie produktu.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Rejestracja hooka<\/h3>\n\n\n\n<p>Aby hook dzia\u0142a\u0142 w module, musi by\u0107 zarejestrowany podczas instalacji modu\u0142u. Rejestracja odbywa si\u0119 w metodzie install() Twojej klasy modu\u0142u. Przyk\u0142ad rejestracji hooka:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public function install()\r\n{\r\n\treturn parent::install() &amp;&amp; $this->registerHook('displayHeader') &amp;&amp;   $this->registerHook('actionOrderStatusUpdate');\r\n}\r\n<\/code><\/pre>\n\n\n\n<p>W powy\u017cszym przyk\u0142adzie modu\u0142 rejestruje dwa hooki: displayHeader (do wy\u015bwietlania tre\u015bci w nag\u0142\u00f3wku strony) oraz actionOrderStatusUpdate (do wykonania akcji przy zmianie statusu zam\u00f3wienia).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dodawanie logiki do hook\u00f3w<\/h3>\n\n\n\n<p>Po zarejestrowaniu hooka nale\u017cy utworzy\u0107 metod\u0119, kt\u00f3ra zostanie wywo\u0142ana, gdy hook zostanie aktywowany. Nazwa metody musi odpowiada\u0107 nazwie hooka, np. <strong>hookDisplayHeader()<\/strong> dla hooka <strong>displayHeader<\/strong>. Przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public function hookDisplayHeader()\r\n{\r\n\t$this->context->controller->addCSS($this->_path . 'views\/css\/mymodule.css');\r\n\t$this->context->controller->addJS($this->_path . 'views\/js\/mymodule.js');\r\n}\r\n<\/code><\/pre>\n\n\n\n<p>Metoda <strong>hookDisplayHeader() <\/strong>dodaje pliki CSS i JS modu\u0142u do nag\u0142\u00f3wka strony, co umo\u017cliwia ich u\u017cycie w frontendzie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Debugowanie hook\u00f3w<\/h3>\n\n\n\n<p>Je\u015bli nie masz pewno\u015bci, gdzie doda\u0107 hooka lub jakie hooki s\u0105 dost\u0119pne w danym szablonie, w\u0142\u0105cz <a href=\"https:\/\/www.lh.pl\/pomoc\/jak-wlaczyc-tryb-debugowania-w-prestashop\/\"><strong>tryb debugowania w PrestaShop<\/strong><\/a>. W pliku <strong>\/config\/defines.inc.php<\/strong> zmie\u0144 warto\u015b\u0107 <strong>_PS_MODE_DEV_<\/strong> na <strong>true<\/strong>. W trybie debug zobaczysz dost\u0119pne hooki oraz ich lokalizacje w szablonie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Podsumowanie<\/h3>\n\n\n\n<p>Hooki s\u0105 podstaw\u0105 dzia\u0142ania modu\u0142\u00f3w w PrestaShop. Pami\u0119taj, aby zawsze rejestrowa\u0107 hooki podczas instalacji modu\u0142u. Pozwoli to Twojemu modu\u0142owi na wywo\u0142ywanie akcji w odpowiednich momentach lub na wstawianie tre\u015bci w okre\u015blonych miejscach sklepu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tworzenie i obs\u0142uga kontroler\u00f3w<\/h2>\n\n\n\n<p>Kontrolery w PrestaShop odgrywaj\u0105 kluczow\u0105 rol\u0119 w obs\u0142udze logiki komunikacji modu\u0142\u00f3w. Odpowiadaj\u0105 za przetwarzanie \u017c\u0105da\u0144 u\u017cytkownika, przekazywanie danych do widok\u00f3w oraz interakcj\u0119 z baz\u0105 danych. W zale\u017cno\u015bci od potrzeb kontrolery mog\u0105 by\u0107 tworzone zar\u00f3wno dla frontendu, jak i backendu sklepu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rodzaje kontroler\u00f3w<\/h3>\n\n\n\n<p>W PrestaShop mo\u017cna tworzy\u0107 dwa g\u0142\u00f3wne typy kontroler\u00f3w w ramach modu\u0142\u00f3w:<\/p>\n\n\n\n<p><strong>Kontrolery frontowe:<\/strong> <br>Znajduj\u0105 si\u0119 w katalogu controllers\/front\/ i obs\u0142uguj\u0105 \u017c\u0105dania u\u017cytkownik\u00f3w odwiedzaj\u0105cych sklep. Przyk\u0142adowo mog\u0105 s\u0142u\u017cy\u0107 do wy\u015bwietlania dedykowanych stron lub obs\u0142ugi dynamicznych dzia\u0142a\u0144 na froncie.<\/p>\n\n\n\n<p><strong>Kontrolery administracyjne: <\/strong><br>Znajduj\u0105 si\u0119 w katalogu controllers\/admin\/ i s\u0105 odpowiedzialne za zarz\u0105dzanie funkcjami modu\u0142u w panelu administracyjnym PrestaShop. Musz\u0105 by\u0107 zarejestrowane w menu administracyjnym, aby mog\u0142y by\u0107 poprawnie u\u017cywane.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tworzenie kontrolera administracyjnego<\/h3>\n\n\n\n<p>Kontrolery administracyjne obs\u0142uguj\u0105 dzia\u0142ania modu\u0142u w panelu administracyjnym PrestaShop. Aby utworzy\u0107 kontroler administracyjny:<\/p>\n\n\n\n<p>Utw\u00f3rz katalog <strong>controllers\/admin\/<\/strong> w folderze modu\u0142u, je\u015bli jeszcze go nie ma.<\/p>\n\n\n\n<p>W katalogu <strong>controllers\/admin\/<\/strong> stw\u00f3rz plik PHP. Nazwa pliku musi by\u0107 zgodna z konwencj\u0105 PrestaShop, np. <strong>AdminMyModuleController.php<\/strong>.<\/p>\n\n\n\n<p>Klasa w pliku kontrolera musi dziedziczy\u0107 po klasie <strong>ModuleAdminController<\/strong>, kt\u00f3ra zapewnia integracj\u0119 z funkcjonalno\u015bciami panelu administracyjnego.<\/p>\n\n\n\n<p><strong>Przyk\u0142ad pliku AdminMyModuleController.php:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class AdminMyModuleController extends ModuleAdminController\r\n{\r\n\tpublic function __construct()\r\n\t{\r\n\t\tparent::__construct();\r\n\r\n\t\t\/\/ W\u0142\u0105czenie szablon\u00f3w opartych na Bootstrapie\r\n\t\t$this->bootstrap = true;\r\n\r\n\t\t\/\/ Tytu\u0142 strony w panelu administracyjnym\r\n\t\t$this->meta_title = $this->l('M\u00f3j modu\u0142 - Zarz\u0105dzanie');\r\n\t}\r\n\r\n\tpublic function renderList()\r\n\t{\r\n\t\t\/\/ Przyk\u0142ad wy\u015bwietlenia tabeli w panelu administracyjnym\r\n\t\t$this->fields_list = &#91;\r\n\t\t\t'id_example' => &#91;\r\n\t\t\t\t'title' => $this->l('ID'),\r\n\t\t\t\t'align' => 'center',\r\n\t\t\t\t'type' => 'int',\r\n\t\t\t],\r\n\t\t\t'example_field' => &#91;\r\n\t\t\t\t'title' => $this->l('Przyk\u0142adowe pole'),\r\n\t\t\t\t'type' => 'text',\r\n\t\t\t],\r\n\t\t];\r\n\r\n\t\t$this->list_no_link = true;\r\n\r\n\t\treturn parent::renderList();\r\n\t}\r\n}\r<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Rejestracja kontrolera administracyjnego<\/h3>\n\n\n\n<p>Aby kontroler administracyjny by\u0142 dost\u0119pny w panelu administracyjnym PrestaShop, <strong>nale\u017cy go zarejestrowa\u0107 jako kart\u0119 menu (ang. tab) w metodzie install() modu\u0142u<\/strong>. W tym celu u\u017cywamy klasy <strong>Tab<\/strong>.<\/p>\n\n\n\n<p>Przyk\u0142ad rejestracji kontrolera w menu administracyjnym:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public function install()\r\n{\r\n\tif (!parent::install() || !$this->registerAdminTab()) {\r\n\t\treturn false;\r\n\t}\r\n\treturn true;\r\n}\r\n\r\nprivate function registerAdminTab()\r\n{\r\n\t$tab = new Tab();\r\n\t$tab->active = 1;\r\n\t$tab->class_name = 'AdminMyModule'; \/\/ Nazwa klasy kontrolera\r\n\t$tab->name = &#91;];\r\n\t\t\t\r\n\tforeach (Language::getLanguages(true) as $lang) {\r\n\t\t$tab->name&#91;$lang&#91;'id_lang']] = 'M\u00f3j modu\u0142';\r\n\t}\r\n\r\n\t$tab->id_parent = (int)Tab::getIdFromClassName('AdminParentModulesSf'); \/\/ Domy\u015blna kategoria \"Modu\u0142y\"\r\n\t$tab->module = $this->name; \/\/ Nazwa modu\u0142u\r\n\t$tab->icon = 'settings'; \/\/ Opcjonalna ikona\r\n\r\n\treturn $tab->add();\r\n}\r<\/code><\/pre>\n\n\n\n<p><strong>Rejestracja karty zapewnia, \u017ce kontroler b\u0119dzie dost\u0119pny w menu \u201eModu\u0142y\u201d w panelu administracyjnym.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Usuwanie karty przy odinstalowaniu modu\u0142u administracyjnego<\/h3>\n\n\n\n<p>Podczas odinstalowywania modu\u0142u nale\u017cy usun\u0105\u0107 kart\u0119 menu zwi\u0105zan\u0105 z kontrolerem, aby unikn\u0105\u0107 niepotrzebnych konflikt\u00f3w.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public function uninstall()\r\n{\r\n\tif (!parent::uninstall() || !$this->unregisterAdminTab()) {\r\n\t\treturn false;\r\n\t}\r\n\treturn true;\r\n}\r\n\r\nprivate function unregisterAdminTab()\r\n{\r\n\t$id_tab = (int)Tab::getIdFromClassName('AdminMyModule');\r\n\tif ($id_tab) {\r\n\t\t$tab = new Tab($id_tab);\r\n\t\treturn $tab->delete();\r\n\t}\r\n\treturn false;\r\n}\r<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Generowanie link\u00f3w do kontroler\u00f3w administracyjnych<\/h3>\n\n\n\n<p>Po zarejestrowaniu kontrolera mo\u017cesz generowa\u0107 do niego linki w panelu administracyjnym PrestaShop:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$adminLink = $this->context->link->getAdminLink('AdminMyModule');\r\necho '&lt;a href=\"' . $adminLink . '\">Zarz\u0105dzaj modu\u0142em&lt;\/a>';\r<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Podsumowanie<\/h3>\n\n\n\n<p>Kontrolery administracyjne w PrestaShop umo\u017cliwiaj\u0105 tworzenie rozbudowanych funkcjonalno\u015bci dost\u0119pnych dla administrator\u00f3w sklepu. Prawid\u0142owa rejestracja kontrolera za pomoc\u0105 klasy Tab jest kluczowa dla jego dzia\u0142ania. Upewnij si\u0119 r\u00f3wnie\u017c, \u017ce klasy kontroler\u00f3w i pliki s\u0105 poprawnie nazwane oraz umieszczone w odpowiednich lokalizacjach.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tworzenie niezale\u017cnych plik\u00f3w PHP w module<\/h2>\n\n\n\n<p>Niezale\u017cne pliki PHP w module PrestaShop mog\u0105 by\u0107 wykorzystywane do wielu r\u00f3\u017cnych cel\u00f3w, takich jak automatyzacja proces\u00f3w (cron), obs\u0142uga \u017c\u0105da\u0144 API, czy te\u017c dynamiczne przetwarzanie danych. Ich elastyczno\u015b\u0107 sprawia, \u017ce s\u0105 wa\u017cnym elementem zaawansowanego modu\u0142u.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Podstawowe zastosowania<\/h3>\n\n\n\n<p>Oto najcz\u0119stsze zastosowania niezale\u017cnych plik\u00f3w PHP w module:<\/p>\n\n\n\n<ul>\n<li><strong>Zadania cron: <\/strong><br>Automatyzacja proces\u00f3w, takich jak czyszczenie danych, synchronizacja zewn\u0119trznych system\u00f3w czy generowanie raport\u00f3w.<\/li>\n\n\n\n<li><strong>Integracja z zewn\u0119trznymi API:<\/strong> <br>Wysy\u0142anie i odbieranie danych z zewn\u0119trznych us\u0142ug, takich jak systemy p\u0142atno\u015bci lub magazynowe.<\/li>\n\n\n\n<li><strong>Obs\u0142uga \u017c\u0105da\u0144 AJAX:<\/strong> <br>Dynamiczne przetwarzanie danych w module bez potrzeby od\u015bwie\u017cania strony.<\/li>\n\n\n\n<li><strong>Specjalistyczne zadania:<\/strong> <br>Tworzenie niestandardowych proces\u00f3w, kt\u00f3re wymagaj\u0105 oddzielnej logiki.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Tworzenie niezale\u017cnego pliku PHP<\/h3>\n\n\n\n<p>Aby utworzy\u0107 niezale\u017cny plik PHP, wykonaj nast\u0119puj\u0105ce kroki:<\/p>\n\n\n\n<p>Utw\u00f3rz nowy plik w katalogu modu\u0142u, np. <strong>custom_task.php<\/strong>.<\/p>\n\n\n\n<p>Za\u0142aduj kontekst PrestaShop w pliku, aby mie\u0107 dost\u0119p do funkcji i klas systemu. Mo\u017cesz to zrobi\u0107 za pomoc\u0105 <strong>config.inc.php<\/strong> lub <strong>init.php<\/strong>.<\/p>\n\n\n\n<p>Dodaj logik\u0119, kt\u00f3ra ma by\u0107 realizowana w pliku, pami\u0119taj\u0105c o wydajno\u015bci i bezpiecze\u0144stwie.<\/p>\n\n\n\n<p>Przyk\u0142ad prostego pliku PHP:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\r\nrequire_once dirname(__FILE__) . '\/..\/..\/config\/config.inc.php';\r\nrequire_once dirname(__FILE__) . '\/..\/..\/init.php';\r\n\r\n\/\/ Logika przetwarzania\r\n$sql = 'DELETE FROM `' . _DB_PREFIX_ . 'custom_table` WHERE date_add &lt; NOW() - INTERVAL 30 DAY';\r\nDb::getInstance()->execute($sql);\r\n\r\necho 'Dane zosta\u0142y przetworzone.';\r<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Jak u\u017cywa\u0107 funkcji z g\u0142\u00f3wnego pliku PHP modu\u0142u?<\/h3>\n\n\n\n<p>W celu ponownego u\u017cycia logiki modu\u0142u mo\u017cna wywo\u0142ywa\u0107 funkcje zdefiniowane w g\u0142\u00f3wnym pliku PHP modu\u0142u. Aby to zrobi\u0107:<\/p>\n\n\n\n<ol>\n<li>Za\u0142aduj g\u0142\u00f3wny plik modu\u0142u, np. mymodule.php, w swoim niezale\u017cnym pliku PHP.<\/li>\n\n\n\n<li>Uzyskaj instancj\u0119 modu\u0142u za pomoc\u0105 Module::getInstanceByName().<\/li>\n<\/ol>\n\n\n\n<p><strong>Przyk\u0142ad:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\r\nrequire_once dirname(__FILE__) . '\/..\/..\/config\/config.inc.php';\r\nrequire_once dirname(__FILE__) . '\/..\/..\/init.php';\r\nrequire_once dirname(__FILE__) . '\/mymodule.php';\r\n\r\n\/\/ Za\u0142adowanie instancji modu\u0142u\r\n$module = Module::getInstanceByName('mymodule');\r\n\r\nif ($module &amp;&amp; $module->active) {\r\n\t$module->exampleFunction();\r\n}\r\n\r\necho 'Funkcja modu\u0142u zosta\u0142a wywo\u0142ana.';\r<\/code><\/pre>\n\n\n\n<p>Dzi\u0119ki temu mo\u017cna korzysta\u0107 z funkcji modu\u0142u w r\u00f3\u017cnych kontekstach, co znacznie zwi\u0119ksza jego elastyczno\u015b\u0107.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Bezpiecze\u0144stwo i ograniczenia dost\u0119pu<\/h3>\n\n\n\n<p>Aby zabezpieczy\u0107 dost\u0119p do niezale\u017cnych plik\u00f3w PHP, zaleca si\u0119:<\/p>\n\n\n\n<ul>\n<li>Dodanie tokena lub has\u0142a, kt\u00f3re b\u0119dzie weryfikowane przed wykonaniem logiki.<\/li>\n\n\n\n<li>Ustawienie odpowiednich nag\u0142\u00f3wk\u00f3w HTTP, aby zablokowa\u0107 nieautoryzowane \u017c\u0105dania.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>if (Tools::getValue('token') !== 'your_secret_token') {\r\n\tdie('Nieautoryzowany dost\u0119p.');\r\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Podsumowanie<\/h3>\n\n\n\n<p>Niezale\u017cne pliki PHP w module PrestaShop oferuj\u0105 du\u017c\u0105 elastyczno\u015b\u0107 w realizacji r\u00f3\u017cnych proces\u00f3w. Dzi\u0119ki nim mo\u017cesz tworzy\u0107 zar\u00f3wno automatyczne zadania, jak i niestandardowe rozwi\u0105zania, kt\u00f3re integruj\u0105 modu\u0142 z zewn\u0119trznymi systemami. Pami\u0119taj jednak o odpowiednich zabezpieczeniach, aby unikn\u0105\u0107 nieautoryzowanego dost\u0119pu do Twojego modu\u0142u.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tworzenie formularzy konfiguracyjnych<\/h2>\n\n\n\n<p>Formularze konfiguracyjne s\u0105 nieod\u0142\u0105cznym elementem modu\u0142\u00f3w w PrestaShop. Pozwalaj\u0105 administratorowi na dostosowanie ustawie\u0144 modu\u0142u bez konieczno\u015bci edycji kodu. Dzi\u0119ki klasie <strong>HelperForm<\/strong>, tworzenie formularzy w panelu administracyjnym jest proste i intuicyjne.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Podstawowe elementy formularza<\/h3>\n\n\n\n<p>Formularze konfiguracyjne sk\u0142adaj\u0105 si\u0119 z kilku kluczowych element\u00f3w, takich jak pola formularza, przyciski akcji i obs\u0142uga zapisanych danych. Wszystko to mo\u017cesz skonfigurowa\u0107 w metodzie getContent() swojej klasy modu\u0142u.<\/p>\n\n\n\n<p>Przyk\u0142ad podstawowego formularza:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public function getContent()\r\n{\r\n\t$output = '';\r\n\r\n\tif (Tools::isSubmit('submit_mymodule')) {\r\n\t\t$customValue = Tools::getValue('MYMODULE_CUSTOM_VALUE');\r\n\t\tConfiguration::updateValue('MYMODULE_CUSTOM_VALUE', $customValue);\r\n\t\t$output .= $this->displayConfirmation($this->l('Ustawienia zapisane.'));\r\n\t}\r\n\r\n\treturn $output . $this->renderForm();\r\n}\r<\/code><\/pre>\n\n\n\n<p>Tworzenie formularza za pomoc\u0105 <strong>HelperForm<\/strong><\/p>\n\n\n\n<p>Klasa <strong>HelperForm <\/strong>u\u0142atwia tworzenie formularzy w panelu administracyjnym PrestaShop. Przyk\u0142ad prostego formularza:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>private function renderForm()\r\n{\r\n\t$fieldsForm&#91;0]&#91;'form'] = &#91;\r\n\t\t'legend' => &#91;\r\n\t\t\t'title' => $this->l('Ustawienia modu\u0142u'),\r\n\t\t\t'icon' => 'icon-cogs',\r\n\t\t],\r\n\t\t'input' => &#91;\r\n\t\t\t&#91;\r\n\t\t\t\t'type' => 'text',\r\n\t\t\t\t'label' => $this->l('Nazwa ustawienia'),\r\n\t\t\t\t'name' => 'MYMODULE_CUSTOM_VALUE',\r\n\t\t\t\t'size' => 20,\r\n\t\t\t\t'required' => true,\r\n\t\t\t],\r\n\t\t],\r\n\t\t'submit' => &#91;\r\n\t\t\t'title' => $this->l('Zapisz'),\r\n\t\t],\r\n\t];\r\n\r\n\t$helper = new HelperForm();\r\n\t$helper->module = $this;\r\n\t$helper->name_controller = $this->name;\r\n\t$helper->token = Tools::getAdminTokenLite('AdminModules');\r\n\t$helper->currentIndex = AdminController::$currentIndex . '&amp;configure=' . $this->name;\r\n\t$helper->default_form_language = (int) Configuration::get('PS_LANG_DEFAULT');\r\n\t$helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0;\r\n\t$helper->title = $this->displayName;\r\n\t$helper->submit_action = 'submit_mymodule';\r\n\t$helper->fields_value = &#91;\r\n\t\t'MYMODULE_CUSTOM_VALUE' => Configuration::get('MYMODULE_CUSTOM_VALUE'),\r\n\t];\r\n\r\n\treturn $helper->generateForm($fieldsForm);\r\n}\r\n<\/code><\/pre>\n\n\n\n<p>W powy\u017cszym przyk\u0142adzie formularz zawiera jedno pole tekstowe MYMODULE_CUSTOM_VALUE oraz przycisk do zapisania ustawie\u0144.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Walidacja danych<\/h3>\n\n\n\n<p>PrestaShop umo\u017cliwia walidacj\u0119 danych wprowadzonych w formularzu. Przyk\u0142ad prostego sprawdzania poprawno\u015bci:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (Tools::isSubmit('submit_mymodule')) {\r\n\t$customValue = Tools::getValue('MYMODULE_CUSTOM_VALUE');\r\n\r\n\tif (!Validate::isGenericName($customValue)) {\r\n\t\t$output .= $this->displayError($this->l('Nieprawid\u0142owa warto\u015b\u0107.'));\r\n\t} else {\r\n\t\tConfiguration::updateValue('MYMODULE_CUSTOM_VALUE', $customValue);\r\n\t\t$output .= $this->displayConfirmation($this->l('Ustawienia zapisane.'));\r\n\t}\r\n}\r<\/code><\/pre>\n\n\n\n<p>Przechowywanie ustawie\u0144<\/p>\n\n\n\n<p>PrestaShop wykorzystuje klas\u0119 Configuration do przechowywania ustawie\u0144 modu\u0142u w bazie danych. Aby zapisa\u0107 warto\u015b\u0107, u\u017cyj metody Configuration::updateValue(), a do jej pobrania Configuration::get().<\/p>\n\n\n\n<p><strong>Przyk\u0142ad:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Configuration::updateValue('MYMODULE_CUSTOM_VALUE', 'example_value');\r\n$value = Configuration::get('MYMODULE_CUSTOM_VALUE');\r<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Podsumowanie<\/h3>\n\n\n\n<p>Formularze konfiguracyjne w PrestaShop pozwalaj\u0105 na \u0142atwe zarz\u0105dzanie ustawieniami modu\u0142u bez potrzeby edycji kodu. Dzi\u0119ki klasie HelperForm mo\u017cesz w prosty spos\u00f3b tworzy\u0107 funkcjonalne i czytelne formularze, kt\u00f3re znacznie u\u0142atwiaj\u0105 administratorom obs\u0142ug\u0119 Twojego modu\u0142u.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Integracja z frontendem<\/h2>\n\n\n\n<p>Integracja modu\u0142u z frontendem PrestaShop pozwala na wy\u015bwietlanie dynamicznych tre\u015bci i wprowadzanie funkcjonalno\u015bci widocznych dla u\u017cytkownik\u00f3w sklepu. Dzi\u0119ki temu mo\u017cesz dostosowa\u0107 interfejs do potrzeb klienta, dodawa\u0107 interaktywne elementy i optymalizowa\u0107 wygl\u0105d strony.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0141adowanie zasob\u00f3w CSS i JavaScript<\/h3>\n\n\n\n<p>Aby modu\u0142 m\u00f3g\u0142 korzysta\u0107 z w\u0142asnych styl\u00f3w CSS i skrypt\u00f3w JavaScript, nale\u017cy je za\u0142adowa\u0107 za pomoc\u0105 hooka displayHeader. Przyk\u0142ad implementacji w pliku modu\u0142u:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public function hookDisplayHeader()\r\n{\r\n\t$this->context->controller->addCSS($this->_path . 'views\/css\/mymodule.css');\r\n\t$this->context->controller->addJS($this->_path . 'views\/js\/mymodule.js');\r\n}\r<\/code><\/pre>\n\n\n\n<p>W powy\u017cszym przyk\u0142adzie pliki CSS i JS s\u0105 \u0142adowane z katalogu views\/ modu\u0142u. Dzi\u0119ki temu zasoby s\u0105 dost\u0119pne na ka\u017cdej stronie sklepu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0141adowanie zasob\u00f3w tylko na wybranych stronach<\/h3>\n\n\n\n<p>Aby zoptymalizowa\u0107 dzia\u0142anie sklepu i poprawi\u0107 szybko\u015b\u0107 \u0142adowania stron, warto \u0142adowa\u0107 CSS i JS wy\u0142\u0105cznie na stronach, kt\u00f3re ich wymagaj\u0105. Dzi\u0119ki temu zmniejszysz liczb\u0119 niepotrzebnych zasob\u00f3w \u0142adowanych przez przegl\u0105dark\u0119. Mo\u017cesz to zrobi\u0107, sprawdzaj\u0105c, jaka strona jest aktualnie wy\u015bwietlana.<\/p>\n\n\n\n<p>Przyk\u0142ad \u0142adowania zasob\u00f3w tylko na stronie produktu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public function hookDisplayHeader()\r\n{\r\n\t\/\/ \u0141adowanie CSS i JS tylko na stronie produktu\r\n\tif ($this->context->controller->php_self === 'product') {\r\n\t\t$this->context->controller->addCSS($this->_path . 'views\/css\/product.css');\r\n\t\t$this->context->controller->addJS($this->_path . 'views\/js\/product.js');\r\n\t}\r\n}\r<\/code><\/pre>\n\n\n\n<p>Mo\u017cesz tak\u017ce sprawdza\u0107 inne typy stron, np.:<\/p>\n\n\n\n<ul>\n<li>&#8217;index&#8217; \u2013 strona g\u0142\u00f3wna<\/li>\n\n\n\n<li>&#8217;category&#8217; \u2013 strona kategorii<\/li>\n\n\n\n<li>&#8217;order&#8217; \u2013 proces sk\u0142adania zam\u00f3wienia<\/li>\n\n\n\n<li>&#8217;cart&#8217; \u2013 koszyk<\/li>\n<\/ul>\n\n\n\n<p>Przyk\u0142ad \u0142adowania zasob\u00f3w na stronie g\u0142\u00f3wnej:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public function hookDisplayHeader()\r\n{\r\n\tif ($this->context->controller->php_self === 'index') {\r\n\t\t$this->context->controller->addCSS($this->_path . 'views\/css\/home.css');\r\n\t}\r\n}\r<\/code><\/pre>\n\n\n\n<p>Takie podej\u015bcie nie tylko poprawia szybko\u015b\u0107 dzia\u0142ania strony, ale r\u00f3wnie\u017c zmniejsza wykorzystanie zasob\u00f3w serwera oraz ilo\u015b\u0107 transferu danych, co pozytywnie wp\u0142ywa na do\u015bwiadczenie u\u017cytkownik\u00f3w i wyniki SEO.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Wy\u015bwietlanie tre\u015bci za pomoc\u0105 hook\u00f3w<\/h3>\n\n\n\n<p>Hooki typu display umo\u017cliwiaj\u0105 dodawanie tre\u015bci w okre\u015blonych miejscach sklepu, takich jak strona g\u0142\u00f3wna, stopka czy karta produktu. Przyk\u0142ad dodania niestandardowego komunikatu na stronie g\u0142\u00f3wnej:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public function hookDisplayHome()\r\n{\r\n\treturn 'Witaj na naszej stronie g\u0142\u00f3wnej!\r';\r\n}\r<\/code><\/pre>\n\n\n\n<p>Kod zwr\u00f3cony przez metod\u0119 zostanie automatycznie wstawiony w miejscu przypisanym do hooka.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Przekazywanie danych do szablon\u00f3w<\/h3>\n\n\n\n<p>Aby przekaza\u0107 dane z modu\u0142u do widok\u00f3w, u\u017cyj tablicy:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$this->context->smarty->assign()<\/code><\/pre>\n\n\n\n<p>Przyk\u0142ad wy\u015bwietlenia dynamicznej tre\u015bci w szablonie:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public function hookDisplayHome()\r\n{\r\n\t$this->context->smarty->assign(&#91;\r\n\t\t'custom_message' => 'Witaj, to dynamiczna wiadomo\u015b\u0107 z modu\u0142u!'\r\n\t]);\r\n\r\n\treturn $this->display(__FILE__, 'views\/templates\/hook\/display_home.tpl');\r\n}\r<\/code><\/pre>\n\n\n\n<p>W pliku szablonu Smarty mo\u017cesz odwo\u0142a\u0107 si\u0119 do przekazanej zmiennej:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;div class=\"custom-message\"&gt;{$custom_message}&lt;\/div&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Podsumowanie<\/h3>\n\n\n\n<p>Integracja modu\u0142u z frontendem to kluczowy element wp\u0142ywaj\u0105cy na interakcj\u0119 u\u017cytkownik\u00f3w ze sklepem. Poprawne wykorzystanie hook\u00f3w, \u0142adowanie zasob\u00f3w oraz ich optymalizacja pod k\u0105tem specyficznych stron pozwalaj\u0105 stworzy\u0107 szybki, dynamiczny i przyjazny dla u\u017cytkownika sklep. Pami\u0119taj, \u017ce wydajno\u015b\u0107 sklepu ma znacz\u0105cy wp\u0142yw na zadowolenie klient\u00f3w oraz na pozycj\u0119 w wynikach wyszukiwania.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Obs\u0142uga AJAX w module PrestaShop<\/h2>\n\n\n\n<p>Obs\u0142uga AJAX w module PrestaShop pozwala na dynamiczne przetwarzanie danych bez konieczno\u015bci od\u015bwie\u017cania strony. Jest to kluczowy element tworzenia nowoczesnych, interaktywnych modu\u0142\u00f3w. Poni\u017cej znajdziesz kompletn\u0105 instrukcj\u0119 dotycz\u0105c\u0105 tworzenia i obs\u0142ugi \u017c\u0105da\u0144 AJAX w PrestaShop.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tworzenie kontrolera obs\u0142uguj\u0105cego AJAX<\/h3>\n\n\n\n<p>Kontroler obs\u0142uguj\u0105cy AJAX jest specjalnym rodzajem kontrolera frontowego w PrestaShop. Aby go utworzy\u0107:<\/p>\n\n\n\n<p>Utw\u00f3rz katalog <strong>controllers\/front\/<\/strong> w <strong>folderze modu\u0142u<\/strong>, je\u015bli jeszcze go nie ma.<\/p>\n\n\n\n<p>W katalogu <strong>controllers\/front\/<\/strong> stw\u00f3rz plik PHP. Nazwa pliku powinna by\u0107 napisana ma\u0142ymi literami, np. <strong>ajaxhandler.php<\/strong>.<\/p>\n\n\n\n<p>Klasa kontrolera w tym pliku powinna dziedziczy\u0107 po <strong>ModuleFrontController <\/strong>i mie\u0107 nazw\u0119 w formacie <strong>mymoduleajaxhandlerModuleFrontController<\/strong>, gdzie:<\/p>\n\n\n\n<ul>\n<li><strong>mymodule <\/strong>to nazwa katalogu modu\u0142u,<\/li>\n\n\n\n<li><strong>ajaxhandler <\/strong>to nazwa kontrolera w ma\u0142ych literach, dopasowana do nazwy pliku.<\/li>\n<\/ul>\n\n\n\n<p><strong>Przyk\u0142ad pliku ajaxhandler.php:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class mymoduleajaxhandlerModuleFrontController extends ModuleFrontController\r\n{\r\n\tpublic function initContent()\r\n\t{\r\n\t\tparent::initContent();\r\n\r\n\t\t\/\/ Przyk\u0142ad przetwarzania danych\r\n\t\t$data = &#91;\r\n\t\t\t'status' => 'success',\r\n\t\t\t'message' => 'Dane zosta\u0142y przetworzone pomy\u015blnie!',\r\n\t\t];\r\n\r\n\t\t\/\/ Zwracanie odpowiedzi w formacie JSON\r\n\t\theader('Content-Type: application\/json');\r\n\t\tdie(json_encode($data));\r\n\t}\r\n}\r<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Tworzenie adresu URL dla \u017c\u0105dania AJAX<\/h3>\n\n\n\n<p>W PrestaShop adres URL kontrolera mo\u017cna wygenerowa\u0107 dynamicznie przy u\u017cyciu metody:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Link::getModuleLink()<\/code><\/pre>\n\n\n\n<p><strong>Przyk\u0142ad generowania URL w pliku modu\u0142u:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ajaxUrl = $this->context->link->getModuleLink('mymodule', 'ajaxhandler');\r\n$this->context->smarty->assign('ajaxUrl', $ajaxUrl);\r<\/code><\/pre>\n\n\n\n<p>Nast\u0119pnie adres URL mo\u017cna przekaza\u0107 do JavaScript za pomoc\u0105 widoku Smarty:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;script>\r\n\tvar ajaxUrl = '{$ajaxUrl}';\r\n&lt;\/script>\r<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Tworzenie \u017c\u0105dania AJAX w JavaScript<\/h3>\n\n\n\n<p>Przyk\u0142ad \u017c\u0105dania AJAX w JavaScript za pomoc\u0105 jQuery:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$.ajax({\r\n\turl: ajaxUrl,\r\n\ttype: 'POST',\r\n\tdata: { action: 'processData' },\r\n\tsuccess: function(response) {\r\n\t\tif (response.status === 'success') {\r\n\t\t\talert(response.message);\r\n\t\t} else {\r\n\t\t\talert('Co\u015b posz\u0142o nie tak.');\r\n\t\t}\r\n\t},\r\n\terror: function() {\r\n\t\talert('B\u0142\u0105d podczas przetwarzania \u017c\u0105dania.');\r\n\t}\r\n});\r<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Zabezpieczenia w obs\u0142udze AJAX<\/h3>\n\n\n\n<p>Ze wzgl\u0119du na mo\u017cliwo\u015b\u0107 nadu\u017cy\u0107, warto zabezpieczy\u0107 obs\u0142ug\u0119 AJAX przed nieautoryzowanym dost\u0119pem. Mo\u017cesz to zrobi\u0107, na przyk\u0142ad:<\/p>\n\n\n\n<ul>\n<li>Weryfikuj\u0105c token u\u017cytkownika (np. z wykorzystaniem klasy <strong>Tools::getToken()<\/strong>).<\/li>\n\n\n\n<li>Sprawdzaj\u0105c, czy \u017c\u0105danie pochodzi od zalogowanego u\u017cytkownika.<\/li>\n\n\n\n<li>Ograniczaj\u0105c dost\u0119p do wybranych adres\u00f3w IP.<\/li>\n<\/ul>\n\n\n\n<p>Przyk\u0142ad zabezpieczenia kontrolera AJAX:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public function initContent()\r\n{\r\n\tparent::initContent();\r\n\r\n\t\/\/ Weryfikacja tokena\r\n\t$token = Tools::getValue('token');\r\n\tif ($token !== Tools::getToken(false)) {\r\n\t\tdie(json_encode(&#91;'status' => 'error', 'message' => 'Nieautoryzowany dost\u0119p.']));\r\n\t}\r\n\r\n\t\/\/ Przetwarzanie \u017c\u0105dania\r\n\t$data = &#91;'status' => 'success', 'message' => 'Dane zosta\u0142y przetworzone.'];\r\n\theader('Content-Type: application\/json');\r\n\tdie(json_encode($data));\r\n}\r<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Debugowanie \u017c\u0105da\u0144 AJAX<\/h3>\n\n\n\n<p>Aby u\u0142atwi\u0107 debugowanie \u017c\u0105da\u0144 AJAX, mo\u017cesz:<\/p>\n\n\n\n<p>Sprawdza\u0107 odpowiedzi kontrolera za pomoc\u0105 narz\u0119dzi deweloperskich w przegl\u0105darce (np. Google Chrome DevTools).<\/p>\n\n\n\n<p>Logowa\u0107 b\u0142\u0119dy i odpowiedzi w plikach log\u00f3w PrestaShop za pomoc\u0105 metody:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PrestaShopLogger::addLog()<\/code><\/pre>\n\n\n\n<p>Przyk\u0142ad logowania:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PrestaShopLogger::addLog('\u017b\u0105danie AJAX zosta\u0142o przetworzone.', 1);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Podsumowanie<\/h3>\n\n\n\n<p>Obs\u0142uga AJAX w module PrestaShop to pot\u0119\u017cne narz\u0119dzie do dynamicznego przetwarzania danych i interakcji z u\u017cytkownikami. Kluczem do sukcesu jest prawid\u0142owa konfiguracja kontrolera, bezpieczne przetwarzanie danych oraz optymalizacja wydajno\u015bci. Dzi\u0119ki AJAX mo\u017cesz stworzy\u0107 bardziej responsywny i przyjazny dla u\u017cytkownika sklep.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Publikacja i testowanie modu\u0142u<\/h2>\n\n\n\n<p>Ostatnim krokiem w procesie tworzenia modu\u0142u jest jego odpowiednie przetestowanie oraz przygotowanie do publikacji. Dzi\u0119ki dok\u0142adnym testom upewnisz si\u0119, \u017ce modu\u0142 dzia\u0142a poprawnie we wszystkich warunkach, a jego publikacja pozwoli na udost\u0119pnienie go szerszej grupie u\u017cytkownik\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testowanie modu\u0142u<\/h3>\n\n\n\n<p>Przed udost\u0119pnieniem modu\u0142u upewnij si\u0119, \u017ce zosta\u0142 dok\u0142adnie przetestowany. Oto kilka kluczowych krok\u00f3w, kt\u00f3re warto wykona\u0107:<\/p>\n\n\n\n<p>Testy funkcjonalne: Sprawd\u017a, czy modu\u0142 dzia\u0142a zgodnie z za\u0142o\u017ceniami. Przetestuj wszystkie funkcje i upewnij si\u0119, \u017ce wy\u015bwietlane tre\u015bci oraz wprowadzone dane s\u0105 poprawne.<\/p>\n\n\n\n<p>Testy wydajno\u015bci: Upewnij si\u0119, \u017ce modu\u0142 nie wp\u0142ywa negatywnie na szybko\u015b\u0107 dzia\u0142ania sklepu. Mo\u017cesz u\u017cy\u0107 narz\u0119dzi takich jak Google PageSpeed Insights czy Lighthouse.<\/p>\n\n\n\n<p>Testy kompatybilno\u015bci: Przetestuj modu\u0142 na r\u00f3\u017cnych wersjach PrestaShop oraz w po\u0142\u0105czeniu z innymi popularnymi modu\u0142ami, aby upewni\u0107 si\u0119, \u017ce nie powoduje konflikt\u00f3w.<\/p>\n\n\n\n<p>Debugowanie w trybie developerskim: W\u0142\u0105cz tryb developerski w PrestaShop, aby \u0142atwo wykry\u0107 b\u0142\u0119dy i ostrze\u017cenia. Mo\u017cesz to zrobi\u0107, edytuj\u0105c plik \/config\/defines.inc.php i ustawiaj\u0105c:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>define('_PS_MODE_DEV_', true);<\/code><\/pre>\n\n\n\n<p>W trybie developerskim wszelkie b\u0142\u0119dy PHP, problemy z baz\u0105 danych czy nieprawid\u0142owe wywo\u0142ania hook\u00f3w zostan\u0105 wy\u015bwietlone na stronie, co znacznie u\u0142atwia ich diagnostyk\u0119 i popraw\u0119.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Debugowanie z u\u017cyciem print_r<\/h4>\n\n\n\n<p>Podczas testowania modu\u0142u mo\u017cesz u\u017cy\u0107 funkcji PHP, takich jak <strong>print_r<\/strong> lub <strong>var_dump<\/strong>, aby wy\u015bwietli\u0107 zawarto\u015b\u0107 zmiennych i zrozumie\u0107, co dzieje si\u0119 w kodzie. Jest to szczeg\u00f3lnie przydatne, gdy musisz sprawdzi\u0107, jakie dane s\u0105 przekazywane mi\u0119dzy funkcjami.<\/p>\n\n\n\n<p>Przyk\u0142ad u\u017cycia <strong>print_r<\/strong> w module:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public function hookDisplayHome()\r\n{\r\n\t$data = &#91;'name' => 'PrestaShop', 'version' => '1.7.8'];\r\n\tprint_r($data); \/\/ Wy\u015bwietlenie danych na ekranie\r\n}\r<\/code><\/pre>\n\n\n\n<p>Warto pami\u0119ta\u0107, aby przed publikacj\u0105 usun\u0105\u0107 wszystkie debugowe wywo\u0142ania print_r, poniewa\u017c mog\u0105 one spowalnia\u0107 dzia\u0142anie sklepu i ujawnia\u0107 niepotrzebne informacje u\u017cytkownikom.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Przygotowanie modu\u0142u do publikacji<\/h3>\n\n\n\n<p>Aby opublikowa\u0107 modu\u0142, nale\u017cy go odpowiednio spakowa\u0107. Oto kroki, kt\u00f3re nale\u017cy wykona\u0107:<\/p>\n\n\n\n<ol>\n<li>Upewnij si\u0119, \u017ce w katalogu modu\u0142u znajduj\u0105 si\u0119 wy\u0142\u0105cznie potrzebne pliki (np. mymodule.php, config.xml, katalog views\/).<\/li>\n\n\n\n<li>Usu\u0144 wszystkie pliki tymczasowe, debugowe oraz niepotrzebne komentarze w kodzie.<\/li>\n\n\n\n<li>Spakuj ca\u0142y katalog modu\u0142u do pliku ZIP. Nazwa archiwum powinna odpowiada\u0107 nazwie modu\u0142u, np. <strong>mymodule.zip<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p>Je\u015bli planujesz udost\u0119pni\u0107 modu\u0142 na platformie PrestaShop Addons, upewnij si\u0119, \u017ce spe\u0142nia wymagania dotycz\u0105ce zgodno\u015bci z regulaminem oraz dostarcz odpowiedni\u0105 dokumentacj\u0119.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Publikacja modu\u0142u w PrestaShop Addons<\/h3>\n\n\n\n<p>PrestaShop Addons to oficjalny marketplace modu\u0142\u00f3w i szablon\u00f3w dla PrestaShop. Publikacja modu\u0142u na tej platformie wymaga:<\/p>\n\n\n\n<ol>\n<li>Utworzenia konta deweloperskiego na stronie PrestaShop Addons.<\/li>\n\n\n\n<li>Przygotowania dok\u0142adnego opisu modu\u0142u, w tym jego funkcjonalno\u015bci, kompatybilno\u015bci oraz korzy\u015bci dla u\u017cytkownika.<\/li>\n\n\n\n<li>Do\u0142\u0105czenia zrzut\u00f3w ekranu prezentuj\u0105cych dzia\u0142anie modu\u0142u.<\/li>\n\n\n\n<li>Przes\u0142ania pliku ZIP z modu\u0142em oraz wymaganej dokumentacji.<\/li>\n\n\n\n<li>Po przes\u0142aniu modu\u0142u zesp\u00f3\u0142 PrestaShop przeprowadzi jego weryfikacj\u0119. Je\u015bli wszystko b\u0119dzie zgodne z wymaganiami, modu\u0142 zostanie zatwierdzony i opublikowany.<\/li>\n<\/ol>\n\n\n\n<p>Testowanie i publikacja modu\u0142u to kluczowe etapy, kt\u00f3re wp\u0142ywaj\u0105 na jego jako\u015b\u0107 i sukces. Wykorzystanie trybu developerskiego, funkcji debuguj\u0105cych takich jak print_r, oraz dok\u0142adne sprawdzenie funkcjonalno\u015bci zapewni\u0105, \u017ce Tw\u00f3j modu\u0142 b\u0119dzie dzia\u0142a\u0142 p\u0142ynnie i spe\u0142nia\u0142 oczekiwania u\u017cytkownik\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p>Tworzenie modu\u0142\u00f3w w PrestaShop to \u015bwietna okazja, aby w pe\u0142ni wykorzysta\u0107 potencja\u0142 tej platformy i dostosowa\u0107 j\u0105 do specyficznych wymaga\u0144 swojego sklepu. Proces ten, cho\u0107 mo\u017ce wydawa\u0107 si\u0119 skomplikowany na pocz\u0105tku, staje si\u0119 znacznie prostszy dzi\u0119ki jasno okre\u015blonym zasadom i narz\u0119dziom oferowanym przez PrestaShop.<\/p>\n\n\n\n<p>Podczas pracy nad modu\u0142em warto pami\u0119ta\u0107 o kilku kluczowych elementach:<\/p>\n\n\n\n<ol>\n<li><strong>Zrozumienie struktury: <\/strong><br>Prawid\u0142owo zaprojektowana struktura plik\u00f3w i folder\u00f3w modu\u0142u to podstawa jego poprawnego dzia\u0142ania.<\/li>\n\n\n\n<li><strong>Wykorzystanie hook\u00f3w: <\/strong><br>Hooki pozwalaj\u0105 na bezproblemow\u0105 integracj\u0119 modu\u0142u z istniej\u0105cymi funkcjonalno\u015bciami sklepu.<\/li>\n\n\n\n<li><strong>Obs\u0142uga kontroler\u00f3w: <\/strong><br>Tworzenie dedykowanych kontroler\u00f3w umo\u017cliwia realizacj\u0119 bardziej zaawansowanych funkcji zar\u00f3wno na frontendzie, jak i w panelu administracyjnym.<\/li>\n\n\n\n<li><strong>Automatyzacja: <\/strong><br>Zadania cron pozwalaj\u0105 na zautomatyzowanie powtarzalnych operacji i oszcz\u0119dzanie czasu.<\/li>\n\n\n\n<li><strong>Testowanie i optymalizacja:<\/strong> <br>Dobrze przetestowany modu\u0142 dzia\u0142a p\u0142ynnie i jest gotowy do wdro\u017cenia lub publikacji.<\/li>\n<\/ol>\n\n\n\n<p>Warto tak\u017ce pami\u0119ta\u0107, \u017ce modu\u0142y nie tylko pomagaj\u0105 w personalizacji sklepu, ale mog\u0105 by\u0107 r\u00f3wnie\u017c \u017ar\u00f3d\u0142em dodatkowego dochodu. Dzi\u0119ki udost\u0119pnianiu ich na platformach takich jak PrestaShop Addons, mo\u017cesz podzieli\u0107 si\u0119 swoimi rozwi\u0105zaniami z innymi u\u017cytkownikami i jednocze\u015bnie zmonetyzowa\u0107 swoj\u0105 prac\u0119.<\/p>\n\n\n\n<p>Je\u015bli dopiero zaczynasz przygod\u0119 z PrestaShop, nie zra\u017caj si\u0119 pocz\u0105tkowymi trudno\u015bciami. Ka\u017cdy nowy modu\u0142 to krok w kierunku rozwijania swoich umiej\u0119tno\u015bci i lepszego poznania platformy. A przede wszystkim \u2013 nie b\u00f3j si\u0119 eksperymentowa\u0107 i testowa\u0107 nowych rozwi\u0105za\u0144!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Co dalej?<\/h3>\n\n\n\n<p>Po stworzeniu swojego pierwszego modu\u0142u mo\u017cesz kontynuowa\u0107 nauk\u0119, zg\u0142\u0119biaj\u0105c bardziej zaawansowane tematy, takie jak:<\/p>\n\n\n\n<ul>\n<li>Tworzenie modu\u0142\u00f3w wieloj\u0119zycznych i kompatybilnych z r\u00f3\u017cnymi wersjami PrestaShop.<\/li>\n\n\n\n<li>Integracja z zewn\u0119trznymi API.<\/li>\n\n\n\n<li>Optymalizacja modu\u0142\u00f3w pod k\u0105tem wydajno\u015bci i bezpiecze\u0144stwa.<\/li>\n<\/ul>\n\n\n\n<p>Tw\u00f3j modu\u0142 to dopiero pocz\u0105tek mo\u017cliwo\u015bci, jakie daje PrestaShop. Niezale\u017cnie od tego, czy rozwijasz sklep dla siebie, czy tworzysz rozwi\u0105zania dla klient\u00f3w, zawsze pami\u0119taj, \u017ce dobrze zaprojektowany modu\u0142 mo\u017ce by\u0107 zar\u00f3wno narz\u0119dziem, jak i wizyt\u00f3wk\u0105 Twoich umiej\u0119tno\u015bci.<\/p>\n\n\n\n<p>Powodzenia w tworzeniu modu\u0142\u00f3w i dalszej pracy z PrestaShop!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Czym s\u0105 modu\u0142y w PrestaShop i dlaczego warto je tworzy\u0107? Modu\u0142y w PrestaShop to rozszerzenia, kt\u00f3re umo\u017cliwiaj\u0105 dostosowanie sklepu do [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":18404,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"ep_exclude_from_search":false,"footnotes":""},"categories":[51],"tags":[],"blocksy_meta":[],"acf":[],"featured_image_urls":{"full":["https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly.jpg",1280,720,false],"thumbnail":["https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly-150x150.jpg",150,150,true],"medium":["https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly-300x169.jpg",300,169,true],"medium_large":["https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly-768x432.jpg",768,432,true],"large":["https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly-1024x576.jpg",1024,576,true],"1536x1536":["https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly.jpg",1280,720,false],"2048x2048":["https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly.jpg",1280,720,false],"yarpp-thumbnail":["https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly-120x120.jpg",120,120,true]},"post_excerpt_stackable":"<p>Czym s\u0105 modu\u0142y w PrestaShop i dlaczego warto je tworzy\u0107? Modu\u0142y w PrestaShop to rozszerzenia, kt\u00f3re umo\u017cliwiaj\u0105 dostosowanie sklepu do indywidualnych potrzeb. Dzi\u0119ki nim mo\u017cesz dodawa\u0107 nowe funkcje, integrowa\u0107 zewn\u0119trzne systemy, modyfikowa\u0107 wygl\u0105d strony czy usprawnia\u0107 dzia\u0142anie sklepu bez ingerencji w kod \u017ar\u00f3d\u0142owy platformy. Modu\u0142y dzia\u0142aj\u0105 niezale\u017cnie, co sprawia, \u017ce s\u0105 \u0142atwe w zarz\u0105dzaniu i aktualizacji. Dlaczego warto tworzy\u0107 modu\u0142y? Przede wszystkim dlatego, \u017ce pozwalaj\u0105 one wprowadza\u0107 spersonalizowane rozwi\u0105zania, kt\u00f3re wyr\u00f3\u017cni\u0105 Tw\u00f3j sklep na tle konkurencji. Dla w\u0142a\u015bcicieli sklep\u00f3w to szansa na unikalne funkcje, a dla programist\u00f3w \u2013 okazja do rozwijania swoich umiej\u0119tno\u015bci i tworzenia warto\u015bciowych rozwi\u0105za\u0144, kt\u00f3re mog\u0105 by\u0107&hellip;<\/p>\n","category_list":"<a href=\"https:\/\/www.lh.pl\/pomoc\/c\/prestashop\/\" rel=\"category tag\">PrestaShop<\/a>","author_info":{"name":"Damian Wyszywacz","url":""},"comments_num":"0 comments","yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Jak zacz\u0105\u0107 tworzy\u0107 modu\u0142y do PrestaShop? - PrestaShop LH.pl<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Jak zacz\u0105\u0107 tworzy\u0107 modu\u0142y do PrestaShop? - PrestaShop LH.pl\" \/>\n<meta property=\"og:description\" content=\"Czym s\u0105 modu\u0142y w PrestaShop i dlaczego warto je tworzy\u0107? Modu\u0142y w PrestaShop to rozszerzenia, kt\u00f3re umo\u017cliwiaj\u0105 dostosowanie sklepu do [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/\" \/>\n<meta property=\"og:site_name\" content=\"LH.pl\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/wwwlhpl\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-30T13:09:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-01-30T13:09:02+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"dzialpomocy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"Damian Wyszywacz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"23 minuty\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/\"},\"author\":{\"name\":\"dzialpomocy\",\"@id\":\"https:\/\/www.lh.pl\/pomoc\/#\/schema\/person\/1d1a12f6b47e6c58202c0deaff010677\"},\"headline\":\"Jak zacz\u0105\u0107 tworzy\u0107 modu\u0142y do PrestaShop?\",\"datePublished\":\"2025-01-30T13:09:01+00:00\",\"dateModified\":\"2025-01-30T13:09:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/\"},\"wordCount\":3644,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.lh.pl\/pomoc\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly.jpg\",\"articleSection\":[\"PrestaShop\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/\",\"url\":\"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/\",\"name\":\"Jak zacz\u0105\u0107 tworzy\u0107 modu\u0142y do PrestaShop? - PrestaShop LH.pl\",\"isPartOf\":{\"@id\":\"https:\/\/www.lh.pl\/pomoc\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly.jpg\",\"datePublished\":\"2025-01-30T13:09:01+00:00\",\"dateModified\":\"2025-01-30T13:09:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/#primaryimage\",\"url\":\"https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly.jpg\",\"contentUrl\":\"https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly.jpg\",\"width\":1280,\"height\":720},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Lh.pl Pomoc\",\"item\":\"https:\/\/www.lh.pl\/pomoc\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Firma\",\"item\":\"https:\/\/www.lh.pl\/pomoc\/c\/firma\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"E-commerce\",\"item\":\"https:\/\/www.lh.pl\/pomoc\/c\/e-commerce\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"PrestaShop\",\"item\":\"https:\/\/www.lh.pl\/pomoc\/c\/prestashop\/\"},{\"@type\":\"ListItem\",\"position\":5,\"name\":\"Jak zacz\u0105\u0107 tworzy\u0107 modu\u0142y do PrestaShop?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.lh.pl\/pomoc\/#website\",\"url\":\"https:\/\/www.lh.pl\/pomoc\/\",\"name\":\"LH.pl\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.lh.pl\/pomoc\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.lh.pl\/pomoc\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.lh.pl\/pomoc\/#organization\",\"name\":\"LH.pl\",\"url\":\"https:\/\/www.lh.pl\/pomoc\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/www.lh.pl\/pomoc\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2019\/09\/LH-logo-color-RGB.png\",\"contentUrl\":\"https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2019\/09\/LH-logo-color-RGB.png\",\"width\":771,\"height\":289,\"caption\":\"LH.pl\"},\"image\":{\"@id\":\"https:\/\/www.lh.pl\/pomoc\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/wwwlhpl\",\"https:\/\/www.instagram.com\/wwwlhpl\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.lh.pl\/pomoc\/#\/schema\/person\/1d1a12f6b47e6c58202c0deaff010677\",\"name\":\"dzialpomocy\",\"url\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Jak zacz\u0105\u0107 tworzy\u0107 modu\u0142y do PrestaShop? - PrestaShop LH.pl","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/","og_locale":"pl_PL","og_type":"article","og_title":"Jak zacz\u0105\u0107 tworzy\u0107 modu\u0142y do PrestaShop? - PrestaShop LH.pl","og_description":"Czym s\u0105 modu\u0142y w PrestaShop i dlaczego warto je tworzy\u0107? Modu\u0142y w PrestaShop to rozszerzenia, kt\u00f3re umo\u017cliwiaj\u0105 dostosowanie sklepu do [&hellip;]","og_url":"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/","og_site_name":"LH.pl","article_publisher":"https:\/\/www.facebook.com\/wwwlhpl","article_published_time":"2025-01-30T13:09:01+00:00","article_modified_time":"2025-01-30T13:09:02+00:00","og_image":[{"width":1280,"height":720,"url":"https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly.jpg","type":"image\/jpeg"}],"author":"dzialpomocy","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"Damian Wyszywacz","Szacowany czas czytania":"23 minuty"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/#article","isPartOf":{"@id":"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/"},"author":{"name":"dzialpomocy","@id":"https:\/\/www.lh.pl\/pomoc\/#\/schema\/person\/1d1a12f6b47e6c58202c0deaff010677"},"headline":"Jak zacz\u0105\u0107 tworzy\u0107 modu\u0142y do PrestaShop?","datePublished":"2025-01-30T13:09:01+00:00","dateModified":"2025-01-30T13:09:02+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/"},"wordCount":3644,"commentCount":0,"publisher":{"@id":"https:\/\/www.lh.pl\/pomoc\/#organization"},"image":{"@id":"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly.jpg","articleSection":["PrestaShop"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/","url":"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/","name":"Jak zacz\u0105\u0107 tworzy\u0107 modu\u0142y do PrestaShop? - PrestaShop LH.pl","isPartOf":{"@id":"https:\/\/www.lh.pl\/pomoc\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/#primaryimage"},"image":{"@id":"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly.jpg","datePublished":"2025-01-30T13:09:01+00:00","dateModified":"2025-01-30T13:09:02+00:00","breadcrumb":{"@id":"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/#primaryimage","url":"https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly.jpg","contentUrl":"https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2025\/01\/prestashop_moduly.jpg","width":1280,"height":720},{"@type":"BreadcrumbList","@id":"https:\/\/www.lh.pl\/pomoc\/jak-zaczac-tworzyc-moduly-do-prestashop\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Lh.pl Pomoc","item":"https:\/\/www.lh.pl\/pomoc\/"},{"@type":"ListItem","position":2,"name":"Firma","item":"https:\/\/www.lh.pl\/pomoc\/c\/firma\/"},{"@type":"ListItem","position":3,"name":"E-commerce","item":"https:\/\/www.lh.pl\/pomoc\/c\/e-commerce\/"},{"@type":"ListItem","position":4,"name":"PrestaShop","item":"https:\/\/www.lh.pl\/pomoc\/c\/prestashop\/"},{"@type":"ListItem","position":5,"name":"Jak zacz\u0105\u0107 tworzy\u0107 modu\u0142y do PrestaShop?"}]},{"@type":"WebSite","@id":"https:\/\/www.lh.pl\/pomoc\/#website","url":"https:\/\/www.lh.pl\/pomoc\/","name":"LH.pl","description":"","publisher":{"@id":"https:\/\/www.lh.pl\/pomoc\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lh.pl\/pomoc\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/www.lh.pl\/pomoc\/#organization","name":"LH.pl","url":"https:\/\/www.lh.pl\/pomoc\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/www.lh.pl\/pomoc\/#\/schema\/logo\/image\/","url":"https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2019\/09\/LH-logo-color-RGB.png","contentUrl":"https:\/\/www.lh.pl\/pomoc\/wp-content\/uploads\/2019\/09\/LH-logo-color-RGB.png","width":771,"height":289,"caption":"LH.pl"},"image":{"@id":"https:\/\/www.lh.pl\/pomoc\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/wwwlhpl","https:\/\/www.instagram.com\/wwwlhpl\/"]},{"@type":"Person","@id":"https:\/\/www.lh.pl\/pomoc\/#\/schema\/person\/1d1a12f6b47e6c58202c0deaff010677","name":"dzialpomocy","url":""}]}},"_links":{"self":[{"href":"https:\/\/www.lh.pl\/pomoc\/wp-json\/wp\/v2\/posts\/18401"}],"collection":[{"href":"https:\/\/www.lh.pl\/pomoc\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lh.pl\/pomoc\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lh.pl\/pomoc\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lh.pl\/pomoc\/wp-json\/wp\/v2\/comments?post=18401"}],"version-history":[{"count":3,"href":"https:\/\/www.lh.pl\/pomoc\/wp-json\/wp\/v2\/posts\/18401\/revisions"}],"predecessor-version":[{"id":18406,"href":"https:\/\/www.lh.pl\/pomoc\/wp-json\/wp\/v2\/posts\/18401\/revisions\/18406"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lh.pl\/pomoc\/wp-json\/wp\/v2\/media\/18404"}],"wp:attachment":[{"href":"https:\/\/www.lh.pl\/pomoc\/wp-json\/wp\/v2\/media?parent=18401"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lh.pl\/pomoc\/wp-json\/wp\/v2\/categories?post=18401"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lh.pl\/pomoc\/wp-json\/wp\/v2\/tags?post=18401"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}