From 2f5767c674f8afb38ada2d135f6de6fbb4f2374d Mon Sep 17 00:00:00 2001 From: Isabelle Anno Date: Mon, 9 Feb 2026 10:08:02 +0100 Subject: [PATCH] Init project --- .gitignore | 2 + composer.json | 29 ++++++ composer.lock | 20 ++++ config/services.yml | 18 ++++ config_nl.xml | 11 ++ controllers/front/ajax.php | 63 ++++++++++++ index.php | 35 +++++++ logo.png | Bin 0 -> 2067 bytes src/Database/ReferenceInstaller.php | 82 +++++++++++++++ src/Entity/OrderReference.php | 91 +++++++++++++++++ src/Module/Install.php | 45 +++++++++ src/Module/actionHooks.php | 25 +++++ src/Module/displayHooks.php | 23 +++++ src/Repository/OrderReferenceRepository.php | 53 ++++++++++ src/Resources/data/install.sql | 7 ++ translations/nl.php | 14 +++ views/css/styles.css | 13 +++ views/js/index.js | 105 ++++++++++++++++++++ views/templates/front/orderreference.tpl | 21 ++++ views/templates/pdf/delivery-slip.tpl | 1 + ws_orderreference.php | 44 ++++++++ 21 files changed, 702 insertions(+) create mode 100644 .gitignore create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/services.yml create mode 100644 config_nl.xml create mode 100644 controllers/front/ajax.php create mode 100644 index.php create mode 100644 logo.png create mode 100644 src/Database/ReferenceInstaller.php create mode 100644 src/Entity/OrderReference.php create mode 100644 src/Module/Install.php create mode 100644 src/Module/actionHooks.php create mode 100644 src/Module/displayHooks.php create mode 100644 src/Repository/OrderReferenceRepository.php create mode 100644 src/Resources/data/install.sql create mode 100644 translations/nl.php create mode 100644 views/css/styles.css create mode 100644 views/js/index.js create mode 100644 views/templates/front/orderreference.tpl create mode 100644 views/templates/pdf/delivery-slip.tpl create mode 100644 ws_orderreference.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ff0608a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +vendor/ diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..fd1a99a --- /dev/null +++ b/composer.json @@ -0,0 +1,29 @@ +{ + "name": "dewebsmid/ws_orderreference", + "description": "Adds an optional order reference field to the shopping cart summary.", + "authors": [ + { + "name": "Isabelle Oving-Anno", + "email": "isabelle@dewebsmid.nl" + } + ], + "require": { + "php": ">=8.2.0" + }, + "autoload": { + "psr-4": { + "Module\\WsOrderreference\\": "src/" + }, + "classmap": [ + "ws_orderreference.php" + ], + "exclude-from-classmap": [] + }, + "config": { + "preferred-install": "dist", + "prepend-autoloader": false + }, + "type": "prestashop-module", + "author": "Isabelle Oving-Anno", + "license": "AFL-3.0" +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..b68d89f --- /dev/null +++ b/composer.lock @@ -0,0 +1,20 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "14a8801fe935c090041cfc25afe6829f", + "packages": [], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=8.2.0" + }, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/config/services.yml b/config/services.yml new file mode 100644 index 0000000..d3c90e7 --- /dev/null +++ b/config/services.yml @@ -0,0 +1,18 @@ +services: + _defaults: + autowire: true + autoconfigure: true + + # Repository - this makes it available via dependency injection + Module\WsOrderreference\Repository\OrderReferenceRepository: + public: true + factory: ["@doctrine.orm.default_entity_manager", getRepository] + arguments: + - Module\WsOrderreference\Entity\OrderReference + + # Database installer + Module\WsOrderreference\Database\ReferenceInstaller: + public: true + arguments: + - "@doctrine.dbal.default_connection" + - "%database_prefix%" diff --git a/config_nl.xml b/config_nl.xml new file mode 100644 index 0000000..2e9e529 --- /dev/null +++ b/config_nl.xml @@ -0,0 +1,11 @@ + + + ws_orderreference + + + + + + 0 + 0 + \ No newline at end of file diff --git a/controllers/front/ajax.php b/controllers/front/ajax.php new file mode 100644 index 0000000..0d030b3 --- /dev/null +++ b/controllers/front/ajax.php @@ -0,0 +1,63 @@ +context->cart->id; + + if (!$idCart) { + $this->ajaxRender(json_encode([ + 'success' => false, + 'message' => $this->module->l('No cart found.', 'ajax') + ])); + return; + } + + if (!preg_match('/^[a-zA-Z0-9_\- ]+$/', $orderReference)) { + $this->ajaxRender(json_encode([ + 'success' => false, + 'message' => $this->module->l('Please enter a valid order reference. Characters allowed: a-z, 0-9, -, _ and space', 'ajax') + ])); + return; + } + + try { + /** @var \Doctrine\ORM\EntityManagerInterface $entityManager */ + $entityManager = $this->get('doctrine.orm.default_entity_manager'); + + /** @var OrderReferenceRepository $repository */ + $repository = $entityManager->getRepository(OrderReference::class); + + $orderRef = $repository->findByCartId($idCart); + + if (!$orderRef) { + $orderRef = new OrderReference(); + $orderRef->setIdCart($idCart); + } + + $orderRef->setOrderReference($orderReference); + + $entityManager->persist($orderRef); + $entityManager->flush(); + + $this->ajaxRender(json_encode([ + 'success' => true, + 'message' => $this->module->l('Order reference received!', 'ajax') + ])); + } catch (Exception $e) { + $this->ajaxRender(json_encode([ + 'success' => false, + 'message' => $this->module->l('Could not save order reference.', 'ajax') + ])); + } + } +} \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..dedd77e --- /dev/null +++ b/index.php @@ -0,0 +1,35 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d0df3a7b6fae6eb0bdb19e8274efe41d564a4aa6 GIT binary patch literal 2067 zcmaJ?X;f2Z8V&_niYS{P0`?|A0g;3R5=bNjNZ3h$ut+PVX1PGnn;UWi3DHteQDBsz zgPz)vQvsD_WD`Y^9SX7uG9xI9s8tZq)TKhHfH;X2+aJT+bMO6@^E}V{zTf+t^JRy! z{PaHE_9+U5(hKlsu$3dA`m{Bbe?%^yR}N+ppJ+)q94C=-#30Ix4|72v0OG`hY>>lG zP3i^RQ7CncAR<~4%?zgSU2a6eu$-9Q85V;iHL&3Nu^S()ENtl<8gR0nXJ+v5FC{VM)6 zb_;}jSc=%c$1|Cf03jmb2zg)tgNjiqU(_F8@z1ab2#;3Xn({nE{FgDInih3`4;Ck|~1qb0Ms&_kqh_ zKNsh9xj1DqI8|f+(&)7M%sk_J78(|m518t6&V*$@gAM2M~v{g zCks02)!^`S(HA2p4Tp@)(^=8MpZ!!+4J-#uXZ4O0ARF>Fn@v?DqucX+a;?jfOncO5 zJ-5^R2O5eJ=!VU6dUh}GaU}+avj#32RG4I(IC{8tkJZV0#;(kefta#m<_}soMnt>i zo-_BnM1qCSkN&5mrN+W8uBi3ay!y>^6e}mD0?mg*=D+k=< z`lY||B0LIK8qB=alkX0dY|G4@W+V;y`+0qG-hC?IlJ%&*d3n~?)TM2nVGW1tAAe@> zH_gs}Xg(@fMk#)6eB2$IIo7{;k=q-rUZwNTgK~rK^`+G|o`j79QxWsWQfzF4Z2f5a z;>#yPVzP0bu8v*sBmcDH9pl}(+mDQnHivz_^==;-vwCw&d!^SVlKo1J#j98|@;$Xe z?Y|qr6^PFDFOE1QZ4BuMI_EczPQ5(U5N$E;Q)hFvAJYyFT7_75>KAYPj(pCzR0Cca z%RJxs?bJ*3(BtP6OqblV`l9D&YqF;TT><@Qm=7`cMKZ?B^vx-+vb2Cs=G3Hp*YWV{!O1lDV{W0CD{x{ zBp=izea#P%50cWIQ}Va$LQBzUPY4S+p2nAq@SORKm&U{78TTsi~SZ-0=<-&Gi*V2>Iz9({s!cE|gr>l{o!4cuE zA)SKLl(V_lV}UoA_EqU?I&PKSr)BZ6>C(LV)@$>+?dcfw^?`egvi%wn5pRnt_ zmZKTlh;F1cxw^!prZz3x13tQEdD|^rK*;giB@5%bo1=Q1*|?k?x9HpJC!e`p-D!9v zP~0=KcsE8ZWZG_4r~AxOLG#G<>21a|Hx0L$0rXj~;R;4<&w;&RjN#cA^!bFGEwyKK zui?A6IhlUp&T}nU2`>9hkJsIPw@9rSeUvqM + * @copyright 2026 De Websmid + * @license De Websmid + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0). + * It is also available through the world-wide-web at this URL: https://opensource.org/licenses/AFL-3.0 + */ + +declare(strict_types=1); + +namespace Module\WsOrderreference\Database; + +use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Exception as DBALException; + +class ReferenceInstaller +{ + private Connection $connection; + private string $dbPrefix; + + public function __construct(Connection $connection, string $dbPrefix) + { + $this->connection = $connection; + $this->dbPrefix = $dbPrefix; + } + + public function createTables(): array + { + $errors = []; + $this->dropTables(); + $sqlInstallFile = dirname(__DIR__) . '/Resources/data/install.sql'; + + $sqlContent = file_get_contents($sqlInstallFile); + $sqlContent = str_replace('PREFIX_', $this->dbPrefix, $sqlContent); + + $sqlQueries = array_filter(array_map('trim', explode(';', $sqlContent))); + + foreach ($sqlQueries as $query) { + if (empty($query)) { + continue; + } + + try { + $this->connection->executeQuery($query); + } catch (DBALException $e) { + $errors[] = [ + 'key' => $e->getMessage(), + 'parameters' => [], + 'domain' => 'Admin.Modules.Notification', + ]; + } + } + return $errors; + } + + public function dropTables(): array + { + $errors = []; + $tableNames = [ + 'ws_orderreference', + ]; + foreach ($tableNames as $tableName) { + $sql = 'DROP TABLE IF EXISTS ' . $this->dbPrefix . $tableName; + try { + $this->connection->executeQuery($sql); + } catch (DBALException $e) { + $errors[] = [ + 'key' => $e->getMessage(), + 'parameters' => [], + 'domain' => 'Admin.Modules.Notification', + ]; + } + } + return $errors; + } +} \ No newline at end of file diff --git a/src/Entity/OrderReference.php b/src/Entity/OrderReference.php new file mode 100644 index 0000000..5389805 --- /dev/null +++ b/src/Entity/OrderReference.php @@ -0,0 +1,91 @@ + + * @copyright 2026 De Websmid + * @license Academic Free License 3.0 (AFL-3.0) + */ + +declare(strict_types=1); + +namespace Module\WsOrderreference\Entity; + +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Table() + * @ORM\Entity(repositoryClass="Module\WsOrderreference\Repository\OrderReferenceRepository") + */ +class OrderReference +{ + /** + * @var int + * + * @ORM\Id + * @ORM\Column(name="id", type="integer") + * @ORM\GeneratedValue(strategy="AUTO") + */ + private $id; + + /** + * @var int + * + * @ORM\Column(name="id_cart", type="integer", unique=true) + */ + private $idCart; + + /** + * @var string + * + * @ORM\Column(name="order_reference", type="string", length=255) + */ + private $orderReference; + + /** + * @return int|null + */ + public function getId(): ?int + { + return $this->id; + } + + /** + * @return int|null + */ + public function getIdCart(): ?int + { + return $this->idCart; + } + + /** + * @param int $idCart + * @return $this + */ + public function setIdCart(int $idCart): self + { + $this->idCart = $idCart; + + return $this; + } + + /** + * @return string + */ + public function getOrderReference(): string + { + return $this->orderReference; + } + + /** + * @param string $orderReference + * @return $this + */ + public function setOrderReference(string $orderReference): self + { + $this->orderReference = $orderReference; + + return $this; + } +} \ No newline at end of file diff --git a/src/Module/Install.php b/src/Module/Install.php new file mode 100644 index 0000000..f3a325d --- /dev/null +++ b/src/Module/Install.php @@ -0,0 +1,45 @@ +installTables() + && parent::install() + && $this->registerHook('displayShoppingCart') + && $this->registerHook('displayPDFDeliverySlip') + && $this->registerHook('actionFrontControllerSetMedia'); + } + + private function getInstaller(): ReferenceInstaller + { + try { + $installer = $this->get(ReferenceInstaller::class); + } catch (\Throwable $e) { + $installer = null; + } + + if (!$installer) { + $installer = new ReferenceInstaller( + $this->get('doctrine.dbal.default_connection'), + $this->getContainer()->getParameter('database_prefix') + ); + } + + return $installer; + } + + private function installTables(): bool + { + /** @var ReferenceInstaller $installer */ + $installer = $this->getInstaller(); + $errors = $installer->createTables(); + + return empty($errors); + } + +} \ No newline at end of file diff --git a/src/Module/actionHooks.php b/src/Module/actionHooks.php new file mode 100644 index 0000000..2b285a0 --- /dev/null +++ b/src/Module/actionHooks.php @@ -0,0 +1,25 @@ + $this->context->link->getModuleLink($this->name, 'ajax'), + ]); + + $this->context->controller->registerJavascript( + 'index.js', + 'modules/'.$this->name.'/views/js/index.js', + ['position' => 'bottom', 'priority' => 150] + ); + + $this->context->controller->registerStylesheet( + 'styles.css', + 'modules/'.$this->name.'/views/css/styles.css', + ['media' => 'all', 'priority' => 150] + ); + } +} \ No newline at end of file diff --git a/src/Module/displayHooks.php b/src/Module/displayHooks.php new file mode 100644 index 0000000..3e9b443 --- /dev/null +++ b/src/Module/displayHooks.php @@ -0,0 +1,23 @@ +fetch('module:ws_orderreference/views/templates/front/orderreference.tpl'); + } + + public function hookDisplayPDFDeliverySlip($params) + { + $orderId = $params['object']->id_order; + + $orderReferenceRepo = \PrestaShop\PrestaShop\Adapter\SymfonyContainer::getInstance()->get('Module\WsOrderreference\Repository\OrderReferenceRepository'); + $orderReference = $orderReferenceRepo->customRefByOrderId($orderId); + + $this->context->smarty->assign('orderReference', $orderReference); + + return $this->fetch('module:ws_orderreference/views/templates/pdf/delivery-slip.tpl'); + } +} \ No newline at end of file diff --git a/src/Repository/OrderReferenceRepository.php b/src/Repository/OrderReferenceRepository.php new file mode 100644 index 0000000..1492597 --- /dev/null +++ b/src/Repository/OrderReferenceRepository.php @@ -0,0 +1,53 @@ + + * @copyright 2026 De Websmid + * @license Academic Free License 3.0 (AFL-3.0) + */ + +declare(strict_types=1); + +namespace Module\WsOrderreference\Repository; + +use Doctrine\ORM\EntityRepository; +use Module\WsOrderreference\Entity\OrderReference; + +class OrderReferenceRepository extends EntityRepository +{ + /** + * Find order reference by cart ID + * + * @param int $cartId + * @return OrderReference|null + */ + public function findByCartId(int $cartId): ?OrderReference + { + return $this->findOneBy(['idCart' => $cartId]); + } + + // Create a function that accepts an order Id and uses the cart ID to check if there is a custom order reference. + // Requires an order ID as a parameter. + // Returns the order reference if found, otherwise returns null. + // Used in the display hook to show the order reference on the pdf. + + // Steps to build and break the problem down: + // 1.) Just return the cart ID from the order ID to see if that works. + // 2.) Use the cart ID to find the order reference. + + public function customRefByOrderId(int $orderId): ?string + { + $conn = $this->getEntityManager()->getConnection(); + $sql = 'SELECT id_cart FROM ps_orders WHERE id_order = :orderId'; + $stmt = $conn->prepare($sql); + $resultSet = $stmt->executeQuery(['orderId' => $orderId]); + $idCart = $resultSet->fetchOne(); + if ($idCart) { + $orderReference = $this->findByCartId((int)$idCart); + return $orderReference ? $orderReference->getOrderReference() : null; + } + return null; + } + +} \ No newline at end of file diff --git a/src/Resources/data/install.sql b/src/Resources/data/install.sql new file mode 100644 index 0000000..61de717 --- /dev/null +++ b/src/Resources/data/install.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS `PREFIX_order_reference` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_cart` int(11) NOT NULL, + `order_reference` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `id_cart` (`id_cart`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/translations/nl.php b/translations/nl.php new file mode 100644 index 0000000..ec617ff --- /dev/null +++ b/translations/nl.php @@ -0,0 +1,14 @@ +ws_orderreference_1e860e56970a81a1ba3e1fcb7fccc846'] = 'Orderreferentie'; +$_MODULE['<{ws_orderreference}prestashop>ws_orderreference_9f0d684399938af879ce3fb38710642c'] = 'Voegt een optioneel orderreferentieveld toe aan het winkelwagenoverzicht.'; +$_MODULE['<{ws_orderreference}prestashop>ajax_ec19148e5460115c7abda82799f02269'] = 'Geen winkelwagen gevonden.'; +$_MODULE['<{ws_orderreference}prestashop>ajax_ffc8410c88b32eb4547230088b9df62a'] = 'Voer een geldige orderreferentie in. Toegestane tekens: a-z, 0-9, -, _ en spatie'; +$_MODULE['<{ws_orderreference}prestashop>ajax_588d7a076adcf5a584c049d954496ae6'] = 'Orderreferentie ontvangen!'; +$_MODULE['<{ws_orderreference}prestashop>ajax_4602466a12672337138c0925bd5f737f'] = 'Kon orderreferentie niet opslaan.'; +$_MODULE['<{ws_orderreference}prestashop>orderreference_9f5ba9ae96aa82530d03f434f4da0670'] = 'Orderreferentie (optioneel)'; +$_MODULE['<{ws_orderreference}prestashop>orderreference_a4d3b161ce1309df1c4e25df28694b7b'] = 'Opslaan'; +$_MODULE['<{ws_orderreference}prestashop>orderreference_fe8cc190e37aa5083375088bd5873c29'] = 'Uw bestelreferentie:'; +$_MODULE['<{ws_orderreference}prestashop>delivery-slip_f8c9e6a6b5ac4fd353d569c78cbabd90'] = 'Uw aangepaste bestelreferentie:'; diff --git a/views/css/styles.css b/views/css/styles.css new file mode 100644 index 0000000..83ad14e --- /dev/null +++ b/views/css/styles.css @@ -0,0 +1,13 @@ +/* Fade out for alert */ +.fade-out { + animation: fadeOut 0.75s forwards; +} + +@keyframes fadeOut { + from { + opacity: 1; + } + to { + opacity: 0; + } +} diff --git a/views/js/index.js b/views/js/index.js new file mode 100644 index 0000000..c6dd4d5 --- /dev/null +++ b/views/js/index.js @@ -0,0 +1,105 @@ +document.addEventListener("DOMContentLoaded", function () { + // Load saved reference on page load (with retry for dynamic content) + loadSavedReferenceWithRetry(); + + // Ajax submission + document.addEventListener("submit", function (e) { + if (e.target && e.target.id === "order_reference_form") { + e.preventDefault(); + const form = e.target; + const url = typeof ajax_url !== "undefined" ? ajax_url : null; + const input = document.querySelector("#order_reference_input"); + const inputValue = input.value.trim(); + + fetch(url, { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + Accept: "application/json", + }, + body: + "ajax=1&order_reference_input=" + + encodeURIComponent(inputValue), + }) + .then((response) => response.json()) + .then((data) => { + if (data.success) { + // Save to localStorage + localStorage.setItem("order_reference", inputValue); + displaySavedReference(inputValue); + input.value = ""; + } + alertFadeOut(form, data); + }) + .catch((error) => { + console.error(error); + alertFadeOut(form, { + success: false, + message: "An error occurred", + }); + }); + } + }); + + // Load saved reference with retry mechanism for dynamic content + function loadSavedReferenceWithRetry(attempts = 0, maxAttempts = 10) { + const savedReference = localStorage.getItem("order_reference"); + if (savedReference) { + const success = displaySavedReference(savedReference); + + if (!success && attempts < maxAttempts) { + setTimeout(() => { + loadSavedReferenceWithRetry(attempts + 1, maxAttempts); + }, 100); + } + } + } + + function displaySavedReference(value) { + const form = document.querySelector("#order_reference_form"); + if (!form) return false; + + const lastSubmittedContainer = form.querySelector( + ".last-submitted-container", + ); + if (lastSubmittedContainer) { + const lastSubmittedSpan = + lastSubmittedContainer.querySelector(".last-submitted"); + if (lastSubmittedSpan) { + lastSubmittedSpan.textContent = value; + lastSubmittedContainer.classList.remove("d-none"); + return true; + } + } + return false; + } + + // Reset alert to initial state + function resetAlert(alert, messageEl) { + alert.classList.add("d-none"); + alert.classList.remove("alert-success", "alert-danger", "fade-out"); + messageEl.textContent = ""; + } + + // Fade out alert and reset + function alertFadeOut(form, data) { + const alert = form.querySelector(".alert"); + if (!alert) return; + + const messageEl = alert.querySelector(".alert-message"); + if (!messageEl) return; + + // Show alert with appropriate class and message + alert.classList.remove("d-none"); + alert.classList.add(data.success ? "alert-success" : "alert-danger"); + messageEl.textContent = data.message; + + // Fade out after delay + setTimeout(() => { + alert.classList.add("fade-out"); + setTimeout(() => { + resetAlert(alert, messageEl); + }, 750); // 750ms for fade-out animation - make sure it matches in styles.css + }, 5000); + } +}); diff --git a/views/templates/front/orderreference.tpl b/views/templates/front/orderreference.tpl new file mode 100644 index 0000000..278ba13 --- /dev/null +++ b/views/templates/front/orderreference.tpl @@ -0,0 +1,21 @@ +
+
+
+

{l s='Order reference (optional)' mod='ws_orderreference'}

+
+
+ + +
+ +
+ +
+

+
+
+
+
diff --git a/views/templates/pdf/delivery-slip.tpl b/views/templates/pdf/delivery-slip.tpl new file mode 100644 index 0000000..b892fb3 --- /dev/null +++ b/views/templates/pdf/delivery-slip.tpl @@ -0,0 +1 @@ +

{l s='Your custom order reference:' mod='ws_orderreference'} {$orderReference}

\ No newline at end of file diff --git a/ws_orderreference.php b/ws_orderreference.php new file mode 100644 index 0000000..6e7dbc3 --- /dev/null +++ b/ws_orderreference.php @@ -0,0 +1,44 @@ +name = 'ws_orderreference'; + $this->tab = 'other'; + $this->version = '1.0.0'; + $this->author = 'Isabelle Oving-Anno | De Websmid b.v.'; + $this->need_instance = 0; + $this->ps_versions_compliancy = [ + 'min' => '9.0.0', + 'max' => '9.99.99', + ]; + $this -> bootstrap = true; + + parent::__construct(); + + $this->displayName = $this->l('Order Reference'); + $this->description = $this->l('Adds an optional order reference field to the shopping cart summary.'); + } + +} \ No newline at end of file