From 340b737436f12ae92a702cadac5bc08d88f6aae7 Mon Sep 17 00:00:00 2001 From: martin Date: Tue, 4 Feb 2025 07:45:30 +0100 Subject: [PATCH 01/65] gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2eea525 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file From 7c0d4f9d0cfa0831fda9f73c5f0fff2668294421 Mon Sep 17 00:00:00 2001 From: martin Date: Tue, 4 Feb 2025 07:47:28 +0100 Subject: [PATCH 02/65] initialize docker --- Dockerfile | 41 +++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f857d6b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,41 @@ +FROM php:8.2-apache +ARG OC_VERSION +ENV OC_VERSION=${OC_VERSION:-latest} + +RUN echo "Opencart version: ${OC_VERSION}" + +WORKDIR /tmp + +RUN curl -L "https://github.com/opencart/opencart/archive/refs/tags/${OC_VERSION}.tar.gz" -o opencart.tar.gz + +RUN tar -xzf opencart.tar.gz + +RUN rm opencart.tar.gz + +RUN cp -r opencart-*/upload/* /var/www/html + +RUN apt-get update \ + && apt-get install -y \ + wait-for-it \ + unzip \ + libfreetype6-dev \ + libjpeg62-turbo-dev \ + libpng-dev \ + libzip-dev \ + libcurl3-dev \ + libwebp-dev \ + && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ + && docker-php-ext-install -j$(nproc) gd zip mysqli curl \ + && docker-php-ext-enable gd zip mysqli curl + +WORKDIR /var/www/html + +RUN chmod 777 system/storage/logs && \ + chmod 777 system/storage/cache && \ + cp config-dist.php config.php && \ + chmod 777 config.php && \ + cp admin/config-dist.php admin/config.php && \ + chmod 777 admin/config.php + + +RUN a2enmod rewrite diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..4019475 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,40 @@ +services: + opencart: + build: + dockerfile: Dockerfile + args: + OC_VERSION: ${OC_VERSION:-latest} + image: opencart:${OC_VERSION:-latest} + depends_on: + - db + ports: + - "8083:80" +# user: www-data +# env_file: +# - ./.env +# environment: +# OC_VERSION: 3.1 + volumes: + - ./:/opt/bitnami/opencart/system/library/cartsms/ + #- ./prestashop:/var/www/html + + db: + image: mysql:5.7 + environment: + MYSQL_DATABASE: opencart + MYSQL_PASSWORD: admin + MYSQL_USER: bn_opencart + MYSQL_ROOT_PASSWORD: admin + volumes: + - db:/var/lib/mysql + + adminer: + image: adminer + environment: + ADMINER_DESIGN: "nette" + ADMINER_DEFAULT_SERVER: "db" + ports: + - "8090:8080" + +volumes: + db: \ No newline at end of file From 2a68424c6a1b07d3f865d7d6376f2e9f6c8af1b9 Mon Sep 17 00:00:00 2001 From: martin Date: Fri, 7 Feb 2025 07:43:01 +0100 Subject: [PATCH 03/65] initialize new module --- .gitignore | 3 +- .gitmodules | 3 - Dockerfile | 43 +- README.md | 19 + .../controller}/module/cartsms.php | 39 +- admin/language/en-gb/module/cartsms.php | 4 + admin/view/template/module/cartsms.twig | 14 + composer.json | 32 ++ ..._6.00_RC1_for_OpenCart_30xx_1535027082.zip | Bin 82871 -> 0 bytes docker-compose.yml | 9 +- entrypoint.sh | 33 ++ install.json | 7 + install.php | 17 - .../admin/controller/cartsms/black_list.php | 20 - upload/admin/controller/cartsms/dashboard.php | 15 - upload/admin/controller/cartsms/events.php | 75 --- upload/admin/controller/cartsms/history.php | 15 - upload/admin/controller/cartsms/inbox.php | 15 - .../admin/controller/cartsms/module_about.php | 17 - .../cartsms/module_notifications.php | 44 -- .../controller/cartsms/module_settings.php | 39 -- upload/admin/controller/cartsms/payment.php | 20 - upload/admin/controller/cartsms/sign.php | 50 -- .../admin/controller/cartsms/sms_campaign.php | 82 ---- upload/admin/controller/cartsms/sms_price.php | 15 - .../admin/controller/cartsms/sms_settings.php | 15 - .../admin/controller/cartsms/statistics.php | 15 - upload/admin/controller/cartsms/top.php | 15 - upload/admin/controller/cartsms/user.php | 15 - upload/admin/controller/cartsms/wallet.php | 15 - .../en-gb/extension/module/cartsms.php | 3 - upload/admin/view/template/cartsms/base.twig | 72 --- upload/catalog/controller/cartsms/events.php | 103 ---- upload/system/library/cartsms/Controller.php | 147 ------ .../system/library/cartsms/cartsms.ocmod.xml | 179 ------- .../system/library/cartsms/cartsms/.htaccess | 2 - .../library/cartsms/cartsms/src/.htaccess | 2 - .../library/cartsms/cartsms/src/Api.php | 27 -- .../library/cartsms/cartsms/src/CartSMS.php | 239 --------- .../library/cartsms/cartsms/src/Customers.php | 112 ----- .../cartsms/cartsms/src/DIContainer.php | 50 -- .../library/cartsms/cartsms/src/Database.php | 73 --- .../cartsms/cartsms/src/HookExtension.php | 15 - .../library/cartsms/cartsms/src/HookLoad.php | 454 ------------------ .../cartsms/cartsms/src/ProxyGenerator.php | 31 -- .../cartsms/cartsms/src/_extension.php | 17 - .../library/cartsms/cartsms/src/helpers.php | 75 --- upload/system/library/cartsms/extensions | 1 - upload/system/library/cartsms/init.php | 221 --------- 49 files changed, 165 insertions(+), 2363 deletions(-) delete mode 100644 .gitmodules rename {upload/admin/controller/extension => admin/controller}/module/cartsms.php (89%) create mode 100644 admin/language/en-gb/module/cartsms.php create mode 100644 admin/view/template/module/cartsms.twig create mode 100644 composer.json delete mode 100644 dist/CartSMS_6.00_RC1_for_OpenCart_30xx_1535027082.zip create mode 100644 entrypoint.sh create mode 100644 install.json delete mode 100644 install.php delete mode 100644 upload/admin/controller/cartsms/black_list.php delete mode 100644 upload/admin/controller/cartsms/dashboard.php delete mode 100644 upload/admin/controller/cartsms/events.php delete mode 100644 upload/admin/controller/cartsms/history.php delete mode 100644 upload/admin/controller/cartsms/inbox.php delete mode 100644 upload/admin/controller/cartsms/module_about.php delete mode 100644 upload/admin/controller/cartsms/module_notifications.php delete mode 100644 upload/admin/controller/cartsms/module_settings.php delete mode 100644 upload/admin/controller/cartsms/payment.php delete mode 100644 upload/admin/controller/cartsms/sign.php delete mode 100644 upload/admin/controller/cartsms/sms_campaign.php delete mode 100644 upload/admin/controller/cartsms/sms_price.php delete mode 100644 upload/admin/controller/cartsms/sms_settings.php delete mode 100644 upload/admin/controller/cartsms/statistics.php delete mode 100644 upload/admin/controller/cartsms/top.php delete mode 100644 upload/admin/controller/cartsms/user.php delete mode 100644 upload/admin/controller/cartsms/wallet.php delete mode 100644 upload/admin/language/en-gb/extension/module/cartsms.php delete mode 100644 upload/admin/view/template/cartsms/base.twig delete mode 100644 upload/catalog/controller/cartsms/events.php delete mode 100644 upload/system/library/cartsms/Controller.php delete mode 100644 upload/system/library/cartsms/cartsms.ocmod.xml delete mode 100644 upload/system/library/cartsms/cartsms/.htaccess delete mode 100644 upload/system/library/cartsms/cartsms/src/.htaccess delete mode 100644 upload/system/library/cartsms/cartsms/src/Api.php delete mode 100644 upload/system/library/cartsms/cartsms/src/CartSMS.php delete mode 100644 upload/system/library/cartsms/cartsms/src/Customers.php delete mode 100644 upload/system/library/cartsms/cartsms/src/DIContainer.php delete mode 100644 upload/system/library/cartsms/cartsms/src/Database.php delete mode 100644 upload/system/library/cartsms/cartsms/src/HookExtension.php delete mode 100644 upload/system/library/cartsms/cartsms/src/HookLoad.php delete mode 100644 upload/system/library/cartsms/cartsms/src/ProxyGenerator.php delete mode 100644 upload/system/library/cartsms/cartsms/src/_extension.php delete mode 100644 upload/system/library/cartsms/cartsms/src/helpers.php delete mode 160000 upload/system/library/cartsms/extensions delete mode 100644 upload/system/library/cartsms/init.php diff --git a/.gitignore b/.gitignore index 2eea525..db27dc8 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.env \ No newline at end of file +.env +vendor \ No newline at end of file diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 5833171..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "upload/system/library/cartsms/extensions"] - path = upload/system/library/cartsms/extensions - url = https://github.com/BulkGate/extensions diff --git a/Dockerfile b/Dockerfile index f857d6b..aab3e08 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,36 +6,43 @@ RUN echo "Opencart version: ${OC_VERSION}" WORKDIR /tmp -RUN curl -L "https://github.com/opencart/opencart/archive/refs/tags/${OC_VERSION}.tar.gz" -o opencart.tar.gz +RUN curl -L "https://github.com/opencart/opencart/archive/refs/tags/${OC_VERSION}.tar.gz" -o opencart.tar.gz && \ + curl -sS https://raw.githubusercontent.com/composer/getcomposer.org/f3108f64b4e1c1ce6eb462b159956461592b3e3e/web/installer | php && \ + mv composer.phar /usr/local/bin/composer RUN tar -xzf opencart.tar.gz RUN rm opencart.tar.gz +USER www-data:www-data + RUN cp -r opencart-*/upload/* /var/www/html +WORKDIR /var/www/html + +RUN cp config-dist.php config.php && \ + cp admin/config-dist.php admin/config.php + +USER root + +VOLUME /var/www/html + RUN apt-get update \ && apt-get install -y \ - wait-for-it \ - unzip \ - libfreetype6-dev \ - libjpeg62-turbo-dev \ - libpng-dev \ - libzip-dev \ - libcurl3-dev \ - libwebp-dev \ + wait-for-it \ + unzip \ + libfreetype6-dev \ + libjpeg62-turbo-dev \ + libpng-dev \ + libzip-dev \ + libcurl3-dev \ + libwebp-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ && docker-php-ext-install -j$(nproc) gd zip mysqli curl \ && docker-php-ext-enable gd zip mysqli curl -WORKDIR /var/www/html - -RUN chmod 777 system/storage/logs && \ - chmod 777 system/storage/cache && \ - cp config-dist.php config.php && \ - chmod 777 config.php && \ - cp admin/config-dist.php admin/config.php && \ - chmod 777 admin/config.php +RUN a2enmod rewrite +COPY --chmod=777 entrypoint.sh /usr/sbin -RUN a2enmod rewrite +ENTRYPOINT ["entrypoint.sh"] diff --git a/README.md b/README.md index fcfe729..bf3c550 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,22 @@ http://www.cart-sms.com/ + +# Development + +https://webkul.com/blog/how-to-create-a-module-in-opencart/ + + +## Category extension +URL: http://localhost:8083/admin/index.php?route=extension/opencart/module/category&user_token=886a6f6378b7a94cbccad4acd55abdf1 +FILE: /extension/opencart/admin/controller/module/category.php +view: /extension/opencart/admin/view/template/module/category.twig +NAMESPACE: Opencart\Admin\Controller\Extension\Opencart\Module; +CLASS: Category + +## Cartsms extension +URL: http://localhost:8083/admin/index.php?route=extension/cartsms/module/cartsms&user_token=886a6f6378b7a94cbccad4acd55abdf1 +FILE: /extension/cartsms/admin/controller/module/cartsms.php +view: /extension/cartsms/admin/view/template/module/cartsms.twig +NAMESPACE: Opencart\Admin\Controller\Extension\Cartsms\Module; +CLASS: Cartsms \ No newline at end of file diff --git a/upload/admin/controller/extension/module/cartsms.php b/admin/controller/module/cartsms.php similarity index 89% rename from upload/admin/controller/extension/module/cartsms.php rename to admin/controller/module/cartsms.php index ab192f8..8aa962b 100644 --- a/upload/admin/controller/extension/module/cartsms.php +++ b/admin/controller/module/cartsms.php @@ -1,23 +1,32 @@ response->redirect($this->url->link('cartsms/module_settings/actionDefault', 'user_token=' . $this->session->data['user_token'], true)); + $this->load->language('extension/oc_cartsms/module/cartsms'); + $this->document->setTitle($this->language->get('heading_title')); + + $this->response->setOutput($this->load->view('extension/oc_cartsms/module/cartsms', [ + 'header' => $this->load->controller('common/header'), + 'column_left' => $this->load->controller('common/column_left'), + 'footer' => $this->load->controller('common/footer'), + ])); } - public function install() + public function install() + { + //throw new \Exception("install: test error"); + } + + public function uninstall() + { + //throw new \Exception("unintall: test error"); + } + + /*public function install() { $this->load->model('setting/event'); $this->load->model('user/user_group'); @@ -112,6 +121,6 @@ private function uninstallOcMod() { $db = $this->oc_di->getDatabase(); $db->execute($db->prepare("DELETE FROM `{$db->table('modification')}` WHERE `code` = %s", array(CartSms\Init::MODULE_CODE))); - } + }*/ } diff --git a/admin/language/en-gb/module/cartsms.php b/admin/language/en-gb/module/cartsms.php new file mode 100644 index 0000000..d5d3b3d --- /dev/null +++ b/admin/language/en-gb/module/cartsms.php @@ -0,0 +1,4 @@ + +
+ +
+
+ BulkGate +
+
+
+
+ +{{ footer }} diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..3657eb0 --- /dev/null +++ b/composer.json @@ -0,0 +1,32 @@ +{ + "name": "bulkgate/cartsms", + "type": "opencart-module", + "minimum-stability": "RC", + "require": { + "php": ">= 7.4", + "bulkgate/plugin": "dev-master" + }, + "require-dev": { + "tracy/tracy": "^2.9", + "nette/tester": "^2.4.3", + "phpstan/phpstan": "^1.10", + "mockery/mockery": "^1.6" + }, + "autoload": { + "psr-4": { + "BulkGate\\CartSms\\": "src/" + }, + "classmap": [ + "src/" + ] + }, + "scripts": { + "tester": "tester -C tests --colors=1", + "coverage": "tester -C --coverage=coverage.html --coverage-src=src --stop-on-fail", + "phpstan": "_PS_ROOT_DIR_=/var/www/html phpstan analyse -c phpstan.neon --memory-limit=1G", + "prestashop-lint": "php-cs-fixer fix" + }, + "config": { + "prepend-autoloader": false + } +} diff --git a/dist/CartSMS_6.00_RC1_for_OpenCart_30xx_1535027082.zip b/dist/CartSMS_6.00_RC1_for_OpenCart_30xx_1535027082.zip deleted file mode 100644 index b60d487d7c83d7d7a8461de99dacc12193a9cccd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82871 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%0DI)nxcXjPU0+*f@ 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 XG;l}{96%KVHdw$m7});-(8eK{ diff --git a/docker-compose.yml b/docker-compose.yml index 4019475..d4c7731 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,15 +15,16 @@ services: # environment: # OC_VERSION: 3.1 volumes: - - ./:/opt/bitnami/opencart/system/library/cartsms/ - #- ./prestashop:/var/www/html + - ./admin:/var/www/html/extension/oc_cartsms/admin + - ./src:/var/www/html/extension/oc_cartsms/src + - ./tests:/var/www/html/extension/oc_cartsms/tests + - ./vendor:/var/www/html/extension/oc_cartsms/vendor + - ./install.json:/var/www/html/extension/oc_cartsms/install.json db: image: mysql:5.7 environment: MYSQL_DATABASE: opencart - MYSQL_PASSWORD: admin - MYSQL_USER: bn_opencart MYSQL_ROOT_PASSWORD: admin volumes: - db:/var/lib/mysql diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..6d76dae --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# idealne napsat php script, ktery by mohl automaticky moduly instalovat... bylo by to podobny install scriptu +echo ' +------------------------------------------------------- + +-- +-- Automatic module registration +-- + +INSERT INTO `oc_extension_install` (`extension_install_id`, `extension_id`, `extension_download_id`, `name`, `description`, `code`, `version`, `author`, `link`, `status`, `date_added`) +VALUES (2, 0, 0, "CartSMS module for OpenCart", "", "oc_cartsms", "4.0", "BulkGate", "https://www.bulkgate.com/en/integrations/cartsms-sms-module-for-opencart/", 1, "2020-08-29 15:35:39"); + +' >> /var/www/html/install/opencart-en-*.sql + +if [ ! -f /var/www/html/install.lock ]; then + wait-for-it db:3306 -t 60 && + php /var/www/html/install/cli_install.php install \ + --username admin \ + --password admin \ + --email admin@example.com \ + --http_server http://localhost:8083/ \ + --db_driver mysqli \ + --db_hostname db \ + --db_username root \ + --db_password admin \ + --db_database opencart \ + --db_port 3306 \ + --db_prefix oc_ && + touch /var/www/html/install.lock +fi + +exec apache2-foreground \ No newline at end of file diff --git a/install.json b/install.json new file mode 100644 index 0000000..88db912 --- /dev/null +++ b/install.json @@ -0,0 +1,7 @@ +{ + "name": "CartSMS module for OpenCart", + "description": "Make your SMS messages stand out from the crowd! In a world of overflowing inboxes, SMS, RCS, and WhatsApp offer a unique way to grab your customers' attention and ensure your important notifications are seen.", + "version": "4.0", + "author": "BulkGate", + "link": "https://www.bulkgate.com/en/integrations/cartsms-sms-module-for-opencart/" +} \ No newline at end of file diff --git a/install.php b/install.php deleted file mode 100644 index 415ec25..0000000 --- a/install.php +++ /dev/null @@ -1,17 +0,0 @@ -registry); - @$modification_controller->install(); - - $this->load->model('extension/extension'); - $this->model_extension_extension->uninstall('module', "cartsms"); - @$this->model_extension_extension->install('module', "cartsms"); - -die; - - diff --git a/upload/admin/controller/cartsms/black_list.php b/upload/admin/controller/cartsms/black_list.php deleted file mode 100644 index e0fec38..0000000 --- a/upload/admin/controller/cartsms/black_list.php +++ /dev/null @@ -1,20 +0,0 @@ -view('Black list', 'BlackList', 'default', true); - } - - public function actionImport() - { - $this->view('Black list', 'BlackList', 'import', true); - } -} \ No newline at end of file diff --git a/upload/admin/controller/cartsms/dashboard.php b/upload/admin/controller/cartsms/dashboard.php deleted file mode 100644 index cb42288..0000000 --- a/upload/admin/controller/cartsms/dashboard.php +++ /dev/null @@ -1,15 +0,0 @@ -view('Dashboard', 'Dashboard', 'default', false); - } -} \ No newline at end of file diff --git a/upload/admin/controller/cartsms/events.php b/upload/admin/controller/cartsms/events.php deleted file mode 100644 index afb6022..0000000 --- a/upload/admin/controller/cartsms/events.php +++ /dev/null @@ -1,75 +0,0 @@ -runHook('return_status_change_'.$return_status_id, new Extensions\Hook\Variables([ - 'return_id' => (int) $return_id, - 'return_status_id' => (int) $return_status_id, - 'return_customer_message' => $comment - ])); - } - } - - - /** - * admin/model/sale/return/addReturn/after - * @param string $hook - * @param array $input - * @param int $return_id - */ - public function returnGoods($hook, $input, $return_id) - { - $this->runHook('product_return', new Extensions\Hook\Variables(array( - 'return_id' => (int) $return_id, - ))); - } - - - /** - * admin/model/catalog/product/deleteProduct/before - * @param string $hook - * @param array $input - */ - public function productDeleteHook($hook, $input) - { - list($product_id) = array_pad($input, 1, null); - - if($product_id) - { - $this->runHook('product_delete', new Extensions\Hook\Variables([ - 'product_id' => (int) $product_id - ])); - } - } - - /** - * admin/model/customer/customer/addCustomer/after - * @param string $hook - * @param array $input - * @param int $customer_id - */ - public function customerAddHook($hook, $input, $customer_id) - { - $this->runHook('customer_account_new', new Extensions\Hook\Variables(array( - 'customer_id' => (int) $customer_id, - ))); - } -} diff --git a/upload/admin/controller/cartsms/history.php b/upload/admin/controller/cartsms/history.php deleted file mode 100644 index 7f27383..0000000 --- a/upload/admin/controller/cartsms/history.php +++ /dev/null @@ -1,15 +0,0 @@ -view('History', 'History', 'list', true); - } -} \ No newline at end of file diff --git a/upload/admin/controller/cartsms/inbox.php b/upload/admin/controller/cartsms/inbox.php deleted file mode 100644 index de3eef1..0000000 --- a/upload/admin/controller/cartsms/inbox.php +++ /dev/null @@ -1,15 +0,0 @@ -view('Inbox', 'Inbox', 'list', true); - } -} \ No newline at end of file diff --git a/upload/admin/controller/cartsms/module_about.php b/upload/admin/controller/cartsms/module_about.php deleted file mode 100644 index 4d9f03f..0000000 --- a/upload/admin/controller/cartsms/module_about.php +++ /dev/null @@ -1,17 +0,0 @@ -view('About module', 'ModuleAbout', 'default', false); - } - - -} \ No newline at end of file diff --git a/upload/admin/controller/cartsms/module_notifications.php b/upload/admin/controller/cartsms/module_notifications.php deleted file mode 100644 index 5a51b11..0000000 --- a/upload/admin/controller/cartsms/module_notifications.php +++ /dev/null @@ -1,44 +0,0 @@ -oc_proxy->add('save', $this->link('cartsms/module_notifications/ajaxSaveAdmin')); - $this->view('Admin SMS', 'ModuleNotifications', 'admin', true); - } - - public function ajaxSaveAdmin() - { - $this->runAjax(function (CartSms\Controller $controller, array $post) - { - $post['template'] = htmlspecialchars_decode($post['template']); - Extensions\JsonResponse::send( - $controller->oc_di->getProxy()->saveAdminNotifications($post) - ); - }); - } - - public function actionCustomer() - { - $this->oc_proxy->add('save', $this->link('cartsms/module_notifications/ajaxSaveCustomer')); - $this->view('Customer SMS', 'ModuleNotifications', 'customer', true); - } - - public function ajaxSaveCustomer() - { - $this->runAjax(function (CartSms\Controller $controller, array $post) - { - $post['template'] = htmlspecialchars_decode($post['template']); - Extensions\JsonResponse::send( - $controller->oc_di->getProxy()->saveCustomerNotifications($post) - ); - }); - } -} \ No newline at end of file diff --git a/upload/admin/controller/cartsms/module_settings.php b/upload/admin/controller/cartsms/module_settings.php deleted file mode 100644 index f7ef17b..0000000 --- a/upload/admin/controller/cartsms/module_settings.php +++ /dev/null @@ -1,39 +0,0 @@ -response->redirect($this->link('cartsms/dashboard/actionDefault')); - } - $this->oc_proxy->add('save', $this->link('cartsms/module_settings/ajaxSave')); - $this->oc_proxy->add('logout', $this->link('cartsms/module_settings/ajaxLogout')); - - $this->view('About module', 'ModuleSettings', 'default', false); - } - - public function ajaxSave() - { - $this->runAjax(function (CartSms\Controller $controller, array $post) - { - $controller->oc_di->getProxy()->saveSettings($post); - Extensions\JsonResponse::send(array('redirect' => $controller->link('cartsms/module_settings/actionDefault'))); - - }, 'cartsms/module_settings/actionDefault'); - } - - - public function ajaxLogout() - { - $this->oc_di->getProxy()->logout(); - Extensions\JsonResponse::send(array('token' => 'guest', 'redirect' => $this->link('cartsms/sign/actionIn'))); - } -} \ No newline at end of file diff --git a/upload/admin/controller/cartsms/payment.php b/upload/admin/controller/cartsms/payment.php deleted file mode 100644 index bff1e01..0000000 --- a/upload/admin/controller/cartsms/payment.php +++ /dev/null @@ -1,20 +0,0 @@ -view('Payment Data', 'Payment', 'data', true); - } - - public function actionList() - { - $this->view('Payment list', 'Payment', 'list', true); - } -} \ No newline at end of file diff --git a/upload/admin/controller/cartsms/sign.php b/upload/admin/controller/cartsms/sign.php deleted file mode 100644 index bf3d0c4..0000000 --- a/upload/admin/controller/cartsms/sign.php +++ /dev/null @@ -1,50 +0,0 @@ -oc_proxy->add('login', $this->link('cartsms/sign/ajaxIn')); - $this->view('Sign in', 'ModuleSign', 'in', false); - } - - public function ajaxIn() - { - $this->runAjax(function (CartSms\Controller $controller, array $post) - { - $response = $controller->oc_di->getProxy()->login(array_merge(array('name' => $controller->config->get('config_meta_title')), $controller->request->post['__bulkgate'])); - - if($response instanceof Extensions\IO\Response) - { - Extensions\JsonResponse::send($response); - } - Extensions\JsonResponse::send(array( - 'token' => $response, - 'redirect' => $controller->link('cartsms/dashboard/actionDefault') - )); - }); - } - - public function actionUp() - { - $this->view('Sign up', 'Sign', 'up', false); - } - - public function authenticate() - { - try - { - Extensions\JsonResponse::send($this->oc_di->getProxy()->authenticate()); - } - catch (Extensions\IO\AuthenticateException $e) - { - Extensions\JsonResponse::send(array('redirect' => $this->link('cartsms/sign/actionIn'))); - } - } -} \ No newline at end of file diff --git a/upload/admin/controller/cartsms/sms_campaign.php b/upload/admin/controller/cartsms/sms_campaign.php deleted file mode 100644 index 4b53ace..0000000 --- a/upload/admin/controller/cartsms/sms_campaign.php +++ /dev/null @@ -1,82 +0,0 @@ -view('Campaigns', 'SmsCampaign', 'default', true); - } - - public function actionNew() - { - $this->view('Create new Campaign', 'SmsCampaign', 'new', true); - } - - public function actionCampaign() - { - $this->oc_proxy->add('loadModuleData', $this->link('cartsms/sms_campaign/ajaxLoadModuleData'), 'campaign'); - $this->oc_proxy->add('saveModuleCustomers', $this->link('cartsms/sms_campaign/ajaxSaveModuleCustomers'), 'campaign'); - $this->oc_proxy->add('addModuleFilter', $this->link('cartsms/sms_campaign/ajaxAddModuleFilter'), 'campaign'); - $this->oc_proxy->add('removeModuleFilter', $this->link('cartsms/sms_campaign/ajaxRemoveModuleFilter'), 'campaign'); - $this->view('Campaign', 'SmsCampaign', 'campaign', true); - } - - public function ajaxLoadModuleData() - { - $this->runAjax(function (CartSms\Controller $controller, array $post) - { - Extensions\JsonResponse::send($controller->oc_di->getProxy()->loadCustomersCount( - isset($post['application_id']) ? $post['application_id'] : null, - isset($post['campaign_id']) ? $post['campaign_id'] : null - )); - }); - } - - public function ajaxAddModuleFilter() - { - $this->runAjax(function (CartSms\Controller $controller, array $post) - { - Extensions\JsonResponse::send($controller->oc_di->getProxy()->loadCustomersCount( - isset($post['application_id']) ? $post['application_id'] : null, - isset($post['campaign_id']) ? $post['campaign_id'] : null, - 'addFilter', - $post - )); - }); - } - - public function ajaxRemoveModuleFilter() - { - $this->runAjax(function (CartSms\Controller $controller, array $post) - { - Extensions\JsonResponse::send($controller->oc_di->getProxy()->loadCustomersCount( - isset($post['application_id']) ? $post['application_id'] : null, - isset($post['campaign_id']) ? $post['campaign_id'] : null, - 'removeFilter', - $post - )); - }); - } - - public function ajaxSaveModuleCustomers() - { - $this->runAjax(function (CartSms\Controller $controller, array $post) - { - Extensions\JsonResponse::send($controller->oc_di->getProxy()->saveModuleCustomers( - isset($post['application_id']) ? $post['application_id'] : null, - isset($post['campaign_id']) ? $post['campaign_id'] : null - )); - }); - } - - public function actionActive() - { - $this->view('Campaign', 'SmsCampaign', 'active', false); - } -} \ No newline at end of file diff --git a/upload/admin/controller/cartsms/sms_price.php b/upload/admin/controller/cartsms/sms_price.php deleted file mode 100644 index daa833e..0000000 --- a/upload/admin/controller/cartsms/sms_price.php +++ /dev/null @@ -1,15 +0,0 @@ -view('Price list', 'SmsPrice', 'list', false); - } -} \ No newline at end of file diff --git a/upload/admin/controller/cartsms/sms_settings.php b/upload/admin/controller/cartsms/sms_settings.php deleted file mode 100644 index 36464ae..0000000 --- a/upload/admin/controller/cartsms/sms_settings.php +++ /dev/null @@ -1,15 +0,0 @@ -view('Sender ID Settings', 'SmsSettings', 'default', true); - } -} \ No newline at end of file diff --git a/upload/admin/controller/cartsms/statistics.php b/upload/admin/controller/cartsms/statistics.php deleted file mode 100644 index 558cf4e..0000000 --- a/upload/admin/controller/cartsms/statistics.php +++ /dev/null @@ -1,15 +0,0 @@ -view('Statistics', 'Statistics', 'default', true); - } -} \ No newline at end of file diff --git a/upload/admin/controller/cartsms/top.php b/upload/admin/controller/cartsms/top.php deleted file mode 100644 index 90981f3..0000000 --- a/upload/admin/controller/cartsms/top.php +++ /dev/null @@ -1,15 +0,0 @@ -view('Campaign', 'Top', 'up', true); - } -} \ No newline at end of file diff --git a/upload/admin/controller/cartsms/user.php b/upload/admin/controller/cartsms/user.php deleted file mode 100644 index 7952ef0..0000000 --- a/upload/admin/controller/cartsms/user.php +++ /dev/null @@ -1,15 +0,0 @@ -view('User profile', 'User', 'profile', false); - } -} \ No newline at end of file diff --git a/upload/admin/controller/cartsms/wallet.php b/upload/admin/controller/cartsms/wallet.php deleted file mode 100644 index da58eb9..0000000 --- a/upload/admin/controller/cartsms/wallet.php +++ /dev/null @@ -1,15 +0,0 @@ -view('Payment Data', 'Wallet', 'detail', true); - } -} \ No newline at end of file diff --git a/upload/admin/language/en-gb/extension/module/cartsms.php b/upload/admin/language/en-gb/extension/module/cartsms.php deleted file mode 100644 index 34269ac..0000000 --- a/upload/admin/language/en-gb/extension/module/cartsms.php +++ /dev/null @@ -1,3 +0,0 @@ -CartSMS - SMS module for OpenCart 🌍'; diff --git a/upload/admin/view/template/cartsms/base.twig b/upload/admin/view/template/cartsms/base.twig deleted file mode 100644 index bf3cecb..0000000 --- a/upload/admin/view/template/cartsms/base.twig +++ /dev/null @@ -1,72 +0,0 @@ -{{ header }}{{ column_left }} -

-
- -
- -
-
-
-
-

Loading content

-
-
- - - - - -
-
- -{{ footer }} diff --git a/upload/catalog/controller/cartsms/events.php b/upload/catalog/controller/cartsms/events.php deleted file mode 100644 index fe9a891..0000000 --- a/upload/catalog/controller/cartsms/events.php +++ /dev/null @@ -1,103 +0,0 @@ -runHook('order_status_change_'.$order_status_id, new Extensions\Hook\Variables(array( - 'order_status_id' => (int) $order_status_id, - 'order_id' => (int) $order_id, - 'order_status_message' => $comment - ))); - } - } - - /** - * catalog/model/account/customer/addCustomer/after - * @param string $hook - * @param array $input - * @param int $customer_id - */ - public function customerAddHook($hook, $input, $customer_id) - { - $this->runHook('customer_account_new', new Extensions\Hook\Variables(array( - 'customer_id' => (int) $customer_id, - ))); - } - - /** - * bulkgate/cartsms/new/order/hook - * @param string $hook - * @param array $input - */ - public function orderAddHook($hook, $input) - { - list($order_id) = array_pad($input, 1, null); - - $this->runHook('order_new', new Extensions\Hook\Variables([ - 'order_id' => (int) $order_id - ])); - - foreach(Helpers::productsOutOfStock($this->oc_di->getDatabase()) as $product_id) - { - if(Extensions\Helpers::outOfStockCheck($this->oc_settings, $product_id)) - { - $this->runHook('product_out_of_stock', new Extensions\Hook\Variables([ - 'product_id' => (int) $product_id - ])); - } - } - } - - /** - * bulkgate/cartsms/contact/form/hook - * @param $hook - * @param $input - */ - public function contactFormHook($hook, $input) - { - list($email, $name, $text) = array_pad($input, 3, null); - - if($text !== null) - { - $this->runHook('contact_form', new Extensions\Hook\Variables(array( - 'customer_email' => $email, - 'customer_name' => $name, - 'customer_message' => $text, - 'customer_message_short_50' => Helpers::subStr($text, 0, 50), - 'customer_message_short_80' => Helpers::subStr($text, 0, 80), - 'customer_message_short_100' => Helpers::subStr($text, 0, 100), - 'customer_message_short_120' => Helpers::subStr($text, 0, 120), - ))); - } - } - - /** - * catalog/model/account/return/addReturn/after - * @param string $hook - * @param array $input - * @param int $return_id - */ - public function returnGoods($hook, $input, $return_id) - { - $this->runHook('product_return', new Extensions\Hook\Variables(array( - 'return_id' => (int) $return_id, - ))); - } -} diff --git a/upload/system/library/cartsms/Controller.php b/upload/system/library/cartsms/Controller.php deleted file mode 100644 index c7f0a9a..0000000 --- a/upload/system/library/cartsms/Controller.php +++ /dev/null @@ -1,147 +0,0 @@ -registry); - $this->oc_di = $init->di(); - $this->oc_module = $this->oc_di->getModule(); - $this->oc_settings = $this->oc_di->getSettings(); - $this->oc_proxy = new BulkGate\CartSms\ProxyGenerator(); - - $this->load->model('setting/event'); - } - - protected function view($title, $presenter, $action, $box = false) - { - $this->synchronize(); - $this->document->addStyle($this->oc_module->getUrl('/dist/css/devices.min.css')); - $this->document->addStyle($this->oc_module->getUrl('/'.(defined('BULKGATE_DEV_MODE') ? 'dev' : 'dist').'/css/bulkgate-cartsms.css')); - $this->document->addStyle('https://fonts.googleapis.com/icon?family=Material+Icons|Open+Sans:300,300i,400,400i,600,600i,700,700i,800,800i'); - - $this->response->setOutput($this->load->view('cartsms/base', array( - 'application_id' => $this->oc_settings->load('static:application_id', ''), - 'language' => $this->oc_settings->load('main:language', 'en'), - 'presenter' => $presenter, - 'action' => $action, - 'title' => $title, - 'mode' => defined('BULKGATE_DEV_MODE') ? 'dev' : 'dist', - 'box' => $box, - 'widget_api_url' => $this->oc_module->getUrl('/'.(defined('BULKGATE_DEV_MODE') ? 'dev' : 'dist').'/widget-api/widget-api.js'), - 'logo' => $this->oc_module->getUrl('/images/products/oc.svg'), - 'proxy' => $this->oc_proxy->get(), - 'authenticate' => $this->link('cartsms/sign/authenticate'), - 'homepage' => $this->link('cartsms/dashboard'), - 'info' => $this->oc_module->info(), - 'header' => $this->load->controller('common/header'), - 'column_left' => $this->load->controller('common/column_left'), - 'footer' => $this->load->controller('common/footer'), - 'loading' => $this->oc_di->getTranslator()->translate('loading_content', 'Loading Content') - ))); - } - - protected function link($route, array $params = array()) - { - return BulkGate\CartSms\Helpers::fixUrl( - $this->url->link($route, array_merge(array('user_token' => $this->session->data['user_token']), $params), true) - ); - } - - protected function runAjax($callback, $fail_redirect = 'common/dashboard') - { - if(isset($this->request->post['__bulkgate'])) - { - $post = $this->request->post['__bulkgate']; - - if(is_array($post)) - { - call_user_func_array($callback, array($this, $post)); - } - else - { - $this->response->redirect($this->url->link($fail_redirect, 'user_token=' . $this->session->data['user_token'], true)); - } - } - else - { - $this->response->redirect($this->url->link($fail_redirect, 'user_token=' . $this->session->data['user_token'], true)); - } - } - - protected function synchronize($now = false) - { - if($this->oc_settings->load('static:application_token')) - { - $status = $this->oc_module->statusLoad(); $language = $this->oc_module->languageLoad(); $store = $this->oc_module->storeLoad(); $return = $this->oc_module->returnStatusLoad(); - - $now = $now || $status || $language || $store || $return; - try - { - $this->oc_di->getSynchronize()->run($this->oc_module->getUrl('/module/settings/synchronize'), $now); - return true; - } - catch (Extensions\IO\InvalidResultException $e) - { - } - } - return false; - } - - protected function runHook($name, Extensions\Hook\Variables $variables) - { - if(!$variables->get('language_id')) - { - $language_iso = isset($this->session->data['language']) ? $this->session->data['language'] : null; - $variables->set('language_id', (int) BulkGate\CartSms\Helpers::getLanguageId($language_iso, $this->oc_di->getDatabase())); - } - - $hook = new Extensions\Hook\Hook( - $this->oc_di->getModule()->getUrl('/module/hook'), - $variables->get('language_id', 0), - $variables->get('store_id', (int) ($this->config->get('config_store_id') ?: 0)), - $this->oc_di->getConnection(), - $this->oc_settings, - new BulkGate\CartSms\HookLoad($this->oc_di->getDatabase()) - ); - - try - { - $hook->run((string) $name, $variables); - return true; - } - catch (Extensions\IO\InvalidResultException $e) - { - return false; - } - } - -} diff --git a/upload/system/library/cartsms/cartsms.ocmod.xml b/upload/system/library/cartsms/cartsms.ocmod.xml deleted file mode 100644 index 3f4d24a..0000000 --- a/upload/system/library/cartsms/cartsms.ocmod.xml +++ /dev/null @@ -1,179 +0,0 @@ - - - CartSMS - SMS module for OpenCart - 6.00 - BulkGate - http://www.cartsms.com/ - - - - - user->hasPermission('access', 'cartsms/sign')) - { - // CartSMS - $cartsms = new CartSms\Init($this->registry); - $data['menus'][] = $cartsms->menu(); - } - ]]> - - - - - - response->setOutput($this->load->view('sale/order_info', $data)); - ]]> - - registry); - - if($init->di()->getSettings()->load("static:application_token", false)) - { - $data['cartsms_css'] = $init->di()->getModule()->getUrl('/'.(defined('BULKGATE_DEV_MODE') ? 'dev' : 'dist').'/css/bulkgate-cartsms.css'); - $data['cartsms_application_id'] = $init->di()->getSettings()->load('static:application_id', ''); - $data['cartsms_language'] = $init->di()->getSettings()->load('main:language', 'en'); - $data['cartsms_widget_api_url'] = $init->di()->getModule()->getUrl('/'.(defined('BULKGATE_DEV_MODE') ? 'dev' : 'dist').'/widget-api/widget-api.js'); - $data['cartsms_authenticate'] = \BulkGate\CartSms\Helpers::fixUrl($this->url->link('cartsms/sign/authenticate', 'user_token=' . $this->session->data['user_token'], true)); - $data['cartsms_customer_iso'] = \BulkGate\CartSms\Helpers::getCountryCode($init->di()->getDatabase(), isset($order_info['payment_country_id']) ? $order_info['payment_country_id'] : -1); - } - } - - ]]> - - - - - -