From 0eeb3537424c35cc528cd3bdb5772f4f8f98414c Mon Sep 17 00:00:00 2001 From: Francois Gaillard Date: Wed, 27 Nov 2013 16:23:48 +0100 Subject: [PATCH] // Natives modules moved --- modules/blockwishlist/WishList.php | 553 ------------ modules/blockwishlist/blockwishlist-ajax.tpl | 49 - modules/blockwishlist/blockwishlist-extra.tpl | 28 - modules/blockwishlist/blockwishlist.css | 248 ------ modules/blockwishlist/blockwishlist.php | 455 ---------- modules/blockwishlist/blockwishlist.tpl | 65 -- .../blockwishlist/blockwishlist_button.tpl | 28 - modules/blockwishlist/blockwishlist_top.tpl | 28 - modules/blockwishlist/buywishlistproduct.php | 56 -- modules/blockwishlist/cart.php | 86 -- modules/blockwishlist/config.xml | 12 - .../blockwishlist/controllers/front/index.php | 35 - .../controllers/front/mywishlist.php | 129 --- modules/blockwishlist/controllers/index.php | 35 - modules/blockwishlist/img/arrow_right_2.png | Bin 155 -> 0 bytes modules/blockwishlist/img/delete.gif | Bin 752 -> 0 bytes modules/blockwishlist/img/gift.gif | Bin 1895 -> 0 bytes modules/blockwishlist/img/icon/add.png | Bin 917 -> 0 bytes modules/blockwishlist/img/icon/delete.gif | Bin 213 -> 0 bytes modules/blockwishlist/img/icon/delete.png | Bin 715 -> 0 bytes modules/blockwishlist/img/icon/index.php | 35 - modules/blockwishlist/img/icon/package.png | Bin 853 -> 0 bytes modules/blockwishlist/img/icon/package_go.png | Bin 898 -> 0 bytes modules/blockwishlist/img/index.php | 35 - modules/blockwishlist/img/star.gif | Bin 815 -> 0 bytes modules/blockwishlist/index.php | 35 - modules/blockwishlist/install.sql | 35 - modules/blockwishlist/js/ajax-wishlist.js | 253 ------ modules/blockwishlist/js/index.php | 35 - modules/blockwishlist/logo.gif | Bin 853 -> 0 bytes modules/blockwishlist/logo.png | Bin 1929 -> 0 bytes modules/blockwishlist/mails/en/index.php | 35 - modules/blockwishlist/mails/en/wishlink.html | 112 --- modules/blockwishlist/mails/en/wishlink.txt | 15 - modules/blockwishlist/mails/en/wishlist.html | 112 --- modules/blockwishlist/mails/en/wishlist.txt | 15 - modules/blockwishlist/mails/index.php | 35 - modules/blockwishlist/managewishlist.php | 124 --- modules/blockwishlist/managewishlist.tpl | 140 --- modules/blockwishlist/my-account.tpl | 33 - modules/blockwishlist/mywishlist.php | 113 --- modules/blockwishlist/sendwishlist.php | 69 -- modules/blockwishlist/translations/index.php | 35 - modules/blockwishlist/upgrade/install-0.3.php | 9 - modules/blockwishlist/view.php | 110 --- modules/blockwishlist/view.tpl | 92 -- modules/blockwishlist/views/index.php | 35 - .../admin/_configure/helpers/index.php | 35 - .../admin/_configure/helpers/list/index.php | 35 - .../_configure/helpers/list/list_content.tpl | 37 - .../templates/admin/_configure/index.php | 35 - .../views/templates/admin/index.php | 35 - .../views/templates/front/index.php | 35 - .../views/templates/front/mywishlist.tpl | 99 -- .../blockwishlist/views/templates/index.php | 35 - modules/carriercompare/ajax.php | 53 -- modules/carriercompare/carriercompare.js | 194 ---- modules/carriercompare/carriercompare.php | 341 ------- modules/carriercompare/config.xml | 12 - modules/carriercompare/index.php | 35 - modules/carriercompare/loader.gif | Bin 3719 -> 0 bytes modules/carriercompare/logo.gif | Bin 583 -> 0 bytes modules/carriercompare/logo.png | Bin 1801 -> 0 bytes modules/carriercompare/style.css | 44 - .../template/carriercompare.tpl | 95 -- .../carriercompare/template/configuration.tpl | 27 - modules/carriercompare/template/index.php | 35 - modules/carriercompare/translations/index.php | 35 - modules/cashondelivery/cashondelivery.gif | Bin 2391 -> 0 bytes modules/cashondelivery/cashondelivery.jpg | Bin 3009 -> 0 bytes modules/cashondelivery/cashondelivery.php | 92 -- modules/cashondelivery/config.xml | 12 - .../controllers/front/index.php | 35 - .../controllers/front/validation.php | 80 -- modules/cashondelivery/controllers/index.php | 35 - modules/cashondelivery/index.php | 35 - modules/cashondelivery/logo.gif | Bin 425 -> 0 bytes modules/cashondelivery/logo.png | Bin 1365 -> 0 bytes modules/cashondelivery/translations/index.php | 35 - modules/cashondelivery/views/index.php | 35 - .../views/templates/front/index.php | 35 - .../views/templates/front/validation.tpl | 57 -- .../views/templates/hook/confirmation.tpl | 31 - .../views/templates/hook/index.php | 35 - .../views/templates/hook/payment.tpl | 33 - .../cashondelivery/views/templates/index.php | 35 - modules/dateofdelivery/beforeCarrier.tpl | 91 -- modules/dateofdelivery/config.xml | 12 - modules/dateofdelivery/dateofdelivery.php | 709 --------------- modules/dateofdelivery/img/cross.png | Bin 655 -> 0 bytes modules/dateofdelivery/img/index.php | 35 - modules/dateofdelivery/img/tick.png | Bin 537 -> 0 bytes modules/dateofdelivery/img/time.png | Bin 793 -> 0 bytes modules/dateofdelivery/img/time_add.png | Bin 827 -> 0 bytes modules/dateofdelivery/img/time_delete.png | Bin 853 -> 0 bytes modules/dateofdelivery/index.php | 35 - modules/dateofdelivery/logo.gif | Bin 618 -> 0 bytes modules/dateofdelivery/logo.png | Bin 1354 -> 0 bytes modules/dateofdelivery/orderDetail.tpl | 28 - modules/dateofdelivery/translations/index.php | 35 - modules/dateofdelivery/views/index.php | 35 - .../views/templates/hook/button.tpl | 31 - .../views/templates/hook/index.php | 35 - .../dateofdelivery/views/templates/index.php | 35 - modules/editorial/EditorialClass.php | 91 -- modules/editorial/config.xml | 12 - modules/editorial/editorial.css | 26 - modules/editorial/editorial.php | 310 ------- modules/editorial/editorial.tpl | 36 - modules/editorial/homepage_logo_1.jpg | Bin 21250 -> 0 bytes modules/editorial/index.php | 35 - modules/editorial/logo.gif | Bin 627 -> 0 bytes modules/editorial/logo.png | Bin 1557 -> 0 bytes modules/editorial/translations/index.php | 35 - modules/favoriteproducts/FavoriteProduct.php | 111 --- modules/favoriteproducts/config.xml | 12 - .../controllers/front/account.php | 54 -- .../controllers/front/actions.php | 87 -- .../controllers/front/index.php | 35 - .../favoriteproducts/controllers/index.php | 35 - .../favoriteproducts-account.php | 41 - .../favoriteproducts-ajax.php | 65 -- modules/favoriteproducts/favoriteproducts.css | 66 -- modules/favoriteproducts/favoriteproducts.js | 78 -- modules/favoriteproducts/favoriteproducts.php | 110 --- modules/favoriteproducts/img/add_favorite.gif | Bin 2045 -> 0 bytes modules/favoriteproducts/img/del_favorite.gif | Bin 358 -> 0 bytes modules/favoriteproducts/img/favorites.png | Bin 463 -> 0 bytes modules/favoriteproducts/img/index.php | 35 - modules/favoriteproducts/index.php | 35 - modules/favoriteproducts/logo.gif | Bin 2045 -> 0 bytes modules/favoriteproducts/logo.png | Bin 1969 -> 0 bytes .../favoriteproducts/translations/index.php | 35 - modules/favoriteproducts/views/index.php | 35 - .../front/favoriteproducts-account.tpl | 89 -- .../views/templates/front/index.php | 35 - .../templates/hook/favoriteproducts-extra.tpl | 42 - .../hook/favoriteproducts-header.tpl | 31 - .../views/templates/hook/index.php | 35 - .../views/templates/hook/my-account.tpl | 31 - .../views/templates/index.php | 35 - modules/feeder/config.xml | 12 - modules/feeder/feeder.php | 79 -- modules/feeder/feederHeader.tpl | 26 - modules/feeder/index.php | 35 - modules/feeder/logo.gif | Bin 1009 -> 0 bytes modules/feeder/logo.png | Bin 1006 -> 0 bytes modules/feeder/rss.php | 82 -- modules/feeder/translations/index.php | 35 - modules/followup/config.xml | 13 - modules/followup/cron.php | 40 - modules/followup/followup.php | 698 --------------- modules/followup/index.php | 35 - modules/followup/logo-2.gif | Bin 606 -> 0 bytes modules/followup/logo.gif | Bin 587 -> 0 bytes modules/followup/logo.png | Bin 2588 -> 0 bytes modules/followup/mails/en/followup_1.html | 124 --- modules/followup/mails/en/followup_1.txt | 24 - modules/followup/mails/en/followup_2.html | 111 --- modules/followup/mails/en/followup_2.txt | 18 - modules/followup/mails/en/followup_3.html | 113 --- modules/followup/mails/en/followup_3.txt | 21 - modules/followup/mails/en/followup_4.html | 122 --- modules/followup/mails/en/followup_4.txt | 22 - modules/followup/mails/en/index.php | 35 - modules/followup/mails/index.php | 35 - modules/followup/translations/index.php | 35 - modules/followup/views/index.php | 35 - .../admin/_configure/helpers/form/form.tpl | 32 - .../followup/views/templates/hook/index.php | 35 - .../followup/views/templates/hook/stats.tpl | 71 -- modules/followup/views/templates/index.php | 35 - modules/gapi/config.xml | 12 - modules/gapi/gapi.php | 547 ------------ modules/gapi/index.php | 33 - modules/gapi/logo.gif | Bin 946 -> 0 bytes modules/gapi/logo.png | Bin 1627 -> 0 bytes modules/gapi/oauth2callback.php | 31 - .../3.0/Google API - 01 - Start.png | Bin 24954 -> 0 bytes .../3.0/Google API - 02 - Services.png | Bin 44186 -> 0 bytes .../3.0/Google API - 03 - Terms.png | Bin 37487 -> 0 bytes .../3.0/Google API - 04 - Terms.png | Bin 17748 -> 0 bytes .../3.0/Google API - 05 - Services OK.png | Bin 44792 -> 0 bytes .../3.0/Google API - 06 - API Access.png | Bin 43919 -> 0 bytes .../Google API - 07 - Create Client ID.png | Bin 32402 -> 0 bytes .../Google API - 08 - Create Client ID.png | Bin 36646 -> 0 bytes .../Google API - 09 - API Access created.png | Bin 39612 -> 0 bytes .../3.0/Google API - 10 - Profile ID.png | Bin 17494 -> 0 bytes modules/gapi/translations/index.php | 35 - modules/loyalty/LoyaltyModule.php | 257 ------ modules/loyalty/LoyaltyStateModule.php | 81 -- modules/loyalty/config.xml | 13 - modules/loyalty/controllers/front/default.php | 264 ------ modules/loyalty/controllers/front/index.php | 35 - modules/loyalty/controllers/index.php | 35 - modules/loyalty/images/index.php | 35 - modules/loyalty/images/loyalty.gif | Bin 1657 -> 0 bytes modules/loyalty/index.php | 35 - modules/loyalty/logo.gif | Bin 1016 -> 0 bytes modules/loyalty/logo.png | Bin 1529 -> 0 bytes modules/loyalty/loyalty-program.php | 168 ---- modules/loyalty/loyalty.gif | Bin 1016 -> 0 bytes modules/loyalty/loyalty.php | 724 --------------- modules/loyalty/translations/index.php | 35 - modules/loyalty/views/index.php | 35 - .../loyalty/views/templates/front/index.php | 35 - .../loyalty/views/templates/front/loyalty.tpl | 215 ----- .../loyalty/views/templates/hook/index.php | 35 - .../views/templates/hook/my-account.tpl | 32 - .../loyalty/views/templates/hook/product.tpl | 84 -- .../views/templates/hook/shopping-cart.tpl | 38 - modules/loyalty/views/templates/index.php | 35 - modules/mailalerts/MailAlert.php | 287 ------ modules/mailalerts/config.xml | 13 - .../mailalerts/controllers/front/account.php | 54 -- .../mailalerts/controllers/front/actions.php | 142 --- .../mailalerts/controllers/front/index.php | 35 - modules/mailalerts/controllers/index.php | 35 - modules/mailalerts/img/del_alert.gif | Bin 358 -> 0 bytes modules/mailalerts/img/icon-alert.png | Bin 1276 -> 0 bytes modules/mailalerts/img/index.php | 36 - modules/mailalerts/index.php | 36 - modules/mailalerts/logo.gif | Bin 792 -> 0 bytes modules/mailalerts/logo.png | Bin 1404 -> 0 bytes modules/mailalerts/mailalerts-account.php | 67 -- modules/mailalerts/mailalerts-ajax.php | 32 - modules/mailalerts/mailalerts-extra.php | 119 --- modules/mailalerts/mailalerts.css | 47 - modules/mailalerts/mailalerts.php | 735 --------------- modules/mailalerts/mails/en/customer_qty.html | 112 --- modules/mailalerts/mails/en/customer_qty.txt | 17 - modules/mailalerts/mails/en/index.php | 36 - modules/mailalerts/mails/en/new_order.html | 210 ----- modules/mailalerts/mails/en/new_order.txt | 69 -- .../mailalerts/mails/en/productcoverage.html | 112 --- .../mailalerts/mails/en/productcoverage.txt | 15 - .../mails/en/productoutofstock.html | 112 --- .../mailalerts/mails/en/productoutofstock.txt | 18 - modules/mailalerts/mails/index.php | 36 - modules/mailalerts/translations/index.php | 35 - modules/mailalerts/upgrade/install-2.5.php | 14 - modules/mailalerts/views/index.php | 35 - .../admin/_configure/helpers/form/form.tpl | 52 -- .../admin/_configure/helpers/form/index.php | 35 - .../views/templates/front/index.php | 35 - .../templates/front/mailalerts-account.tpl | 85 -- .../mailalerts/views/templates/hook/index.php | 35 - .../views/templates/hook/my-account.tpl | 31 - .../views/templates/hook/product.tpl | 97 -- modules/mailalerts/views/templates/index.php | 35 - modules/newsletter/config.xml | 12 - modules/newsletter/index.php | 35 - modules/newsletter/logo.gif | Bin 983 -> 0 bytes modules/newsletter/logo.png | Bin 1715 -> 0 bytes modules/newsletter/newsletter.php | 342 ------- modules/newsletter/translations/index.php | 35 - modules/productcomments/ProductComment.php | 406 --------- .../ProductCommentCriterion.php | 260 ------ modules/productcomments/ProductCriterion.php | 174 ---- modules/productcomments/config.xml | 12 - .../controllers/front/default.php | 170 ---- .../controllers/front/index.php | 35 - modules/productcomments/controllers/index.php | 35 - modules/productcomments/img/accept.png | Bin 781 -> 0 bytes modules/productcomments/img/bg_bt.gif | Bin 314 -> 0 bytes modules/productcomments/img/bg_li.png | Bin 155 -> 0 bytes modules/productcomments/img/comment.png | Bin 413 -> 0 bytes .../productcomments/img/comments_delete.png | Bin 670 -> 0 bytes modules/productcomments/img/delete.gif | Bin 752 -> 0 bytes modules/productcomments/img/delete.png | Bin 715 -> 0 bytes modules/productcomments/img/index.php | 35 - modules/productcomments/img/note.png | Bin 500 -> 0 bytes modules/productcomments/img/note_go.png | Bin 661 -> 0 bytes modules/productcomments/img/star.gif | Bin 398 -> 0 bytes modules/productcomments/index.php | 35 - modules/productcomments/install.sql | 75 -- modules/productcomments/js/index.php | 35 - .../productcomments/js/jquery.rating.pack.js | 12 - .../js/jquery.textareaCounter.plugin.js | 163 ---- modules/productcomments/js/moderate.js | 97 -- .../productcomments/js/productCriterion.js | 40 - modules/productcomments/js/productcomments.js | 91 -- .../productcomments/js/products-comparison.js | 45 - modules/productcomments/logo.gif | Bin 557 -> 0 bytes modules/productcomments/logo.png | Bin 1691 -> 0 bytes .../productcomments/productcomments-ajax.php | 138 --- .../productcomments/productcomments-extra.tpl | 67 -- modules/productcomments/productcomments.css | 224 ----- modules/productcomments/productcomments.php | 842 ------------------ modules/productcomments/productcomments.tpl | 161 ---- .../productcomments_reviews.tpl | 37 - .../productcomments/productcomments_top.tpl | 6 - .../productcommentscriterion.php | 49 - .../productcomments/products-comparison.tpl | 119 --- modules/productcomments/tab.tpl | 26 - .../productcomments/translations/index.php | 35 - modules/productcomments/upgrade/index.php | 35 - .../productcomments/upgrade/install-2.4.php | 9 - modules/pscleaner/config.xml | 12 - modules/pscleaner/index.php | 35 - modules/pscleaner/logo.gif | Bin 1089 -> 0 bytes modules/pscleaner/logo.png | Bin 3000 -> 0 bytes modules/pscleaner/pscleaner.php | 613 ------------- modules/pscleaner/translations/index.php | 35 - .../referralprogram/ReferralProgramModule.php | 192 ---- modules/referralprogram/config.xml | 13 - .../controllers/front/email.php | 72 -- .../controllers/front/index.php | 35 - .../controllers/front/program.php | 208 ----- .../controllers/front/rules.php | 57 -- modules/referralprogram/controllers/index.php | 35 - modules/referralprogram/index.php | 35 - modules/referralprogram/logo.gif | Bin 1051 -> 0 bytes modules/referralprogram/logo.png | Bin 2514 -> 0 bytes modules/referralprogram/mails/en/index.php | 35 - .../en/referralprogram-congratulations.html | 117 --- .../en/referralprogram-congratulations.txt | 17 - .../mails/en/referralprogram-invitation.html | 119 --- .../mails/en/referralprogram-invitation.txt | 21 - .../mails/en/referralprogram-voucher.html | 112 --- .../mails/en/referralprogram-voucher.txt | 18 - modules/referralprogram/mails/index.php | 35 - modules/referralprogram/referralprogram.gif | Bin 7413 -> 0 bytes modules/referralprogram/referralprogram.php | 678 -------------- .../referralprogram/translations/index.php | 35 - modules/referralprogram/views/index.php | 35 - .../admin/_configure/helpers/form/form.tpl | 54 -- .../views/templates/front/email.tpl | 26 - .../views/templates/front/index.php | 35 - .../views/templates/front/program.tpl | 225 ----- .../views/templates/front/rules.tpl | 32 - .../views/templates/hook/authentication.tpl | 34 - .../views/templates/hook/index.php | 35 - .../views/templates/hook/my-account.tpl | 33 - .../templates/hook/order-confirmation.tpl | 29 - .../views/templates/hook/shopping-cart.tpl | 34 - .../referralprogram/views/templates/index.php | 35 - modules/sendtoafriend/config.xml | 12 - modules/sendtoafriend/index.php | 35 - modules/sendtoafriend/logo.gif | Bin 633 -> 0 bytes modules/sendtoafriend/logo.png | Bin 1364 -> 0 bytes modules/sendtoafriend/mails/en/index.php | 35 - .../mails/en/send_to_a_friend.html | 112 --- .../mails/en/send_to_a_friend.txt | 16 - modules/sendtoafriend/mails/index.php | 35 - modules/sendtoafriend/product_page.tpl | 27 - modules/sendtoafriend/sendtoafriend-extra.tpl | 97 -- modules/sendtoafriend/sendtoafriend.css | 46 - modules/sendtoafriend/sendtoafriend.php | 84 -- modules/sendtoafriend/sendtoafriend.png | Bin 754 -> 0 bytes modules/sendtoafriend/sendtoafriend.tpl | 66 -- modules/sendtoafriend/sendtoafriend_ajax.php | 68 -- modules/sendtoafriend/translations/index.php | 35 - modules/watermark/config.xml | 13 - modules/watermark/index.php | 36 - modules/watermark/logo.gif | Bin 988 -> 0 bytes modules/watermark/logo.png | Bin 1486 -> 0 bytes modules/watermark/translations/index.php | 35 - modules/watermark/watermark.gif | Bin 2055 -> 0 bytes modules/watermark/watermark.php | 430 --------- 360 files changed, 23725 deletions(-) delete mode 100644 modules/blockwishlist/WishList.php delete mode 100644 modules/blockwishlist/blockwishlist-ajax.tpl delete mode 100644 modules/blockwishlist/blockwishlist-extra.tpl delete mode 100644 modules/blockwishlist/blockwishlist.css delete mode 100644 modules/blockwishlist/blockwishlist.php delete mode 100644 modules/blockwishlist/blockwishlist.tpl delete mode 100644 modules/blockwishlist/blockwishlist_button.tpl delete mode 100644 modules/blockwishlist/blockwishlist_top.tpl delete mode 100644 modules/blockwishlist/buywishlistproduct.php delete mode 100644 modules/blockwishlist/cart.php delete mode 100755 modules/blockwishlist/config.xml delete mode 100644 modules/blockwishlist/controllers/front/index.php delete mode 100644 modules/blockwishlist/controllers/front/mywishlist.php delete mode 100644 modules/blockwishlist/controllers/index.php delete mode 100644 modules/blockwishlist/img/arrow_right_2.png delete mode 100644 modules/blockwishlist/img/delete.gif delete mode 100644 modules/blockwishlist/img/gift.gif delete mode 100644 modules/blockwishlist/img/icon/add.png delete mode 100644 modules/blockwishlist/img/icon/delete.gif delete mode 100644 modules/blockwishlist/img/icon/delete.png delete mode 100644 modules/blockwishlist/img/icon/index.php delete mode 100644 modules/blockwishlist/img/icon/package.png delete mode 100644 modules/blockwishlist/img/icon/package_go.png delete mode 100644 modules/blockwishlist/img/index.php delete mode 100644 modules/blockwishlist/img/star.gif delete mode 100644 modules/blockwishlist/index.php delete mode 100644 modules/blockwishlist/install.sql delete mode 100644 modules/blockwishlist/js/ajax-wishlist.js delete mode 100644 modules/blockwishlist/js/index.php delete mode 100644 modules/blockwishlist/logo.gif delete mode 100755 modules/blockwishlist/logo.png delete mode 100644 modules/blockwishlist/mails/en/index.php delete mode 100644 modules/blockwishlist/mails/en/wishlink.html delete mode 100644 modules/blockwishlist/mails/en/wishlink.txt delete mode 100644 modules/blockwishlist/mails/en/wishlist.html delete mode 100644 modules/blockwishlist/mails/en/wishlist.txt delete mode 100644 modules/blockwishlist/mails/index.php delete mode 100644 modules/blockwishlist/managewishlist.php delete mode 100644 modules/blockwishlist/managewishlist.tpl delete mode 100644 modules/blockwishlist/my-account.tpl delete mode 100644 modules/blockwishlist/mywishlist.php delete mode 100644 modules/blockwishlist/sendwishlist.php delete mode 100644 modules/blockwishlist/translations/index.php delete mode 100644 modules/blockwishlist/upgrade/install-0.3.php delete mode 100644 modules/blockwishlist/view.php delete mode 100644 modules/blockwishlist/view.tpl delete mode 100644 modules/blockwishlist/views/index.php delete mode 100644 modules/blockwishlist/views/templates/admin/_configure/helpers/index.php delete mode 100644 modules/blockwishlist/views/templates/admin/_configure/helpers/list/index.php delete mode 100644 modules/blockwishlist/views/templates/admin/_configure/helpers/list/list_content.tpl delete mode 100644 modules/blockwishlist/views/templates/admin/_configure/index.php delete mode 100644 modules/blockwishlist/views/templates/admin/index.php delete mode 100644 modules/blockwishlist/views/templates/front/index.php delete mode 100644 modules/blockwishlist/views/templates/front/mywishlist.tpl delete mode 100644 modules/blockwishlist/views/templates/index.php delete mode 100644 modules/carriercompare/ajax.php delete mode 100644 modules/carriercompare/carriercompare.js delete mode 100755 modules/carriercompare/carriercompare.php delete mode 100644 modules/carriercompare/config.xml delete mode 100644 modules/carriercompare/index.php delete mode 100755 modules/carriercompare/loader.gif delete mode 100644 modules/carriercompare/logo.gif delete mode 100755 modules/carriercompare/logo.png delete mode 100644 modules/carriercompare/style.css delete mode 100755 modules/carriercompare/template/carriercompare.tpl delete mode 100644 modules/carriercompare/template/configuration.tpl delete mode 100644 modules/carriercompare/template/index.php delete mode 100644 modules/carriercompare/translations/index.php delete mode 100755 modules/cashondelivery/cashondelivery.gif delete mode 100755 modules/cashondelivery/cashondelivery.jpg delete mode 100755 modules/cashondelivery/cashondelivery.php delete mode 100755 modules/cashondelivery/config.xml delete mode 100644 modules/cashondelivery/controllers/front/index.php delete mode 100644 modules/cashondelivery/controllers/front/validation.php delete mode 100644 modules/cashondelivery/controllers/index.php delete mode 100755 modules/cashondelivery/index.php delete mode 100755 modules/cashondelivery/logo.gif delete mode 100644 modules/cashondelivery/logo.png delete mode 100644 modules/cashondelivery/translations/index.php delete mode 100644 modules/cashondelivery/views/index.php delete mode 100644 modules/cashondelivery/views/templates/front/index.php delete mode 100755 modules/cashondelivery/views/templates/front/validation.tpl delete mode 100755 modules/cashondelivery/views/templates/hook/confirmation.tpl delete mode 100644 modules/cashondelivery/views/templates/hook/index.php delete mode 100755 modules/cashondelivery/views/templates/hook/payment.tpl delete mode 100644 modules/cashondelivery/views/templates/index.php delete mode 100644 modules/dateofdelivery/beforeCarrier.tpl delete mode 100755 modules/dateofdelivery/config.xml delete mode 100644 modules/dateofdelivery/dateofdelivery.php delete mode 100755 modules/dateofdelivery/img/cross.png delete mode 100644 modules/dateofdelivery/img/index.php delete mode 100755 modules/dateofdelivery/img/tick.png delete mode 100755 modules/dateofdelivery/img/time.png delete mode 100755 modules/dateofdelivery/img/time_add.png delete mode 100755 modules/dateofdelivery/img/time_delete.png delete mode 100644 modules/dateofdelivery/index.php delete mode 100644 modules/dateofdelivery/logo.gif delete mode 100755 modules/dateofdelivery/logo.png delete mode 100644 modules/dateofdelivery/orderDetail.tpl delete mode 100644 modules/dateofdelivery/translations/index.php delete mode 100644 modules/dateofdelivery/views/index.php delete mode 100644 modules/dateofdelivery/views/templates/hook/button.tpl delete mode 100644 modules/dateofdelivery/views/templates/hook/index.php delete mode 100644 modules/dateofdelivery/views/templates/index.php delete mode 100755 modules/editorial/EditorialClass.php delete mode 100755 modules/editorial/config.xml delete mode 100644 modules/editorial/editorial.css delete mode 100644 modules/editorial/editorial.php delete mode 100644 modules/editorial/editorial.tpl delete mode 100644 modules/editorial/homepage_logo_1.jpg delete mode 100644 modules/editorial/index.php delete mode 100644 modules/editorial/logo.gif delete mode 100755 modules/editorial/logo.png delete mode 100644 modules/editorial/translations/index.php delete mode 100644 modules/favoriteproducts/FavoriteProduct.php delete mode 100644 modules/favoriteproducts/config.xml delete mode 100644 modules/favoriteproducts/controllers/front/account.php delete mode 100644 modules/favoriteproducts/controllers/front/actions.php delete mode 100644 modules/favoriteproducts/controllers/front/index.php delete mode 100644 modules/favoriteproducts/controllers/index.php delete mode 100644 modules/favoriteproducts/favoriteproducts-account.php delete mode 100644 modules/favoriteproducts/favoriteproducts-ajax.php delete mode 100644 modules/favoriteproducts/favoriteproducts.css delete mode 100755 modules/favoriteproducts/favoriteproducts.js delete mode 100644 modules/favoriteproducts/favoriteproducts.php delete mode 100644 modules/favoriteproducts/img/add_favorite.gif delete mode 100644 modules/favoriteproducts/img/del_favorite.gif delete mode 100644 modules/favoriteproducts/img/favorites.png delete mode 100644 modules/favoriteproducts/img/index.php delete mode 100644 modules/favoriteproducts/index.php delete mode 100644 modules/favoriteproducts/logo.gif delete mode 100755 modules/favoriteproducts/logo.png delete mode 100644 modules/favoriteproducts/translations/index.php delete mode 100644 modules/favoriteproducts/views/index.php delete mode 100644 modules/favoriteproducts/views/templates/front/favoriteproducts-account.tpl delete mode 100644 modules/favoriteproducts/views/templates/front/index.php delete mode 100644 modules/favoriteproducts/views/templates/hook/favoriteproducts-extra.tpl delete mode 100755 modules/favoriteproducts/views/templates/hook/favoriteproducts-header.tpl delete mode 100644 modules/favoriteproducts/views/templates/hook/index.php delete mode 100644 modules/favoriteproducts/views/templates/hook/my-account.tpl delete mode 100644 modules/favoriteproducts/views/templates/index.php delete mode 100755 modules/feeder/config.xml delete mode 100644 modules/feeder/feeder.php delete mode 100644 modules/feeder/feederHeader.tpl delete mode 100644 modules/feeder/index.php delete mode 100644 modules/feeder/logo.gif delete mode 100755 modules/feeder/logo.png delete mode 100644 modules/feeder/rss.php delete mode 100644 modules/feeder/translations/index.php delete mode 100755 modules/followup/config.xml delete mode 100644 modules/followup/cron.php delete mode 100644 modules/followup/followup.php delete mode 100644 modules/followup/index.php delete mode 100644 modules/followup/logo-2.gif delete mode 100644 modules/followup/logo.gif delete mode 100755 modules/followup/logo.png delete mode 100644 modules/followup/mails/en/followup_1.html delete mode 100644 modules/followup/mails/en/followup_1.txt delete mode 100644 modules/followup/mails/en/followup_2.html delete mode 100644 modules/followup/mails/en/followup_2.txt delete mode 100644 modules/followup/mails/en/followup_3.html delete mode 100644 modules/followup/mails/en/followup_3.txt delete mode 100644 modules/followup/mails/en/followup_4.html delete mode 100644 modules/followup/mails/en/followup_4.txt delete mode 100644 modules/followup/mails/en/index.php delete mode 100644 modules/followup/mails/index.php delete mode 100644 modules/followup/translations/index.php delete mode 100644 modules/followup/views/index.php delete mode 100644 modules/followup/views/templates/admin/_configure/helpers/form/form.tpl delete mode 100644 modules/followup/views/templates/hook/index.php delete mode 100644 modules/followup/views/templates/hook/stats.tpl delete mode 100644 modules/followup/views/templates/index.php delete mode 100644 modules/gapi/config.xml delete mode 100644 modules/gapi/gapi.php delete mode 100644 modules/gapi/index.php delete mode 100644 modules/gapi/logo.gif delete mode 100644 modules/gapi/logo.png delete mode 100644 modules/gapi/oauth2callback.php delete mode 100644 modules/gapi/screenshots/3.0/Google API - 01 - Start.png delete mode 100644 modules/gapi/screenshots/3.0/Google API - 02 - Services.png delete mode 100644 modules/gapi/screenshots/3.0/Google API - 03 - Terms.png delete mode 100644 modules/gapi/screenshots/3.0/Google API - 04 - Terms.png delete mode 100644 modules/gapi/screenshots/3.0/Google API - 05 - Services OK.png delete mode 100644 modules/gapi/screenshots/3.0/Google API - 06 - API Access.png delete mode 100644 modules/gapi/screenshots/3.0/Google API - 07 - Create Client ID.png delete mode 100644 modules/gapi/screenshots/3.0/Google API - 08 - Create Client ID.png delete mode 100644 modules/gapi/screenshots/3.0/Google API - 09 - API Access created.png delete mode 100644 modules/gapi/screenshots/3.0/Google API - 10 - Profile ID.png delete mode 100644 modules/gapi/translations/index.php delete mode 100644 modules/loyalty/LoyaltyModule.php delete mode 100644 modules/loyalty/LoyaltyStateModule.php delete mode 100755 modules/loyalty/config.xml delete mode 100644 modules/loyalty/controllers/front/default.php delete mode 100644 modules/loyalty/controllers/front/index.php delete mode 100644 modules/loyalty/controllers/index.php delete mode 100644 modules/loyalty/images/index.php delete mode 100644 modules/loyalty/images/loyalty.gif delete mode 100644 modules/loyalty/index.php delete mode 100644 modules/loyalty/logo.gif delete mode 100755 modules/loyalty/logo.png delete mode 100644 modules/loyalty/loyalty-program.php delete mode 100644 modules/loyalty/loyalty.gif delete mode 100644 modules/loyalty/loyalty.php delete mode 100644 modules/loyalty/translations/index.php delete mode 100644 modules/loyalty/views/index.php delete mode 100644 modules/loyalty/views/templates/front/index.php delete mode 100644 modules/loyalty/views/templates/front/loyalty.tpl delete mode 100644 modules/loyalty/views/templates/hook/index.php delete mode 100644 modules/loyalty/views/templates/hook/my-account.tpl delete mode 100644 modules/loyalty/views/templates/hook/product.tpl delete mode 100644 modules/loyalty/views/templates/hook/shopping-cart.tpl delete mode 100644 modules/loyalty/views/templates/index.php delete mode 100644 modules/mailalerts/MailAlert.php delete mode 100755 modules/mailalerts/config.xml delete mode 100644 modules/mailalerts/controllers/front/account.php delete mode 100644 modules/mailalerts/controllers/front/actions.php delete mode 100644 modules/mailalerts/controllers/front/index.php delete mode 100644 modules/mailalerts/controllers/index.php delete mode 100644 modules/mailalerts/img/del_alert.gif delete mode 100644 modules/mailalerts/img/icon-alert.png delete mode 100644 modules/mailalerts/img/index.php delete mode 100644 modules/mailalerts/index.php delete mode 100644 modules/mailalerts/logo.gif delete mode 100755 modules/mailalerts/logo.png delete mode 100644 modules/mailalerts/mailalerts-account.php delete mode 100644 modules/mailalerts/mailalerts-ajax.php delete mode 100644 modules/mailalerts/mailalerts-extra.php delete mode 100644 modules/mailalerts/mailalerts.css delete mode 100644 modules/mailalerts/mailalerts.php delete mode 100644 modules/mailalerts/mails/en/customer_qty.html delete mode 100644 modules/mailalerts/mails/en/customer_qty.txt delete mode 100644 modules/mailalerts/mails/en/index.php delete mode 100644 modules/mailalerts/mails/en/new_order.html delete mode 100644 modules/mailalerts/mails/en/new_order.txt delete mode 100644 modules/mailalerts/mails/en/productcoverage.html delete mode 100644 modules/mailalerts/mails/en/productcoverage.txt delete mode 100644 modules/mailalerts/mails/en/productoutofstock.html delete mode 100644 modules/mailalerts/mails/en/productoutofstock.txt delete mode 100644 modules/mailalerts/mails/index.php delete mode 100644 modules/mailalerts/translations/index.php delete mode 100644 modules/mailalerts/upgrade/install-2.5.php delete mode 100644 modules/mailalerts/views/index.php delete mode 100644 modules/mailalerts/views/templates/admin/_configure/helpers/form/form.tpl delete mode 100644 modules/mailalerts/views/templates/admin/_configure/helpers/form/index.php delete mode 100644 modules/mailalerts/views/templates/front/index.php delete mode 100644 modules/mailalerts/views/templates/front/mailalerts-account.tpl delete mode 100644 modules/mailalerts/views/templates/hook/index.php delete mode 100644 modules/mailalerts/views/templates/hook/my-account.tpl delete mode 100644 modules/mailalerts/views/templates/hook/product.tpl delete mode 100644 modules/mailalerts/views/templates/index.php delete mode 100755 modules/newsletter/config.xml delete mode 100644 modules/newsletter/index.php delete mode 100644 modules/newsletter/logo.gif delete mode 100755 modules/newsletter/logo.png delete mode 100644 modules/newsletter/newsletter.php delete mode 100644 modules/newsletter/translations/index.php delete mode 100644 modules/productcomments/ProductComment.php delete mode 100644 modules/productcomments/ProductCommentCriterion.php delete mode 100644 modules/productcomments/ProductCriterion.php delete mode 100755 modules/productcomments/config.xml delete mode 100644 modules/productcomments/controllers/front/default.php delete mode 100644 modules/productcomments/controllers/front/index.php delete mode 100644 modules/productcomments/controllers/index.php delete mode 100644 modules/productcomments/img/accept.png delete mode 100644 modules/productcomments/img/bg_bt.gif delete mode 100644 modules/productcomments/img/bg_li.png delete mode 100644 modules/productcomments/img/comment.png delete mode 100644 modules/productcomments/img/comments_delete.png delete mode 100644 modules/productcomments/img/delete.gif delete mode 100644 modules/productcomments/img/delete.png delete mode 100644 modules/productcomments/img/index.php delete mode 100644 modules/productcomments/img/note.png delete mode 100644 modules/productcomments/img/note_go.png delete mode 100644 modules/productcomments/img/star.gif delete mode 100644 modules/productcomments/index.php delete mode 100644 modules/productcomments/install.sql delete mode 100644 modules/productcomments/js/index.php delete mode 100644 modules/productcomments/js/jquery.rating.pack.js delete mode 100644 modules/productcomments/js/jquery.textareaCounter.plugin.js delete mode 100644 modules/productcomments/js/moderate.js delete mode 100644 modules/productcomments/js/productCriterion.js delete mode 100644 modules/productcomments/js/productcomments.js delete mode 100755 modules/productcomments/js/products-comparison.js delete mode 100644 modules/productcomments/logo.gif delete mode 100755 modules/productcomments/logo.png delete mode 100644 modules/productcomments/productcomments-ajax.php delete mode 100644 modules/productcomments/productcomments-extra.tpl delete mode 100644 modules/productcomments/productcomments.css delete mode 100644 modules/productcomments/productcomments.php delete mode 100644 modules/productcomments/productcomments.tpl delete mode 100644 modules/productcomments/productcomments_reviews.tpl delete mode 100644 modules/productcomments/productcomments_top.tpl delete mode 100644 modules/productcomments/productcommentscriterion.php delete mode 100755 modules/productcomments/products-comparison.tpl delete mode 100644 modules/productcomments/tab.tpl delete mode 100644 modules/productcomments/translations/index.php delete mode 100644 modules/productcomments/upgrade/index.php delete mode 100644 modules/productcomments/upgrade/install-2.4.php delete mode 100644 modules/pscleaner/config.xml delete mode 100644 modules/pscleaner/index.php delete mode 100644 modules/pscleaner/logo.gif delete mode 100644 modules/pscleaner/logo.png delete mode 100644 modules/pscleaner/pscleaner.php delete mode 100644 modules/pscleaner/translations/index.php delete mode 100644 modules/referralprogram/ReferralProgramModule.php delete mode 100755 modules/referralprogram/config.xml delete mode 100755 modules/referralprogram/controllers/front/email.php delete mode 100644 modules/referralprogram/controllers/front/index.php delete mode 100755 modules/referralprogram/controllers/front/program.php delete mode 100755 modules/referralprogram/controllers/front/rules.php delete mode 100644 modules/referralprogram/controllers/index.php delete mode 100644 modules/referralprogram/index.php delete mode 100644 modules/referralprogram/logo.gif delete mode 100755 modules/referralprogram/logo.png delete mode 100644 modules/referralprogram/mails/en/index.php delete mode 100644 modules/referralprogram/mails/en/referralprogram-congratulations.html delete mode 100644 modules/referralprogram/mails/en/referralprogram-congratulations.txt delete mode 100644 modules/referralprogram/mails/en/referralprogram-invitation.html delete mode 100644 modules/referralprogram/mails/en/referralprogram-invitation.txt delete mode 100644 modules/referralprogram/mails/en/referralprogram-voucher.html delete mode 100644 modules/referralprogram/mails/en/referralprogram-voucher.txt delete mode 100644 modules/referralprogram/mails/index.php delete mode 100644 modules/referralprogram/referralprogram.gif delete mode 100644 modules/referralprogram/referralprogram.php delete mode 100644 modules/referralprogram/translations/index.php delete mode 100644 modules/referralprogram/views/index.php delete mode 100644 modules/referralprogram/views/templates/admin/_configure/helpers/form/form.tpl delete mode 100755 modules/referralprogram/views/templates/front/email.tpl delete mode 100644 modules/referralprogram/views/templates/front/index.php delete mode 100644 modules/referralprogram/views/templates/front/program.tpl delete mode 100755 modules/referralprogram/views/templates/front/rules.tpl delete mode 100755 modules/referralprogram/views/templates/hook/authentication.tpl delete mode 100644 modules/referralprogram/views/templates/hook/index.php delete mode 100755 modules/referralprogram/views/templates/hook/my-account.tpl delete mode 100755 modules/referralprogram/views/templates/hook/order-confirmation.tpl delete mode 100755 modules/referralprogram/views/templates/hook/shopping-cart.tpl delete mode 100644 modules/referralprogram/views/templates/index.php delete mode 100755 modules/sendtoafriend/config.xml delete mode 100644 modules/sendtoafriend/index.php delete mode 100644 modules/sendtoafriend/logo.gif delete mode 100755 modules/sendtoafriend/logo.png delete mode 100644 modules/sendtoafriend/mails/en/index.php delete mode 100644 modules/sendtoafriend/mails/en/send_to_a_friend.html delete mode 100644 modules/sendtoafriend/mails/en/send_to_a_friend.txt delete mode 100644 modules/sendtoafriend/mails/index.php delete mode 100755 modules/sendtoafriend/product_page.tpl delete mode 100755 modules/sendtoafriend/sendtoafriend-extra.tpl delete mode 100644 modules/sendtoafriend/sendtoafriend.css delete mode 100644 modules/sendtoafriend/sendtoafriend.php delete mode 100644 modules/sendtoafriend/sendtoafriend.png delete mode 100644 modules/sendtoafriend/sendtoafriend.tpl delete mode 100644 modules/sendtoafriend/sendtoafriend_ajax.php delete mode 100644 modules/sendtoafriend/translations/index.php delete mode 100755 modules/watermark/config.xml delete mode 100644 modules/watermark/index.php delete mode 100644 modules/watermark/logo.gif delete mode 100755 modules/watermark/logo.png delete mode 100644 modules/watermark/translations/index.php delete mode 100644 modules/watermark/watermark.gif delete mode 100644 modules/watermark/watermark.php diff --git a/modules/blockwishlist/WishList.php b/modules/blockwishlist/WishList.php deleted file mode 100644 index 23e57cdbe..000000000 --- a/modules/blockwishlist/WishList.php +++ /dev/null @@ -1,553 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class WishList extends ObjectModel -{ - /** @var integer Wishlist ID */ - public $id; - - /** @var integer Customer ID */ - public $id_customer; - - /** @var integer Token */ - public $token; - - /** @var integer Name */ - public $name; - - /** @var string Object creation date */ - public $date_add; - - /** @var string Object last modification date */ - public $date_upd; - - /** @var string Object last modification date */ - public $id_shop; - - /** @var string Object last modification date */ - public $id_shop_group; - /** - * @see ObjectModel::$definition - */ - public static $definition = array( - 'table' => 'wishlist', - 'primary' => 'id_wishlist', - 'fields' => array( - 'id_customer' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), - 'token' => array('type' => self::TYPE_STRING, 'validate' => 'isMessage', 'required' => true), - 'name' => array('type' => self::TYPE_STRING, 'validate' => 'isMessage', 'required' => true), - 'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), - 'date_upd' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), - 'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), - 'id_shop_group' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), - ) - ); - - public function delete() - { - Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'wishlist_email` WHERE `id_wishlist` = '.(int)($this->id)); - Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'wishlist_product` WHERE `id_wishlist` = '.(int)($this->id)); - if (isset($this->context->cookie->id_wishlist)) - unset($this->context->cookie->id_wishlist); - - return (parent::delete()); - } - - /** - * Increment counter - * - * @return boolean succeed - */ - public static function incCounter($id_wishlist) - { - if (!Validate::isUnsignedId($id_wishlist)) - die (Tools::displayError()); - $result = Db::getInstance()->getRow(' - SELECT `counter` - FROM `'._DB_PREFIX_.'wishlist` - WHERE `id_wishlist` = '.(int)$id_wishlist - ); - if ($result == false || !count($result) || empty($result) === true) - return (false); - - return Db::getInstance()->execute(' - UPDATE `'._DB_PREFIX_.'wishlist` SET - `counter` = '.(int)($result['counter'] + 1).' - WHERE `id_wishlist` = '.(int)$id_wishlist - ); - } - - - public static function isExistsByNameForUser($name) - { - if (Shop::getContextShopID()) - $shop_restriction = 'AND id_shop = '.(int)Shop::getContextShopID(); - elseif (Shop::getContextShopGroupID()) - $shop_restriction = 'AND id_shop_group = '.(int)Shop::getContextShopGroupID(); - else - $shop_restriction = ''; - - $context = Context::getContext(); - return Db::getInstance()->getValue(' - SELECT COUNT(*) AS total - FROM `'._DB_PREFIX_.'wishlist` - WHERE `name` = \''.pSQL($name).'\' - AND `id_customer` = '.(int)$context->customer->id.' - '.$shop_restriction - ); - } - - /** - * Return true if wishlist exists else false - * - * @return boolean exists - */ - public static function exists($id_wishlist, $id_customer, $return = false) - { - if (!Validate::isUnsignedId($id_wishlist) OR - !Validate::isUnsignedId($id_customer)) - die (Tools::displayError()); - $result = Db::getInstance()->getRow(' - SELECT `id_wishlist`, `name`, `token` - FROM `'._DB_PREFIX_.'wishlist` - WHERE `id_wishlist` = '.(int)($id_wishlist).' - AND `id_customer` = '.(int)($id_customer)); - if (empty($result) === false AND $result != false AND sizeof($result)) - { - if ($return === false) - return (true); - else - return ($result); - } - return (false); - } - - /** - * Get ID wishlist by Token - * - * @return array Results - */ - public static function getByToken($token) - { - if (!Validate::isMessage($token)) - die (Tools::displayError()); - return (Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' - SELECT w.`id_wishlist`, w.`name`, w.`id_customer`, c.`firstname`, c.`lastname` - FROM `'._DB_PREFIX_.'wishlist` w - INNER JOIN `'._DB_PREFIX_.'customer` c ON c.`id_customer` = w.`id_customer` - WHERE `token` = \''.pSQL($token).'\'')); - } - - /** - * Get Wishlists by Customer ID - * - * @return array Results - */ - public static function getByIdCustomer($id_customer) - { - if (!Validate::isUnsignedId($id_customer)) - die (Tools::displayError()); - if (Shop::getContextShopID()) - $shop_restriction = 'AND id_shop = '.(int)Shop::getContextShopID(); - elseif (Shop::getContextShopGroupID()) - $shop_restriction = 'AND id_shop_group = '.(int)Shop::getContextShopGroupID(); - else - $shop_restriction = ''; - - $cache_id = 'WhishList::getByIdCustomer_'.(int)$id_customer.'-'.(int)Shop::getContextShopID().'-'.(int)Shop::getContextShopGroupID(); - if (!Cache::isStored($cache_id)) - { - $result = Db::getInstance()->executeS(' - SELECT w.`id_wishlist`, w.`name`, w.`token`, w.`date_add`, w.`date_upd`, w.`counter` - FROM `'._DB_PREFIX_.'wishlist` w - WHERE `id_customer` = '.(int)($id_customer).' - '.$shop_restriction.' - ORDER BY w.`name` ASC'); - Cache::store($cache_id, $result); - } - return Cache::retrieve($cache_id); - } - - public static function refreshWishList($id_wishlist) - { - $old_carts = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' - SELECT wp.id_product, wp.id_product_attribute, wpc.id_cart, UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(wpc.date_add) AS timecart - FROM `'._DB_PREFIX_.'wishlist_product_cart` wpc - JOIN `'._DB_PREFIX_.'wishlist_product` wp ON (wp.id_wishlist_product = wpc.id_wishlist_product) - JOIN `'._DB_PREFIX_.'cart` c ON (c.id_cart = wpc.id_cart) - JOIN `'._DB_PREFIX_.'cart_product` cp ON (wpc.id_cart = cp.id_cart) - LEFT JOIN `'._DB_PREFIX_.'orders` o ON (o.id_cart = c.id_cart) - WHERE (wp.id_wishlist='.(int)($id_wishlist).' AND o.id_cart IS NULL) - HAVING timecart >= 3600*6'); - - if (isset($old_carts) AND $old_carts != false) - foreach ($old_carts AS $old_cart) - Db::getInstance()->execute(' - DELETE FROM `'._DB_PREFIX_.'cart_product` - WHERE id_cart='.(int)($old_cart['id_cart']).' AND id_product='.(int)($old_cart['id_product']).' AND id_product_attribute='.(int)($old_cart['id_product_attribute']) - ); - - $freshwish = Db::getInstance()->executeS(' - SELECT wpc.id_cart, wpc.id_wishlist_product - FROM `'._DB_PREFIX_.'wishlist_product_cart` wpc - JOIN `'._DB_PREFIX_.'wishlist_product` wp ON (wpc.id_wishlist_product = wp.id_wishlist_product) - JOIN `'._DB_PREFIX_.'cart` c ON (c.id_cart = wpc.id_cart) - LEFT JOIN `'._DB_PREFIX_.'cart_product` cp ON (cp.id_cart = wpc.id_cart AND cp.id_product = wp.id_product AND cp.id_product_attribute = wp.id_product_attribute) - WHERE (wp.id_wishlist = '.(int)($id_wishlist).' AND ((cp.id_product IS NULL AND cp.id_product_attribute IS NULL))) - '); - $res = Db::getInstance()->executeS(' - SELECT wp.id_wishlist_product, cp.quantity AS cart_quantity, wpc.quantity AS wish_quantity, wpc.id_cart - FROM `'._DB_PREFIX_.'wishlist_product_cart` wpc - JOIN `'._DB_PREFIX_.'wishlist_product` wp ON (wp.id_wishlist_product = wpc.id_wishlist_product) - JOIN `'._DB_PREFIX_.'cart` c ON (c.id_cart = wpc.id_cart) - JOIN `'._DB_PREFIX_.'cart_product` cp ON (cp.id_cart = wpc.id_cart AND cp.id_product = wp.id_product AND cp.id_product_attribute = wp.id_product_attribute) - WHERE wp.id_wishlist='.(int)($id_wishlist) - ); - - if (isset($res) AND $res != false) - foreach ($res AS $refresh) - if ($refresh['wish_quantity'] > $refresh['cart_quantity']) - { - Db::getInstance()->execute(' - UPDATE `'._DB_PREFIX_.'wishlist_product` - SET `quantity`= `quantity` + '.((int)($refresh['wish_quantity']) - (int)($refresh['cart_quantity'])).' - WHERE id_wishlist_product='.(int)($refresh['id_wishlist_product']) - ); - Db::getInstance()->execute(' - UPDATE `'._DB_PREFIX_.'wishlist_product_cart` - SET `quantity`='.(int)($refresh['cart_quantity']).' - WHERE id_wishlist_product='.(int)($refresh['id_wishlist_product']).' AND id_cart='.(int)($refresh['id_cart']) - ); - } - if (isset($freshwish) AND $freshwish != false) - foreach ($freshwish AS $prodcustomer) - { - Db::getInstance()->execute(' - UPDATE `'._DB_PREFIX_.'wishlist_product` SET `quantity`=`quantity` + - ( - SELECT `quantity` FROM `'._DB_PREFIX_.'wishlist_product_cart` - WHERE `id_wishlist_product`='.(int)($prodcustomer['id_wishlist_product']).' AND `id_cart`='.(int)($prodcustomer['id_cart']).' - ) - WHERE `id_wishlist_product`='.(int)($prodcustomer['id_wishlist_product']).' AND `id_wishlist`='.(int)($id_wishlist) - ); - Db::getInstance()->execute(' - DELETE FROM `'._DB_PREFIX_.'wishlist_product_cart` - WHERE `id_wishlist_product`='.(int)($prodcustomer['id_wishlist_product']).' AND `id_cart`='.(int)($prodcustomer['id_cart']) - ); - } - } - - /** - * Get Wishlist products by Customer ID - * - * @return array Results - */ - public static function getProductByIdCustomer($id_wishlist, $id_customer, $id_lang, $id_product = null, $quantity = false) - { - if (!Validate::isUnsignedId($id_customer) OR - !Validate::isUnsignedId($id_lang) OR - !Validate::isUnsignedId($id_wishlist)) - die (Tools::displayError()); - $products = Db::getInstance()->executeS(' - SELECT wp.`id_product`, wp.`quantity`, p.`quantity` AS product_quantity, pl.`name`, wp.`id_product_attribute`, wp.`priority`, pl.link_rewrite, cl.link_rewrite AS category_rewrite - FROM `'._DB_PREFIX_.'wishlist_product` wp - LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = wp.`id_product` - '.Shop::addSqlAssociation('product', 'p').' - LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON pl.`id_product` = wp.`id_product`'.Shop::addSqlRestrictionOnLang('pl').' - LEFT JOIN `'._DB_PREFIX_.'wishlist` w ON w.`id_wishlist` = wp.`id_wishlist` - LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON cl.`id_category` = product_shop.`id_category_default` AND cl.id_lang='.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').' - WHERE w.`id_customer` = '.(int)($id_customer).' - AND pl.`id_lang` = '.(int)($id_lang).' - AND wp.`id_wishlist` = '.(int)($id_wishlist). - (empty($id_product) === false ? ' AND wp.`id_product` = '.(int)($id_product) : ''). - ($quantity == true ? ' AND wp.`quantity` != 0': '').' - GROUP BY p.id_product, wp.id_product_attribute'); - if (empty($products) === true OR !sizeof($products)) - return array(); - for ($i = 0; $i < sizeof($products); ++$i) - { - if (isset($products[$i]['id_product_attribute']) AND - Validate::isUnsignedInt($products[$i]['id_product_attribute'])) - { - $result = Db::getInstance()->executeS(' - SELECT al.`name` AS attribute_name, pa.`quantity` AS "attribute_quantity" - FROM `'._DB_PREFIX_.'product_attribute_combination` pac - LEFT JOIN `'._DB_PREFIX_.'attribute` a ON (a.`id_attribute` = pac.`id_attribute`) - LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON (ag.`id_attribute_group` = a.`id_attribute_group`) - LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)($id_lang).') - LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)($id_lang).') - LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (pac.`id_product_attribute` = pa.`id_product_attribute`) - '.Shop::addSqlAssociation('product_attribute', 'pa').' - WHERE pac.`id_product_attribute` = '.(int)($products[$i]['id_product_attribute'])); - $products[$i]['attributes_small'] = ''; - if ($result) - foreach ($result AS $k => $row) - $products[$i]['attributes_small'] .= $row['attribute_name'].', '; - $products[$i]['attributes_small'] = rtrim($products[$i]['attributes_small'], ', '); - if (isset($result[0])) - $products[$i]['attribute_quantity'] = $result[0]['attribute_quantity']; - } - else - $products[$i]['attribute_quantity'] = $products[$i]['product_quantity']; - } - return ($products); - } - - /** - * Get Wishlists number products by Customer ID - * - * @return array Results - */ - public static function getInfosByIdCustomer($id_customer) - { - if (Shop::getContextShopID()) - $shop_restriction = 'AND id_shop = '.(int)Shop::getContextShopID(); - elseif (Shop::getContextShopGroupID()) - $shop_restriction = 'AND id_shop_group = '.(int)Shop::getContextShopGroupID(); - else - $shop_restriction = ''; - - if (!Validate::isUnsignedId($id_customer)) - die (Tools::displayError()); - return (Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' - SELECT SUM(wp.`quantity`) AS nbProducts, wp.`id_wishlist` - FROM `'._DB_PREFIX_.'wishlist_product` wp - INNER JOIN `'._DB_PREFIX_.'wishlist` w ON (w.`id_wishlist` = wp.`id_wishlist`) - WHERE w.`id_customer` = '.(int)($id_customer).' - '.$shop_restriction.' - GROUP BY w.`id_wishlist` - ORDER BY w.`name` ASC')); - } - - /** - * Add product to ID wishlist - * - * @return boolean succeed - */ - public static function addProduct($id_wishlist, $id_customer, $id_product, $id_product_attribute, $quantity) - { - if (!Validate::isUnsignedId($id_wishlist) OR - !Validate::isUnsignedId($id_customer) OR - !Validate::isUnsignedId($id_product) OR - !Validate::isUnsignedId($quantity)) - die (Tools::displayError()); - $result = Db::getInstance()->getRow(' - SELECT wp.`quantity` - FROM `'._DB_PREFIX_.'wishlist_product` wp - JOIN `'._DB_PREFIX_.'wishlist` w ON (w.`id_wishlist` = wp.`id_wishlist`) - WHERE wp.`id_wishlist` = '.(int)($id_wishlist).' - AND w.`id_customer` = '.(int)($id_customer).' - AND wp.`id_product` = '.(int)($id_product).' - AND wp.`id_product_attribute` = '.(int)($id_product_attribute)); - if (empty($result) === false AND sizeof($result)) - { - if (($result['quantity'] + $quantity) <= 0) - return (WishList::removeProduct($id_wishlist, $id_customer, $id_product, $id_product_attribute)); - else - return (Db::getInstance()->execute(' - UPDATE `'._DB_PREFIX_.'wishlist_product` SET - `quantity` = '.(int)($quantity + $result['quantity']).' - WHERE `id_wishlist` = '.(int)($id_wishlist).' - AND `id_product` = '.(int)($id_product).' - AND `id_product_attribute` = '.(int)($id_product_attribute))); - } - else - return (Db::getInstance()->execute(' - INSERT INTO `'._DB_PREFIX_.'wishlist_product` (`id_wishlist`, `id_product`, `id_product_attribute`, `quantity`, `priority`) VALUES( - '.(int)($id_wishlist).', - '.(int)($id_product).', - '.(int)($id_product_attribute).', - '.(int)($quantity).', 1)')); - - } - - /** - * Update product to wishlist - * - * @return boolean succeed - */ - public static function updateProduct($id_wishlist, $id_product, $id_product_attribute, $priority, $quantity) - { - if (!Validate::isUnsignedId($id_wishlist) OR - !Validate::isUnsignedId($id_product) OR - !Validate::isUnsignedId($quantity) OR - $priority < 0 OR $priority > 2) - die (Tools::displayError()); - return (Db::getInstance()->execute(' - UPDATE `'._DB_PREFIX_.'wishlist_product` SET - `priority` = '.(int)($priority).', - `quantity` = '.(int)($quantity).' - WHERE `id_wishlist` = '.(int)($id_wishlist).' - AND `id_product` = '.(int)($id_product).' - AND `id_product_attribute` = '.(int)($id_product_attribute))); - } - - /** - * Remove product from wishlist - * - * @return boolean succeed - */ - public static function removeProduct($id_wishlist, $id_customer, $id_product, $id_product_attribute) - { - if (!Validate::isUnsignedId($id_wishlist) OR - !Validate::isUnsignedId($id_customer) OR - !Validate::isUnsignedId($id_product)) - die (Tools::displayError()); - $result = Db::getInstance()->getRow(' - SELECT w.`id_wishlist`, wp.`id_wishlist_product` - FROM `'._DB_PREFIX_.'wishlist` w - LEFT JOIN `'._DB_PREFIX_.'wishlist_product` wp ON (wp.`id_wishlist` = w.`id_wishlist`) - WHERE `id_customer` = '.(int)($id_customer).' - AND w.`id_wishlist` = '.(int)($id_wishlist)); - if (empty($result) === true OR - $result === false OR - !sizeof($result) OR - $result['id_wishlist'] != $id_wishlist) - return (false); - // Delete product in wishlist_product_cart - Db::getInstance()->execute(' - DELETE FROM `'._DB_PREFIX_.'wishlist_product_cart` - WHERE `id_wishlist_product` = '.(int)($result['id_wishlist_product']) - ); - return Db::getInstance()->execute(' - DELETE FROM `'._DB_PREFIX_.'wishlist_product` - WHERE `id_wishlist` = '.(int)($id_wishlist).' - AND `id_product` = '.(int)($id_product).' - AND `id_product_attribute` = '.(int)($id_product_attribute) - ); - } - - /** - * Return bought product by ID wishlist - * - * @return Array results - */ - public static function getBoughtProduct($id_wishlist) - { - - if (!Validate::isUnsignedId($id_wishlist)) - die (Tools::displayError()); - return (Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' - SELECT wp.`id_product`, wp.`id_product_attribute`, wpc.`quantity`, wpc.`date_add`, cu.`lastname`, cu.`firstname` - FROM `'._DB_PREFIX_.'wishlist_product_cart` wpc - JOIN `'._DB_PREFIX_.'wishlist_product` wp ON (wp.id_wishlist_product = wpc.id_wishlist_product) - JOIN `'._DB_PREFIX_.'cart` ca ON (ca.id_cart = wpc.id_cart) - JOIN `'._DB_PREFIX_.'customer` cu ON (cu.`id_customer` = ca.`id_customer`) - WHERE wp.`id_wishlist` = '.(int)($id_wishlist))); - } - - /** - * Add bought product - * - * @return boolean succeed - */ - public static function addBoughtProduct($id_wishlist, $id_product, $id_product_attribute, $id_cart, $quantity) - { - if (!Validate::isUnsignedId($id_wishlist) OR - !Validate::isUnsignedId($id_product) OR - !Validate::isUnsignedId($quantity)) - die (Tools::displayError()); - $result = Db::getInstance()->getRow(' - SELECT `quantity`, `id_wishlist_product` - FROM `'._DB_PREFIX_.'wishlist_product` wp - WHERE `id_wishlist` = '.(int)($id_wishlist).' - AND `id_product` = '.(int)($id_product).' - AND `id_product_attribute` = '.(int)($id_product_attribute)); - - if (!sizeof($result) OR - ($result['quantity'] - $quantity) < 0 OR - $quantity > $result['quantity']) - return (false); - - Db::getInstance()->executeS(' - SELECT * - FROM `'._DB_PREFIX_.'wishlist_product_cart` - WHERE `id_wishlist_product`='.(int)($result['id_wishlist_product']).' AND `id_cart`='.(int)($id_cart) - ); - - if (Db::getInstance()->NumRows() > 0) - $result2= Db::getInstance()->execute(' - UPDATE `'._DB_PREFIX_.'wishlist_product_cart` - SET `quantity`=`quantity` + '.(int)($quantity).' - WHERE `id_wishlist_product`='.(int)($result['id_wishlist_product']).' AND `id_cart`='.(int)($id_cart) - ); - - else - $result2 = Db::getInstance()->execute(' - INSERT INTO `'._DB_PREFIX_.'wishlist_product_cart` - (`id_wishlist_product`, `id_cart`, `quantity`, `date_add`) VALUES( - '.(int)($result['id_wishlist_product']).', - '.(int)($id_cart).', - '.(int)($quantity).', - \''.pSQL(date('Y-m-d H:i:s')).'\')'); - - if ($result2 === false) - return (false); - return (Db::getInstance()->execute(' - UPDATE `'._DB_PREFIX_.'wishlist_product` SET - `quantity` = '.(int)($result['quantity'] - $quantity).' - WHERE `id_wishlist` = '.(int)($id_wishlist).' - AND `id_product` = '.(int)($id_product).' - AND `id_product_attribute` = '.(int)($id_product_attribute))); - } - - /** - * Add email to wishlist - * - * @return boolean succeed - */ - public static function addEmail($id_wishlist, $email) - { - if (!Validate::isUnsignedId($id_wishlist) OR empty($email) OR !Validate::isEmail($email)) - return false; - return (Db::getInstance()->execute(' - INSERT INTO `'._DB_PREFIX_.'wishlist_email` (`id_wishlist`, `email`, `date_add`) VALUES( - '.(int)($id_wishlist).', - \''.pSQL($email).'\', - \''.pSQL(date('Y-m-d H:i:s')).'\')')); - } - - /** - * Get email from wishlist - * - * @return Array results - */ - public static function getEmail($id_wishlist, $id_customer) - { - if (!Validate::isUnsignedId($id_wishlist) OR - !Validate::isUnsignedId($id_customer)) - die (Tools::displayError()); - return (Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' - SELECT we.`email`, we.`date_add` - FROM `'._DB_PREFIX_.'wishlist_email` we - INNER JOIN `'._DB_PREFIX_.'wishlist` w ON w.`id_wishlist` = we.`id_wishlist` - WHERE we.`id_wishlist` = '.(int)($id_wishlist).' - AND w.`id_customer` = '.(int)($id_customer))); - } -}; diff --git a/modules/blockwishlist/blockwishlist-ajax.tpl b/modules/blockwishlist/blockwishlist-ajax.tpl deleted file mode 100644 index a3f2d5f3a..000000000 --- a/modules/blockwishlist/blockwishlist-ajax.tpl +++ /dev/null @@ -1,49 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -{if $products} -
- {foreach from=$products item=product name=i} -
- {$product.quantity|intval}x - {$product.name|truncate:13:'...'|escape:'html':'UTF-8'} - {l s='Delete'} -
- {if isset($product.attributes_small)} -
- {$product.attributes_small|escape:'html':'UTF-8'} -
- {/if} - {/foreach} -
-{else} -
- {if isset($error) && $error} -
{l s='You must create a wishlist before adding products' mod='blockwishlist'}
- {else} -
{l s='No products' mod='blockwishlist'}
- {/if} -
-{/if} diff --git a/modules/blockwishlist/blockwishlist-extra.tpl b/modules/blockwishlist/blockwishlist-extra.tpl deleted file mode 100644 index b1a77c38f..000000000 --- a/modules/blockwishlist/blockwishlist-extra.tpl +++ /dev/null @@ -1,28 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -

- » {l s='Add to my wishlist' mod='blockwishlist'} -

diff --git a/modules/blockwishlist/blockwishlist.css b/modules/blockwishlist/blockwishlist.css deleted file mode 100644 index 8f0c50613..000000000 --- a/modules/blockwishlist/blockwishlist.css +++ /dev/null @@ -1,248 +0,0 @@ -/* module blockwishlist */ - -/* lnk on detail product page */ -#wishlist_button { - padding:2px 0 2px 20px; - background:url(img/icon/add.png) no-repeat 0 0 transparent -} - - -/* bt add */ -.add_wishlist_button a {padding:5px 7px 5px 18px} -.add_wishlist_button a span { - z-index:10; - display:block; - position:absolute; - top:-1px; - left:-12px; - height:26px; - width:26px; - background:url(img/icon/pict_add_wishlist.png) no-repeat 0 0 transparent -} - -/* bloc */ -#wishlist_block #wishlist_block_list { - margin:5px 0 10px 0; - padding-bottom:10px; - border-bottom:1px dotted #ccc -} -#wishlist_block_list dt { - position:relative; - margin-top:5px; - padding-right:20px -} - -#wishlist_block_list .quantity-formated { - display:inline-block; - margin-right:5px; - width:15px -} -#wishlist_block_list .cart_block_product_name {font-weight:bold} -#wishlist_block_list .ajax_cart_block_remove_link { - display:inline-block; - position:absolute; - right:0; - top:0; - margin:1px 0 0 5px; - height:12px; - width:12px -} -#wishlist_block_list dd {margin:0 0 0 24px} - - -#wishlist_block_list .ajax_cart_block_remove_link a { - display:inline-block; - height:12px; - width:12px; - background: url(img/icon/delete.gif) no-repeat 0 0 -} -#wishlist_block_list .price { - float:right -} - -#wishlist_block select#wishlists { - margin-bottom:10px; - width:99%; - border:1px solid #ccc; -} -#wishlist_block .lnk {padding:0} -#wishlist_block .lnk a { - display:block; - font-weight:bold; - text-align:right -} - -/* page in my account ************************************************************************* */ -#module-blockwishlist-mywishlist #left_column {display:none} -#module-blockwishlist-mywishlist #center_column{width:757px} - -#module-blockwishlist-mywishlist #mywishlist fieldset { - padding:10px; - -moz-border-radius:3px; - -webkit-border-radius:3px; - border-radius:3px; - background:#eee -} -#module-blockwishlist-mywishlist #mywishlist p.text label { - display:inline-block; - padding-right:10px; - width:174px; - font-weight:bold; - font-size:12px; - text-align:right -} -#module-blockwishlist-mywishlist #mywishlist p.text input { - padding:0 5px; - height:20px; - width:288px; - border:1px solid #ccc; -} -#module-blockwishlist-mywishlist #mywishlist p.submit { - margin-right:25px; - padding-bottom:5px; - text-align:right -} - -#mywishlist td.wishlist_delete { - text-align:center; - border-right: 1px solid #999 -} -#mywishlist td.wishlist_delete a { - display:inline-block; - font-size:8px; - padding:1px 2px; - -moz-border-radius:3px; - -webkit-border-radius:3px; - border-radius:3px; - color:#666; - text-shadow:0 1px 0 #fff; - text-transform:uppercase; - background: none repeat scroll 0 0 #ccc; -} - - -/* form add ****************************************** */ -#form_wishlist {} -#form_wishlist fieldset { padding: 20px } -#form_wishlist label { - display:inline-block; - padding:6px 15px; - width:150px; - font-size:12px; - text-align:right; -} -#form_wishlist input.inputTxt { - padding:0 5px; - height:26px; - width:260px; - font-size:12px; - color:#666; - border:1px solid #ccc; -} - -/* block-order-detail ********************************** */ -#module-blockwishlist-mywishlist #block-order-detail {margin-top:20px} - -/* wishlistLinkTop */ -#module-blockwishlist-mywishlist #block-order-detail #hideSendWishlist { - display:inline-block; - height:12px; - width:12px; - background: url(img/icon/delete.gif) no-repeat 0 0 -} - -#module-blockwishlist-mywishlist .wishlistLinkTop {} -#module-blockwishlist-mywishlist .wishlistLinkTop ul { - list-style-type:none; - border-bottom:1px dotted #ccc -} - #module-blockwishlist-mywishlist .wishlistLinkTop ul.wlp_bought_list {border:none;} -#module-blockwishlist-mywishlist .wishlistLinkTop li {float:left} -#module-blockwishlist-mywishlist .wishlistLinkTop .display_list li a { - display:inline-block; - padding:7px 11px 5px 22px; - color: #333; - background:url(img/arrow_right_2.png) no-repeat 10px 10px transparent -} - -#module-blockwishlist-mywishlist .wishlistLinkTop #hideSendWishlist { - float:right; - display:block; - height:12px; - width:12px; - text-indent:-5000px; - background: url(img/icon/delete.gif) no-repeat 0 0 -} -#module-blockwishlist-mywishlist .wishlistLinkTop #showBoughtProducts, -#module-blockwishlist-mywishlist .wishlistLinkTop #hideBoughtProductsInfos {display:none} - -/* wishlisturl */ -#module-blockwishlist-mywishlist .wishlisturl { - margin:20px 0; - padding:10px; - background:#eee -} -#module-blockwishlist-mywishlist .wishlisturl input { - padding:2px 5px; - border:1px solid #ccc -} - - -/* wlp_bought ****************************************** */ - -/* wlp_bought_list */ -ul.wlp_bought_list { - list-style-type:none; - margin-bottom:20px -} -ul.wlp_bought_list li { - position:relative; - float:left; - margin:20px 20px 0 0; - padding:5px; - width:218px;/* 230 */ - border:1px solid #d1d1d1; - -moz-border-radius:3px; - -webkit-border-radius:3px; - border-radius:3px; -} -ul.wlp_bought_list li .product_image { - float:left; - width:82px -} -ul.wlp_bought_list li .product_image a { - display:block; - padding:0; - border:1px solid #d1d1d1 -} - -ul.wlp_bought_list li .product_infos { - float:left; - margin-left:10px; - width:126px -} -ul.wlp_bought_list li .product_infos .s_title_block.product_name { - padding:5px 0; - font-size:12px; - color:#222 -} -ul.wlp_bought_list li .product_infos .wishlist_product_detail input, -ul.wlp_bought_list li .product_infos .wishlist_product_detail select { - border:1px solid #d1d1d1 -} - -ul.wlp_bought_list li .btn_action { - clear:both; - margin-top:10px -} -ul.wlp_bought_list li .btn_action .lnksave {float:right} -ul.wlp_bought_list li .lnkdel { - position:absolute; - top:5px; - right:5px; - display:block; - height:12px; - width:12px; - text-indent:-5000px; - background: url(img/icon/delete.gif) no-repeat 0 0 -} diff --git a/modules/blockwishlist/blockwishlist.php b/modules/blockwishlist/blockwishlist.php deleted file mode 100644 index 074e72b61..000000000 --- a/modules/blockwishlist/blockwishlist.php +++ /dev/null @@ -1,455 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class BlockWishList extends Module -{ - const INSTALL_SQL_FILE = 'install.sql'; - - private $_html = ''; - private $_postErrors = array(); - - public function __construct() - { - $this->name = 'blockwishlist'; - $this->tab = 'front_office_features'; - $this->version = 0.4; - $this->author = 'PrestaShop'; - $this->need_instance = 0; - - $this->bootstrap = true; - parent::__construct(); - - $this->displayName = $this->l('Wishlist block'); - $this->description = $this->l('Adds a block containing the customer\'s wishlists.'); - $this->default_wishlist_name = $this->l('My wishlist'); - } - - public function install() - { - if (!file_exists(dirname(__FILE__).'/'.self::INSTALL_SQL_FILE)) - return (false); - else if (!$sql = file_get_contents(dirname(__FILE__).'/'.self::INSTALL_SQL_FILE)) - return (false); - $sql = str_replace(array('PREFIX_', 'ENGINE_TYPE'), array(_DB_PREFIX_, _MYSQL_ENGINE_), $sql); - $sql = preg_split("/;\s*[\r\n]+/", $sql); - foreach ($sql AS $query) - if($query) - if(!Db::getInstance()->execute(trim($query))) - return false; - if (!parent::install() || - !$this->registerHook('rightColumn') || - !$this->registerHook('productActions') || - !$this->registerHook('cart') || - !$this->registerHook('customerAccount') || - !$this->registerHook('header') || - !$this->registerHook('adminCustomers') || - !$this->registerHook('displayProductListFunctionalButtons') || - !$this->registerHook('top') - ) - return false; - /* This hook is optional */ - $this->registerHook('displayMyAccountBlock'); - return true; - } - - public function uninstall() - { - return ( - Db::getInstance()->execute('DROP TABLE '._DB_PREFIX_.'wishlist') && - Db::getInstance()->execute('DROP TABLE '._DB_PREFIX_.'wishlist_email') && - Db::getInstance()->execute('DROP TABLE '._DB_PREFIX_.'wishlist_product') && - Db::getInstance()->execute('DROP TABLE '._DB_PREFIX_.'wishlist_product_cart') && - parent::uninstall() - ); - } - - public function getContent() - { - $this->_html = '

'.$this->displayName.'

'; - if (Tools::isSubmit('submitSettings')) - { - $activated = Tools::getValue('activated'); - if ($activated != 0 AND $activated != 1) - $this->_html .= '
'.$this->l('Activate module : Invalid choice.').'
'; - $this->_html .= '
'.$this->l('Settings updated').'
'; - } - - $this->_html .= $this->renderJS(); - $this->_html .= $this->renderForm(); - if (Tools::getValue('id_customer') && Tools::getValue('id_wishlist')) - $this->_html .= $this->renderList((int)Tools::getValue('id_wishlist')); - - - return $this->_html; - } - - public function hookDisplayProductListFunctionalButtons($params) - { - //TODO : Add cache - $this->smarty->assign('product', $params['product']); - return $this->display(__FILE__, 'blockwishlist_button.tpl'); - } - - public function hookTop($params) - { - - global $errors; - - require_once(dirname(__FILE__).'/WishList.php'); - if ($this->context->customer->isLogged()) - { - $wishlists = Wishlist::getByIdCustomer($this->context->customer->id); - if (empty($this->context->cookie->id_wishlist) === true || - WishList::exists($this->context->cookie->id_wishlist, $this->context->customer->id) === false) - { - if (!sizeof($wishlists)) - $id_wishlist = false; - else - { - $id_wishlist = (int)($wishlists[0]['id_wishlist']); - $this->context->cookie->id_wishlist = (int)($id_wishlist); - } - } - else - $id_wishlist = $this->context->cookie->id_wishlist; - - - $this->smarty->assign(array( - 'id_wishlist' => $id_wishlist, - 'isLogged' => true, - 'wishlist_products' => ($id_wishlist == false ? false : WishList::getProductByIdCustomer($id_wishlist, $this->context->customer->id, $this->context->language->id, null, true)), - 'wishlists' => $wishlists, - 'ptoken' => Tools::getToken(false))); - } - else - $this->smarty->assign(array('wishlist_products' => false, 'wishlists' => false)); - - return $this->display(__FILE__, 'blockwishlist_top.tpl'); - } - - public function hookHeader($params) - { - $this->context->controller->addCSS(($this->_path).'blockwishlist.css', 'all'); - $this->context->controller->addJS(($this->_path).'js/ajax-wishlist.js'); - - $this->smarty->assign(array('wishlist_link' => $this->context->link->getModuleLink('blockwishlist', 'mywishlist'))); - } - - public function hookRightColumn($params) - { - global $errors; - - require_once(dirname(__FILE__).'/WishList.php'); - if ($this->context->customer->isLogged()) - { - $wishlists = Wishlist::getByIdCustomer($this->context->customer->id); - if (empty($this->context->cookie->id_wishlist) === true || - WishList::exists($this->context->cookie->id_wishlist, $this->context->customer->id) === false) - { - if (!sizeof($wishlists)) - $id_wishlist = false; - else - { - $id_wishlist = (int)($wishlists[0]['id_wishlist']); - $this->context->cookie->id_wishlist = (int)($id_wishlist); - } - } - else - $id_wishlist = $this->context->cookie->id_wishlist; - $this->smarty->assign(array( - 'id_wishlist' => $id_wishlist, - 'isLogged' => true, - 'wishlist_products' => ($id_wishlist == false ? false : WishList::getProductByIdCustomer($id_wishlist, $this->context->customer->id, $this->context->language->id, null, true)), - 'wishlists' => $wishlists, - 'ptoken' => Tools::getToken(false))); - } - else - $this->smarty->assign(array('wishlist_products' => false, 'wishlists' => false)); - - return ($this->display(__FILE__, 'blockwishlist.tpl')); - } - - public function hookLeftColumn($params) - { - return $this->hookRightColumn($params); - } - - public function hookProductActions($params) - { - $this->smarty->assign('id_product', (int)(Tools::getValue('id_product'))); - return ($this->display(__FILE__, 'blockwishlist-extra.tpl')); - } - - public function hookCustomerAccount($params) - { - return $this->display(__FILE__, 'my-account.tpl'); - } - - public function hookDisplayMyAccountBlock($params) - { - return $this->hookCustomerAccount($params); - } - - private function _displayProducts($id_wishlist) - { - include_once(dirname(__FILE__).'/WishList.php'); - - $wishlist = new WishList($id_wishlist); - $products = WishList::getProductByIdCustomer($id_wishlist, $wishlist->id_customer, $this->context->language->id); - for ($i = 0; $i < sizeof($products); ++$i) - { - $obj = new Product((int)($products[$i]['id_product']), false, $this->context->language->id); - if (!Validate::isLoadedObject($obj)) - continue; - else - { - $images = $obj->getImages($this->context->language->id); - foreach ($images AS $k => $image) - { - if ($image['cover']) - { - $products[$i]['cover'] = $obj->id.'-'.$image['id_image']; - break; - } - } - if (!isset($products[$i]['cover'])) - $products[$i]['cover'] = $this->context->language->iso_code.'-default'; - } - } - $this->_html .= ' - - - - - - - - - '; - $priority = array($this->l('High'), $this->l('Medium'), $this->l('Low')); - foreach ($products as $product) - { - $this->_html .= ' - - - - - '; - } - $this->_html .= '
'.$this->l('Product').''.$this->l('Quantity').''.$this->l('Priority').'
- '.htmlentities($product['name'], ENT_COMPAT, 'UTF-8').' - '.$product['name']; - if (isset($product['attributes_small'])) - $this->_html .= '
'.htmlentities($product['attributes_small'], ENT_COMPAT, 'UTF-8').''; - $this->_html .= ' -
'.(int)($product['quantity']).''.$priority[(int)($product['priority']) % 3].'
'; - } - - public function hookAdminCustomers($params) - { - require_once(dirname(__FILE__).'/WishList.php'); - - $customer = new Customer((int)($params['id_customer'])); - if (!Validate::isLoadedObject($customer)) - die (Tools::displayError()); - - $this->_html = '

'.$this->l('Wishlists').'

'; - - $wishlists = WishList::getByIdCustomer((int)($customer->id)); - if (!sizeof($wishlists)) - $this->_html .= $customer->lastname.' '.$customer->firstname.' '.$this->l('No wishlist.'); - else - { - $this->_html .= '
'; - - $id_wishlist = (int)(Tools::getValue('id_wishlist')); - if (!$id_wishlist) - $id_wishlist = $wishlists[0]['id_wishlist']; - - $this->_html .= ''.$this->l('Wishlist').': '; - - $this->_displayProducts((int)($id_wishlist)); - - $this->_html .= '

'; - - return $this->_html; - } - } - /* - * Display Error from controler - */ - public function errorLogged() - { - return $this->l('You must be logged in to manage your wishlists.'); - } - - public function renderJS() - { - return ""; - } - - public function renderForm() - { - $customers = Customer::getCustomers(); - foreach ($customers as $key => $val) - $customers[$key]['name'] = $val['firstname'].' '.$val['lastname']; - - $fields_form = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Listing'), - 'icon' => 'icon-cogs' - ), - 'input' => array( - array( - 'type' => 'select', - 'label' => $this->l('Customers :'), - 'name' => 'id_customer', - 'options' => array( - 'default' => array('value' => 0, 'label' => $this->l('Choose customer')), - 'query' => $customers, - 'id' => 'id_customer', - 'name' => 'name' - ), - ) - ), - ), - ); - - if ($id_customer = Tools::getValue('id_customer')) - { - require_once(dirname(__FILE__).'/WishList.php'); - $wishlists = WishList::getByIdCustomer($id_customer); - $fields_form['form']['input'][] = array( - 'type' => 'select', - 'label' => $this->l('Wishlist :'), - 'name' => 'id_wishlist', - 'options' => array( - 'default' => array('value' => 0, 'label' => $this->l('Choose wishlist')), - 'query' => $wishlists, - 'id' => 'id_wishlist', - 'name' => 'name' - ), - ); - } - - $helper = new HelperForm(); - $helper->show_toolbar = false; - $helper->table = $this->table; - $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); - $helper->default_form_language = $lang->id; - $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; - $this->fields_form = array(); - - $helper->identifier = $this->identifier; - $helper->submit_action = 'submitModule'; - $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->tpl_vars = array( - 'fields_value' => $this->getConfigFieldsValues(), - 'languages' => $this->context->controller->getLanguages(), - 'id_language' => $this->context->language->id - ); - - return $helper->generateForm(array($fields_form)); - } - - public function getConfigFieldsValues() - { - return array( - 'id_customer' => Tools::getValue('id_customer'), - 'id_wishlist' => Tools::getValue('id_wishlist'), - ); - } - - public function renderList($id_wishlist) - { - $wishlist = new WishList($id_wishlist); - $products = WishList::getProductByIdCustomer($id_wishlist, $wishlist->id_customer, $this->context->language->id); - - foreach ($products as $key => $val) - { - $image = Image::getCover($val['id_product']); - $products[$key]['image'] = $this->context->link->getImageLink($val['link_rewrite'], $image['id_image'], ImageType::getFormatedName('small')); - } - - $fields_list = array( - 'image' => array( - 'title' => $this->l('Image'), - 'type' => 'image', - ), - 'name' => array( - 'title' => $this->l('Product'), - 'type' => 'text', - ), - 'attributes_small' => array( - 'title' => $this->l('Combination'), - 'type' => 'text', - ), - 'quantity' => array( - 'title' => $this->l('Quantity'), - 'type' => 'text', - ), - 'priority' => array( - 'title' => $this->l('Priority'), - 'type' => 'priority', - 'values' => array($this->l('High'), $this->l('Medium'), $this->l('Low')), - ) - ); - - - $helper = new HelperList(); - $helper->shopLinkType = ''; - $helper->simple_header = true; - $helper->actions = array(); - $helper->show_toolbar = false; - $helper->module = $this; - $helper->identifier = 'image'; - $helper->title = $this->l('Product list'); - $helper->table = $this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name; - $helper->tpl_vars = array('priority' => array($this->l('High'), $this->l('Medium'), $this->l('Low'))); - - return $helper->generateList($products, $fields_list); - } -} \ No newline at end of file diff --git a/modules/blockwishlist/blockwishlist.tpl b/modules/blockwishlist/blockwishlist.tpl deleted file mode 100644 index dd68e8412..000000000 --- a/modules/blockwishlist/blockwishlist.tpl +++ /dev/null @@ -1,65 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - diff --git a/modules/blockwishlist/blockwishlist_button.tpl b/modules/blockwishlist/blockwishlist_button.tpl deleted file mode 100644 index c339a9b59..000000000 --- a/modules/blockwishlist/blockwishlist_button.tpl +++ /dev/null @@ -1,28 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - \ No newline at end of file diff --git a/modules/blockwishlist/blockwishlist_top.tpl b/modules/blockwishlist/blockwishlist_top.tpl deleted file mode 100644 index a7e5a6463..000000000 --- a/modules/blockwishlist/blockwishlist_top.tpl +++ /dev/null @@ -1,28 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - \ No newline at end of file diff --git a/modules/blockwishlist/buywishlistproduct.php b/modules/blockwishlist/buywishlistproduct.php deleted file mode 100644 index 68d1111fb..000000000 --- a/modules/blockwishlist/buywishlistproduct.php +++ /dev/null @@ -1,56 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -require_once(dirname(__FILE__).'/../../config/config.inc.php'); -require_once(dirname(__FILE__).'/../../init.php'); -require_once(dirname(__FILE__).'/WishList.php'); - - -$error = ''; - -// Instance of module class for translations -$module = new BlockWishList(); - -$token = Tools::getValue('token'); -$id_product = (int)Tools::getValue('id_product'); -$id_product_attribute = (int)Tools::getValue('id_product_attribute'); -if (Configuration::get('PS_TOKEN_ENABLE') == 1 && strcmp(Tools::getToken(false), Tools::getValue('static_token'))) - $error = $module->l('Invalid token', 'buywishlistproduct'); - -if (!strlen($error) && - empty($token) === false && - empty($id_product) === false) -{ - $wishlist = WishList::getByToken($token); - if ($wishlist !== false) - WishList::addBoughtProduct($wishlist['id_wishlist'], $id_product, $id_product_attribute, $cart->id, 1); -} -else - $error = $module->l('You must log in', 'buywishlistproduct'); - -if (empty($error) === false) - echo $error; - diff --git a/modules/blockwishlist/cart.php b/modules/blockwishlist/cart.php deleted file mode 100644 index 6ab2311ca..000000000 --- a/modules/blockwishlist/cart.php +++ /dev/null @@ -1,86 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -require_once(dirname(__FILE__).'/../../config/config.inc.php'); -require_once(dirname(__FILE__).'/../../init.php'); -require_once(dirname(__FILE__).'/WishList.php'); -require_once(dirname(__FILE__).'/blockwishlist.php'); - -$context = Context::getContext(); -$action = Tools::getValue('action'); -$add = (!strcmp($action, 'add') ? 1 : 0); -$delete = (!strcmp($action, 'delete') ? 1 : 0); -$id_wishlist = (int)(Tools::getValue('id_wishlist')); -$id_product = (int)(Tools::getValue('id_product')); -$quantity = (int)(Tools::getValue('quantity')); -$id_product_attribute = (int)(Tools::getValue('id_product_attribute')); - -// Instance of module class for translations -$module = new BlockWishList(); - -if (Configuration::get('PS_TOKEN_ENABLE') == 1 AND - strcmp(Tools::getToken(false), Tools::getValue('token')) AND - $context->customer->isLogged() === true) - echo $module->l('Invalid token', 'cart'); -if ($context->customer->isLogged()) -{ - if ($id_wishlist AND WishList::exists($id_wishlist, $context->customer->id) === true) - $context->cookie->id_wishlist = (int)($id_wishlist); - if (empty($context->cookie->id_wishlist) === true OR $context->cookie->id_wishlist == false) - $context->smarty->assign('error', true); - if (($add OR $delete) AND empty($id_product) === false) - { - if(!isset($context->cookie->id_wishlist) OR $context->cookie->id_wishlist == '') - { - $wishlist = new WishList(); - $wishlist->id_shop = $context->shop->id; - $wishlist->id_shop_group = $context->shop->id_shop_group; - - $modWishlist = new BlockWishList(); - $wishlist->name = $modWishlist->default_wishlist_name; - $wishlist->id_customer = (int)($context->customer->id); - list($us, $s) = explode(' ', microtime()); - srand($s * $us); - $wishlist->token = strtoupper(substr(sha1(uniqid(rand(), true)._COOKIE_KEY_.$context->customer->id), 0, 16)); - $wishlist->add(); - $context->cookie->id_wishlist = (int)($wishlist->id); - } - if ($add AND $quantity) - WishList::addProduct($context->cookie->id_wishlist, $context->customer->id, $id_product, $id_product_attribute, $quantity); - else if ($delete) - WishList::removeProduct($context->cookie->id_wishlist, $context->customer->id, $id_product, $id_product_attribute); - } - $context->smarty->assign('products', WishList::getProductByIdCustomer($context->cookie->id_wishlist, $context->customer->id, $context->language->id, null, true)); - - if (Tools::file_exists_cache(_PS_THEME_DIR_.'modules/blockwishlist/blockwishlist-ajax.tpl')) - $context->smarty->display(_PS_THEME_DIR_.'modules/blockwishlist/blockwishlist-ajax.tpl'); - elseif (Tools::file_exists_cache(dirname(__FILE__).'/blockwishlist-ajax.tpl')) - $context->smarty->display(dirname(__FILE__).'/blockwishlist-ajax.tpl'); - else - echo $module->l('No template found', 'cart'); -} -else - echo $module->l('You must be logged in to manage your wishlist.', 'cart'); diff --git a/modules/blockwishlist/config.xml b/modules/blockwishlist/config.xml deleted file mode 100755 index 1bd0cf514..000000000 --- a/modules/blockwishlist/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - blockwishlist - - - - - - 1 - 0 - - \ No newline at end of file diff --git a/modules/blockwishlist/controllers/front/index.php b/modules/blockwishlist/controllers/front/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/blockwishlist/controllers/front/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/blockwishlist/controllers/front/mywishlist.php b/modules/blockwishlist/controllers/front/mywishlist.php deleted file mode 100644 index cfa1b32d9..000000000 --- a/modules/blockwishlist/controllers/front/mywishlist.php +++ /dev/null @@ -1,129 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/** - * @since 1.5.0 - */ -class BlockWishListMyWishListModuleFrontController extends ModuleFrontController -{ - public $ssl = true; - public $display_column_left = false; - - public function __construct() - { - parent::__construct(); - $this->context = Context::getContext(); - include_once($this->module->getLocalPath().'WishList.php'); - } - - /** - * @see FrontController::initContent() - */ - public function initContent() - { - parent::initContent(); - $this->assign(); - } - - /** - * Assign wishlist template - */ - public function assign() - { - $errors = array(); - - if ($this->context->customer->isLogged()) - { - $add = Tools::getIsset('add'); - $add = (empty($add) === false ? 1 : 0); - $delete = Tools::getIsset('deleted'); - $delete = (empty($delete) === false ? 1 : 0); - $id_wishlist = Tools::getValue('id_wishlist'); - if (Tools::isSubmit('submitWishlist')) - { - if (Configuration::get('PS_TOKEN_ACTIVATED') == 1 && strcmp(Tools::getToken(), Tools::getValue('token'))) - $errors[] = $this->module->l('Invalid token', 'mywishlist'); - if (!count($errors)) - { - $name = Tools::getValue('name'); - if (empty($name)) - $errors[] = $this->module->l('You must specify a name.', 'mywishlist'); - if (WishList::isExistsByNameForUser($name)) - $errors[] = $this->module->l('This name is already used by another list.', 'mywishlist'); - - if (!count($errors)) - { - $wishlist = new WishList(); - $wishlist->id_shop = $this->context->shop->id; - $wishlist->id_shop_group = $this->context->shop->id_shop_group; - $wishlist->name = $name; - $wishlist->id_customer = (int)$this->context->customer->id; - list($us, $s) = explode(' ', microtime()); - srand($s * $us); - $wishlist->token = strtoupper(substr(sha1(uniqid(rand(), true)._COOKIE_KEY_.$this->context->customer->id), 0, 16)); - $wishlist->add(); - Mail::Send( - $this->context->language->id, - 'wishlink', - Mail::l('Your wishlist\'s link', $this->context->language->id), - array( - '{wishlist}' => $wishlist->name, - '{message}' => Tools::getProtocol().htmlentities($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').__PS_BASE_URI__.'modules/blockwishlist/view.php?token='.$wishlist->token), - $this->context->customer->email, - $this->context->customer->firstname.' '.$this->context->customer->lastname, - null, - strval(Configuration::get('PS_SHOP_NAME')), - null, - null, - $this->module->getLocalPath().'mails/'); - } - } - } - else if ($add) - WishList::addCardToWishlist($this->context->customer->id, Tools::getValue('id_wishlist'), $this->context->language->id); - elseif ($delete && empty($id_wishlist) === false) - { - $wishlist = new WishList((int)($id_wishlist)); - if (Validate::isLoadedObject($wishlist)) - $wishlist->delete(); - else - $errors[] = $this->module->l('Cannot delete this wishlist', 'mywishlist'); - } - $this->context->smarty->assign('wishlists', WishList::getByIdCustomer($this->context->customer->id)); - $this->context->smarty->assign('nbProducts', WishList::getInfosByIdCustomer($this->context->customer->id)); - } - else - Tools::redirect('index.php?controller=authentication&back='.urlencode($this->context->link->getModuleLink('blockwishlist', 'mywishlist'))); - - $this->context->smarty->assign(array( - 'id_customer' => (int)$this->context->customer->id, - 'errors' => $errors, - 'form_link' => $errors, - )); - - $this->setTemplate('mywishlist.tpl'); - } -} diff --git a/modules/blockwishlist/controllers/index.php b/modules/blockwishlist/controllers/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/blockwishlist/controllers/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/blockwishlist/img/arrow_right_2.png b/modules/blockwishlist/img/arrow_right_2.png deleted file mode 100644 index c970f18ef441cd6991598167ea6769a00b44743e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c8!3-oNcFQ~hQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jir4~tLR^iFjsO4uudGpj94Nw6666>BpW*3t11}&?*3-o? xq~camLPAPPN>vDoj9y44$rjF6*2UngH4;DJuW~ diff --git a/modules/blockwishlist/img/delete.gif b/modules/blockwishlist/img/delete.gif deleted file mode 100644 index 43c6ca8763d79bde87bcf437e497af00c8be562d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 752 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 diff --git a/modules/blockwishlist/img/icon/delete.gif b/modules/blockwishlist/img/icon/delete.gif deleted file mode 100644 index 6d186d193983f580cabf7efec6597a6905675718..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213 zcmZ?wbhEHbx+N^}A1V=PjHy zXP&C6s;8%yo4fmu-~TUNxnX2vq@bYi|NnmmB7ovg7DfgJVFn$LT9BO#tU(V{wAc&`~py_FKMaZ;bWTl*9tXdrFE7)&RJ*L#hA( diff --git a/modules/blockwishlist/img/icon/delete.png b/modules/blockwishlist/img/icon/delete.png deleted file mode 100644 index 08f249365afd29594b51210c6e21ba253897505d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 715 zcmV;+0yO=JP)C4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;yxzh{5!Htr?51 zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7 zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l z!7?%Uwib*ROP67Hw`ika)gX-(8Ia`-u_IEhxG7U<13kSsMW+$lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc diff --git a/modules/blockwishlist/img/icon/index.php b/modules/blockwishlist/img/icon/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/blockwishlist/img/icon/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/blockwishlist/img/icon/package.png b/modules/blockwishlist/img/icon/package.png deleted file mode 100644 index da3c2a2d74bab159ba0f65d7db601768258afcb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 zcmV-b1FHOqP)5TQ^(M5v$(QKVE?W+9X! z*o}&~6c?_FreF)9NJB7b5Nbn{G0n4+%uJhR9(V5R|NFTpb|HgjefT!tIhLx@DR+N) zV+fHiR5Yt19}k|KnCsND{tH-`IMJ)3AE?OtyZ4>Un|6(d%h#JK`i&a7^xW9>`yBy` zS4SOHeOpC7$?hH5-#7Rswiue_8Ju*2N@$58=a#2OTA3png`w3v->gWif7t%e$ z$NLVS!tFT#8WL|Wa&K~+{%4P2cRfwesYV1_!F=3OaRVHl(>=`%&{x*s30c}#CNE@&;ItrAv!f!)Oy$Q9t$uS=(sD$-J{T*^(8Eez1E-l3}} zPrfHZ1`qsIFe&gipuL8-IZbo2Yg{lFGKs?ZZWcOaOdk*3`5T;$?AjbG1#`B510Er^h2)2r3Y{!8_2Gj=$KzuN5 zaErtW8W_Y2iJJjY)5pmTVJoPJYpanPOEuYHclM^C1F>${hFRpdi8a<2H|Xudf78bm(zwJ9`K%6I?q*Ua~ fW9JvIbn5*B+_J)rUMBs>00000NkvXXu0mjfH&TkY diff --git a/modules/blockwishlist/img/icon/package_go.png b/modules/blockwishlist/img/icon/package_go.png deleted file mode 100644 index aace63ad6f91537268eb6e9bf328743da7c631c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 898 zcmV-|1AY97P)yqPWur#3F*- zi1-H*6GJgONgz~1E;+_Oe@~@VF-1Iy-=*@ zV9T!Kgk#%59lVt}Zj7B_)9wTKYBy6YEwPxKqOdeGuEw0%cVhe}Yj*hPSBMNYZ5yz{ z4STT*%d9TVV4NauDND$z(%QKb>=kMr>ckh0lFuesOioc=Nq^^8BQNYYbk1@M%M`O? zh?6H&UZR}Ol3%#RzJX5(MAktmg_e?7`2>w^4^!6w)4$9==U0)EV$}u1A)*bPRF?jv zHdar4EJB1b*f+rh!M+8R159x8%Qjd0I{0j+|69pUC)f(>!P(OTs8c~;XuVtXzfO>s`m zrjW9YI38*Yel_NvP&FVfNEx)sn-kxIx;WzEcpe*LJBYXLr(llS6I0o+c9O z0L_4N7u$0%Dx~ks;fjYRF0OIOR}1uPI!MtibK=J3pihiBTv)jD>R%(Llj(_XFa#mG z6Wg=#j7Q7*PFmM*W@B9!ftm;#qU}sCT;|&KtBZ%Fe#3()Pk+9@Sw&8%k=NQD>92qN zkFT*E2S*%i&!MYvH;;DpF?sU}zb4Mlls)au3~BX$XZr12Z?_sbts>8Fec~0Xl1q`9 zxyH%T#p<5UCqrY2(J4oGEHk9ens22BN3dYXATM07*qoM6N<$g3xBAZ~y=R diff --git a/modules/blockwishlist/img/index.php b/modules/blockwishlist/img/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/blockwishlist/img/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/blockwishlist/img/star.gif b/modules/blockwishlist/img/star.gif deleted file mode 100644 index d0948a70843bf01952d1f81dcfcdadc92976a04a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 815 zcmZ?wbhEHb6ksr5c*el6(A@m!(W5UnOP^`reSRqFN=wUy;^KSv?mbz*{y;*);~mc5 z-|RUW6m;#{wMW}bp6pHg_U+rN({8s`u6+0I-Q5+MAMeb%w`5!M# z{q=^=j}*N*e*EQepZ7;K-(U6l^W*)qy-uI5Mx04YJ9FmD@2@w0e|`3BzvYV!svmDJ zy1UBtA9dUx3IVz=bW<9TmSpMHPB|LHc1x92?H@6~*NPV?1P?R#4d zPbMV1-s|#ytJ9}D;U7+0e!n;8#jahi&$Zv4GUd&Fk1akv*Jf&ey1!wEi_7gU#eYv#yB=$CE4*Ha3+f942mV(XO4k$!yUkYI4!^v z(7()>%8M?Gl%7kx>Gn`^RAQF96>H~ zqm`q-QcY~aQ7_g~!8sNO9r=2u3Mlqi#CWtc9T(=ypIRf>c$iT@(<;xV@nLFbqN;ve z&H|wp@2R5NS2`L#KJ=KR(rKEJaLDyUmqb%cL}by=)-=YHmH-A@k7GPXma%d?aC*qL zh)X7I#x;cnUQ^jS^;|kOFmg@Nv0U}W!=<5%L(6DYL1B*CL?*3JjSUV#i&`dVbSiW! SUO9NY!6jXVS5kz7!5RQ -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/blockwishlist/install.sql b/modules/blockwishlist/install.sql deleted file mode 100644 index fbcdc2e31..000000000 --- a/modules/blockwishlist/install.sql +++ /dev/null @@ -1,35 +0,0 @@ -CREATE TABLE IF NOT EXISTS `PREFIX_wishlist` ( - `id_wishlist` int(10) unsigned NOT NULL auto_increment, - `id_customer` int(10) unsigned NOT NULL, - `token` varchar(64) character set utf8 NOT NULL, - `name` varchar(64) character set utf8 NOT NULL, - `counter` int(10) unsigned NULL, - `id_shop` int(10) unsigned default 1, - `id_shop_group` int(10) unsigned default 1, - `date_add` datetime NOT NULL, - `date_upd` datetime NOT NULL, - PRIMARY KEY (`id_wishlist`) -) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; - -CREATE TABLE IF NOT EXISTS `PREFIX_wishlist_email` ( - `id_wishlist` int(10) unsigned NOT NULL, - `email` varchar(128) character set utf8 NOT NULL, - `date_add` datetime NOT NULL -) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; - -CREATE TABLE IF NOT EXISTS `PREFIX_wishlist_product` ( - `id_wishlist_product` int(10) NOT NULL auto_increment, - `id_wishlist` int(10) unsigned NOT NULL, - `id_product` int(10) unsigned NOT NULL, - `id_product_attribute` int(10) unsigned NOT NULL, - `quantity` int(10) unsigned NOT NULL, - `priority` int(10) unsigned NOT NULL, - PRIMARY KEY (`id_wishlist_product`) -) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; - -CREATE TABLE IF NOT EXISTS `PREFIX_wishlist_product_cart` ( - `id_wishlist_product` int(10) unsigned NOT NULL, - `id_cart` int(10) unsigned NOT NULL, - `quantity` int(10) unsigned NOT NULL, - `date_add` datetime NOT NULL -) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; diff --git a/modules/blockwishlist/js/ajax-wishlist.js b/modules/blockwishlist/js/ajax-wishlist.js deleted file mode 100644 index 8e748dd9a..000000000 --- a/modules/blockwishlist/js/ajax-wishlist.js +++ /dev/null @@ -1,253 +0,0 @@ -/* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/** - * Update WishList Cart by adding, deleting, updating objects - * - * @return void - */ -function WishlistCart(id, action, id_product, id_product_attribute, quantity) -{ - $.ajax({ - type: 'GET', - url: baseDir + 'modules/blockwishlist/cart.php', - async: true, - cache: false, - data: 'action=' + action + '&id_product=' + id_product + '&quantity=' + quantity + '&token=' + static_token + '&id_product_attribute=' + id_product_attribute, - success: function(data) - { - if (action == 'add') - { - var $element = $('#bigpic'); - if (!$element.length) - var $element = $('#wishlist_button'); - var $picture = $element.clone(); - var pictureOffsetOriginal = $element.offset(); - $picture.css({'position': 'absolute', 'top': pictureOffsetOriginal.top, 'left': pictureOffsetOriginal.left}); - var pictureOffset = $picture.offset(); - var wishlistBlockOffset = $('#wishlist_block').offset(); - - $picture.appendTo('body'); - $picture.css({ 'position': 'absolute', 'top': $picture.css('top'), 'left': $picture.css('left') }) - .animate({ 'width': $element.attr('width')*0.66, 'height': $element.attr('height')*0.66, 'opacity': 0.2, 'top': wishlistBlockOffset.top + 30, 'left': wishlistBlockOffset.left + 15 }, 1000) - .fadeOut(800); - } - - if($('#' + id).length != 0) - { - $('#' + id).slideUp('normal'); - $('#' + id).html(data); - $('#' + id).slideDown('normal'); - } - } - }); -} - -/** - * Change customer default wishlist - * - * @return void - */ -function WishlistChangeDefault(id, id_wishlist) -{ - $.ajax({ - type: 'GET', - url: baseDir + 'modules/blockwishlist/cart.php', - async: true, - data: 'id_wishlist=' + id_wishlist + '&token=' + static_token, - cache: false, - success: function(data) - { - $('#' + id).slideUp('normal'); - $('#' + id).html(data); - $('#' + id).slideDown('normal'); - } - }); -} - -/** - * Buy Product - * - * @return void - */ -function WishlistBuyProduct(token, id_product, id_product_attribute, id_quantity, button, ajax) -{ - if(ajax) - ajaxCart.add(id_product, id_product_attribute, false, button, 1, [token, id_quantity]); - else - { - $('#' + id_quantity).val(0); - WishlistAddProductCart(token, id_product, id_product_attribute, id_quantity) - document.forms['addtocart' + '_' + id_product + '_' + id_product_attribute].method='POST'; - document.forms['addtocart' + '_' + id_product + '_' + id_product_attribute].action=baseUri + '?controller=cart'; - document.forms['addtocart' + '_' + id_product + '_' + id_product_attribute].elements['token'].value = static_token; - document.forms['addtocart' + '_' + id_product + '_' + id_product_attribute].submit(); - } - return (true); -} - -function WishlistAddProductCart(token, id_product, id_product_attribute, id_quantity) -{ - if ($('#' + id_quantity).val() <= 0) - return (false); - $.ajax({ - type: 'GET', - url: baseDir + 'modules/blockwishlist/buywishlistproduct.php', - data: 'token=' + token + '&static_token=' + static_token + '&id_product=' + id_product + '&id_product_attribute=' + id_product_attribute, - async: true, - cache: false, - success: function(data) - { - if (data) - alert(data); - else - { - $('#' + id_quantity).val($('#' + id_quantity).val() - 1); - } - } - }); - return (true); -} - -/** - * Show wishlist managment page - * - * @return void - */ -function WishlistManage(id, id_wishlist) -{ - $.ajax({ - type: 'GET', - async: true, - url: baseDir + 'modules/blockwishlist/managewishlist.php', - data: 'id_wishlist=' + id_wishlist + '&refresh=' + false, - cache: false, - success: function(data) - { - $('#' + id).hide(); - $('#' + id).html(data); - $('#' + id).fadeIn('slow'); - } - }); -} - -/** - * Show wishlist product managment page - * - * @return void - */ -function WishlistProductManage(id, action, id_wishlist, id_product, id_product_attribute, quantity, priority) -{ - $.ajax({ - type: 'GET', - async: true, - url: baseDir + 'modules/blockwishlist/managewishlist.php', - data: 'action=' + action + '&id_wishlist=' + id_wishlist + '&id_product=' + id_product + '&id_product_attribute=' + id_product_attribute + '&quantity=' + quantity + '&priority=' + priority + '&refresh=' + true, - cache: false, - success: function(data) - { - if (action == 'delete') - $('#wlp_' + id_product + '_' + id_product_attribute).fadeOut('fast'); - else if (action == 'update') - { - $('#wlp_' + id_product + '_' + id_product_attribute).fadeOut('fast'); - $('#wlp_' + id_product + '_' + id_product_attribute).fadeIn('fast'); - } - } - }); -} - -/** - * Delete wishlist - * - * @return boolean succeed - */ -function WishlistDelete(id, id_wishlist, msg) -{ - var res = confirm(msg); - if (res == false) - return (false); - $.ajax({ - type: 'GET', - async: true, - url: baseDir + 'modules/blockwishlist/mywishlist.php', - cache: false, - data: 'deleted&id_wishlist=' + id_wishlist, - success: function(data) - { - $('#' + id).fadeOut('slow'); - } - }); -} - -/** - * Hide/Show bought product - * - * @return void - */ -function WishlistVisibility(bought_class, id_button) -{ - if ($('#hide' + id_button).css('display') == 'none') - { - $('.' + bought_class).slideDown('fast'); - $('#show' + id_button).hide(); - $('#hide' + id_button).css('display', 'block'); - } - else - { - $('.' + bought_class).slideUp('fast'); - $('#hide' + id_button).hide(); - $('#show' + id_button).css('display', 'block'); - } -} - -/** - * Send wishlist by email - * - * @return void - */ -function WishlistSend(id, id_wishlist, id_email) -{ - $.post(baseDir + 'modules/blockwishlist/sendwishlist.php', - { token: static_token, - id_wishlist: id_wishlist, - email1: $('#' + id_email + '1').val(), - email2: $('#' + id_email + '2').val(), - email3: $('#' + id_email + '3').val(), - email4: $('#' + id_email + '4').val(), - email5: $('#' + id_email + '5').val(), - email6: $('#' + id_email + '6').val(), - email7: $('#' + id_email + '7').val(), - email8: $('#' + id_email + '8').val(), - email9: $('#' + id_email + '9').val(), - email10: $('#' + id_email + '10').val() }, - function(data) - { - if (data) - alert(data); - else - WishlistVisibility(id, 'hideSendWishlist'); - }); -} diff --git a/modules/blockwishlist/js/index.php b/modules/blockwishlist/js/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/blockwishlist/js/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/blockwishlist/logo.gif b/modules/blockwishlist/logo.gif deleted file mode 100644 index da3c2a2d74bab159ba0f65d7db601768258afcb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 zcmV-b1FHOqP)5TQ^(M5v$(QKVE?W+9X! z*o}&~6c?_FreF)9NJB7b5Nbn{G0n4+%uJhR9(V5R|NFTpb|HgjefT!tIhLx@DR+N) zV+fHiR5Yt19}k|KnCsND{tH-`IMJ)3AE?OtyZ4>Un|6(d%h#JK`i&a7^xW9>`yBy` zS4SOHeOpC7$?hH5-#7Rswiue_8Ju*2N@$58=a#2OTA3png`w3v->gWif7t%e$ z$NLVS!tFT#8WL|Wa&K~+{%4P2cRfwesYV1_!F=3OaRVHl(>=`%&{x*s30c}#CNE@&;ItrAv!f!)Oy$Q9t$uS=(sD$-J{T*^(8Eez1E-l3}} zPrfHZ1`qsIFe&gipuL8-IZbo2Yg{lFGKs?ZZWcOaOdk*3`5T;$?AjbG1#`B510Er^h2)2r3Y{!8_2Gj=$KzuN5 zaErtW8W_Y2iJJjY)5pmTVJoPJYpanPOEuYHclM^C1F>${hFRpdi8a<2H|Xudf78bm(zwJ9`K%6I?q*Ua~ fW9JvIbn5*B+_J)rUMBs>00000NkvXXu0mjfH&TkY diff --git a/modules/blockwishlist/logo.png b/modules/blockwishlist/logo.png deleted file mode 100755 index 2251c341939be039746002bf8245069e353993bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1929 zcmV;42X^?0P)srl_s$b&UNe?0`*fA2>BFUzYC;GB z*LBy99Xoa;{k3t4&1mMjWYRl4BO`;AstHZgP+YumIKQKQ?otg9Y{Zi3L%tM{SyBo2 zP6+8jI5C6=Jcpj$(@C)d$8n$#pw1&30iof@Z$}X=c^y(W)&IC?LGL9*(Ic-H=l&Z? zhB|@kX5~KoBq^{Vq(fU>Wq<|;YY*FK+a?ti6_v``z-(%4)HR(tqU`Wtj2t(acInCh zG7VDb&~*c=K3R~}7)oqF5-Se3>w&V>`S|_H!8jdCBLf_0q^Ppu5ccg4E1z>uY>dK* zlYh{fa;!JI!)5SDajI30j(=@OdUn1#6zgcr0Kq$@6Q%B;I@}d`*_jO%6%-WEY4nSC zlL0pEnKo@&gX!g~H=u*FMalH6f@qY4l3qKO1&3glbaHOxMM2MzTVc%mt%w^! zDPV;z!Ri@9M5X11p}{l_8tYMFSxTmCMi{bimlnHH2561@pbfryLgM~K0)-Q!uw)I^ zto{m})6&ql?+qwgL(g5(;01*j6}@|3ACQz~u}skf1V)@pjztEz^)FUTiDBeIffbKC zu--5#BpX1tY zU6m3}(f#_}m|%ePUC=B82r@hFFK@^CsS=rQ3aq0sW>b!!Oqw@lbl`8I7#_@fNFf#{ zp_{+~^`B%yYR!lO@}FfzVJDE#cB6E14m(NEhWJS2S3jLgc&?IOR*1Vz^Xq`1(RGD# zf!>4xS|S38ccV)gv>CE5c!#6Jw66K#G|2-7B^E%LYRK0ts(4$o5=y& zQhtl)`=Rr6YPuy8`M`jj||F{|F`aFvVMo=xF zM0d{|fi0|@kawh|T$NA;d^v(5fg*;yG=JTrSohNsWZ(J#Zs;^7K5EsWwBmbg zJWz-;XKNO3n1RVq8sZlcI<>75Q9TLC<=8w!Dn%;8x>`L4eBN-7^PPaA5HGJBfdiFm zF)QzF96LwK%4Xoi`3q`o`;?aG(_s{*=Dvl6U%xORbIvKTVJ0TA8ZD@5L>Q06o(pvE zt^q;92a_8@?0fRDVT4qj*EsHJ3{edztt>&wuWRv4&TH6RF%REIK1Fry1-zRhRX6-+qYWKu% zC}waWv0`2^(wNTwaC2=mnUDqNtqKKmQ;ktLAFGJV6h=V87^hpJ`{`1wT2E899k}CP z6;rWF)?0(~&zWcyU0{G0w+hM`Kph3l{7i5E(;Ebm3@&hlIj^ld769lQKw-$WfS7In zvW9LmtJLkMsix66>gc}NBjqZbs;)-IwjSA-16l$aEl6pLkav0x=@Taj@fz%B&4yp$ ziG)#gqvchCa=&P*js|sK$BnVxC@SBDtJ`@>Y)UbS2{;_`=+4SHeH{4>IJOV-nV)Qc zJX;gpjY##tOZl?V2)&S-j5O;Se7iq_fj5yt(?ekHHzGhl#Ty~>&0e6o601wsU?;zLyx@Jkuxf(VMX7vOoCKFZ$; zBKSJ;J|4tn7{I8frVqh@PPbt)U8eg6UL>ipvp87s9Tt@pV;9XFqke`{@#QGI2m$I` zeNufiQ~Wvjh37o=Q`ApWzYs4*|EB?Qc_ANBGeJIM5o4co(oHPKe+w`GaXezsRpTQ_ P00000NkvXXu0mjftgwpG diff --git a/modules/blockwishlist/mails/en/index.php b/modules/blockwishlist/mails/en/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/blockwishlist/mails/en/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/blockwishlist/mails/en/wishlink.html b/modules/blockwishlist/mails/en/wishlink.html deleted file mode 100644 index 0b3bf9e47..000000000 --- a/modules/blockwishlist/mails/en/wishlink.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - Message from {shop_name} - - - - - - - - - - - - -
  - - - - - - - - - - - - - - - - - - - - - -
- Hi, -
-

- Message from {shop_name}

- - {shop_name} invites you to send this link to your friends, so they can see your wishlist: {wishlist}

- {message} -
-
-
 
- - \ No newline at end of file diff --git a/modules/blockwishlist/mails/en/wishlink.txt b/modules/blockwishlist/mails/en/wishlink.txt deleted file mode 100644 index 98e61a513..000000000 --- a/modules/blockwishlist/mails/en/wishlink.txt +++ /dev/null @@ -1,15 +0,0 @@ - -[{shop_url}] - -Hi, - -Message from {shop_name} - -{shop_name} invites you to send this link to your friends, so they -can see your wishlist: {wishlist} - -{message} [{message}] - -{shop_name} [{shop_url}] powered by -PrestaShop(tm) [http://www.prestashop.com/] - diff --git a/modules/blockwishlist/mails/en/wishlist.html b/modules/blockwishlist/mails/en/wishlist.html deleted file mode 100644 index ef220f26d..000000000 --- a/modules/blockwishlist/mails/en/wishlist.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - Message from {shop_name} - - - - - - - - - - - - -
  - - - - - - - - - - - - - - - - - - - - - -
- Hi, -
-

- Message from {shop_name}

- - {firstname} {lastname} indicated you may want to see his/her wishlist: {wishlist}

- {wishlist} -
-
-
 
- - \ No newline at end of file diff --git a/modules/blockwishlist/mails/en/wishlist.txt b/modules/blockwishlist/mails/en/wishlist.txt deleted file mode 100644 index 65697c159..000000000 --- a/modules/blockwishlist/mails/en/wishlist.txt +++ /dev/null @@ -1,15 +0,0 @@ - -[{shop_url}] - -Hi, - -Message from {shop_name} - -{firstname} {lastname} indicated you may want to see his/her -wishlist: {wishlist} - -{wishlist} [{message}] - -{shop_name} [{shop_url}] powered by -PrestaShop(tm) [http://www.prestashop.com/] - diff --git a/modules/blockwishlist/mails/index.php b/modules/blockwishlist/mails/index.php deleted file mode 100644 index 6f5ff3bab..000000000 --- a/modules/blockwishlist/mails/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/blockwishlist/managewishlist.php b/modules/blockwishlist/managewishlist.php deleted file mode 100644 index 5dd8f8ff7..000000000 --- a/modules/blockwishlist/managewishlist.php +++ /dev/null @@ -1,124 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/* SSL Management */ -$useSSL = true; - -require_once(dirname(__FILE__).'/../../config/config.inc.php'); -require_once(dirname(__FILE__).'/../../init.php'); -require_once(dirname(__FILE__).'/WishList.php'); -require_once(dirname(__FILE__).'/blockwishlist.php'); -$context = Context::getContext(); -if ($context->customer->isLogged()) -{ - $action = Tools::getValue('action'); - $id_wishlist = (int)Tools::getValue('id_wishlist'); - $id_product = (int)Tools::getValue('id_product'); - $id_product_attribute = (int)Tools::getValue('id_product_attribute'); - $quantity = (int)Tools::getValue('quantity'); - $priority = Tools::getValue('priority'); - $wishlist = new WishList((int)($id_wishlist)); - $refresh = (($_GET['refresh'] == 'true') ? 1 : 0); - if (empty($id_wishlist) === false) - { - if (!strcmp($action, 'update')) - { - WishList::updateProduct($id_wishlist, $id_product, $id_product_attribute, $priority, $quantity); - } - else - { - if (!strcmp($action, 'delete')) - WishList::removeProduct($id_wishlist, (int)$context->customer->id, $id_product, $id_product_attribute); - - $products = WishList::getProductByIdCustomer($id_wishlist, $context->customer->id, $context->language->id); - $bought = WishList::getBoughtProduct($id_wishlist); - - for ($i = 0; $i < sizeof($products); ++$i) - { - $obj = new Product((int)($products[$i]['id_product']), false, $context->language->id); - if (!Validate::isLoadedObject($obj)) - continue; - else - { - if ($products[$i]['id_product_attribute'] != 0) - { - $combination_imgs = $obj->getCombinationImages($context->language->id); - if (isset($combination_imgs[$products[$i]['id_product_attribute']][0])) - $products[$i]['cover'] = $obj->id.'-'.$combination_imgs[$products[$i]['id_product_attribute']][0]['id_image']; - else - { - $cover = Product::getCover($obj->id); - $products[$i]['cover'] = $obj->id.'-'.$cover['id_image']; - } - } - else - { - $images = $obj->getImages($context->language->id); - foreach ($images AS $k => $image) - if ($image['cover']) - { - $products[$i]['cover'] = $obj->id.'-'.$image['id_image']; - break; - } - } - if (!isset($products[$i]['cover'])) - $products[$i]['cover'] = $context->language->iso_code.'-default'; - } - $products[$i]['bought'] = false; - for ($j = 0, $k = 0; $j < sizeof($bought); ++$j) - { - if ($bought[$j]['id_product'] == $products[$i]['id_product'] AND - $bought[$j]['id_product_attribute'] == $products[$i]['id_product_attribute']) - $products[$i]['bought'][$k++] = $bought[$j]; - } - } - - $productBoughts = array(); - - foreach ($products as $product) - if (sizeof($product['bought'])) - $productBoughts[] = $product; - $context->smarty->assign(array( - 'products' => $products, - 'productsBoughts' => $productBoughts, - 'id_wishlist' => $id_wishlist, - 'refresh' => $refresh, - 'token_wish' => $wishlist->token - )); - - // Instance of module class for translations - $module = new BlockWishList(); - - if (Tools::file_exists_cache(_PS_THEME_DIR_.'modules/blockwishlist/managewishlist.tpl')) - $context->smarty->display(_PS_THEME_DIR_.'modules/blockwishlist/managewishlist.tpl'); - elseif (Tools::file_exists_cache(dirname(__FILE__).'/managewishlist.tpl')) - $context->smarty->display(dirname(__FILE__).'/managewishlist.tpl'); - else - echo $module->l('No template found', 'managewishlist'); - } - } -} - diff --git a/modules/blockwishlist/managewishlist.tpl b/modules/blockwishlist/managewishlist.tpl deleted file mode 100644 index 82990caba..000000000 --- a/modules/blockwishlist/managewishlist.tpl +++ /dev/null @@ -1,140 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -{if $products} - {if !$refresh} -
- - -

{l s='Permalink' mod='blockwishlist'}:

-

- -

- {/if} -
- -
- {if !$refresh} - - {if count($productsBoughts)} - - - - - - - {foreach from=$productsBoughts item=product name=i} - {foreach from=$product.bought item=bought name=j} - {if $bought.quantity > 0} - - - - - - - {/if} - {/foreach} - {/foreach} - - - {/if} - {/if} -{else} -

{l s='No products' mod='blockwishlist'}

-{/if} \ No newline at end of file diff --git a/modules/blockwishlist/my-account.tpl b/modules/blockwishlist/my-account.tpl deleted file mode 100644 index 14d690af8..000000000 --- a/modules/blockwishlist/my-account.tpl +++ /dev/null @@ -1,33 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - -
  • - - {l s='My wishlists' mod='blockwishlist'} - {l s='My wishlists' mod='blockwishlist'} - -
  • - \ No newline at end of file diff --git a/modules/blockwishlist/mywishlist.php b/modules/blockwishlist/mywishlist.php deleted file mode 100644 index 5cce77395..000000000 --- a/modules/blockwishlist/mywishlist.php +++ /dev/null @@ -1,113 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/* SSL Management */ -$useSSL = true; - -include(dirname(__FILE__).'/../../config/config.inc.php'); -include(dirname(__FILE__).'/../../header.php'); -include_once(dirname(__FILE__).'/WishList.php'); - -$context = Context::getContext(); -$errors = array(); - -Tools::displayFileAsDeprecated(); - -// Instance of module class for translations -$module = new BlockWishList(); - -if ($context->customer->isLogged()) -{ - $add = Tools::getIsset('add'); - $add = (empty($add) === false ? 1 : 0); - $delete = Tools::getIsset('deleted'); - $delete = (empty($delete) === false ? 1 : 0); - $id_wishlist = Tools::getValue('id_wishlist'); - if (Tools::isSubmit('submitWishlist')) - { - if (Configuration::get('PS_TOKEN_ACTIVATED') == 1 AND - strcmp(Tools::getToken(), Tools::getValue('token'))) - $errors[] = $module->l('Invalid token', 'mywishlist'); - if (!sizeof($errors)) - { - $name = Tools::getValue('name'); - if (empty($name)) - $errors[] = $module->l('You must specify a name.', 'mywishlist'); - if (WishList::isExistsByNameForUser($name)) - $errors[] = $module->l('This name is already used by another list.', 'mywishlist'); - - if(!sizeof($errors)) - { - $wishlist = new WishList(); - $wishlist->name = $name; - $wishlist->id_customer = (int)$context->customer->id; - $wishlist->id_shop = $context->shop->id; - $wishlist->id_shop_group = $context->shop->id_shop_group; - list($us, $s) = explode(' ', microtime()); - srand($s * $us); - $wishlist->token = strtoupper(substr(sha1(uniqid(rand(), true)._COOKIE_KEY_.$context->customer->id), 0, 16)); - $wishlist->add(); - Mail::Send($context->language->id, 'wishlink', Mail::l('Your wishlist\'s link', $context->language->id), - array( - '{wishlist}' => $wishlist->name, - '{message}' => Tools::getProtocol().htmlentities($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').__PS_BASE_URI__.'modules/blockwishlist/view.php?token='.$wishlist->token), - $context->customer->email, $context->customer->firstname.' '.$context->customer->lastname, NULL, strval(Configuration::get('PS_SHOP_NAME')), NULL, NULL, dirname(__FILE__).'/mails/'); - } - } - } - else if ($add) - WishList::addCardToWishlist($context->customer->id, Tools::getValue('id_wishlist'), $context->language->id); - else if ($delete AND empty($id_wishlist) === false) - { - $wishlist = new WishList((int)($id_wishlist)); - if (Validate::isLoadedObject($wishlist)) - $wishlist->delete(); - else - $errors[] = $module->l('Cannot delete this wishlist', 'mywishlist'); - } - $context->smarty->assign('wishlists', WishList::getByIdCustomer($context->customer->id)); - $context->smarty->assign('nbProducts', WishList::getInfosByIdCustomer($context->customer->id)); -} -else -{ - Tools::redirect('index.php?controller=authentication&back=modules/blockwishlist/mywishlist.php'); -} - -$context->smarty->assign(array( - 'id_customer' => (int)$context->customer->id, - 'errors' => $errors -)); - -if (Tools::file_exists_cache(_PS_THEME_DIR_.'modules/blockwishlist/mywishlist.tpl')) - $context->smarty->display(_PS_THEME_DIR_.'modules/blockwishlist/mywishlist.tpl'); -elseif (Tools::file_exists_cache(dirname(__FILE__).'/views/templates/front/mywishlist.tpl')) - $context->smarty->display(dirname(__FILE__).'/views/templates/front/mywishlist.tpl'); -else - echo $module->l('No template found', 'mywishlist'); - -include(dirname(__FILE__).'/../../footer.php'); - - diff --git a/modules/blockwishlist/sendwishlist.php b/modules/blockwishlist/sendwishlist.php deleted file mode 100644 index c0eb98c78..000000000 --- a/modules/blockwishlist/sendwishlist.php +++ /dev/null @@ -1,69 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -require_once(dirname(__FILE__).'/../../config/config.inc.php'); -require_once(dirname(__FILE__).'/../../init.php'); -require_once(dirname(__FILE__).'/WishList.php'); -require_once(dirname(__FILE__).'/blockwishlist.php'); - -$context = Context::getContext(); - -// Instance of module class for translations -$module = new BlockWishList(); - -if (Configuration::get('PS_TOKEN_ENABLE') == 1 AND - strcmp(Tools::getToken(false), Tools::getValue('token')) AND - $context->customer->isLogged() === true) - exit($module->l('invalid token', 'sendwishlist')); - -if ($context->customer->isLogged()) -{ - $id_wishlist = (int)(Tools::getValue('id_wishlist')); - if (empty($id_wishlist) === true) - exit($module->l('Invalid wishlist', 'sendwishlist')); - for ($i = 1; empty($_POST['email'.strval($i)]) === false; ++$i) - { - $to = Tools::getValue('email'.$i); - $wishlist = WishList::exists($id_wishlist, $context->customer->id, true); - if ($wishlist === false) - exit($module->l('Invalid wishlist', 'sendwishlist')); - if (WishList::addEmail($id_wishlist, $to) === false) - exit($module->l('Wishlist send error', 'sendwishlist')); - $toName = strval(Configuration::get('PS_SHOP_NAME')); - $customer = $context->customer; - if (Validate::isLoadedObject($customer)) - Mail::Send( - $context->language->id, - 'wishlist', - sprintf(Mail::l('Message from %1$s %2$s', $context->language->id), $customer->lastname, $customer->firstname), - array( - '{lastname}' => $customer->lastname, - '{firstname}' => $customer->firstname, - '{wishlist}' => $wishlist['name'], - '{message}' => Tools::getProtocol().htmlentities($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').__PS_BASE_URI__.'modules/blockwishlist/view.php?token='.$wishlist['token']), - $to, $toName, $customer->email, $customer->firstname.' '.$customer->lastname, NULL, NULL, dirname(__FILE__).'/mails/'); - } -} diff --git a/modules/blockwishlist/translations/index.php b/modules/blockwishlist/translations/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/blockwishlist/translations/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/blockwishlist/upgrade/install-0.3.php b/modules/blockwishlist/upgrade/install-0.3.php deleted file mode 100644 index 1d2b8f3d3..000000000 --- a/modules/blockwishlist/upgrade/install-0.3.php +++ /dev/null @@ -1,9 +0,0 @@ -registerHook('displayProductListFunctionalButtons') && $object->registerHook('top')); -} diff --git a/modules/blockwishlist/view.php b/modules/blockwishlist/view.php deleted file mode 100644 index 0d02e7b6d..000000000 --- a/modules/blockwishlist/view.php +++ /dev/null @@ -1,110 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/* SSL Management */ -$useSSL = true; - -require_once(dirname(__FILE__).'/../../config/config.inc.php'); -require_once(dirname(__FILE__).'/../../header.php'); -require_once(dirname(__FILE__).'/WishList.php'); - -error_reporting(0); - -$context = Context::getContext(); -$token = Tools::getValue('token'); - -// Instance of module class for translations -$module = new BlockWishList(); - -if (empty($token) === false) -{ - $wishlist = WishList::getByToken($token); - if (empty($result) === true || $result === false) - $errors[] = $module->l('Invalid wishlist token', 'view'); - WishList::refreshWishList($wishlist['id_wishlist']); - $products = WishList::getProductByIdCustomer((int)($wishlist['id_wishlist']), (int)($wishlist['id_customer']), $context->language->id, null, true); - - for ($i = 0; $i < sizeof($products); ++$i) - { - $obj = new Product((int)($products[$i]['id_product']), false, $context->language->id); - if (!Validate::isLoadedObject($obj)) - continue; - else - { - $quantity = Product::getQuantity((int)$products[$i]['id_product'], $products[$i]['id_product_attribute']); - $products[$i]['attribute_quantity'] = $quantity; - $products[$i]['product_quantity'] = $quantity; - if ($products[$i]['id_product_attribute'] != 0) - { - $combination_imgs = $obj->getCombinationImages($context->language->id); - if (isset($combination_imgs[$products[$i]['id_product_attribute']][0])) - $products[$i]['cover'] = $obj->id.'-'.$combination_imgs[$products[$i]['id_product_attribute']][0]['id_image']; - else - { - $cover = Product::getCover($obj->id); - $products[$i]['cover'] = $obj->id.'-'.$cover['id_image']; - } - } - else - { - $images = $obj->getImages($context->language->id); - foreach ($images AS $k => $image) - if ($image['cover']) - { - $products[$i]['cover'] = $obj->id.'-'.$image['id_image']; - break; - } - } - if (!isset($products[$i]['cover'])) - $products[$i]['cover'] = $context->language->iso_code.'-default'; - } - $products[$i]['bought'] = false; - for ($j = 0, $k = 0; $j < sizeof($bought); ++$j) - { - if ($bought[$j]['id_product'] == $products[$i]['id_product'] AND - $bought[$j]['id_product_attribute'] == $products[$i]['id_product_attribute']) - $products[$i]['bought'][$k++] = $bought[$j]; - } - } - - WishList::incCounter((int)($wishlist['id_wishlist'])); - $ajax = Configuration::get('PS_BLOCK_CART_AJAX'); - $context->smarty->assign(array ( - 'current_wishlist' => $wishlist, - 'token' => $token, - 'ajax' => ((isset($ajax) AND (int)($ajax) == 1) ? '1' : '0'), - 'wishlists' => WishList::getByIdCustomer((int)($wishlist['id_customer'])), - 'products' => $products)); -} - -if (Tools::file_exists_cache(_PS_THEME_DIR_.'modules/blockwishlist/view.tpl')) - $context->smarty->display(_PS_THEME_DIR_.'modules/blockwishlist/view.tpl'); -elseif (Tools::file_exists_cache(dirname(__FILE__).'/view.tpl')) - $context->smarty->display(dirname(__FILE__).'/view.tpl'); -else - echo $module->l('No template found', 'view'); - -require(dirname(__FILE__).'/../../footer.php'); diff --git a/modules/blockwishlist/view.tpl b/modules/blockwishlist/view.tpl deleted file mode 100644 index 5d10b5717..000000000 --- a/modules/blockwishlist/view.tpl +++ /dev/null @@ -1,92 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -
    -

    {l s='Wishlist' mod='blockwishlist'}

    -{if $wishlists} -

    - {l s='Other wishlists of' mod='blockwishlist'} {$current_wishlist.firstname} {$current_wishlist.lastname}: - {foreach from=$wishlists item=wishlist name=i} - {if $wishlist.id_wishlist != $current_wishlist.id_wishlist} - {$wishlist.name} - {if !$smarty.foreach.i.last} - / - {/if} - {/if} - {/foreach} -

    -{/if} - -
    -
      - {foreach from=$products item=product name=i} -
    • -
      -
      - - {$product.name|escape:'html':'UTF-8'} - -
      -
      -

      {$product.name|truncate:30:'...'|escape:'html':'UTF-8'}

      - - {if isset($product.attributes_small)} - {$product.attributes_small|escape:'html':'UTF-8'} - {/if} -
      {l s='Quantity' mod='blockwishlist'}: -

      - {l s='Priority' mod='blockwishlist'}: - -
      -
      -
      -
      - {l s='View' mod='blockwishlist'} - {if isset($product.attribute_quantity) AND $product.attribute_quantity >= 1 OR !isset($product.attribute_quantity) AND $product.product_quantity >= 1} - {if !$ajax} -
      - -
      - {/if} - {l s='Add to cart' mod='blockwishlist'} - {else} - {l s='Add to cart' mod='blockwishlist'} - {/if} -
      -
    • - {/foreach} -
    -
    - -
    diff --git a/modules/blockwishlist/views/index.php b/modules/blockwishlist/views/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/blockwishlist/views/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/blockwishlist/views/templates/admin/_configure/helpers/index.php b/modules/blockwishlist/views/templates/admin/_configure/helpers/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/blockwishlist/views/templates/admin/_configure/helpers/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/blockwishlist/views/templates/admin/_configure/helpers/list/index.php b/modules/blockwishlist/views/templates/admin/_configure/helpers/list/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/blockwishlist/views/templates/admin/_configure/helpers/list/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/blockwishlist/views/templates/admin/_configure/helpers/list/list_content.tpl b/modules/blockwishlist/views/templates/admin/_configure/helpers/list/list_content.tpl deleted file mode 100644 index ab842ec66..000000000 --- a/modules/blockwishlist/views/templates/admin/_configure/helpers/list/list_content.tpl +++ /dev/null @@ -1,37 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -{extends file="helpers/list/list_content.tpl"} - -{block name="td_content"} - {if isset($params.type) && $params.type == 'priority'} - {$priority[$tr.$key]} - {elseif isset($params.type) && $params.type == 'image'} - - {else} - {$smarty.block.parent} - {/if} - -{/block} diff --git a/modules/blockwishlist/views/templates/admin/_configure/index.php b/modules/blockwishlist/views/templates/admin/_configure/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/blockwishlist/views/templates/admin/_configure/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/blockwishlist/views/templates/admin/index.php b/modules/blockwishlist/views/templates/admin/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/blockwishlist/views/templates/admin/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/blockwishlist/views/templates/front/index.php b/modules/blockwishlist/views/templates/front/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/blockwishlist/views/templates/front/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/blockwishlist/views/templates/front/mywishlist.tpl b/modules/blockwishlist/views/templates/front/mywishlist.tpl deleted file mode 100644 index d1ee85356..000000000 --- a/modules/blockwishlist/views/templates/front/mywishlist.tpl +++ /dev/null @@ -1,99 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -
    - {capture name=path}{l s='My account' mod='blockwishlist'}{$navigationPipe}{l s='My wishlists' mod='blockwishlist'}{/capture} - {include file="$tpl_dir./breadcrumb.tpl"} - -

    {l s='My wishlists' mod='blockwishlist'}

    - - {include file="$tpl_dir./errors.tpl"} - - {if $id_customer|intval neq 0} -
    -
    -

    {l s='New wishlist' mod='blockwishlist'}

    -

    - - - -

    -

    - -

    -
    -
    - {if $wishlists} -
    - - - - - - - - - - - - - {section name=i loop=$wishlists} - - - - - - - - - {/section} - -
    {l s='Name' mod='blockwishlist'}{l s='Qty' mod='blockwishlist'}{l s='Viewed' mod='blockwishlist'}{l s='Created' mod='blockwishlist'}{l s='Direct Link' mod='blockwishlist'}{l s='Delete' mod='blockwishlist'}
    - {$wishlists[i].name|truncate:30:'...'|escape:'html':'UTF-8'} - - {assign var=n value=0} - {foreach from=$nbProducts item=nb name=i} - {if $nb.id_wishlist eq $wishlists[i].id_wishlist} - {assign var=n value=$nb.nbProducts|intval} - {/if} - {/foreach} - {if $n} - {$n|intval} - {else} - 0 - {/if} - {$wishlists[i].counter|intval}{$wishlists[i].date_add|date_format:"%Y-%m-%d"}{l s='View' mod='blockwishlist'} - {l s='Delete' mod='blockwishlist'} -
    -
    -
     
    - {/if} - {/if} - - -
    diff --git a/modules/blockwishlist/views/templates/index.php b/modules/blockwishlist/views/templates/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/blockwishlist/views/templates/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/carriercompare/ajax.php b/modules/carriercompare/ajax.php deleted file mode 100644 index 7b90d3b33..000000000 --- a/modules/carriercompare/ajax.php +++ /dev/null @@ -1,53 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/* SSL Management */ -$useSSL = true; - -require_once(dirname(__FILE__).'../../../config/config.inc.php'); -require_once(dirname(__FILE__).'../../../init.php'); -require_once(dirname(__FILE__).'/carriercompare.php'); - -$carrierCompare = new CarrierCompare(); - -switch (Tools::getValue('method')) -{ - case 'getStates': - if (!(int)Tools::getValue('id_country')) - exit; - die(Tools::jsonEncode($carrierCompare->getStatesByIdCountry((int)Tools::getValue('id_country')))); - break; - case 'getCarriers': - die(Tools::jsonEncode($carrierCompare->getCarriersListByIdZone((int)Tools::getValue('id_country'), (int)Tools::getValue('id_state', 0), Tools::safeOutput(Tools::getValue('zipcode', 0))))); - break; - case 'saveSelection': - $errors = $carrierCompare->saveSelection((int)Tools::getValue('id_country'), (int)Tools::getValue('id_state', 0), Tools::getValue('zipcode', 0), (int)Tools::getValue('id_carrier', 0)); - die(Tools::jsonEncode($errors)); - break; - default: - exit; -} -exit; diff --git a/modules/carriercompare/carriercompare.js b/modules/carriercompare/carriercompare.js deleted file mode 100644 index a3a63459c..000000000 --- a/modules/carriercompare/carriercompare.js +++ /dev/null @@ -1,194 +0,0 @@ -/* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -function PS_SE_HandleEvent() -{ - $(document).ready(function() { - $('#id_country').change(function() { - resetAjaxQueries(); - updateStateByIdCountry(); - }); - - if (SE_RefreshMethod == 0) - { - $('#id_state').change(function() { - resetAjaxQueries(); - updateCarriersList(); - }); - - $('#zipcode').bind('keyup',function(e) { - if (e.keyCode == '13') - { - resetAjaxQueries(); - updateCarriersList(); - } - }); - } - - $('#update_carriers_list').click(function() { - updateCarriersList(); - }); - - $('#carriercompare_submit').click(function() { - resetAjaxQueries(); - saveSelection(); - return false; - }); - - updateStateByIdCountry(); - }); -} - -function displayWaitingAjax(type, message) -{ - $('#SE_AjaxDisplay').find('p').html(message); - $('#SE_AjaxDisplay').css('display', type); -} - -function updateStateByIdCountry() -{ - $('#id_state').children().remove(); - $('#availableCarriers').slideUp('fast'); - $('#states').slideUp('fast'); - displayWaitingAjax('block', SE_RefreshStateTS); - - var query = $.ajax({ - type: 'POST', - headers: { "cache-control": "no-cache" }, - url: baseDir + 'modules/carriercompare/ajax.php' + '?rand=' + new Date().getTime(), - data: 'method=getStates&id_country=' + $('#id_country').val(), - dataType: 'json', - success: function(json) { - if (json.length) - { - for (state in json) - { - $('#id_state').append(''); - } - $('#states').slideDown('fast'); - } - if (SE_RefreshMethod == 0) - updateCarriersList(); - displayWaitingAjax('none', ''); - } - }); - ajaxQueries.push(query); -} - -function updateCarriersList() -{ - $('#carriercompare_errors_list').children().remove(); - $('#availableCarriers').slideUp('normal', function(){ - $(this).find(('tbody')).children().remove(); - $('#noCarrier').slideUp('fast'); - displayWaitingAjax('block', SE_RetrievingInfoTS); - - var query = $.ajax({ - type: 'POST', - headers: { "cache-control": "no-cache" }, - url: baseDir + 'modules/carriercompare/ajax.php' + '?rand=' + new Date().getTime(), - data: 'method=getCarriers&id_country=' + $('#id_country').val() + '&id_state=' + $('#id_state').val() + '&zipcode=' + $('#zipcode').val(), - dataType: 'json', - success: function(json) { - if (json.length) - { - for (carrier in json) - { - var html = ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+((json[carrier].delay != null) ? json[carrier].delay : '') +''+ - ''; - - if (json[carrier].price) - { - html += ''+(displayPrice == 1 ? formatCurrency(json[carrier].price_tax_exc, currencyFormat, currencySign, currencyBlank) : formatCurrency(json[carrier].price, currencyFormat, currencySign, currencyBlank))+''; - } - else - { - html += txtFree; - } - html += ''+ - ''; - $('#carriers_list').append(html); - } - displayWaitingAjax('none', ''); - $('#availableCarriers').slideDown(); - } - else - { - displayWaitingAjax('none', ''); - $('#noCarrier').slideDown(); - } - } - }); - ajaxQueries.push(query); - }); -} - -function saveSelection() -{ - $('#carriercompare_errors').slideUp(); - $('#carriercompare_errors_list').children().remove(); - displayWaitingAjax('block', SE_RedirectTS); - - var query = $.ajax({ - type: 'POST', - headers: { "cache-control": "no-cache" }, - url: baseDir + 'modules/carriercompare/ajax.php' + '?rand=' + new Date().getTime(), - data: 'method=saveSelection&' + $('#compare_shipping_form').serialize(), - dataType: 'json', - success: function(json) { - if (json.length) - { - for (error in json) - $('#carriercompare_errors_list').append('
  • '+json[error]+'
  • '); - $('#carriercompare_errors').slideDown(); - displayWaitingAjax('none', ''); - } - else - { - $('.SE_SubmitRefreshCard').fadeOut('fast'); - location.reload(true); - } - } - }); - ajaxQueries.push(query); - return false; -} - -var ajaxQueries = new Array(); -function resetAjaxQueries() -{ - for (i = 0; i < ajaxQueries.length; ++i) - ajaxQueries[i].abort(); - ajaxQueries = new Array(); -} \ No newline at end of file diff --git a/modules/carriercompare/carriercompare.php b/modules/carriercompare/carriercompare.php deleted file mode 100755 index 34c4bb308..000000000 --- a/modules/carriercompare/carriercompare.php +++ /dev/null @@ -1,341 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class CarrierCompare extends Module -{ - public $template_directory = ''; - public $smarty; - - public function __construct() - { - $this->name = 'carriercompare'; - $this->tab = 'shipping_logistics'; - $this->version = '1.2'; - $this->author = 'PrestaShop'; - $this->need_instance = 0; - - $this->bootstrap = true; - parent::__construct(); - - $this->displayName = $this->l('Shipping Estimate'); - $this->description = $this->l('Compares carrier choices before checkout.'); - $this->template_directory = dirname(__FILE__).'/template/'; - $this->initRetroCompatibilityVar(); - } - - // Retro-compatibiliy 1.4/1.5 - private function initRetroCompatibilityVar() - { - if (class_exists('Context')) - $smarty = Context::getContext()->smarty; - else - global $smarty; - - $this->smarty = $smarty; - } - - public function install() - { - if (!parent::install() OR !$this->registerHook('shoppingCart') OR !$this->registerHook('header')) - return false; - return true; - } - - public function getContent() - { - $output = ''; - if (Tools::isSubmit('setGlobalConfiguration')) - if (Configuration::updateValue('SE_RERESH_METHOD', (int)Tools::getValue('SE_RERESH_METHOD'))) - $output .= $this->displayConfirmation('Configuration updated'); - - return $output.$this->renderForm(); - } - - public function hookHeader($params) - { - if (!$this->isModuleAvailable()) - return; - $this->context->controller->addCSS(($this->_path).'style.css', 'all'); - $this->context->controller->addJS(($this->_path).'carriercompare.js'); - } - - /* - ** Hook Shopping Cart Process - */ - public function hookShoppingCart($params) - { - if (!$this->isModuleAvailable()) - return; - - if (!isset($this->context->cart) || $this->context->cart->getProducts() == 0) - return; - - $protocol = (Configuration::get('PS_SSL_ENABLED') || (!empty($_SERVER['HTTPS']) - && strtolower($_SERVER['HTTPS']) != 'off')) ? 'https://' : 'http://'; - - $endURL = __PS_BASE_URI__.'modules/carriercompare/'; - - if (method_exists('Tools', 'getShopDomainSsl')) - $moduleURL = $protocol.Tools::getShopDomainSsl().$endURL; - else - $moduleURL = $protocol.$_SERVER['HTTP_HOST'].$endURL; - - $refresh_method = Configuration::get('SE_RERESH_METHOD'); - - if(isset($this->context->cookie->id_country) && $this->context->cookie->id_country > 0) - $id_country = (int)$this->context->cookie->id_country; - if(!isset($id_country)) - $id_country = (isset($this->context->customer->geoloc_id_country) ? (int)$this->context->customer->geoloc_id_country : (int)Configuration::get('PS_COUNTRY_DEFAULT')); - if (isset($this->context->customer->id) && $this->context->customer->id && isset($this->context->cart->id_address_delivery) && $this->context->cart->id_address_delivery) - { - $address = new Address((int)($this->context->cart->id_address_delivery)); - $id_country = (int)$address->id_country; - } - - - if(isset($this->context->cookie->id_state) && $this->context->cookie->id_state > 0) - $id_state = (int)$this->context->cookie->id_state; - if(!isset($id_state)) - $id_state = (isset($this->context->customer->geoloc_id_state) ? (int)$this->context->customer->geoloc_id_state : 0); - - if(isset($this->context->cookie->postcode) && $this->context->cookie->postcode > 0) - $zipcode = Tools::safeOutput($this->context->cookie->postcode); - if(!isset($zipcode)) - $zipcode = (isset($this->context->customer->geoloc_postcode) ? $this->context->customer->geoloc_postcode : ''); - - $this->smarty->assign(array( - 'countries' => Country::getCountries((int)$this->context->cookie->id_lang, true), - 'id_carrier' => ($params['cart']->id_carrier ? $params['cart']->id_carrier : Configuration::get('PS_CARRIER_DEFAULT')), - 'id_country' => $id_country, - 'id_state' => $id_state, - 'zipcode' => $zipcode, - 'currencySign' => $this->context->currency->sign, - 'currencyRate' => $this->context->currency->conversion_rate, - 'currencyFormat' => $this->context->currency->format, - 'currencyBlank' => $this->context->currency->blank, - 'new_base_dir' => $moduleURL, - 'refresh_method' => ($refresh_method === false) ? 0 : $refresh_method - )); - - return $this->display(__FILE__, 'template/carriercompare.tpl'); - } - - /* - ** Get states by Country id, called by the ajax process - ** id_state allow to preselect the selection option - */ - public function getStatesByIdCountry($id_country, $id_state = '') - { - $states = State::getStatesByIdCountry($id_country); - - return (sizeof($states) ? $states : array()); - } - - /* - ** Get carriers by country id, called by the ajax process - */ - public function getCarriersListByIdZone($id_country, $id_state = 0, $zipcode = 0) - { - // cookie saving/updating - $this->context->cookie->id_country = $id_country; - if ($id_state != 0) - $this->context->cookie->id_state = $id_state; - if ($zipcode != 0) - $this->context->cookie->postcode = $zipcode; - - $id_zone = 0; - if ($id_state != 0) - $id_zone = State::getIdZone($id_state); - if (!$id_zone) - $id_zone = Country::getIdZone($id_country); - - // Need to set the infos for carrier module ! - $this->context->cookie->id_country = $id_country; - $this->context->cookie->id_state = $id_state; - $this->context->cookie->postcode = $zipcode; - - $carriers = Carrier::getCarriersForOrder((int)$id_zone); - - return (sizeof($carriers) ? $carriers : array()); - } - - public function saveSelection($id_country, $id_state, $zipcode, $id_carrier) - { - $errors = array(); - - if (!Validate::isInt($id_state)) - $errors[] = $this->l('Invalid State ID'); - if ($id_state != 0 && !Validate::isLoadedObject(new State($id_state))) - $errors[] = $this->l('Please select a state'); - if (!Validate::isInt($id_country) || !Validate::isLoadedObject(new Country($id_country))) - $errors[] = $this->l('Please select a country'); - if (!$this->checkZipcode($zipcode, $id_country)) - $errors[] = $this->l('Depending on your country selection, please use a valid zip/postal code.'); - if (!Validate::isInt($id_carrier) || !Validate::isLoadedObject(new Carrier($id_carrier))) - $errors[] = $this->l('Please select a carrier'); - - if (sizeof($errors)) - return $errors; - - $ids_carrier = array(); - foreach (self::getCarriersListByIdZone($id_country, $id_state, $zipcode) as $carrier) - $ids_carrier[] = $carrier['id_carrier']; - if (!in_array($id_carrier, $ids_carrier)) - $errors[] = $this->l('The carrier ID isn\'t available for your selection'); - - if (sizeof($errors)) - return $errors; - - $this->context->cookie->id_country = $id_country; - $this->context->cookie->id_state = $id_state; - $this->context->cookie->postcode = $zipcode; - $this->context->cart->id_carrier = $id_carrier; - $delivery_option_list = $this->context->cart->getDeliveryOptionList(); - - $delivery_option = reset($delivery_option_list); - $id_carrier = (string)$id_carrier; - $id_carrier .= ','; - foreach ($delivery_option_list as $id_address => $options) - if (isset($options[$id_carrier])) - $this->context->cart->setDeliveryOption(array($id_address => $id_carrier)); - - if (!$this->context->cart->update()) - return array($this->l('Cannot update the shopping cart.')); - return array(); - } - - /* - ** Check the validity of the zipcode format depending of the country - */ - private function checkZipcode($zipcode, $id_country) - { - $country = new Country((int)$id_country); - if (!Validate::isLoadedObject($country)) - return true; - $zipcodeFormat = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' - SELECT `zip_code_format` - FROM `'._DB_PREFIX_.'country` - WHERE `id_country` = '.(int)$id_country); - - if (!$country->need_zip_code || !$country->zip_code_format) - return true; - - $regxMask = str_replace( - array('N', 'C', 'L'), - array( - '[0-9]', - $country->iso_code, - '[a-zA-Z]'), - $country->zip_code_format); - if (preg_match('/'.$regxMask.'/', $zipcode)) - return true; - return false; - } - - /** - * This module is shown on front office, in only some conditions - * @return bool - */ - private function isModuleAvailable() - { - $fileName = basename($_SERVER['SCRIPT_FILENAME']); - /** - * This module is only available on standard order process because - * on One Page Checkout the carrier list is already available. - */ - if (Configuration::get('PS_ORDER_PROCESS_TYPE') == 1) - return false; - /** - * If visitor is logged, the module isn't available on Front office, - * we use the account informations for carrier selection and taxes. - */ - /*if (Context::getContext()->customer->id) - return false;*/ - return true; - } - - public function renderForm() - { - $fields_form = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Settings'), - 'icon' => 'icon-cogs' - ), - 'input' => array( - array( - 'type' => 'select', - 'label' => $this->l('How to refresh the carrier list?'), - 'name' => 'SE_RERESH_METHOD', - 'required' => false, - 'desc' => $this->l('This determines when the list of carriers presented to the customer is updated.'), - 'default_value' => (int)$this->context->country->id, - 'options' => array( - 'query' => array( - array('id' => 0, 'name' => $this->l('Automatically with each field change')), - array('id' => 1, 'name' => $this->l('When the customer clicks on the "Estimate Shipping Cost" button')) - ), - 'id' => 'id', - 'name' => 'name', - ), - ), - ), - 'submit' => array( - 'title' => $this->l('Save'), - 'class' => 'btn btn-default') - ), - ); - - $helper = new HelperForm(); - $helper->show_toolbar = false; - $helper->table = $this->table; - $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); - $helper->default_form_language = $lang->id; - $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; - $helper->identifier = $this->identifier; - $helper->submit_action = 'setGlobalConfiguration'; - $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->tpl_vars = array( - 'fields_value' => $this->getConfigFieldsValues(), - 'languages' => $this->context->controller->getLanguages(), - 'id_language' => $this->context->language->id - ); - - return $helper->generateForm(array($fields_form)); - } - - public function getConfigFieldsValues() - { - return array( - 'SE_RERESH_METHOD' => Tools::getValue('SE_RERESH_METHOD', Configuration::get('SE_RERESH_METHOD')), - ); - } -} - diff --git a/modules/carriercompare/config.xml b/modules/carriercompare/config.xml deleted file mode 100644 index 7c07a8bb2..000000000 --- a/modules/carriercompare/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - carriercompare - - - - - - 1 - 0 - - \ No newline at end of file diff --git a/modules/carriercompare/index.php b/modules/carriercompare/index.php deleted file mode 100644 index a230e5ac6..000000000 --- a/modules/carriercompare/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/carriercompare/loader.gif b/modules/carriercompare/loader.gif deleted file mode 100755 index cd4e37cc2cc0cb7a360c73b2092a70b45e929c58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3719 zcmdVc`&S$1nFsK9Ml++)NJ4jM5EAIZMF@e#C76q`C1BoQ=dyB3oQvBY*>Uy|Z<>Qs zCrwjtSIh{Z3l5TlYKU8q!4M*Fif>JmIE^5-gE3CQiJdf<7#s&<$MLQ4uD8u;cO3t) zO-|1KzVjE%eCGK+&-dQdu%dDU4QQ|k!T9+5r%rv`-~Z-IFO42JaAeb_9gU4azkhJ+ z*56#b`1$3_7eD!A?u##$78fsEy?W`bw~pVq@x^DKefIk6$1Ys>?8=p;Yu7HHIrGV% z{&Z$?@`F!5J-4{{`O?zj@bEj^w(b7#!#`iY{zWYI+TOjXnVFByp8d49_w{}I-rcq9 z(BRNed-eVIPai!xeemGXFTcF>(MPkFE-n7_ zr(NUYCx7yj7w6{A4Gp~=i44E}_GB#fyXT(k;kd!3rg&f98}GbxqNC%rRO;mU^XG5g zyaN9JJm!ChA7mPTSm*XIB}GmF!oRuszcCyD2po65;?8dZ!hiT6%lRQew1!%B%XC~D zr;(*vAnQ7t3 z)d%;#k~G))^B#M4^H4Hz)UAGA(y;c)TA$^Za-gZ$>k6&0qS$DnWg1oHtOs2;QZosI zWu^K?;u!>Y8`iA39di4C6|6JiqbV}diM*_T)HB|ikXB({XRXht(1VSQ@;zSc_w_Q& z-!*pn-&$#qw?aPUZG3vYyApsXZr|&7|5!KxOnna#A_e%RW)A{SM1H;=N55^S`)4~G zZw>ho0m9p58tE{bORnPWjD#%?#Uv@??UV%3nLtS+6$oaydP3SfElU|m!+wYo73raD zp)gMcv3_V;29szw{XJo|Op-gmnQa+~{F;fp#6^irxcuUmS6c-)ZoYGky?Ha|)?aUx z7Nfd2tzHYvGq@4Ow%*s7Xo!i_#1mx9BP6s1Tcs~MQI;jsG8$d+=!C?Ika8zlhfM;e zeOuEbds<==ndQn3S4zQ8#E-D+*WFPLOH*zznOa(7y(Kl6jYtM3aWqoG1k9 zyaBGnWJfDzUB_8n_KBRhZMMQ3QUgJL+)O<76kt3tA4le>9e()&*DALvH*RV1SwpO& z!Q}Gd$1JrKYec8kIf87SMnLAq*&=};pQiyN$tO-JC{zc6)T*9vx-6Yl7YbG!fEa0H z*fNujRidaYW2hhIbtf@sFU0X>tYQkSqDylII9V=bD4$(9$z_^P%HpQk@{({Vjb00t z;Or2eI0c_LZaX)!_tKV{ zM&}Q*!2ltmHp`2rNwExR*A%aNrXGm1nv_R}QiFuMEKxjt9sW3VDEfw5l`^l+^TunF59_ ztwM_rK$);w#fte21Tc)IAl(mh3@|B!6iSl2^i!A;amWU^<#`g!IJat&6Dv;^#B=A2 ze-1eiY$PO;H~Y>cy%s>K#+&dy-@9!hRk-Qa`Gq=;7XEv)BGuI=C$OhHWn*>xKC$n1 zdO;AYr5wNc%7fLSM5vrhjqT^!9?vV?Hob1s&OS+jbnBhHg1fUUYV#u^0VN45)!o4S zxLL^bzL2x$(AdYnliJ&**!OXKeU}48c@73JJV%j19OeqJTAsro$ceLh4Ab%)I)Q-a zpfRN*5L9RPg!L9Z>ri640}u!b--79R1JDV8MGcXDC{w~DfD*G%n9bU!K(Sa;Fv;fU zsAbi2HA}E4|D+|JH&?wptPz9C_|t~ySR(Fb5T$+7L&q_;O|G#UW;TQRps+NJ_4GHm znG&kmvpeYaTNpknYZE?Mrr&VCE8X4FC$}{=kIvl0rEaO`X`kn~52-JDMEksX!p%~9 zAEQ(I+|#%`RrYjhgEx3=7p&R#0Cog~_q95=raa%>9d`qA{VoWG@gRDqo(EAV)5Dwv z z<|DU>`DQ*!^}q1>d_~*+_nTbT`}Ga!CbfLY`3yL`&gh}@J*oAI7)j7&-c&;rEpH?# zuO;<4Zu2R{pRC{2{cW@REp``Qppxg9EG=}^ir zqEV&~TAXkQfu;2*s)U*ojDnI|_i)+*2VFI5KAuobiF#$TRl1OzVkEsfwD?~~^bMnl zm{Op$msJG0@m7iTS8r~acdrVu4;m__tw)nmTdn*BFFVE=Ggcq2%TDoOPZ=6zx! zy)4?$iL@aIq}0xF#ND=0`=GbhKMtZ&cbk352bS!TqPG~$SH4B|p$DoZ%Bm$Hs(QHk zdAhpM<3m2e=^aLz{NKEMR|Y|NnKWq{FJpJ=L!5|F@iI0~twBVjvW5db_*2BVO} z4o&`VM_9Rnxo3Zy7!<2neF4)+^+Br`zB=WgF%0yI_HdOJ4Wc|%d+haK!6~J7p;L?L z9Q@Vw%g~#DxdxSg`Rdk4Mj>JD%_o37V8hY`glC(**b72p&I#PXIv*u3A?GUGh$|8> z{D{8fYn~vi2LAI)QvR4gm`Ts1nt{+td!CnH7>6ypNI4zb;(hNBp3`MU*QVMit9!fi z<1O=9!(#g{$nfS1#FS*D>yPx2(+wShyx0DiaIYIOiL;5RHwymt{io&X-Q+M#Ybfk* z8tsBhFo*J~f@sfxRrAxylDR5i zS#F^2Ut#L(J0g)(U0oeCEwvuj+S}zWUy2N=ARz(XOVF zRyu-++00?00?i2UJ(bBkqK-XD6er|r*4h#5vaem&k z!@0OPcMVboQr51;5JyC2izciNdzp@CTol$uP!${e(y?D97Zu@nZQv5+R%&l1Ynkg#!gF+Iq z8}O2-gtSXURpYLPEsOV9<2moO=NjBUu#Vv08Gq?Tl>P- zvp0OTA$8C(GBj!;+_W8w-PUc?`;ZISEBJEm0#-GF`pgsKAqiV{kOr<_1FMc~@G5@j z4=_1IG~xY#6pOI5LxTL|kV2gEACQ{d5cTb1{qjd0@eQmtVfJZ diff --git a/modules/carriercompare/logo.gif b/modules/carriercompare/logo.gif deleted file mode 100644 index 482ceea3cddf5a48431d1f910553c60ea5683cb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 583 zcmZ?wbhEHb6krfwc*elsZK-&DWA(N=7oCJ9)tm3CN6ml!>A$L}@A3J?n>TMxPEI~@ z8L9Ky+U{zCh92BX{H(G}s;ZJJ7!3_IjQIJ@1Z36Kot#uu82&S~ qanyWt65wFv)3KPaAmM^zTa%Q5&jEuY3Y}a!=WdsW>?>z50cL1L3;kM)ep+x8Klpk($ zCXi7_u}rULJzXVa;iie>r0OEbWVRh4Zx#UA8+Y)3DZ+XR*@~{+`nY?!H!{Il_3;5{ zX#QOJf@GEc0THJn5h#ygz6xkPg%s@Dg;NH2vDW$9VbIeLbiHW*Zuq_RBuL23G5{~H zdmna}R=}=+@1d1krfjLErt1HOy2(AwGzt5>fANs^F6o6k+V51;jX-Q6qfWF>NkWh(xy;l?$=@hpwU9lR{E1LjAvk8~Y3XmjQr2>yl zQ(&P^r;}VR7whBWL*K0`4?jH#=?8No0_UFTgrH?hf#npzvT&R)S{4SGRX5$jyOB%^ z7;!5=fh`_1oSB)qqqny=`_Q37+q%2EPvqw2Cgb`;PwU+ZxYSMEmry`awHXYH^`OB> zQSw{N!O7}DXiA$DZgGPUHHl_;e2hk8N^x;<4bHntN=j-C21BgBzrUZiW9U|*XVu+< z>6JB32w3DR)9D%)th$|eEGM&I4}Kq+Zoy1P8)Khnu~^Ja|LODo&HwxCF`*;<4^mR#rBO;|e-=uOY20 zFE5v-VN5ARY*tqGz5z>51qn3yy(+woqi1b`57k~z2m=C< zqlg&BXLB+Re>rCi$sl9UI${*ghy9JF1St(gZ60!oVJ174JYwC~vIIm{7}D(=f3>*0 z>P~Y@JN$62BAh=T*33v!$Xqa3+3%WR?asmHX)n+b-{nEt9rfrB+Sc6($}2=9wdPU6 z8vu4JZQc4%tSwq9KvMEp$NDV`VPh`N5kn8ch1Y@s2DMZHjqu3q(hlF^$V4mlM#Sdu z^w|e7Vpx+Lm{$@7!NU+54UA?nzyxgtN){_tf`)%+w(Ey)`OXa^6r>3=xN|`4G{bko z^+I3*!hsCc0}-uA50HNZ$ppl98;G?Fm<4Myd_<<dLsbZ?g^3j#+$a9sJ!vBluzYf$Pk)>@}+bV!x(Fd zJh$Ka_Itx^2Z+Szlq8jtm2bS|Ji9%2u*L&J^laxkwFh8!LJ;lgFRkPZ?e|^u!s0|4 zRa^E0HN8U$i_3=EuC>B9=f4hBzs-Q5M+~PojK}U1R9$*$^i{za_xUL-tFAT}e719( z7DRyu-o=9;3Lx@4IC1WBx`4-Z7cYX{&es>^A5T#CyDh)aYrOTI5 zuogIulSvQ+;86ief;=kkBCfl57qqvv%i-a4x=1ygkLK$Eno!TE3B^9)PmiSDA$!!M ro0kHd`rkL-UoT$0_Itg^{wu%$I-!k1z5l0P00000NkvXXu0mjfwwqD2 diff --git a/modules/carriercompare/style.css b/modules/carriercompare/style.css deleted file mode 100644 index 34eec6256..000000000 --- a/modules/carriercompare/style.css +++ /dev/null @@ -1,44 +0,0 @@ -#compare_shipping .center {text-align: center;} - -#compare_shipping { - padding: 10px; -} - -#compare_shipping #availableCarriers { - margin-bottom: 20px; -} - -#compare_shipping #availableCarriers_table { - margin: auto; -} - -#compare_shipping ul#carriercompare_errors_list { - color: red; -} - -#compare_shipping ul#carriercompare_errors_list li { - margin-left: 30px; - text-decoration: none; - list-style: none; -} - -#SE_AjaxDisplay -{ - text-align: center; - display: none; -} - -#SE_AjaxDisplay img -{ - width: 15px; -} - -.SE_SubmitRefreshCard -{ - text-align: center; -} - -.SE_SubmitRefreshCard input -{ - display: inline; -} \ No newline at end of file diff --git a/modules/carriercompare/template/carriercompare.tpl b/modules/carriercompare/template/carriercompare.tpl deleted file mode 100755 index 8896bbcbc..000000000 --- a/modules/carriercompare/template/carriercompare.tpl +++ /dev/null @@ -1,95 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -{if !$opc} - -
    -
    -

    {l s='Estimate the cost of shipping & taxes.' mod='carriercompare'}

    -

    - - -

    - -

    - - ({l s='Needed for certain carriers.' mod='carriercompare'}) -

    - -
    - Loading data
    -

    -
    - - -

    - - -

    -
    -
    -{/if} diff --git a/modules/carriercompare/template/configuration.tpl b/modules/carriercompare/template/configuration.tpl deleted file mode 100644 index f698d2846..000000000 --- a/modules/carriercompare/template/configuration.tpl +++ /dev/null @@ -1,27 +0,0 @@ -{if isset($display_error)} - {if $display_error} -
    {l s='An error occured during form validation.' mod='carriercompare'}
    - {else} -
    {l s='Configuration updated' mod='carriercompare'}
    - {/if} -{/if} - -
    -
    -
    {l s='This module is only available during the standard five-step checkout process. The carrier list has already been defined for one-page checkout. ' mod='carriercompare'}.
    - {l s='Global Configuration' mod='carriercompare'} - - -
    - -

    {l s='How would you like to refresh information for a customer?' mod='carriercompare'}

    -
    - -
    - -
    -
    -
    \ No newline at end of file diff --git a/modules/carriercompare/template/index.php b/modules/carriercompare/template/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/carriercompare/template/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/carriercompare/translations/index.php b/modules/carriercompare/translations/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/carriercompare/translations/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/cashondelivery/cashondelivery.gif b/modules/cashondelivery/cashondelivery.gif deleted file mode 100755 index 926ce1d7c56ef4e7bc8cb160f0c74a6cbf737e74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2391 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 jKjRUbZX_JX7IV*5K*U0@x{|oFX|6326PBD -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class CashOnDelivery extends PaymentModule -{ - public function __construct() - { - $this->name = 'cashondelivery'; - $this->tab = 'payments_gateways'; - $this->version = '0.4'; - $this->author = 'PrestaShop'; - $this->need_instance = 1; - - $this->currencies = false; - - parent::__construct(); - - $this->displayName = $this->l('Cash on delivery (COD)'); - $this->description = $this->l('Accept cash on delivery payments'); - - /* For 1.4.3 and less compatibility */ - $updateConfig = array('PS_OS_CHEQUE', 'PS_OS_PAYMENT', 'PS_OS_PREPARATION', 'PS_OS_SHIPPING', 'PS_OS_CANCELED', 'PS_OS_REFUND', 'PS_OS_ERROR', 'PS_OS_OUTOFSTOCK', 'PS_OS_BANKWIRE', 'PS_OS_PAYPAL', 'PS_OS_WS_PAYMENT'); - if (!Configuration::get('PS_OS_PAYMENT')) - foreach ($updateConfig as $u) - if (!Configuration::get($u) && defined('_'.$u.'_')) - Configuration::updateValue($u, constant('_'.$u.'_')); - } - - public function install() - { - if (!parent::install() OR !$this->registerHook('payment') OR !$this->registerHook('paymentReturn')) - return false; - return true; - } - - public function hookPayment($params) - { - if (!$this->active) - return ; - - global $smarty; - - // Check if cart has product download - foreach ($params['cart']->getProducts() AS $product) - { - $pd = ProductDownload::getIdFromIdProduct((int)($product['id_product'])); - if ($pd AND Validate::isUnsignedInt($pd)) - return false; - } - - $smarty->assign(array( - 'this_path' => $this->_path, //keep for retro compat - 'this_path_cod' => $this->_path, - 'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/' - )); - return $this->display(__FILE__, 'payment.tpl'); - } - - public function hookPaymentReturn($params) - { - if (!$this->active) - return ; - - return $this->display(__FILE__, 'confirmation.tpl'); - } -} diff --git a/modules/cashondelivery/config.xml b/modules/cashondelivery/config.xml deleted file mode 100755 index 3af2893aa..000000000 --- a/modules/cashondelivery/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - cashondelivery - - - - - - 0 - 1 - - \ No newline at end of file diff --git a/modules/cashondelivery/controllers/front/index.php b/modules/cashondelivery/controllers/front/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/cashondelivery/controllers/front/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/cashondelivery/controllers/front/validation.php b/modules/cashondelivery/controllers/front/validation.php deleted file mode 100644 index 97ec4bbb9..000000000 --- a/modules/cashondelivery/controllers/front/validation.php +++ /dev/null @@ -1,80 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/** - * @since 1.5.0 - */ -class CashondeliveryValidationModuleFrontController extends ModuleFrontController -{ - public $ssl = true; - public $display_column_left = false; - - public function postProcess() - { - if ($this->context->cart->id_customer == 0 || $this->context->cart->id_address_delivery == 0 || $this->context->cart->id_address_invoice == 0 || !$this->module->active) - Tools::redirectLink(__PS_BASE_URI__.'order.php?step=1'); - - // Check that this payment option is still available in case the customer changed his address just before the end of the checkout process - $authorized = false; - foreach (Module::getPaymentModules() as $module) - if ($module['name'] == 'cashondelivery') - { - $authorized = true; - break; - } - if (!$authorized) - die(Tools::displayError('This payment method is not available.')); - - $customer = new Customer($this->context->cart->id_customer); - if (!Validate::isLoadedObject($customer)) - Tools::redirectLink(__PS_BASE_URI__.'order.php?step=1'); - - if (Tools::getValue('confirm')) - { - $customer = new Customer((int)$this->context->cart->id_customer); - $total = $this->context->cart->getOrderTotal(true, Cart::BOTH); - $this->module->validateOrder((int)$this->context->cart->id, Configuration::get('PS_OS_PREPARATION'), $total, $this->module->displayName, null, array(), null, false, $customer->secure_key); - Tools::redirectLink(__PS_BASE_URI__.'order-confirmation.php?key='.$customer->secure_key.'&id_cart='.(int)$this->context->cart->id.'&id_module='.(int)$this->module->id.'&id_order='.(int)$this->module->currentOrder); - } - } - - /** - * @see FrontController::initContent() - */ - public function initContent() - { - parent::initContent(); - - $this->context->smarty->assign(array( - 'total' => $this->context->cart->getOrderTotal(true, Cart::BOTH), - 'this_path' => $this->module->getPathUri(),//keep for retro compat - 'this_path_cod' => $this->module->getPathUri(), - 'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->module->name.'/' - )); - - $this->setTemplate('validation.tpl'); - } -} diff --git a/modules/cashondelivery/controllers/index.php b/modules/cashondelivery/controllers/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/cashondelivery/controllers/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/cashondelivery/index.php b/modules/cashondelivery/index.php deleted file mode 100755 index 3f6561f72..000000000 --- a/modules/cashondelivery/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/cashondelivery/logo.gif b/modules/cashondelivery/logo.gif deleted file mode 100755 index a082499446067f528398020a42a7f6491bd6fa6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 425 zcmV;a0apG;Nk%w1VGsZi0M!5hD1QQ{%a7NuO^CN@@ZiF3qc`i=qQr+O-MDD=(0A+1 zgHe|u|Mb^;u2j;ZSKYaJ`s~j7wPjnMJLtYg`}Xcj zl{28liT>Y|%9AnLtWS@-b91Ur&YM2oymI8QOYqQ(``m-z#eMAAvH$kn|Nr)^&6EG- zr1s^$A^8LW2LL<(EC2ui01yBW000KYK%Q_&QshX(g$3HWU;E6Dup3j-44VCMF#P4GT63Fan&NA_ck=4FNM28nqWY86vqo$N@4g zAR`AgH9y2Y6Fo8mDcKb&06aP|V-OPo0WK~n6(AN;m^48W;w1q!n)sqokQWjKL;6c;`OR7LLVlvzk6uF70 z5CT{_cG@YWm+9Qj**?sfX{SIfP|}sG$xhB>|KC|_?X}Jptu>Qrib*yZ4+NZ3J?+17QEQWqxM*%=z?QIZfBKJayFu_0=X? zj}0IKiJm-NJsx#cCQ}}q&DFEVcw)sd2gr^Gz&^gYDKn#aITGIsN+F`?N@n@DGfjQ1 zL$tvi24Pq@-kB!RondN&OI?kP);{g79ko9qqWBOgOq6>bRL=U7Js&`p=s60G6*Rb ze>^k$jh*=CJ_Srr21A2clHL9E_hm?@vs8p#s%k2zua8hXKq8Px^m8qlA~l%Cb!{T| zIn>lf2!(C%Js^*IbTy~9Eu(4GsS-pHz&^31DKqE&gY@iQPH%69WLH0_RE|*Cp<#Lr zwY8OmDjc-dfm4iz4vBo&nctAkVC_^~2dtD0< zG66?>9%ke7bbZwfhBKTQJ<;7pgO{Q1rGsd1Er4Sdx}k>bb;JrGhD)*WOt@(utrTRh z7vD~qMMRzL!?0{H?0X7;^3mD8QdrDVvT}VW(<(4c5P$#@2x)YoF^L7azG8s{0D$&V zD9Zt5|IdgRzqqLkY%u`HY7fuP7aEk88Xh>sze}zkWdsqJ004#H8aA^JZD&@*=8IWN zu}y=Vr;*%1Nkf%*bqX;o#4vBm4a34PZOqYb*^5&^;uVnlwpPFUex&2s91ku^j$To||U3sZO z5u(PG0wsc}EIvNd%AWRiM2~8Q66~ZwluOIpm)Ub-7oYsTm$lOtVv1Q_12BYPSm<$n zBpIT>v}ygPoz{0gqc7KnFuHy;T6-v6%^&eyES|TF){{F~e|RfPrE(ZRL_lXzwvE;@ z&Nf>BP{2^GnzctcCuvN>$IKT&bEB*C;-z#-0=A8UlbS)N?_3I z0BfvyPyo}wg`O{YX68&b|8=$mppygM;S=BPdD_2?sbiq16bsXU6df4Ott&_S#kv7) zX885OS^Pd?fHr~ja~~al8>k)Gn8s;V^9J_ij5tpCCIA|I4f)`6)HL8yI~@3#SZo9D z0%-|ELx6h+9q9gN*RVZQ$-?4Wmg#HA=i#+i3hT?4;in&o#Wt`4xB~RvZOe-Q4~`K% zYtef4EnfzIpN9kA6N_yuiC+Ue^DY5~g3S`Qh+dUpz@;m2 -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/cashondelivery/views/index.php b/modules/cashondelivery/views/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/cashondelivery/views/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/cashondelivery/views/templates/front/index.php b/modules/cashondelivery/views/templates/front/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/cashondelivery/views/templates/front/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/cashondelivery/views/templates/front/validation.tpl b/modules/cashondelivery/views/templates/front/validation.tpl deleted file mode 100755 index 9ea4c7d13..000000000 --- a/modules/cashondelivery/views/templates/front/validation.tpl +++ /dev/null @@ -1,57 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -{capture name=path}{l s='Shipping' mod='cashondelivery'}{/capture} -{include file="$tpl_dir./breadcrumb.tpl"} - -

    {l s='Order summation' mod='cashondelivery'}

    - -{assign var='current_step' value='payment'} -{include file="$tpl_dir./order-steps.tpl"} - -

    {l s='Cash on delivery (COD) payment' mod='cashondelivery'}

    - -
    - -

    - {l s='Cash on delivery (COD) payment' mod='cashondelivery'} - {l s='You have chosen the cash on delivery method.' mod='cashondelivery'} -

    - {l s='The total amount of your order is' mod='cashondelivery'} - {convertPrice price=$total} - {if $use_taxes == 1} - {l s='(tax incl.)' mod='cashondelivery'} - {/if} -

    -

    -

    -

    - {l s='Please confirm your order by clicking \'I confirm my order\'' mod='cashondelivery'}. -

    -

    - {l s='Other payment methods' mod='cashondelivery'} - -

    -
    diff --git a/modules/cashondelivery/views/templates/hook/confirmation.tpl b/modules/cashondelivery/views/templates/hook/confirmation.tpl deleted file mode 100755 index 2081949c9..000000000 --- a/modules/cashondelivery/views/templates/hook/confirmation.tpl +++ /dev/null @@ -1,31 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -

    {l s='Your order on' mod='cashondelivery'} {$shop_name} {l s='is complete.' mod='cashondelivery'} -

    - {l s='You have chosen the cash on delivery method.' mod='cashondelivery'} -

    {l s='Your order will be sent very soon.' mod='cashondelivery'} -

    {l s='For any questions or for further information, please contact our' mod='cashondelivery'} {l s='customer support' mod='cashondelivery'}. -

    diff --git a/modules/cashondelivery/views/templates/hook/index.php b/modules/cashondelivery/views/templates/hook/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/cashondelivery/views/templates/hook/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/cashondelivery/views/templates/hook/payment.tpl b/modules/cashondelivery/views/templates/hook/payment.tpl deleted file mode 100755 index b0f1854bd..000000000 --- a/modules/cashondelivery/views/templates/hook/payment.tpl +++ /dev/null @@ -1,33 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -

    - - {l s='Pay with cash on delivery (COD)' mod='cashondelivery'} -
    {l s='Pay with cash on delivery (COD)' mod='cashondelivery'} -
    {l s='You pay for the merchandise upon delivery' mod='cashondelivery'} -
    -
    -

    \ No newline at end of file diff --git a/modules/cashondelivery/views/templates/index.php b/modules/cashondelivery/views/templates/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/cashondelivery/views/templates/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/dateofdelivery/beforeCarrier.tpl b/modules/dateofdelivery/beforeCarrier.tpl deleted file mode 100644 index 9235a59f9..000000000 --- a/modules/dateofdelivery/beforeCarrier.tpl +++ /dev/null @@ -1,91 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -{if $datesDelivery|count} - - -
    -

    - {if $nbPackages <= 1} - {l s='Approximate date of delivery with this carrier is between' mod='dateofdelivery'} - {else} - {l s='There are %s packages, that will be approximately delivered with the delivery option you choose between' sprintf=$nbPackages mod='dateofdelivery'} - {/if} - {l s='and' mod='dateofdelivery'} * -
    - * {l s='with direct payment methods (e.g. credit card)' mod='dateofdelivery'} -

    -{/if} diff --git a/modules/dateofdelivery/config.xml b/modules/dateofdelivery/config.xml deleted file mode 100755 index 9fb0e47c3..000000000 --- a/modules/dateofdelivery/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - dateofdelivery - - - - - - 1 - 0 - - \ No newline at end of file diff --git a/modules/dateofdelivery/dateofdelivery.php b/modules/dateofdelivery/dateofdelivery.php deleted file mode 100644 index 4524db85f..000000000 --- a/modules/dateofdelivery/dateofdelivery.php +++ /dev/null @@ -1,709 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class DateOfDelivery extends Module -{ - private $_html = ''; - - public function __construct() - { - $this->name = 'dateofdelivery'; - $this->tab = 'shipping_logistics'; - $this->version = '1.2'; - $this->author = 'PrestaShop'; - $this->need_instance = 0; - - $this->bootstrap = true; - parent::__construct(); - - $this->displayName = $this->l('Date of delivery'); - $this->description = $this->l('Displays an approximate date of delivery'); - } - - public function install() - { - if (!parent::install() - || !$this->registerHook('beforeCarrier') - || !$this->registerHook('orderDetailDisplayed') - ||!$this->registerHook('displayPDFInvoice')) - return false; - - if (!Db::getInstance()->execute(' - CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'dateofdelivery_carrier_rule` ( - `id_carrier_rule` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, - `id_carrier` INT NOT NULL, - `minimal_time` INT NOT NULL, - `maximal_time` INT NOT NULL, - `delivery_saturday` TINYINT(1) NOT NULL, - `delivery_sunday` TINYINT(1) NOT NULL - ) ENGINE ='._MYSQL_ENGINE_.'; - ')) - return false; - - Configuration::updateValue('DOD_EXTRA_TIME_PRODUCT_OOS', 0); - Configuration::updateValue('DOD_EXTRA_TIME_PREPARATION', 1); - Configuration::updateValue('DOD_PREPARATION_SATURDAY', 1); - Configuration::updateValue('DOD_PREPARATION_SUNDAY', 1); - Configuration::updateValue('DOD_DATE_FORMAT', 'l j F Y'); - - return true; - } - - public function uninstall() - { - Configuration::deleteByName('DOD_EXTRA_TIME_PRODUCT_OOS'); - Configuration::deleteByName('DOD_EXTRA_TIME_PREPARATION'); - Configuration::deleteByName('DOD_PREPARATION_SATURDAY'); - Configuration::deleteByName('DOD_PREPARATION_SUNDAY'); - Configuration::deleteByName('DOD_DATE_FORMAT'); - Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'dateofdelivery_carrier_rule`'); - - return parent::uninstall(); - } - - public function getContent() - { - $this->_html .= ''; - - $this->_postProcess(); - if (Tools::isSubmit('addCarrierRule') OR (Tools::isSubmit('updatedateofdelivery') AND Tools::isSubmit('id_carrier_rule'))) - $this->_html .= $this->renderAddForm(); - else - { - $this->_html .= $this->renderList(); - $this->_html .= $this->renderForm(); - } - - - return $this->_html; - } - - public function hookBeforeCarrier($params) - { - if (!isset($params['delivery_option_list']) || !count($params['delivery_option_list'])) - return false; - - $package_list = $params['cart']->getPackageList(); - - $datesDelivery = array(); - foreach ($params['delivery_option_list'] as $id_address => $by_address) - { - $datesDelivery[$id_address] = array(); - foreach ($by_address as $key => $delivery_option) - { - $date_from = null; - $date_to = null; - $datesDelivery[$id_address][$key] = array(); - - foreach ($delivery_option['carrier_list'] as $id_carrier => $carrier) - { - foreach ($carrier['package_list'] as $id_package) - { - $package = $package_list[$id_address][$id_package]; - $oos = false; // For out of stock management - foreach ($package['product_list'] as $product) - if (StockAvailable::getQuantityAvailableByProduct($product['id_product'], ($product['id_product_attribute'] ? (int)$product['id_product_attribute'] : null), (int)$this->context->shop->id) <= 0) - { - $oos = true; - break; - } - $available_date = Product::getAvailableDate($product['id_product'], ($product['id_product_attribute'] ? (int)$product['id_product_attribute'] : null), (int)$this->context->shop->id); - $date_range = $this->_getDatesOfDelivery($id_carrier, $oos, $available_date); - if (is_null($date_from) || $date_from < $date_range[0]) - { - $date_from = $date_range[0][1]; - $datesDelivery[$id_address][$key][0] = $date_range[0]; - } - if (is_null($date_to) || $date_to < $date_range[1]) - { - $date_to = $date_range[1][1]; - $datesDelivery[$id_address][$key][1] = $date_range[1]; - } - } - } - } - } - $this->smarty->assign(array( - 'nbPackages' => $params['cart']->getNbOfPackages(), - 'datesDelivery' => $datesDelivery, - 'delivery_option' => $params['delivery_option'] - )); - - return $this->display(__FILE__, 'beforeCarrier.tpl'); - } - - public function hookOrderDetailDisplayed($params) - { - - $oos = false; // For out of stock management - foreach ($params['order']->getProducts() as $product) - if ($product['product_quantity_in_stock'] < 1) - $oos = true; - - $datesDelivery = array(); - $datesDelivery = $this->_getDatesOfDelivery((int)($params['order']->id_carrier), $oos, $params['order']->date_add); - - if (!is_array($datesDelivery) OR !sizeof($datesDelivery)) - return ; - - $this->smarty->assign('datesDelivery', $datesDelivery); - - return $this->display(__FILE__, 'orderDetail.tpl'); - } - - /** - * Displays the delivery dates on the invoice - * - * @param $params contains an instance of OrderInvoice - * @return string - * - */ - public function hookDisplayPDFInvoice($params) - { - $order_invoice = $params['object']; - if (!($order_invoice instanceof OrderInvoice)) - return; - - $order = new Order((int)$order_invoice->id_order); - - $oos = false; // For out of stock management - foreach ($order->getProducts() as $product) - if ($product['product_quantity_in_stock'] < 1) - $oos = true; - - $id_carrier = (int)OrderInvoice::getCarrierId($order_invoice->id); - $return = ''; - if (($datesDelivery = $this->_getDatesOfDelivery($id_carrier, $oos, $order_invoice->date_add)) && isset($datesDelivery[0][0]) && isset($datesDelivery[1][0])) - $return = sprintf($this->l('Approximate date of delivery is between %1$s and %2$s'), $datesDelivery[0][0], $datesDelivery[1][0]); - - return $return; - } - - private function _postProcess() - { - $errors = array(); - if (Tools::isSubmit('submitMoreOptions')) - { - if (Tools::getValue('date_format') == '' OR !Validate::isCleanHtml(Tools::getValue('date_format'))) - $errors[] = $this->l('Date format is invalid'); - - if (!sizeof($errors)) - { - Configuration::updateValue('DOD_EXTRA_TIME_PRODUCT_OOS', (int)Tools::getValue('extra_time_product_oos')); - Configuration::updateValue('DOD_EXTRA_TIME_PREPARATION', (int)Tools::getValue('extra_time_preparation')); - Configuration::updateValue('DOD_PREPARATION_SATURDAY', (int)Tools::getValue('preparation_day_preparation_saturday')); - Configuration::updateValue('DOD_PREPARATION_SUNDAY', (int)Tools::getValue('preparation_day_preparation_sunday')); - Configuration::updateValue('DOD_DATE_FORMAT', Tools::getValue('date_format')); - $this->_html .= $this->displayConfirmation($this->l('Settings are updated')); - } - else - $this->_html .= $this->displayError(implode('
    ', $errors)); - } - - if (Tools::isSubmit('submitCarrierRule')) - { - if (!Validate::isUnsignedInt(Tools::getValue('minimal_time'))) - $errors[] = $this->l('Minimum time is invalid'); - if (!Validate::isUnsignedInt(Tools::getValue('maximal_time'))) - $errors[] = $this->l('Maximum time is invalid'); - if (($carrier = new Carrier((int)Tools::getValue('id_carrier'))) AND !Validate::isLoadedObject($carrier)) - $errors[] = $this->l('Carrier is invalid'); - if ($this->_isAlreadyDefinedForCarrier((int)($carrier->id), (int)(Tools::getValue('id_carrier_rule', 0)))) - $errors[] = $this->l('You cannot use this carrier, a rule has already been saved.'); - - if (!sizeof($errors)) - { - if (Tools::isSubmit('addCarrierRule')) - { - if (Db::getInstance()->execute(' - INSERT INTO `'._DB_PREFIX_.'dateofdelivery_carrier_rule`(`id_carrier`, `minimal_time`, `maximal_time`, `delivery_saturday`, `delivery_sunday`) - VALUES ('.(int)($carrier->id).', '.(int)Tools::getValue('minimal_time').', '.(int)Tools::getValue('maximal_time').', '.(int)Tools::isSubmit('preparation_day_delivery_saturday').', '.(int)Tools::isSubmit('preparation_day_delivery_sunday').') - ')) - Tools::redirectAdmin(AdminController::$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&confirmAddCarrierRule'); - else - $this->_html .= $this->displayError($this->l('An error occurred on adding of carrier rule.')); - } - else - { - if (Db::getInstance()->execute(' - UPDATE `'._DB_PREFIX_.'dateofdelivery_carrier_rule` - SET `id_carrier` = '.(int)($carrier->id).', `minimal_time` = '.(int)Tools::getValue('minimal_time').', `maximal_time` = '.(int)Tools::getValue('maximal_time').', `delivery_saturday` = '.(int)Tools::isSubmit('preparation_day_delivery_saturday').', `delivery_sunday` = '.(int)Tools::isSubmit('preparation_day_delivery_sunday').' - WHERE `id_carrier_rule` = '.(int)Tools::getValue('id_carrier_rule') - )) - Tools::redirectAdmin(AdminController::$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&confirmupdatedateofdelivery'); - else - $this->_html .= $this->displayError($this->l('An error occurred on updating of carrier rule.')); - } - - } - else - $this->_html .= $this->displayError(implode('
    ', $errors)); - } - - if (Tools::isSubmit('deletedateofdelivery') AND Tools::isSubmit('id_carrier_rule') AND (int)Tools::getValue('id_carrier_rule') AND $this->_isCarrierRuleExists((int)Tools::getValue('id_carrier_rule'))) - { - $this->_deleteByIdCarrierRule((int)Tools::getValue('id_carrier_rule')); - $this->_html .= $this->displayConfirmation($this->l('Carrier rule deleted successfully')); - } - - if (Tools::isSubmit('confirmAddCarrierRule')) - $this->_html = $this->displayConfirmation($this->l('Carrier rule added successfully')); - - if (Tools::isSubmit('confirmupdatedateofdelivery')) - $this->_html = $this->displayConfirmation($this->l('Carrier rule updated successfully')); - } - - private function _getCarrierRulesWithCarrierName() - { - return Db::getInstance()->executeS(' - SELECT * - FROM `'._DB_PREFIX_.'dateofdelivery_carrier_rule` dcr - LEFT JOIN `'._DB_PREFIX_.'carrier` c ON (c.`id_carrier` = dcr.`id_carrier`) - '); - } - - private function _getCarrierRule($id_carrier_rule) - { - if (!(int)($id_carrier_rule)) - return false; - return Db::getInstance()->getRow(' - SELECT * - FROM `'._DB_PREFIX_.'dateofdelivery_carrier_rule` - WHERE `id_carrier_rule` = '.(int)($id_carrier_rule) - ); - } - - private function _getCarrierRuleWithIdCarrier($id_carrier) - { - if (!(int)($id_carrier)) - return false; - return Db::getInstance()->getRow(' - SELECT * - FROM `'._DB_PREFIX_.'dateofdelivery_carrier_rule` - WHERE `id_carrier` = '.(int)($id_carrier) - ); - } - - private function _isCarrierRuleExists($id_carrier_rule) - { - if (!(int)($id_carrier_rule)) - return false; - return (bool)Db::getInstance()->getValue(' - SELECT COUNT(*) - FROM `'._DB_PREFIX_.'dateofdelivery_carrier_rule` - WHERE `id_carrier_rule` = '.(int)($id_carrier_rule) - ); - } - - private function _deleteByIdCarrierRule($id_carrier_rule) - { - if (!(int)($id_carrier_rule)) - return false; - return Db::getInstance()->execute(' - DELETE FROM `'._DB_PREFIX_.'dateofdelivery_carrier_rule` - WHERE `id_carrier_rule` = '.(int)($id_carrier_rule) - ); - } - - private function _isAlreadyDefinedForCarrier($id_carrier, $id_carrier_rule = 0) - { - if (!(int)($id_carrier)) - return false; - return (bool)Db::getInstance()->getValue(' - SELECT COUNT(*) - FROM `'._DB_PREFIX_.'dateofdelivery_carrier_rule` - WHERE `id_carrier` = '.(int)($id_carrier).' - '.((int)$id_carrier_rule != 0 ? 'AND `id_carrier_rule` != '.(int)($id_carrier_rule) : '')); - } - - /** - * @param int $id_carrier - * @param bool $product_oos - * @param string $date - * - * @return array|bool returns the min & max delivery date - */ - private function _getDatesOfDelivery($id_carrier, $product_oos = false, $date = null) - { - if (!(int)($id_carrier)) - return false; - $carrier_rule = $this->_getCarrierRuleWithIdCarrier((int)($id_carrier)); - if (empty($carrier_rule)) - return false; - - if ($date != null AND Validate::isDate($date)) - $date_now = strtotime($date); - else - $date_now = time(); // Date on timestamp format - if ($product_oos) - $date_now += Configuration::get('DOD_EXTRA_TIME_PRODUCT_OOS') * 24 * 3600; - if (!Configuration::get('DOD_PREPARATION_SATURDAY') AND date('l', $date_now) == 'Saturday') - $date_now += 24 * 3600; - if (!Configuration::get('DOD_PREPARATION_SUNDAY') AND date('l', $date_now) == 'Sunday') - $date_now += 24 * 3600; - - $date_minimal_time = $date_now + ($carrier_rule['minimal_time'] * 24 * 3600) + (Configuration::get('DOD_EXTRA_TIME_PREPARATION') * 24 * 3600); - $date_maximal_time = $date_now + ($carrier_rule['maximal_time'] * 24 * 3600) + (Configuration::get('DOD_EXTRA_TIME_PREPARATION') * 24 * 3600); - - if (!$carrier_rule['delivery_saturday'] AND date('l', $date_minimal_time) == 'Saturday') - { - $date_minimal_time += 24 * 3600; - $date_maximal_time += 24 * 3600; - } - if (!$carrier_rule['delivery_saturday'] AND date('l', $date_maximal_time) == 'Saturday') - $date_maximal_time += 24 * 3600; - - if (!$carrier_rule['delivery_sunday'] AND date('l', $date_minimal_time) == 'Sunday') - { - $date_minimal_time += 24 * 3600; - $date_maximal_time += 24 * 3600; - } - if (!$carrier_rule['delivery_sunday'] AND date('l', $date_maximal_time) == 'Sunday') - $date_maximal_time += 24 * 3600; - - /* - - // Do not remove this commentary, it's usefull to allow translations of months and days in the translator tool - - $this->l('Sunday'); - $this->l('Monday'); - $this->l('Tuesday'); - $this->l('Wednesday'); - $this->l('Thursday'); - $this->l('Friday'); - $this->l('Saturday'); - - $this->l('January'); - $this->l('February'); - $this->l('March'); - $this->l('April'); - $this->l('May'); - $this->l('June'); - $this->l('July'); - $this->l('August'); - $this->l('September'); - $this->l('October'); - $this->l('November'); - $this->l('December'); - */ - - $date_minimal_string = ''; - $date_maximal_string = ''; - $date_format = preg_split('/([a-z])/Ui', Configuration::get('DOD_DATE_FORMAT'), NULL, PREG_SPLIT_DELIM_CAPTURE); - foreach ($date_format as $elmt) - { - if ($elmt == 'l' OR $elmt == 'F') - { - $date_minimal_string .= $this->l(date($elmt, $date_minimal_time)); - $date_maximal_string .= $this->l(date($elmt, $date_maximal_time)); - } - elseif (preg_match('/[a-z]/Ui', $elmt)) - { - $date_minimal_string .= date($elmt, $date_minimal_time); - $date_maximal_string .= date($elmt, $date_maximal_time); - } - else - { - $date_minimal_string .= $elmt; - $date_maximal_string .= $elmt; - } - } - return array( - array( - $date_minimal_string, - $date_minimal_time - ), - array( - $date_maximal_string, - $date_maximal_time - ) - ); - } - - public function renderForm() - { - $fields_form = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Settings'), - 'icon' => 'icon-cogs' - ), - 'input' => array( - array( - 'type' => 'text', - 'label' => $this->l('Extra time when a product is out of stock'), - 'name' => 'extra_time_product_oos', - 'suffix' => $this->l('day(s)'), - ), - array( - 'type' => 'text', - 'label' => $this->l('Extra time for preparation of the order'), - 'name' => 'extra_time_preparation', - 'suffix' => $this->l('day(s)'), - ), - array( - 'type' => 'checkbox', - 'label' => $this->l('Preparation option'), - 'name' => 'preparation_day', - 'values' => array( - 'id' => 'id', - 'name' => 'name', - 'query' => array( - array( - 'id' => 'preparation_saturday', - 'name' => $this->l('Saturday preparation'), - 'val' => 1 - ), - array( - 'id' => 'preparation_sunday', - 'name' => $this->l('Sunday preparation'), - 'val' => 1 - ), - ), - ) - ), - array( - 'type' => 'text', - 'label' => $this->l('Date format:'), - 'name' => 'date_format', - 'desc' => $this->l('You can see all parameters available at:').' http://www.php.net/manual/en/function.date.php', - ), - ), - 'submit' => array( - 'title' => $this->l('Save'), - 'class' => 'btn btn-default') - ), - ); - - $helper = new HelperForm(); - $helper->show_toolbar = false; - $helper->table = $this->table; - $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); - $helper->default_form_language = $lang->id; - $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; - $this->fields_form = array(); - - $helper->identifier = $this->identifier; - $helper->submit_action = 'submitMoreOptions'; - $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->tpl_vars = array( - 'fields_value' => $this->getConfigFieldsValues(), - 'languages' => $this->context->controller->getLanguages(), - 'id_language' => $this->context->language->id - ); - - return $helper->generateForm(array($fields_form)); - } - - public function renderAddForm() - { - $carriers = Carrier::getCarriers($this->context->language->id, true, false, false, null, Carrier::ALL_CARRIERS); - - foreach ($carriers as $key => $val) - $carriers[$key]['name'] = (!$val['name'] ? Configuration::get('PS_SHOP_NAME') : $val['name']); - - $fields_form = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Settings'), - 'icon' => 'icon-cogs' - ), - 'input' => array( - array( - 'type' => 'select', - 'label' => $this->l('Carrier :'), - 'name' => 'id_carrier', - 'options' => array( - 'query' => $carriers, - 'id' => 'id_carrier', - 'name' => 'name' - ) - ), - array( - 'type' => 'text', - 'label' => $this->l('Delivery between'), - 'name' => 'minimal_time', - 'suffix' => $this->l('day(s)'), - ), - array( - 'type' => 'text', - 'label' => $this->l(''), - 'name' => 'maximal_time', - 'suffix' => $this->l('day(s)'), - ), - array( - 'type' => 'checkbox', - 'label' => $this->l('Preparation option'), - 'name' => 'preparation_day', - 'values' => array( - 'id' => 'id', - 'name' => 'name', - 'query' => array( - array( - 'id' => 'delivery_saturday', - 'name' => $this->l('Saturday preparation'), - 'val' => 1 - ), - array( - 'id' => 'delivery_sunday', - 'name' => $this->l('Sunday preparation'), - 'val' => 1 - ), - ), - ) - ) - ), - 'submit' => array( - 'title' => $this->l('Save'), - 'class' => 'btn btn-default', - 'name' => 'submitCarrierRule', - ) - ), - ); - - if (Tools::getValue('id_carrier_rule') && $this->_isCarrierRuleExists(Tools::getValue('id_carrier_rule'))) - $fields_form['form']['input'][] = array('type' => 'hidden', 'name' => 'id_carrier_rule'); - - $helper = new HelperForm(); - $helper->show_toolbar = false; - $helper->table = $this->table; - $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); - $helper->default_form_language = $lang->id; - $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; - $this->fields_form = array(); - - $helper->identifier = $this->identifier; - - if (Tools::getValue('id_carrier_rule')) - $helper->submit_action = 'updatedateofdelivery'; - else - $helper->submit_action = 'addCarrierRule'; - $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->tpl_vars = array( - 'fields_value' => $this->getCarrierRuleFieldsValues(), - 'languages' => $this->context->controller->getLanguages(), - 'id_language' => $this->context->language->id - ); - - return $helper->generateForm(array($fields_form)); - } - - public function getConfigFieldsValues() - { - return array( - 'extra_time_product_oos' => Tools::getValue('extra_time_product_oos', Configuration::get('DOD_EXTRA_TIME_PRODUCT_OOS')), - 'extra_time_preparation' => Tools::getValue('extra_time_preparation', Configuration::get('DOD_EXTRA_TIME_PREPARATION')), - 'preparation_day_preparation_saturday' => Tools::getValue('preparation_day_preparation_saturday', Configuration::get('DOD_PREPARATION_SATURDAY')), - 'preparation_day_preparation_sunday' => Tools::getValue('preparation_day_preparation_sunday', Configuration::get('DOD_PREPARATION_SUNDAY')), - 'date_format' => Tools::getValue('date_format', Configuration::get('DOD_DATE_FORMAT')), - 'id_carrier' => Tools::getValue('id_carrier'), - ); - } - - public function getCarrierRuleFieldsValues() - { - $fields = array( - 'id_carrier_rule' => Tools::getValue('id_carrier_rule'), - 'id_carrier' => Tools::getValue('id_carrier'), - 'minimal_time' => Tools::getValue('minimal_time'), - 'maximal_time' => Tools::getValue('maximal_time'), - 'delivery_saturday' => Tools::getValue('delivery_saturday'), - 'delivery_sunday' => Tools::getValue('delivery_sunday'), - ); - - if (Tools::isSubmit('updatedateofdelivery') AND $this->_isCarrierRuleExists(Tools::getValue('id_carrier_rule'))) - { - $carrier_rule = $this->_getCarrierRule(Tools::getValue('id_carrier_rule')); - - $fields['id_carrier_rule'] = Tools::getValue('id_carrier_rule', $carrier_rule['id_carrier_rule']); - $fields['id_carrier'] = Tools::getValue('id_carrier', $carrier_rule['id_carrier']); - $fields['minimal_time'] = Tools::getValue('minimal_time', $carrier_rule['minimal_time']); - $fields['maximal_time'] = Tools::getValue('maximal_time', $carrier_rule['maximal_time']); - $fields['preparation_day_delivery_saturday'] = Tools::getValue('preparation_day_delivery_saturday', $carrier_rule['delivery_saturday']); - $fields['preparation_day_delivery_sunday'] = Tools::getValue('preparation_day_delivery_sunday', $carrier_rule['delivery_sunday']); - } - - return $fields; - } - - public function renderList() - { - - $add_url = $this->context->link->getAdminLink('AdminModules').'&configure='.$this->name.'&addCarrierRule=1'; - - $fields_list = array( - 'name' => array( - 'title' => $this->l('Name of carrier'), - 'type' => 'text', - ), - 'delivery_between' => array( - 'title' => $this->l('Delivery between'), - 'type' => 'text', - ), - 'delivery_saturday' => array( - 'title' => $this->l('Saturday delivery'), - 'type' => 'bool', - 'align' => 'center', - 'active' => 'status', - ), - 'delivery_sunday' => array( - 'title' => $this->l('Sunday delivery'), - 'type' => 'bool', - 'align' => 'center', - 'active' => 'status', - ), - ); - $list = $this->_getCarrierRulesWithCarrierName(); - - foreach ($list as $key => $val) - { - if (!$val['name']) - $list[$key]['name'] = Configuration::get('PS_SHOP_NAME'); - $list[$key]['delivery_between'] = sprintf($this->l('%1$d day(s) and %2$d day(s)'), $val['minimal_time'], $val['maximal_time']); - } - - $helper = new HelperList(); - $helper->shopLinkType = ''; - $helper->simple_header = true; - $helper->identifier = 'id_carrier_rule'; - $helper->actions = array('edit', 'delete'); - $helper->show_toolbar = false; - - $helper->title = $this->l('Link list'); - $helper->table = $this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name; - - $this->context->smarty->assign(array('add_url' => $add_url)); - - return $this->display(__FILE__, 'button.tpl').$helper->generateList($list, $fields_list).$this->display(__FILE__, 'button.tpl'); - } -} \ No newline at end of file diff --git a/modules/dateofdelivery/img/cross.png b/modules/dateofdelivery/img/cross.png deleted file mode 100755 index 1514d51a3cf1b67e1c5b9ada36f1fd474e2d214a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmV;A0&x9_P)uEoyT++I zn$b9r%cFfhHe2K68PkBu*@^<$y+7xQ$wJ~;c5aBx$R=xq*41Wo zhwQus_VOgm0hughj}MhOvs#{>Vg09Y8WxjWUJY5YW zJ?&8eG!59Cz=|E%Ns@013KLWOLV)CObIIj_5{>{#k%TEAMs_GbdDV`x-iYsGH z#=Z{USAQA>NY(}X7=3{K8# -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/dateofdelivery/img/tick.png b/modules/dateofdelivery/img/tick.png deleted file mode 100755 index a9925a06ab02db30c1e7ead9c701c15bc63145cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 537 zcmV+!0_OdRP)Hs{AQG2a)rMyf zFQK~pm1x3+7!nu%-M`k}``c>^00{o_1pjWJUTfl8mg=3qGEl8H@}^@w`VUx0_$uy4 z2FhRqKX}xI*?Tv1DJd8z#F#0c%*~rM30HE1@2o5m~}ZyoWhqv>ql{V z1ZGE0lgcoK^lx+eqc*rAX1Ky;Xx3U%u#zG!m-;eD1Qsn@kf3|F9qz~|95=&g3(7!X zB}JAT>RU;a%vaNOGnJ%e1=K6eAh43c(QN8RQ6~GP%O}Jju$~Ld*%`mO1p`EB*FHYdKr%;k=xO&(k^EfNlSiKZ>5l+xr|%SFOV@6-ysFmD2F5 ze93OiS+LaQym;|2f6tbH%~V`D+ND?vc>4J^KSLxEMifJQ`8>*~y^+pGr&o-n=LJ zGWB(yB#;DR8&Lhqi{0(#wc#SwSB~jZKzIFx`8od>2Fo-Pfe7*M8^q#qw2yTxiXzd~ zRaz|F*rr78G`JZXG*YX~5K@5k>G@0HdlBo-6v1jHye?%qRwO@+-hO7J^4LlPG>@A1#{ zQFl4x7tnG)+cz_2Mq_f*H!U)kgg{iHqxT)Yr3ec@K!`)z_%h1c0Y2Eu(dMPkrhq5v zY+bKWfx|sTiOEB71HuwS*CDzA%ReBv4*7Zy7RM0n6`5#chfOJK`ze)Y6>d6Z?UmyNHH!3DdsP-ARyDo}1HO+>7_um7 zx_gj{+_aU_OUH_~Jd?KI#ICZujD`of2mDpCv_zFGE%6}tfL|j!WGu_i-u>4%{%d{$ X7`zMSfT21V00000NkvXXu0mjfkBx0` diff --git a/modules/dateofdelivery/img/time_add.png b/modules/dateofdelivery/img/time_add.png deleted file mode 100755 index dcc45cb22d734911a75bd4950e2571a16605a9cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 827 zcmV-B1H}A^P)3?6FD7nDHK>VL42oe(*rZTUs{)lBOewOJrAS)@sgRZy z%F>hyq)^%d($a+jvbEIPma<%g&wCql)nJT?C;2jG&YAhmnKKgsAmV>?EHES~x~T7X zs+sKJY)$uZ$;sXvQYTGaS2d(|cfZX!|5t!kR#0tLbM}|5W7u4C!0-2gAiP*vG{dZu zpszlDTUwr!_ea36B)`&b5W?qi!|L|o{h$lgowKNt&7f6j$CPayE~_4jy2lXZ$7TKo zP_^Rg$&G$-I%;z7v@(FfmgKcnw*_L=0_Lcb zLkC9)hC&cDim*X}0(*PtR1HFFBT(FKf@MOAIxfq_05r`>yFTv5iHukZk`&|+%R~ULN=n0< zwMH{M2Y|s#BDvxd+>Q}6WV3z(I?H054vP{MG80A?2&__JW&z`G!!PDX?YR7GjC`?n{pDbW%Dq)z9LBVBN!qPTXY$6O9kX}RpA#Z z8F+~Dfp{9Q%Y39-UM%Mw{}$%PsxdTSK!IosPpU?dUZKMkZX^^l_4w63ngulA_kS(O zy_Z+Zxe=5L?_x@m59gd1&eSqXN&&j;A0wZRe+P0j{YEgzubTh>002ovPDHLk FV1g6?b$0*& diff --git a/modules/dateofdelivery/img/time_delete.png b/modules/dateofdelivery/img/time_delete.png deleted file mode 100755 index 5bf8313c6fe2d345c2e2e27e163fb9a91f902f40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 zcmV-b1FHOqP)LI8ef}kKQAC1Vu3=||mNqz7>Z<*DWS(X}8({x^D&e^=6 z>88%hn5MS5Hq)H$;+)OP=KODSbNf%kRfIoX_w44(Ip*@cSPfat!hc zgGXB)iRGP)^{>KgTHcjKOPiBcMAb>{?eDTK{}mwNv&vMxjBTTO3~S3;*lbo%lm$x* zDyXD92;awUHor;8{UczA$1Ksv%3(Ddpf*_XaX^nU!8A(w-_X#b!Q|Wu^y*P`SH*$D zj7d8H5H%EBk#(lhmQ_6@3KLof_0Sk?u-F_h+cu$Iw4tF_gSKHEW)(f)KE3CxVm-Xz z1N7HrbkCE(_l0%v#X5M+N>P~mv5YNp_sZb`D!Md~Dh=r4rl2AxqQM6ks83ur8K%G$ z&0~hV?A-Cd;dFvs!@(*6+1+jkL<5k_QFz&;#MDGHs -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/dateofdelivery/logo.gif b/modules/dateofdelivery/logo.gif deleted file mode 100644 index 321c583ad78d7c86f0725af246988f8e342f98ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmZ?wbhEHb6krfwc*ejmz0B?2)%iL7#}BWnTC-#CnK!>SOp9E1<^ADJvu>Z?R#w;0 zzw+X~Q)iw(x^wI4^O-Ye&TmS3@#p{f!&~;Qp0arDhWj^KKl1tO*UCjVr>?nr@B8<6FCMJw_PcO!;(^;A?!EnZ zc2CWsZFk;%_;7CboOeI|F7M7Lop|Kg_y1Q;Y}>cEV8`J@UCS;WzWDI*%@fl%-}(Rl z|Ge7p>8lUjIWz6y-2?Cc{D1fQ;fu%ju08&EZcELLGYemS_|Q7<#QFR0&+TccsBf57 z611c>=F^WKyXNQKIKOSj(bMnVJh^gU{=I99i~0{={_tz>xodYGe|&WRI@s<}Xu0FObDQq$yS_S6c)1f{9dG$s5ZZf-i-HA^*olY^v6<6$#9t_?R>t*&Lw2U=08;3pDfq diff --git a/modules/dateofdelivery/logo.png b/modules/dateofdelivery/logo.png deleted file mode 100755 index 2b5502d0b76c52cd826b46951522b63058fd0044..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1354 zcmV-Q1-1H#P)`6pHRCwCFS51gqMG*eF`^|fsU`#fD z;3g`9BCdfwsD~(CBACM-cGrMW5pR3Yi>x0ud8|#fT(fc&iPn1#$hx3 zFGFcGZSqO--08`P9@oT?9mgYY16j(m@;8uS{f9P)kI#%VHajo`lK|}|@WWdKZU*as zrA^-VJOq=lBiVAi7O4LPtlRD!8026F7>h9pEs~cJZTZNvK0gD_KS$xaSzz=52hAVP zB=dOvwGp&z$WxaiwqLUKutD!CBrjIa)5A9BK-{{Fq&uVh!B zf9+E+b*zeJ`wB8T>UU2}3l?J*4$$`akq_X#Q`4fzURMtQ`=5RjnT>ri)oKnrv})p| zLo?VhHHk*kZG@v>J!UBdyx0?h7ATriDZd9AX&qnvGLysGUd62k@%jD3_v{xNY)izt zd955~?m&wkRA8iEpuMFut4nG)r|fi)VxAc7stJXe3~D!Ly>5p+TR7Rux+1_YSveRt zULi$2FOCd$%kcdeANwBfe5sIBsD|vkLgc*}j!Vn<;G6XlYF1}mwqd+I6$C{DwBtY~ z6Q(4Q-(edy?j5r7shx`gF3ynb8a*uF$9~!&!rym|&ciC{H=-K~ZP_+swS8d_2U`9V zbT1SjTc=auj@06%kMP^YLoUapaO=j$aN^uPEY*G%;qTjrCuEM-vo4SBjcJcr6e5bd z^2a8K(M1HfV?-40Z-0LQCzswpkv!l+eE}7kV>!D#?_L_$WkLju?zGKVsqG+PCV4Tc zV5#v$%52S@XP?U`N}T83!KS_FQY3Z6nYtb2ctpW+NP7>yeN)E`Js^uiqOfFA< z-$#jvn_L`4G0o>B1*+DOg5ZErT_j9Xn@6C7gqF*KBcV7U|DET-sVz4>h>Ukj>$h!~ z%;(q%)@2+2BB94DQb3F}A*`7{x4IO8$e&^MT(@$NGgs#@y5$v|xi%-0qnlsG`D;g| zkLXeaw66`JJR6T$lwu!_?l1)h*jT6!kKX>Hyq_Mkm_4Pi=dRt@ea8tnE?vdfe@q~* zIH2pLpp2O}qi|j`?`;%Hs;NmOWCyrQ&Ye~v7_!squfxS%L%D`#JP_*!kg{#`YDVzg zkdF)-sKA90m1X%J+Hw3JFG1`K>#_~jkGUmVmtyp4Mm#FC`0(t9RM9FJs%#Kqz5kwd zU96A$fYw%aeYAQUD|7>Dr!DMx@(GkNd2Aio_qpZK%&cwD|CV*5dgKdxqa)a0n+=b_ zgE1MqBL&(w9P1g|@b|Vh`ilS?4>qj7@a7ySry%oH$&|WPeuwuL6|4HZ5PKU;LaU0F zpOq_N*|siy-@Etm+*rRq7p`X`e3ueq>X#NazWUiiEsDP_-QN}X$k`kEUC?cVBV3`Q zmaJS}2!UNkavRC!qQ?z -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} -{if $datesDelivery|count} -

    {l s='Approximate date of delivery is between %1$s and %2$s' sprintf=[$datesDelivery.0.0, $datesDelivery.1.0] mod='dateofdelivery'} *

    -

    * {l s='with direct payment methods (e.g. credit card)' mod='dateofdelivery'}

    -{/if} \ No newline at end of file diff --git a/modules/dateofdelivery/translations/index.php b/modules/dateofdelivery/translations/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/dateofdelivery/translations/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/dateofdelivery/views/index.php b/modules/dateofdelivery/views/index.php deleted file mode 100644 index fd6bae0d3..000000000 --- a/modules/dateofdelivery/views/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/dateofdelivery/views/templates/hook/button.tpl b/modules/dateofdelivery/views/templates/hook/button.tpl deleted file mode 100644 index b001326e0..000000000 --- a/modules/dateofdelivery/views/templates/hook/button.tpl +++ /dev/null @@ -1,31 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - -
    \ No newline at end of file diff --git a/modules/dateofdelivery/views/templates/hook/index.php b/modules/dateofdelivery/views/templates/hook/index.php deleted file mode 100644 index c7a193905..000000000 --- a/modules/dateofdelivery/views/templates/hook/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/dateofdelivery/views/templates/index.php b/modules/dateofdelivery/views/templates/index.php deleted file mode 100644 index 3f4b16e7e..000000000 --- a/modules/dateofdelivery/views/templates/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/editorial/EditorialClass.php b/modules/editorial/EditorialClass.php deleted file mode 100755 index 5b3d05349..000000000 --- a/modules/editorial/EditorialClass.php +++ /dev/null @@ -1,91 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -class EditorialClass extends ObjectModel -{ - /** @var integer editorial id*/ - public $id; - - /** @var integer editorial id shop*/ - public $id_shop; - - /** @var string body_title*/ - public $body_home_logo_link; - - /** @var string body_title*/ - public $body_title; - - /** @var string body_title*/ - public $body_subheading; - - /** @var string body_title*/ - public $body_paragraph; - - /** @var string body_title*/ - public $body_logo_subheading; - - /** - * @see ObjectModel::$definition - */ - public static $definition = array( - 'table' => 'editorial', - 'primary' => 'id_editorial', - 'multilang' => true, - 'fields' => array( - 'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isunsignedInt', 'required' => true), - 'body_home_logo_link' => array('type' => self::TYPE_STRING, 'validate' => 'isUrl'), - // Lang fields - 'body_title' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName'), - 'body_subheading' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName'), - 'body_paragraph' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isString'), - 'body_logo_subheading' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName'), - ) - ); - - static public function getByIdShop($id_shop) - { - $id = Db::getInstance()->getValue('SELECT `id_editorial` FROM `'._DB_PREFIX_.'editorial` WHERE `id_shop` ='.(int)$id_shop); - return new EditorialClass($id); - } - - public function copyFromPost() - { - /* Classical fields */ - foreach ($_POST AS $key => $value) - if (key_exists($key, $this) AND $key != 'id_'.$this->table) - $this->{$key} = $value; - - /* Multilingual fields */ - if (sizeof($this->fieldsValidateLang)) - { - $languages = Language::getLanguages(false); - foreach ($languages AS $language) - foreach ($this->fieldsValidateLang AS $field => $validation) - if (isset($_POST[$field.'_'.(int)($language['id_lang'])])) - $this->{$field}[(int)($language['id_lang'])] = $_POST[$field.'_'.(int)($language['id_lang'])]; - } - } -} diff --git a/modules/editorial/config.xml b/modules/editorial/config.xml deleted file mode 100755 index 84619c28c..000000000 --- a/modules/editorial/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - editorial - - - - - - 1 - 0 - - \ No newline at end of file diff --git a/modules/editorial/editorial.css b/modules/editorial/editorial.css deleted file mode 100644 index 7f9d6244a..000000000 --- a/modules/editorial/editorial.css +++ /dev/null @@ -1,26 +0,0 @@ -/* Block editorial */ -.editorial_block { margin-bottom: 2em } -.editorial_block .rte { background: transparent none repeat scroll 0 0 } -.editorial_block h1 { - margin:40px 0 10px 0; - padding: 0; - background: none; -} -.editorial_block h2 { - padding:0 0 10px 0; - font-size: 12px; - line-height: 1.2em; - color: #666; - text-transform: none; - background: none; -} -#editorial_block_center p { padding-left: 0 } -#editorial_block_center .rte p {color:#666 } - -#editorial_block_center p#editorial_image_legend { - margin: 0 0 10px; - padding:0; - color: #666; - font-size: 10px; -} - diff --git a/modules/editorial/editorial.php b/modules/editorial/editorial.php deleted file mode 100644 index c7ecf4414..000000000 --- a/modules/editorial/editorial.php +++ /dev/null @@ -1,310 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class Editorial extends Module -{ - public function __construct() - { - $this->name = 'editorial'; - $this->tab = 'front_office_features'; - $this->version = '2.0'; - $this->author = 'PrestaShop'; - $this->need_instance = 0; - - parent::__construct(); - - $this->displayName = $this->l('Home text editor'); - $this->description = $this->l('A text-edit module for your homepage.'); - $path = dirname(__FILE__); - if (strpos(__FILE__, 'Module.php') !== false) - $path .= '/../modules/'.$this->name; - include_once $path.'/EditorialClass.php'; - } - - public function install() - { - if (!parent::install() || !$this->registerHook('displayHome') || !$this->registerHook('displayHeader')) - return false; - - $res = Db::getInstance()->execute(' - CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'editorial` ( - `id_editorial` int(10) unsigned NOT NULL auto_increment, - `id_shop` int(10) unsigned NOT NULL , - `body_home_logo_link` varchar(255) NOT NULL, - PRIMARY KEY (`id_editorial`)) - ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8'); - - if ($res) - $res &= Db::getInstance()->execute(' - CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'editorial_lang` ( - `id_editorial` int(10) unsigned NOT NULL, - `id_lang` int(10) unsigned NOT NULL, - `body_title` varchar(255) NOT NULL, - `body_subheading` varchar(255) NOT NULL, - `body_paragraph` text NOT NULL, - `body_logo_subheading` varchar(255) NOT NULL, - PRIMARY KEY (`id_editorial`, `id_lang`)) - ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8'); - - - if ($res) - foreach - (Shop::getShops(false) as $shop) - $res &= $this->createExampleEditorial($shop['id_shop']); - - if (!$res) - $res &= $this->uninstall(); - - return $res; - } - - private function createExampleEditorial($id_shop) - { - $editorial = new EditorialClass(); - $editorial->id_shop = (int)$id_shop; - $editorial->body_home_logo_link = 'http://www.prestashop.com'; - foreach (Language::getLanguages(false) as $lang) - { - $editorial->body_title[$lang['id_lang']] = 'Lorem ipsum dolor sit amet'; - $editorial->body_subheading[$lang['id_lang']] = 'Excepteur sint occaecat cupidatat non proident'; - $editorial->body_paragraph[$lang['id_lang']] = '

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum

    '; - $editorial->body_logo_subheading[$lang['id_lang']] = 'Lorem ipsum presta shop amet'; - } - return $editorial->add(); - } - - public function uninstall() - { - $res = Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'editorial`'); - $res &= Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'editorial_lang`'); - - if (!$res || !parent::uninstall()) - return false; - - return true; - } - - private function initForm() - { - $languages = Language::getLanguages(false); - foreach ($languages as $k => $language) - $languages[$k]['is_default'] = (int)($language['id_lang'] == Configuration::get('PS_LANG_DEFAULT')); - - $helper = new HelperForm(); - $helper->module = $this; - $helper->name_controller = 'editorial'; - $helper->identifier = $this->identifier; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->languages = $languages; - $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name; - $helper->default_form_language = (int)Configuration::get('PS_LANG_DEFAULT'); - $helper->allow_employee_form_lang = true; - $helper->toolbar_scroll = true; - $helper->toolbar_btn = $this->initToolbar(); - $helper->title = $this->displayName; - $helper->submit_action = 'submitUpdateEditorial'; - - $this->fields_form[0]['form'] = array( - 'tinymce' => true, - 'legend' => array( - 'title' => $this->displayName, - 'image' => $this->_path.'logo.gif' - ), - 'submit' => array( - 'name' => 'submitUpdateEditorial', - 'title' => $this->l('Save '), - 'class' => 'button' - ), - 'input' => array( - array( - 'type' => 'text', - 'label' => $this->l('Main title'), - 'name' => 'body_title', - 'lang' => true, - 'size' => 64, - 'hint' => $this->l('Appears along top of your homepage'), - ), - array( - 'type' => 'text', - 'label' => $this->l('Subheading'), - 'name' => 'body_subheading', - 'lang' => true, - 'size' => 64, - ), - array( - 'type' => 'textarea', - 'label' => $this->l('Introductory text'), - 'name' => 'body_paragraph', - 'lang' => true, - 'autoload_rte' => true, - 'hint' => $this->l('For example... explain your mission, highlight a new product, or describe a recent event.'), - 'cols' => 60, - 'rows' => 30 - ), - array( - 'type' => 'file', - 'label' => $this->l('Homepage logo'), - 'name' => 'body_homepage_logo', - 'display_image' => true - ), - array( - 'type' => 'text', - 'label' => $this->l('Homepage logo link'), - 'name' => 'body_home_logo_link', - 'size' => 33, - ), - array( - 'type' => 'text', - 'label' => $this->l('Homepage logo subheading'), - 'name' => 'body_logo_subheading', - 'lang' => true, - 'size' => 33, - ), - ) - ); - return $helper; - } - - private function initToolbar() - { - $this->toolbar_btn['save'] = array( - 'href' => '#', - 'desc' => $this->l('Save') - ); - - return $this->toolbar_btn; - } - - public function getContent() - { - $this->_html = ''; - $this->postProcess(); - - $helper = $this->initForm(); - - $id_shop = (int)$this->context->shop->id; - $editorial = EditorialClass::getByIdShop($id_shop); - - if (!$editorial) //if editorial ddo not exist for this shop => create a new example one - $this->createExampleEditorial($id_shop); - - foreach ($this->fields_form[0]['form']['input'] as $input) //fill all form fields - if ($input['name'] != 'body_homepage_logo') - $helper->fields_value[$input['name']] = $editorial->{$input['name']}; - - $helper->fields_value['body_homepage_logo']['image'] = (file_exists(dirname(__FILE__).'/homepage_logo_'.(int)$id_shop.'.jpg') ? '' : ''); - if ($helper->fields_value['body_homepage_logo']) - $helper->fields_value['body_homepage_logo']['size'] = filesize(dirname(__FILE__).'/homepage_logo_'.(int)$id_shop.'.jpg') / 1000; - - $this->_html .= $helper->generateForm($this->fields_form); - return $this->_html; - } - - public function postProcess() - { - $errors = ''; - $id_shop = (int)$this->context->shop->id; - // Delete logo image - if (Tools::isSubmit('deleteImage')) - { - if (!file_exists(dirname(__FILE__).'/homepage_logo_'.(int)$id_shop.'.jpg')) - $errors .= $this->displayError($this->l('This action cannot be made.')); - else - { - unlink(dirname(__FILE__).'/homepage_logo_'.(int)$id_shop.'.jpg'); - Configuration::updateValue('EDITORIAL_IMAGE_DISABLE', 1); - $this->_clearCache('editorial.tpl'); - Tools::redirectAdmin('index.php?tab=AdminModules&configure='.$this->name.'&token='.Tools::getAdminToken('AdminModules'.(int)(Tab::getIdFromClassName('AdminModules')).(int)$this->context->employee->id)); - } - $this->_html .= $errors; - } - - if (Tools::isSubmit('submitUpdateEditorial')) - { - $id_shop = (int)$this->context->shop->id; - $editorial = EditorialClass::getByIdShop($id_shop); - $editorial->copyFromPost(); - $editorial->update(); - - /* upload the image */ - if (isset($_FILES['body_homepage_logo']) && isset($_FILES['body_homepage_logo']['tmp_name']) && !empty($_FILES['body_homepage_logo']['tmp_name'])) - { - Configuration::set('PS_IMAGE_GENERATION_METHOD', 1); - if (file_exists(dirname(__FILE__).'/homepage_logo_'.(int)$id_shop.'.jpg')) - unlink(dirname(__FILE__).'/homepage_logo_'.(int)$id_shop.'.jpg'); - if ($error = ImageManager::validateUpload($_FILES['body_homepage_logo'])) - $errors .= $error; - elseif (!($tmpName = tempnam(_PS_TMP_IMG_DIR_, 'PS')) || !move_uploaded_file($_FILES['body_homepage_logo']['tmp_name'], $tmpName)) - return false; - elseif (!ImageManager::resize($tmpName, dirname(__FILE__).'/homepage_logo_'.(int)$id_shop.'.jpg')) - $errors .= $this->displayError($this->l('An error occurred while attempting to upload the image.')); - if (isset($tmpName)) - unlink($tmpName); - } - $this->_html .= $errors == '' ? $this->displayConfirmation($this->l('Settings updated successfully.')) : $errors; - if (file_exists(dirname(__FILE__).'/homepage_logo_'.(int)$id_shop.'.jpg')) - { - list($width, $height, $type, $attr) = getimagesize(dirname(__FILE__).'/homepage_logo_'.(int)$id_shop.'.jpg'); - Configuration::updateValue('EDITORIAL_IMAGE_WIDTH', (int)round($width)); - Configuration::updateValue('EDITORIAL_IMAGE_HEIGHT', (int)round($height)); - Configuration::updateValue('EDITORIAL_IMAGE_DISABLE', 0); - } - $this->_clearCache('editorial.tpl'); - } - } - - public function hookDisplayHome($params) - { - if (!$this->isCached('editorial.tpl', $this->getCacheId())) - { - $id_shop = (int)$this->context->shop->id; - $editorial = EditorialClass::getByIdShop($id_shop); - if (!$editorial) - return; - $editorial = new EditorialClass((int)$editorial->id, $this->context->language->id); - if (!$editorial) - return; - $this->smarty->assign(array( - 'editorial' => $editorial, - 'default_lang' => (int)$this->context->language->id, - 'image_width' => Configuration::get('EDITORIAL_IMAGE_WIDTH'), - 'image_height' => Configuration::get('EDITORIAL_IMAGE_HEIGHT'), - 'id_lang' => $this->context->language->id, - 'homepage_logo' => !Configuration::get('EDITORIAL_IMAGE_DISABLE') && file_exists('modules/editorial/homepage_logo_'.(int)$id_shop.'.jpg'), - 'image_path' => $this->_path.'homepage_logo_'.(int)$id_shop.'.jpg' - )); - } - return $this->display(__FILE__, 'editorial.tpl', $this->getCacheId()); - } - - public function hookDisplayHeader() - { - $this->context->controller->addCSS(($this->_path).'editorial.css', 'all'); - } -} diff --git a/modules/editorial/editorial.tpl b/modules/editorial/editorial.tpl deleted file mode 100644 index d9331774f..000000000 --- a/modules/editorial/editorial.tpl +++ /dev/null @@ -1,36 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - -
    - {if $editorial->body_home_logo_link}{/if} - {if $homepage_logo}{$editorial->body_title|escape:'html':'UTF-8'|stripslashes}{/if} - {if $editorial->body_home_logo_link}{/if} - {if $editorial->body_logo_subheading}

    {$editorial->body_logo_subheading|stripslashes}

    {/if} - {if $editorial->body_title}

    {$editorial->body_title|stripslashes}

    {/if} - {if $editorial->body_subheading}

    {$editorial->body_subheading|stripslashes}

    {/if} - {if $editorial->body_paragraph}
    {$editorial->body_paragraph|stripslashes}
    {/if} -
    - diff --git a/modules/editorial/homepage_logo_1.jpg b/modules/editorial/homepage_logo_1.jpg deleted file mode 100644 index 38a7b65e1b29e15454733c0dc7f771a7b0599f15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21250 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 GP5d`l(7V_G diff --git a/modules/editorial/index.php b/modules/editorial/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/editorial/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/editorial/logo.gif b/modules/editorial/logo.gif deleted file mode 100644 index fa26b20b551a8783660280b808b4ed3a532ea1c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 627 zcmZ?wbhEHb6krfwc*ekB5HVi~NACTs-*CerW9HU#_aa(0 z$2G1A>%H8x??w8=-J6cyU$*nYxo7`xzxtcH_-f1I;{{uue*g9N|Ns9xZ+<-W@Ylq> z4Z;@_hdB=N1W5+P2@XT5_{{ z|Er8Sk3M|+f8+JvXW#!%S$FQ-z5h2~{|M^YS~Krp_SR>&U;J8f>hGK}Oal4X>sqwWz>AF(ziQCc{K^$HhKAYHI3gI?PROVXPJ#T^2j4d$W2p zX<7Sd?%TLgT|`H@NnFQ;lT&QpK6P!UgeG$%qf^&8HCb7Frt< z>zZopQ#q_y-<+}#u$uZq{oxxIJ~@`XGnkY+xb*7wC+m8hlLyx9Qpx*ibkw03%J-sZb%$rU~W*B*q4*=!8t&I G!5RRdv>l)T diff --git a/modules/editorial/logo.png b/modules/editorial/logo.png deleted file mode 100755 index 382ab1dbe005b125e5434ae24dc782f65783055c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1557 zcmV+w2I~2VP)Eg&HOq*N_RENJjSi7^@^Di30#pax?UoA82Bf<_ZXjKmicACMP}s3i!J#>51} zp9%;{NLxe$*6!~8AJ3V4yWMTK-O|7$(>ptJ?mgc*-}#ve^dIIeEqiw7La{uE6cn!R z5UfB7j4;%m&P~f#mXf)C^c!EPYdu&8>oQ9KNc&N2_oVlZ6H);wua5Om1mr@6v(0r# zbfnDzyrjp((P@mb2!Ie*2Y^z@_(i0OQUE|6($5=4+DNen#PGQ8i<^y3TdGJ$X#mM{ z*CW-q*25g^@Ys=~P-KR<0t#5tray0;wP4EvJ`)O<`;Q--S`I+`nqgWH6oJx^7zzZH z_}P{U*QE>!U{C<}z8TV)$ z^N`Y@^0u)>JP!_ltQSI}ep=O#0#Rp{is(H7gVau$I-bCw$OE|^4-8I03{RRd0QQ0` zO3*cJSdwRP2JzDBV@Y`r(EQ<8M^cOiN5F-qetIP-Ra9;j&YbGd-YE3IgdPf@ z$^(!FN0EVsnGIrq@ECvyQA-raJ`}jY5GYVRSzx6hc=GSaqrXucP>QV$ z<6_glifN^$jC9i}qChYRSss8VQu=9+tU%ih8o+_|V{qoqcd@jw z5#R3p2KDuea4%5H z7T_SfeM;qk0Mbqvp|$l7R8PAb^B!w~>TXAE%SCP8i8me0eS8ai`sMueDy01k8t2qN z1zx_h#ULWxz73kQ>c$tf@`wO<;lLD#F2_ODv?Z9m@@3?@E|SY!{Ce`DK6EoF`sLuR zhhKviMEGQN1)kn{8J;T=5Rs-p>e?YF4Qb8n6vT)`Oid{O_KxN|E{v;PjM+`k!^`|j zZ?Ye4IG@&N0f&Oe^T~eK#hiy;LO_;$@MHzneMTTS#{*wiK!LacnaLEz85*PL1Hj(? z!gSXdU5#aHx1;lP8|gN2cJDU)bNsvBTLry+W8G3rTGouv=|ZZ`s|a3)#e2?K6dC)(S# zYQf5d>-AnlXDs8n{}EUxX)-G5`-wsZ0PcwSoup1Eh!Qct6m~~ZK=fvy!VnSh8z>1s zdjZ0*wIHu~kIz`fbFySnT-Q11l75*05WSoW)vsX|u6wh9EpswjfglAw;Sahy$gQym zuX!)(0Z6j>w#~$H<0=?UbvKp0x}h*8`BR>o)h^}=$JPejo!Xr|dChx##xlN_)f^9Z zScdFd2L!n_M+%fy!o4rZcIFESuX&HpSjKl9q%68KzJ7r6-J!S%bS#t`x=)buw0rqb z7q^}K<%2Guy8qK>_y(kCZ3z0PC6X5dy~k& -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/favoriteproducts/FavoriteProduct.php b/modules/favoriteproducts/FavoriteProduct.php deleted file mode 100644 index f4ddaec66..000000000 --- a/modules/favoriteproducts/FavoriteProduct.php +++ /dev/null @@ -1,111 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -class FavoriteProduct extends ObjectModel -{ - public $id; - - public $id_product; - - public $id_customer; - - public $id_shop; - - public $date_add; - - public $date_upd; - - /** - * @see ObjectModel::$definition - */ - public static $definition = array( - 'table' => 'favorite_product', - 'primary' => 'id_favorite_product', - 'fields' => array( - 'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true), - 'id_customer' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true), - 'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true), - 'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), - 'date_upd' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), - ), - ); - - public static function getFavoriteProducts($id_customer, $id_lang) - { - return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' - SELECT DISTINCT p.`id_product`, fp.`id_shop`, pl.`description_short`, pl.`link_rewrite`, - pl.`name`, i.`id_image`, CONCAT(p.`id_product`, \'-\', i.`id_image`) as image - FROM `'._DB_PREFIX_.'favorite_product` fp - LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.`id_product` = fp.`id_product`) - '.Shop::addSqlAssociation('product', 'p').' - LEFT JOIN `'._DB_PREFIX_.'product_lang` pl - ON p.`id_product` = pl.`id_product` - AND pl.`id_lang` = '.(int)$id_lang - .Shop::addSqlRestrictionOnLang('pl').' - LEFT OUTER JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product`) - '.Shop::addSqlAssociation('product_attribute', 'pa', false).' - LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) - LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') - WHERE product_shop.`active` = 1 - '.($id_customer ? ' AND fp.id_customer = '.(int)$id_customer : '').' - '.Shop::addSqlRestriction(false, 'fp') - ); - } - - public static function getFavoriteProduct($id_customer, $id_product, Shop $shop = null) - { - if (!$shop) - $shop = Context::getContext()->shop; - - $id_favorite_product = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' - SELECT `id_favorite_product` - FROM `'._DB_PREFIX_.'favorite_product` - WHERE `id_customer` = '.(int)$id_customer.' - AND `id_product` = '.(int)$id_product.' - AND `id_shop` = '.(int)$shop->id - ); - - if ($id_favorite_product) - return new FavoriteProduct($id_favorite_product); - return null; - } - - public static function isCustomerFavoriteProduct($id_customer, $id_product, Shop $shop = null) - { - if (!$id_customer) - return false; - - if (!$shop) - $shop = Context::getContext()->shop; - - return (bool)Db::getInstance()->getValue(' - SELECT COUNT(*) - FROM `'._DB_PREFIX_.'favorite_product` - WHERE `id_customer` = '.(int)$id_customer.' - AND `id_product` = '.(int)$id_product.' - AND `id_shop` = '.(int)$shop->id); - } -} diff --git a/modules/favoriteproducts/config.xml b/modules/favoriteproducts/config.xml deleted file mode 100644 index f8e8e0682..000000000 --- a/modules/favoriteproducts/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - favoriteproducts - - - - - - 0 - 0 - - \ No newline at end of file diff --git a/modules/favoriteproducts/controllers/front/account.php b/modules/favoriteproducts/controllers/front/account.php deleted file mode 100644 index 043141a5c..000000000 --- a/modules/favoriteproducts/controllers/front/account.php +++ /dev/null @@ -1,54 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/** - * @since 1.5.0 - */ -class FavoriteproductsAccountModuleFrontController extends ModuleFrontController -{ - public $ssl = true; - - public function init() - { - parent::init(); - - require_once($this->module->getLocalPath().'FavoriteProduct.php'); - } - - public function initContent() - { - parent::initContent(); - - if (!Context::getContext()->customer->isLogged()) - Tools::redirect('index.php?controller=authentication&redirect=module&module=favoriteproducts&action=account'); - - if (Context::getContext()->customer->id) - { - $this->context->smarty->assign('favoriteProducts', FavoriteProduct::getFavoriteProducts((int)Context::getContext()->customer->id, (int)Context::getContext()->language->id)); - $this->setTemplate('favoriteproducts-account.tpl'); - } - } -} \ No newline at end of file diff --git a/modules/favoriteproducts/controllers/front/actions.php b/modules/favoriteproducts/controllers/front/actions.php deleted file mode 100644 index 55ab8a2e9..000000000 --- a/modules/favoriteproducts/controllers/front/actions.php +++ /dev/null @@ -1,87 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/** - * @since 1.5.0 - */ -class FavoriteproductsActionsModuleFrontController extends ModuleFrontController -{ - /** - * @var int - */ - public $id_product; - - public function init() - { - parent::init(); - - require_once($this->module->getLocalPath().'FavoriteProduct.php'); - $this->id_product = (int)Tools::getValue('id_product'); - } - - public function postProcess() - { - if (Tools::getValue('process') == 'remove') - $this->processRemove(); - else if (Tools::getValue('process') == 'add') - $this->processAdd(); - exit; - } - - /** - * Remove a favorite product - */ - public function processRemove() - { - // check if product exists - $product = new Product($this->id_product); - if (!Validate::isLoadedObject($product)) - die('0'); - - $favorite_product = FavoriteProduct::getFavoriteProduct((int)Context::getContext()->cookie->id_customer, (int)$product->id); - if ($favorite_product && $favorite_product->delete()) - die('0'); - die(1); - } - - /** - * Add a favorite product - */ - public function processAdd() - { - $product = new Product($this->id_product); - // check if product exists - if (!Validate::isLoadedObject($product) || FavoriteProduct::isCustomerFavoriteProduct((int)Context::getContext()->cookie->id_customer, (int)$product->id)) - die('1'); - $favorite_product = new FavoriteProduct(); - $favorite_product->id_product = $product->id; - $favorite_product->id_customer = (int)Context::getContext()->cookie->id_customer; - $favorite_product->id_shop = (int)Context::getContext()->shop->id; - if ($favorite_product->add()) - die('0'); - die(1); - } -} \ No newline at end of file diff --git a/modules/favoriteproducts/controllers/front/index.php b/modules/favoriteproducts/controllers/front/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/favoriteproducts/controllers/front/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/favoriteproducts/controllers/index.php b/modules/favoriteproducts/controllers/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/favoriteproducts/controllers/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/favoriteproducts/favoriteproducts-account.php b/modules/favoriteproducts/favoriteproducts-account.php deleted file mode 100644 index 9b7885925..000000000 --- a/modules/favoriteproducts/favoriteproducts-account.php +++ /dev/null @@ -1,41 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/** - * @deprecated 1.5.0 This file is deprecated, use moduleFrontController instead - */ - -/* SSL Management */ -$useSSL = true; - -require('../../config/config.inc.php'); -Tools::displayFileAsDeprecated(); - -// init front controller in order to use Tools::redirect -$controller = new FrontController(); -$controller->init(); - -Tools::redirect(Context::getContext()->link->getModuleLink('favoriteproducts', 'account')); \ No newline at end of file diff --git a/modules/favoriteproducts/favoriteproducts-ajax.php b/modules/favoriteproducts/favoriteproducts-ajax.php deleted file mode 100644 index cfc395329..000000000 --- a/modules/favoriteproducts/favoriteproducts-ajax.php +++ /dev/null @@ -1,65 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/** - * @deprecated 1.5.0 This file is deprecated, use moduleFrontController instead - */ - -require_once(dirname(__FILE__).'/../../config/config.inc.php'); -require_once(dirname(__FILE__).'/../../init.php'); -include(dirname(__FILE__).'/FavoriteProduct.php'); - -if (Tools::getValue('action') && Tools::getValue('id_product') && Context::getContext()->cookie->id_customer) -{ - if (Tools::getValue('action') == 'remove') - { - // check if product exists - $product = new Product((int)Tools::getValue('id_product')); - if (!Validate::isLoadedObject($product)) - die('0'); - $favorite_product = FavoriteProduct::getFavoriteProduct((int)Context::getContext()->cookie->id_customer, (int)$product->id); - if ($favorite_product) - if ($favorite_product->delete()) - die('0'); - } - elseif (Tools::getValue('action') == 'add') - { - $product = new Product((int)Tools::getValue('id_product')); - // check if product exists - if (!Validate::isLoadedObject($product) - || FavoriteProduct::isCustomerFavoriteProduct((int)Context::getContext()->cookie->id_customer, (int)$product->id)) - die('1'); - $favorite_product = new FavoriteProduct(); - $favorite_product->id_product = $product->id; - $favorite_product->id_customer = (int)Context::getContext()->cookie->id_customer; - $favorite_product->id_shop = (int)Context::getContext()->shop->id; - if ($favorite_product->add()) - die('0'); - } -} - -die('1'); - diff --git a/modules/favoriteproducts/favoriteproducts.css b/modules/favoriteproducts/favoriteproducts.css deleted file mode 100644 index bb93b7e03..000000000 --- a/modules/favoriteproducts/favoriteproducts.css +++ /dev/null @@ -1,66 +0,0 @@ -#module-favoriteproducts-account #left_column {display:none} -#module-favoriteproducts-account #center_column {width:757px} - -#favoriteproducts_block_account .favoriteproduct { - position:relative; - margin-bottom: 14px; - padding: 12px 8px; - border: 1px solid #eee; - border-radius: 3px 3px 3px 3px; -} - -.favoriteproduct a.product_img_link { - border: 1px solid #CCCCCC; - display: block; - float: left; - margin-right: 14px; - overflow: hidden; - position: relative; -} - -.favoriteproduct h3 { - color: #000000; - font-size: 13px; - padding: 0 0 10px; -} - -.favoriteproduct p.product_desc { - line-height: 16px; - overflow: hidden; - padding: 0; -} - -.favoriteproduct .remove { - position:absolute; - top:10px; - right:10px -} -.favoriteproduct .remove .icon {cursor:pointer} - - -/* lnk fiche produit */ - -#usefull_link_block li#favoriteproducts_block_extra_add { - padding-left:20px; - background:url(img/add_favorite.gif) no-repeat 0 0; - cursor: pointer; -} - -#usefull_link_block li#favoriteproducts_block_extra_remove { - padding-left:20px; - background:url(img/del_favorite.gif) no-repeat 0 0; - cursor: pointer; -} - -ul#usefull_link_block li#favoriteproducts_block_extra_added { - padding-left:20px; - background:url(img/add_favorite.gif) no-repeat 0 0; - cursor: pointer; - display: none; -} -ul#usefull_link_block li#favoriteproducts_block_extra_removed { - padding-left:20px; - background:url(img/add_favorite.gif) no-repeat 0 0; - cursor: pointer; - display: none; -} \ No newline at end of file diff --git a/modules/favoriteproducts/favoriteproducts.js b/modules/favoriteproducts/favoriteproducts.js deleted file mode 100755 index ae490fdbb..000000000 --- a/modules/favoriteproducts/favoriteproducts.js +++ /dev/null @@ -1,78 +0,0 @@ -$('document').ready(function(){ - $('#favoriteproducts_block_extra_add').click(function(){ - $.ajax({ - url: favorite_products_url_add + '&rand=' + new Date().getTime(), - type: "POST", - headers: { "cache-control": "no-cache" }, - data: { - "id_product": favorite_products_id_product - }, - success: function(result){ - if (result == '0') - { - $('#favoriteproducts_block_extra_add').slideUp(function() { - $('#favoriteproducts_block_extra_added').slideDown("slow"); - }); - - } - } - }); - }); - $('#favoriteproducts_block_extra_remove').click(function(){ - $.ajax({ - url: favorite_products_url_remove + '&rand=' + new Date().getTime(), - type: "POST", - headers: { "cache-control": "no-cache" }, - data: { - "id_product": favorite_products_id_product - }, - success: function(result){ - if (result == '0') - { - $('#favoriteproducts_block_extra_remove').slideUp(function() { - $('#favoriteproducts_block_extra_removed').slideDown("slow"); - }); - - } - } - }); - }); - $('#favoriteproducts_block_extra_added').click(function(){ - $.ajax({ - url: favorite_products_url_remove + '&rand=' + new Date().getTime(), - type: "POST", - headers: { "cache-control": "no-cache" }, - data: { - "id_product": favorite_products_id_product - }, - success: function(result){ - if (result == '0') - { - $('#favoriteproducts_block_extra_added').slideUp(function() { - $('#favoriteproducts_block_extra_removed').slideDown("slow"); - }); - - } - } - }); - }); - $('#favoriteproducts_block_extra_removed').click(function(){ - $.ajax({ - url: favorite_products_url_add + '&rand=' + new Date().getTime(), - type: "POST", - headers: { "cache-control": "no-cache" }, - data: { - "id_product": favorite_products_id_product - }, - success: function(result){ - if (result == '0') - { - $('#favoriteproducts_block_extra_removed').slideUp(function() { - $('#favoriteproducts_block_extra_added').slideDown("slow"); - }); - - } - } - }); - }); -}) \ No newline at end of file diff --git a/modules/favoriteproducts/favoriteproducts.php b/modules/favoriteproducts/favoriteproducts.php deleted file mode 100644 index 35a3972de..000000000 --- a/modules/favoriteproducts/favoriteproducts.php +++ /dev/null @@ -1,110 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_CAN_LOAD_FILES_')) - exit; - -class FavoriteProducts extends Module -{ - public function __construct() - { - $this->name = 'favoriteproducts'; - $this->tab = 'front_office_features'; - $this->version = 1.0; - $this->author = 'PrestaShop'; - $this->need_instance = 0; - - parent::__construct(); - - $this->displayName = $this->l('Favorite Products'); - $this->description = $this->l('Display a page featuring the customer\'s favorite products.'); - } - - public function install() - { - if (!parent::install() - || !$this->registerHook('displayMyAccountBlock') - || !$this->registerHook('displayCustomerAccount') - || !$this->registerHook('displayLeftColumnProduct') - || !$this->registerHook('extraLeft') - || !$this->registerHook('displayHeader')) - return false; - - if (!Db::getInstance()->execute(' - CREATE TABLE `'._DB_PREFIX_.'favorite_product` ( - `id_favorite_product` int(10) unsigned NOT NULL auto_increment, - `id_product` int(10) unsigned NOT NULL, - `id_customer` int(10) unsigned NOT NULL, - `id_shop` int(10) unsigned NOT NULL, - `date_add` datetime NOT NULL, - `date_upd` datetime NOT NULL, - PRIMARY KEY (`id_favorite_product`)) - ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8')) - return false; - - return true; - } - - public function uninstall() - { - if (!parent::uninstall() || !Db::getInstance()->execute('DROP TABLE `'._DB_PREFIX_.'favorite_product`')) - return false; - return true; - } - - public function hookDisplayCustomerAccount($params) - { - $this->smarty->assign('in_footer', false); - return $this->display(__FILE__, 'my-account.tpl'); - } - - public function hookDisplayMyAccountBlock($params) - { - $this->smarty->assign('in_footer', true); - return $this->display(__FILE__, 'my-account.tpl'); - } - - public function hookDisplayLeftColumnProduct($params) - { - include_once(dirname(__FILE__).'/FavoriteProduct.php'); - - $this->smarty->assign(array( - 'isCustomerFavoriteProduct' => (FavoriteProduct::isCustomerFavoriteProduct($this->context->customer->id, Tools::getValue('id_product')) ? 1 : 0), - 'isLogged' => (int)$this->context->customer->logged, - )); - return $this->display(__FILE__, 'favoriteproducts-extra.tpl'); - } - - public function hookDisplayHeader($params) - { - $this->context->controller->addCSS($this->_path.'favoriteproducts.css', 'all'); - $this->context->controller->addJS($this->_path.'favoriteproducts.js'); - return $this->display(__FILE__, 'favoriteproducts-header.tpl'); - } - -} - - diff --git a/modules/favoriteproducts/img/add_favorite.gif b/modules/favoriteproducts/img/add_favorite.gif deleted file mode 100644 index 8b0b263f659586f99603d8f76212ce5a215bf2ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2045 zcmZ?wbhEHb6krfw_}<8{MM-*%qV!%R>7z>0H*enjdh*zxKY#xJ|G!vK>i@rgn;aFE z$V;6+fBx>>yZ?UvII19d6sTBU`rf^Ja|O9}xjXJvmR{*1zeir;@87@YXV2Uq%6m>u z?&5gC!qrgBTArM^A5|KrDxKc7DSdH=5H zxb|K}sXre->`{=IASXFRkb8=#L`$yHwQJX|yI8HaF`pE#kiR&xZ%%jjMfsCD$`{n7 zPiV;fc=hU>tnh<9yZRhlJ{>)D)WUGFg4EytfByaa`QgKde}Dh|`~UaPyEhfPbiZFZ zH))~5k;8|Z536oly5xww#D|+V+Ef&~4<`Ql`@Lkh<^nIp=Kc2PmBh}<3U{p6`uX$c zW*M=+-@a|xw0!%$CSYhYjDi6Q0mc8^5xxNmE{P?HK-$K>q98FjJGDe1DK$Ma&sORE z?)^#%nJKnP;ikR@z6H*y8JQkcMXAA6ej&+K*~ykEO7?aNHWgMCxdpkYC5Z|ZxjA{o zRu#5Ni7EL>sa8NXNLXJ<0j#7X+g8aDB%uJZ(>cE=Rl!uxKsVXI%s|1+P|wiV#N6Cm zN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj%k|2Q z_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAf(~1RD^r68eAMwS&*t9 zlvKL-|y0U7xv`NbLe1q#l=rV8Pic`5nj#bDLG zzE+-j#U+V($*G<$wn{+#dYPFiR?cpQj%J1yj?RXbE{2A#2A0m2#%^YgCdLL%2Cl{y zmN308`N^fZsd*(Zy(tL2PB`^~5<+eP&}Ns^qRg_?6t|-MTm`U)tuk@D#R8{!P`xR* z-C~JTuRhQ*`k-h|Gy9x$yJ0TVUj|9^k~{QmXx$MeX-RQWVL^UgZccVqW=48iYD#ia zVnTdeY)o`iWJGvaXh?8SV1U1$uaCEvr-!?ntBbRfql3Mjt&O#nrG>efsfn=>Fhl9- z>S$|eYN)HJswgWdD#**p%1BE|N{EYziUvq{l z7%;SU>K3v&Xgqq@;Gkm4a$-%v!p;U6!FfHAiWj=s7#tdfZZ16FF<*d_MQwqBO2cIa zd7UF3iY#o7mcl0#95y^SA*-9ara)tb(kWhn@NZu#gpaT-;A7!W`JtG~C2XyKt>eJt zV+s-)Rs|a-I4<{_*(ee7!83{B+#G{?uLRDPV+{w4g;vZ-aA;_gR)};H$hg3?@a1JT IW+nz}08YN3O8@`> diff --git a/modules/favoriteproducts/img/del_favorite.gif b/modules/favoriteproducts/img/del_favorite.gif deleted file mode 100644 index 8aea7d4f7050eb06564d02cdef2de912ac365832..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmV-s0h#_sNk%w1VGsZi0M!5h?SNOsH5jEJ6}&AL)_ZUFnswGxE#+@U_T=N_wXpJy zW#ei@)pKagQ9Se9+t!SR+GbP5T2IVEA=j&`?#aj7t*!sBi|oU}(rI7j%*~w|66}3c z!$2{rCmYh0l-gP{++I2R^6>PYf%%|)#6>sKot^mV>ELWlxZ&&~Yz_w|u!_UY-|YgW%+RqvL2)1ssA)YJd|{?u7J`ta}Gk%qlC zCIA2bA^8LV00000EC2ui01yBW000Jqz@KnPEEr>TRa;$% zjGJY|K=23!iwHyH6cn$XEODAC3M8Tr0NAJ;1PgrtEJP6?2L~VoISmU3I}bz&0|p-- z4G1X)1}HQ{IvyPoFcA*{5*-ys9s&Uz0RaLNNIxY40|Nr9wLdr-8nnGa85zUJ$U{K@ EJ471MUIY+kdTmwh=`Y$m;C(v_V)Jp z`1t$#`|9fI@$vEQ?(U+ZqN=K@;o;%s<>iu+lK1!b-QC@;uCBqs!KtaKwY9aJoSenQ z#kaS&^z`(fpP!MDk^cVvo}Qkhq@=X8wD9oo&(F`RtEFK4VrR(eKy1Kf@$H$M4kBf_oiHV7g zjg5+mij0hm|NsAG(mkXA0065=L_t(|+Psq24uc>7MWN!J-Me=0y{+*7zf~(3t;l10 zo^EnN0`~%l5b$@U?8k#y`;*Y9ZdLVEouyI)E)z1OX^|*J3SzM1O -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/favoriteproducts/index.php b/modules/favoriteproducts/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/favoriteproducts/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/favoriteproducts/logo.gif b/modules/favoriteproducts/logo.gif deleted file mode 100644 index 8b0b263f659586f99603d8f76212ce5a215bf2ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2045 zcmZ?wbhEHb6krfw_}<8{MM-*%qV!%R>7z>0H*enjdh*zxKY#xJ|G!vK>i@rgn;aFE z$V;6+fBx>>yZ?UvII19d6sTBU`rf^Ja|O9}xjXJvmR{*1zeir;@87@YXV2Uq%6m>u z?&5gC!qrgBTArM^A5|KrDxKc7DSdH=5H zxb|K}sXre->`{=IASXFRkb8=#L`$yHwQJX|yI8HaF`pE#kiR&xZ%%jjMfsCD$`{n7 zPiV;fc=hU>tnh<9yZRhlJ{>)D)WUGFg4EytfByaa`QgKde}Dh|`~UaPyEhfPbiZFZ zH))~5k;8|Z536oly5xww#D|+V+Ef&~4<`Ql`@Lkh<^nIp=Kc2PmBh}<3U{p6`uX$c zW*M=+-@a|xw0!%$CSYhYjDi6Q0mc8^5xxNmE{P?HK-$K>q98FjJGDe1DK$Ma&sORE z?)^#%nJKnP;ikR@z6H*y8JQkcMXAA6ej&+K*~ykEO7?aNHWgMCxdpkYC5Z|ZxjA{o zRu#5Ni7EL>sa8NXNLXJ<0j#7X+g8aDB%uJZ(>cE=Rl!uxKsVXI%s|1+P|wiV#N6Cm zN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj%k|2Q z_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAf(~1RD^r68eAMwS&*t9 zlvKL-|y0U7xv`NbLe1q#l=rV8Pic`5nj#bDLG zzE+-j#U+V($*G<$wn{+#dYPFiR?cpQj%J1yj?RXbE{2A#2A0m2#%^YgCdLL%2Cl{y zmN308`N^fZsd*(Zy(tL2PB`^~5<+eP&}Ns^qRg_?6t|-MTm`U)tuk@D#R8{!P`xR* z-C~JTuRhQ*`k-h|Gy9x$yJ0TVUj|9^k~{QmXx$MeX-RQWVL^UgZccVqW=48iYD#ia zVnTdeY)o`iWJGvaXh?8SV1U1$uaCEvr-!?ntBbRfql3Mjt&O#nrG>efsfn=>Fhl9- z>S$|eYN)HJswgWdD#**p%1BE|N{EYziUvq{l z7%;SU>K3v&Xgqq@;Gkm4a$-%v!p;U6!FfHAiWj=s7#tdfZZ16FF<*d_MQwqBO2cIa zd7UF3iY#o7mcl0#95y^SA*-9ara)tb(kWhn@NZu#gpaT-;A7!W`JtG~C2XyKt>eJt zV+s-)Rs|a-I4<{_*(ee7!83{B+#G{?uLRDPV+{w4g;vZ-aA;_gR)};H$hg3?@a1JT IW+nz}08YN3O8@`> diff --git a/modules/favoriteproducts/logo.png b/modules/favoriteproducts/logo.png deleted file mode 100755 index 478d568fa9e9b3e169dcf4a6f2712067e3a2051a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1969 zcmV;i2Tu5jP)ssQ&hLEZ^_?r=(j^?Js;J5l z@v@|8_oUNlWEB)3HaQ7V6ysCCleNuVhe%GtH!rb%ZTaK#fP-x-7)7;5Mz_qrb*IBc^1dqG}b<9V5CEfM9 zuQmFsrjWJz4%jws!Kr;O*})ad#^OYZe4qF^CK? zNCBb|B--2XgH2lz@eJl}$yK&LR$BNAyVF^5^M(fz{MX-*jzl0R*30+HGSm?dgk%ze zVw`|=8DG^_4 zmBgy$b=!0vzhfC)_OktouA4C!i!m9S{ERHCD6X8BP9h{*4A%?76_T7BCP+w+Patuo z4L{!ZcRkUP|NBJe3A|qvam6KwdfG7-V=^`yATyvk>eDTSB+e?1*@Y(R6mL0!c#|u` z6D-#NH?mnj1Y?7=y7Gld-uGiSFRkR}U2C?8rKPA3k&cg8U~6 z=jTv`O;_i)I2{qeK%unC(iB+J3M`roOPYvy7BV753D)DAz)pAfqm#+hAb~`ui#gIW z6&vUZO&zj%#~-hBmOxcCO33t_Gh0fFuu?=%+kAMt=qz0M)K|>ylyJB=n1`RZi@5+^ zzd%@wIeQ++A#xtAt~|1$*uJE+Z~;_JGj77UfTv`|p9tBM~%+5B}lP`?M>;qkW`_FxCk1JbNU%>#xu6iYPT zYL&Ly^YdU)6l1W_E8|iUi4?N?Y_<udE@l%3(p(aczYeJ3-A(8Qr~p*B#1`-+C6mm z_-NpzFVA%&7Efjjm|b>!oiyb5QD)D@V6YP@a#x({Dlubh<|9ELeK_FRBol}YWpZRLBMgVb_wmSN^Twu*hub|~_vdYHy{mzzAe!nn#LF=1 z2dp&D*sRo0h-{XxmGHC9vl=oqy@6W8Db_y+r|CxU)k$*{E^KM(dcx%yJ=olO3L$?G zv49_I8f`e=XADz3w<@v$G`*}QkKajj@(UM%p*FnA`T1?f9}Za_k)x(?{tsWgrSvsP z6Vf}~Jx^utoT^*A7@P0B!|-d8LO>O4e6>i10UWZXR!Z1je0cmX_%-L)^~_)FHSV!? zZgQrFLd?5+7yejSiicJ#2a1Z!iPM<&Fgy%=b)MWmfTJh&V>hw;c%SecCM(4>1ZIfn zLlO&@-;cW%RpCiX9#&`OJCaTW;qGt2!SkQsByom_0+~;K_2#$usN?%MAT#v%^NscAx1?{}*5YIRet&z2i@;00000NkvXXu0mjf Dupz+i diff --git a/modules/favoriteproducts/translations/index.php b/modules/favoriteproducts/translations/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/favoriteproducts/translations/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/favoriteproducts/views/index.php b/modules/favoriteproducts/views/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/favoriteproducts/views/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/favoriteproducts/views/templates/front/favoriteproducts-account.tpl b/modules/favoriteproducts/views/templates/front/favoriteproducts-account.tpl deleted file mode 100644 index a5ebf872f..000000000 --- a/modules/favoriteproducts/views/templates/front/favoriteproducts-account.tpl +++ /dev/null @@ -1,89 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - - -{capture name=path} - - {l s='My account' mod='favoriteproducts'} - {$navigationPipe}{l s='My favorite products.' mod='favoriteproducts'} -{/capture} -{include file="$tpl_dir./breadcrumb.tpl"} - -
    -

    {l s='My favorite products.' mod='favoriteproducts'}

    - {if $favoriteProducts} -
    - {foreach from=$favoriteProducts item=favoriteProduct} -
    - - -

    {$favoriteProduct.name|escape:'html':'UTF-8'}

    -
    {$favoriteProduct.description_short|strip_tags|escape:'html':'UTF-8'}
    - -
    - -
    -
    - {/foreach} -
    - {else} -

    {l s='No favorite products have been determined just yet. ' mod='favoriteproducts'}

    - {/if} - - -
    \ No newline at end of file diff --git a/modules/favoriteproducts/views/templates/front/index.php b/modules/favoriteproducts/views/templates/front/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/favoriteproducts/views/templates/front/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/favoriteproducts/views/templates/hook/favoriteproducts-extra.tpl b/modules/favoriteproducts/views/templates/hook/favoriteproducts-extra.tpl deleted file mode 100644 index 7bd3e1df7..000000000 --- a/modules/favoriteproducts/views/templates/hook/favoriteproducts-extra.tpl +++ /dev/null @@ -1,42 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -{if !$isCustomerFavoriteProduct AND $isLogged} -
  • - {l s='Add this product to my list of favorites.' mod='favoriteproducts'} -
  • -{/if} -{if $isCustomerFavoriteProduct AND $isLogged} -
  • - {l s='Remove this product from my favorite\'s list. ' mod='favoriteproducts'} -
  • -{/if} - -
  • - {l s='Remove this product from my favorite\'s list. ' mod='favoriteproducts'} -
  • -
  • - {l s='Add this product to my list of favorites.' mod='favoriteproducts'} -
  • \ No newline at end of file diff --git a/modules/favoriteproducts/views/templates/hook/favoriteproducts-header.tpl b/modules/favoriteproducts/views/templates/hook/favoriteproducts-header.tpl deleted file mode 100755 index 669a45eec..000000000 --- a/modules/favoriteproducts/views/templates/hook/favoriteproducts-header.tpl +++ /dev/null @@ -1,31 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - diff --git a/modules/favoriteproducts/views/templates/hook/index.php b/modules/favoriteproducts/views/templates/hook/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/favoriteproducts/views/templates/hook/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/favoriteproducts/views/templates/hook/my-account.tpl b/modules/favoriteproducts/views/templates/hook/my-account.tpl deleted file mode 100644 index b2cd80e49..000000000 --- a/modules/favoriteproducts/views/templates/hook/my-account.tpl +++ /dev/null @@ -1,31 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -
  • - - {if !$in_footer}{l s='My favorite products.' mod='favoriteproducts'}{/if} - {l s='My favorite products.' mod='favoriteproducts'} - -
  • diff --git a/modules/favoriteproducts/views/templates/index.php b/modules/favoriteproducts/views/templates/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/favoriteproducts/views/templates/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/feeder/config.xml b/modules/feeder/config.xml deleted file mode 100755 index 58ba3ce4a..000000000 --- a/modules/feeder/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - feeder - - - - - - 0 - 0 - - \ No newline at end of file diff --git a/modules/feeder/feeder.php b/modules/feeder/feeder.php deleted file mode 100644 index 6382a0637..000000000 --- a/modules/feeder/feeder.php +++ /dev/null @@ -1,79 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class Feeder extends Module -{ - private $_postErrors = array(); - - public function __construct() - { - $this->name = 'feeder'; - $this->tab = 'front_office_features'; - $this->version = 0.4; - $this->author = 'PrestaShop'; - $this->need_instance = 0; - - $this->_directory = dirname(__FILE__).'/../../'; - parent::__construct(); - - $this->displayName = $this->l('RSS products feed.'); - $this->description = $this->l('Generate an RSS products feed.'); - } - - function install() - { - return (parent::install() && $this->registerHook('header')); - } - - function hookHeader($params) - { - if (!($id_category = (int)Tools::getValue('id_category'))) - { - if (isset($_SERVER['HTTP_REFERER']) && strstr($_SERVER['HTTP_REFERER'], Tools::getHttpHost()) && preg_match('!^(.*)\/([0-9]+)\-(.*[^\.])|(.*)id_category=([0-9]+)(.*)$!', $_SERVER['HTTP_REFERER'], $regs)) - { - if (isset($regs[2]) && is_numeric($regs[2])) - $id_category = (int)($regs[2]); - elseif (isset($regs[5]) && is_numeric($regs[5])) - $id_category = (int)$regs[5]; - } - elseif ($id_product = (int)Tools::getValue('id_product')) - { - $product = new Product($id_product); - $id_category = $product->id_category_default; - } - } - - $orderBy = Tools::getProductsOrder('by', Tools::getValue('orderby')); - $orderWay = Tools::getProductsOrder('way', Tools::getValue('orderway')); - $this->smarty->assign(array( - 'feedUrl' => Tools::getShopDomain(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/rss.php?id_category='.$id_category.'&orderby='.$orderBy.'&orderway='.$orderWay, - )); - return $this->display(__FILE__, 'feederHeader.tpl'); - } -} diff --git a/modules/feeder/feederHeader.tpl b/modules/feeder/feederHeader.tpl deleted file mode 100644 index c05a8b5a1..000000000 --- a/modules/feeder/feederHeader.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - \ No newline at end of file diff --git a/modules/feeder/index.php b/modules/feeder/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/feeder/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/feeder/logo.gif b/modules/feeder/logo.gif deleted file mode 100644 index 7a5e0099f7522ee53c55350a42a41c1018feaeea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1009 zcmeH`=}Xgb0Ed6(%oUR6Jn|rqkW9o(E7YVs$}6*pcp|3rKyn_7G%=#-h8N2Y6R%vR z=8L9m4g$=4~anBYHZ1Knrb@pg< z(AW6V_x+%Dp&$Cwwdd)_7tnSbo$lyzN3REZJ?XkYraqWy2xgitF;7C7mM}&gf%;f9 z#Gx?(O$lgDggO~dQ`pu>wk?WzCT2UtTvrU*u5mrF+>1D_H=cWy#J^7F-=v^D70=Vr znU3yEwl5#O+33sR2U7V#2^q?OCKvsAWF(7>Ws|qp$-5l9m$LmbcHkxkWEhmOL&X>_ z#7Gf0T7t1+Xmg>>!$dwN3&=zf#&2Wd4yNw%<7ND$5+CIJbOk?Mg_$zUC@`zUTsfIl zVZM^g*Ksq=Sg686HUFubEcTGaKJraVmZykrj{N*g*1nL96|%X4O&zv$*jXjpYuH)C z?mB+2L%#w27U*AKw!!Rx)r0#B4W0uC^?(1qfD6Oa}p5IQeqOKX3qY`oG&3;MlWsuijvjc2q(Ia6bQCZoesrYsen zP23g+d3Rn_+ZE~kot!QjRC>qn&poU&o~!pM%o?`YG%T&~x?<8p2d|o`-70r|zNb!( z8=bsta-igx@pOx?>ms$ZAqg<@h!9kr5_E|jPbev)j|#)3={q7u3INyl6F rQ3BVna-qR;yRpjJBjKeu`fH%V=%Bfyk6133QL~3T@g{5TZ$7L7QAkMPgZ6MA;8y7CMU1 z{JqyX@4Pqj#(7Q@4YSA#ci#1V&iTIk-E+^qqZo#Pd^Qz%ZYu)vF2KVdilUg~SDjn> zyow$|t`d`YVum_c*FDirf5npm_&IiT^T5`Q!_BDK4&-WM@I0qRLSshnKx5BjD~qrN z1cR#4jJ4ZV|P_=75sE3zAKb3K{>?$tUR+&Q1Xj&jT})K+$TT^%_uKlfpke1^PP) zTLZK$#hw9!$7vF(aJbh2MU=DsMk4ikdYs%?lz^ctKy-n~yHW(-CgeHyL4vorVBskt zHywyB;{d;7P}4+&-EOu3{$k+7C{R#A;>g=uX zm31*DctOH^8b*R(_Dh z(OJTJGcmIYk{iB)Yz|m;fOEjiSgUase;t)EXLzt8h1mr2AAtv*Lg0oCS(xU@r~~Ph z(6ExwM`e2WoRn365e1<={`jorNC|Ljk0h0^M6#c&q)MU#otf6%sHrW;qa)=l2&Ph)XLI8IHA0o)a9=pE?I@EO{0f!r|(Gt$9?V30)=a@ytiBFy`6F`13|{%NMH{5JgW c1^g0V03PE@8pCCiy#N3J07*qoM6N<$f}wcL!2kdN diff --git a/modules/feeder/rss.php b/modules/feeder/rss.php deleted file mode 100644 index 046650c4e..000000000 --- a/modules/feeder/rss.php +++ /dev/null @@ -1,82 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ -include(dirname(__FILE__).'/../../config/config.inc.php'); -require_once(dirname(__FILE__).'/../../init.php'); - -if (!Module::getInstanceByName('feeder')->active) - exit; - -// Get data -$number = ((int)(Tools::getValue('n')) ? (int)(Tools::getValue('n')) : 10); -$orderBy = Tools::getProductsOrder('by', Tools::getValue('orderby')); -$orderWay = Tools::getProductsOrder('way', Tools::getValue('orderway')); -$id_category = ((int)(Tools::getValue('id_category')) ? (int)(Tools::getValue('id_category')) : Configuration::get('PS_HOME_CATEGORY')); -$products = Product::getProducts((int)Context::getContext()->language->id, 0, ($number > 10 ? 10 : $number), $orderBy, $orderWay, $id_category, true); -$currency = new Currency((int)Context::getContext()->currency->id); -$affiliate = (Tools::getValue('ac') ? '?ac='.(int)(Tools::getValue('ac')) : ''); -$metas = Meta::getMetaByPage('index', (int)Context::getContext()->language->id); - -// Send feed -header("Content-Type:text/xml; charset=utf-8"); -echo ''."\n"; -?> - - - <![CDATA[<?php echo Configuration::get('PS_SHOP_NAME') ?>]]> - ]]> - - - PrestaShop - language->iso_code; ?> - - <![CDATA[<?php echo Configuration::get('PS_SHOP_NAME') ?>]]> - - - -id_lang), $product['id_product']); - echo "\t\t\n"; - echo "\t\t\t<![CDATA[".$product['name']." - ".html_entity_decode(Tools::displayPrice(Product::getPriceStatic($product['id_product']), $currency), ENT_COMPAT, 'UTF-8')." ]]>\n"; - echo "\t\t\t"; - $cdata = true; - if (is_array($image) AND sizeof($image)) - { - $imageObj = new Image($image[0]['id_image']); - echo "getImageLink($product['link_rewrite'], $image[0]['id_image'], 'small_default')."' title='".str_replace('&', '', $product['name'])."' alt='thumb' />"; - $cdata = false; - } - if ($cdata) - echo "\n"; - - echo "\t\t\tgetproductLink($product['id_product'], $product['link_rewrite'], Category::getLinkRewrite((int)($product['id_category_default']), $cookie->id_lang)))).$affiliate."]]>\n"; - echo "\t\t\n"; - } -?> - - \ No newline at end of file diff --git a/modules/feeder/translations/index.php b/modules/feeder/translations/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/feeder/translations/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/followup/config.xml b/modules/followup/config.xml deleted file mode 100755 index 54ea7dfa1..000000000 --- a/modules/followup/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - followup - - - - - - Are you sure you want to delete all settings and your logs? - 1 - 0 - - \ No newline at end of file diff --git a/modules/followup/cron.php b/modules/followup/cron.php deleted file mode 100644 index c6099b094..000000000 --- a/modules/followup/cron.php +++ /dev/null @@ -1,40 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -include(dirname(__FILE__).'/../../config/config.inc.php'); -include(dirname(__FILE__).'/followup.php'); - -if (isset($_GET['secure_key'])) -{ - $secureKey = Configuration::get('PS_FOLLOWUP_SECURE_KEY'); - if (!empty($secureKey) AND $secureKey === $_GET['secure_key']) - { - $followup = new Followup(); - if ($followup->active) - $followup->cronTask(); - } -} - diff --git a/modules/followup/followup.php b/modules/followup/followup.php deleted file mode 100644 index a884911d4..000000000 --- a/modules/followup/followup.php +++ /dev/null @@ -1,698 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class Followup extends Module -{ - function __construct() - { - $this->name = 'followup'; - $this->tab = 'advertising_marketing'; - $this->version = '1.0'; - $this->author = 'PrestaShop'; - $this->need_instance = 0; - - $this->confKeys = array( - 'PS_FOLLOW_UP_ENABLE_1', 'PS_FOLLOW_UP_ENABLE_2', 'PS_FOLLOW_UP_ENABLE_3', 'PS_FOLLOW_UP_ENABLE_4', - 'PS_FOLLOW_UP_AMOUNT_1', 'PS_FOLLOW_UP_AMOUNT_2', 'PS_FOLLOW_UP_AMOUNT_3', 'PS_FOLLOW_UP_AMOUNT_4', - 'PS_FOLLOW_UP_DAYS_1', 'PS_FOLLOW_UP_DAYS_2', 'PS_FOLLOW_UP_DAYS_3', 'PS_FOLLOW_UP_DAYS_4', - 'PS_FOLLOW_UP_THRESHOLD_3', - 'PS_FOLLOW_UP_DAYS_THRESHOLD_4', - 'PS_FOLLOW_UP_CLEAN_DB'); - - $this->bootstrap = true; - parent::__construct(); - - $this->displayName = $this->l('Customer follow-up'); - $this->description = $this->l('Follow-up with your customers with daily customized e-mails.'); - $this->confirmUninstall = $this->l('Are you sure you want to delete all settings and your logs?'); - } - - public function install() - { - $logEmailTable = Db::getInstance()->execute(' - CREATE TABLE '._DB_PREFIX_.'log_email ( - `id_log_email` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , - `id_email_type` INT UNSIGNED NOT NULL , - `id_cart_rule` INT UNSIGNED NOT NULL , - `id_customer` INT UNSIGNED NULL , - `id_cart` INT UNSIGNED NULL , - `date_add` DATETIME NOT NULL, - INDEX `date_add`(`date_add`), - INDEX `id_cart`(`id_cart`) - ) ENGINE='._MYSQL_ENGINE_); - - foreach ($this->confKeys AS $key) - Configuration::updateValue($key, 0); - - Configuration::updateValue('PS_FOLLOWUP_SECURE_KEY', strtoupper(Tools::passwdGen(16))); - - return parent::install(); - } - - public function uninstall() - { - foreach ($this->confKeys AS $key) - Configuration::deleteByName($key); - - Configuration::deleteByName('PS_FOLLOWUP_SECURE_KEY'); - - Db::getInstance()->execute('DROP TABLE '._DB_PREFIX_.'log_email'); - - return parent::uninstall(); - } - - public function getContent() - { - $html = ''; - /* Save settings */ - if (Tools::isSubmit('submitFollowUp')) - { - $ok = true; - foreach ($this->confKeys AS $c) - $ok &= Configuration::updateValue($c, (float)Tools::getValue($c)); - if ($ok) - $html .= $this->displayConfirmation($this->l('Settings updated succesfully')); - else - $html .= $this->displayError($this->l('Error occurred during settings update')); - } - $html .= $this->renderForm(); - $html .= $this->renderStats(); - return $html; - } - - /* Log each sent e-mail */ - private function logEmail($id_email_type, $id_cart_rule, $id_customer = NULL, $id_cart = NULL) - { - $values = array('id_email_type' => (int)($id_email_type), 'id_cart_rule' => (int)$id_cart_rule, 'date_add' => date('Y-m-d H:i:s')); - if (!empty($id_cart)) - $values['id_cart'] = (int)($id_cart); - if (!empty($id_customer)) - $values['id_customer'] = (int)($id_customer); - Db::getInstance()->insert('log_email', $values); - } - - /* Each cart which wasn't transformed into an order */ - private function cancelledCart($count = false) - { - $emailLogs = $this->getLogsEmail(1); - $sql = ' - SELECT c.id_cart, c.id_lang, cu.id_customer, cu.firstname, cu.lastname, cu.email - FROM '._DB_PREFIX_.'cart c - LEFT JOIN '._DB_PREFIX_.'orders o ON (o.id_cart = c.id_cart) - RIGHT JOIN '._DB_PREFIX_.'customer cu ON (cu.id_customer = c.id_customer) - RIGHT JOIN '._DB_PREFIX_.'cart_product cp ON (cp.id_cart = c.id_cart) - WHERE DATE_SUB(CURDATE(),INTERVAL 7 DAY) <= c.date_add AND o.id_order IS NULL'; - - if(!empty($emailLogs)) - $sql .= ' AND c.id_cart NOT IN ('.join(',', $emailLogs).')'; - - $emails = Db::getInstance()->executeS($sql); - - if ($count OR !sizeof($emails)) - return sizeof($emails); - - $conf = Configuration::getMultiple(array('PS_FOLLOW_UP_AMOUNT_1', 'PS_FOLLOW_UP_DAYS_1')); - foreach ($emails AS $email) - { - $voucher = $this->createDiscount(1, (float)($conf['PS_FOLLOW_UP_AMOUNT_1']), (int)($email['id_customer']), strftime('%Y-%m-%d', strtotime('+'.(int)($conf['PS_FOLLOW_UP_DAYS_1']).' day')), $this->l('Discount for your cancelled cart')); - if ($voucher !== false) - { - $templateVars = array('{email}' => $email['email'], '{lastname}' => $email['lastname'], '{firstname}' => $email['firstname'], '{amount}' => $conf['PS_FOLLOW_UP_AMOUNT_1'], '{days}' => $conf['PS_FOLLOW_UP_DAYS_1'], '{voucher_num}' => $voucher->code); - $result = Mail::Send((int)$email['id_lang'], 'followup_1', Mail::l('Your cart and your discount', (int)$email['id_lang']), $templateVars, $email['email'], $email['firstname'].' '.$email['lastname'], NULL, NULL, NULL, NULL, dirname(__FILE__).'/mails/'); - $this->logEmail(1, (int)($voucher->id), (int)($email['id_customer']), (int)($email['id_cart'])); - } - } - } - - private function getLogsEmail($emailType) - { - static $idList = array( - '1' => array(), - '2' => array(), - '3' => array(), - '4' => array(), - ); - static $executed = false; - - if(!$executed) - { - $query = ' - SELECT id_cart, id_customer, id_email_type FROM '._DB_PREFIX_.'log_email - WHERE id_email_type <> 4 OR date_add >= DATE_SUB(date_add,INTERVAL '.(int)(Configuration::get('PS_FOLLOW_UP_DAYS_THRESHOLD_4')).' DAY)'; - $results = Db::getInstance()->executeS($query); - foreach ($results as $line) - { - switch ($line['id_email_type']) - { - case 1: - $idList['1'][] = $line['id_cart']; - break; - case 2: - $idList['2'][] = $line['id_cart']; - break; - case 3: - $idList['3'][] = $line['id_customer']; - break; - case 4: - $idList['4'][] = $line['id_customer']; - break; - } - } - $executed = true; - } - return $idList[$emailType]; - } - - /* For all validated orders, a discount if re-ordering before x days */ - private function reOrder($count = false) - { - $emailLogs = $this->getLogsEmail(2); - $sql = ' - SELECT o.id_order, c.id_cart, o.id_lang, cu.id_customer, cu.firstname, cu.lastname, cu.email - FROM '._DB_PREFIX_.'orders o - LEFT JOIN '._DB_PREFIX_.'customer cu ON (cu.id_customer = o.id_customer) - LEFT JOIN '._DB_PREFIX_.'cart c ON (c.id_cart = o.id_cart) - WHERE o.valid = 1 - AND c.date_add >= DATE_SUB(CURDATE(),INTERVAL 7 DAY) - AND cu.is_guest = 0 '; - - if(!empty($emailLogs)) - $sql .= ' AND o.id_cart NOT IN ('.join(',', $emailLogs).')'; - - $emails = Db::getInstance()->executeS($sql); - - if ($count OR !sizeof($emails)) - return sizeof($emails); - - $conf = Configuration::getMultiple(array('PS_FOLLOW_UP_AMOUNT_2', 'PS_FOLLOW_UP_DAYS_2')); - foreach ($emails AS $email) - { - $voucher = $this->createDiscount(2, (float)($conf['PS_FOLLOW_UP_AMOUNT_2']), (int)($email['id_customer']), strftime('%Y-%m-%d', strtotime('+'.(int)($conf['PS_FOLLOW_UP_DAYS_2']).' day')), $this->l('Thank you for your order.')); - if ($voucher !== false) - { - $templateVars = array('{email}' => $email['email'], '{lastname}' => $email['lastname'], '{firstname}' => $email['firstname'], '{amount}' => $conf['PS_FOLLOW_UP_AMOUNT_2'], '{days}' => $conf['PS_FOLLOW_UP_DAYS_2'], '{voucher_num}' => $voucher->code); - $result = Mail::Send((int)$email['id_lang'], 'followup_2', Mail::l('Thanks for your order', (int)$email['id_lang']), $templateVars, $email['email'], $email['firstname'].' '.$email['lastname'], NULL, NULL, NULL, NULL, dirname(__FILE__).'/mails/'); - $this->logEmail(2, (int)($voucher->id), (int)($email['id_customer']), (int)($email['id_cart'])); - } - } - } - - /* For all customers with more than x euros in 90 days */ - private function bestCustomer($count = false) - { - $emailLogs = $this->getLogsEmail(3); - - $sql = ' - SELECT SUM(o.total_paid) total, c.id_cart, o.id_lang, cu.id_customer, cu.firstname, cu.lastname, cu.email - FROM '._DB_PREFIX_.'orders o - LEFT JOIN '._DB_PREFIX_.'customer cu ON (cu.id_customer = o.id_customer) - LEFT JOIN '._DB_PREFIX_.'cart c ON (c.id_cart = o.id_cart) - WHERE o.valid = 1 - AND DATE_SUB(CURDATE(),INTERVAL 90 DAY) <= o.date_add - AND cu.is_guest = 0 '; - - if(!empty($emailLogs)) - $sql .= ' AND cu.id_customer NOT IN ('.join(',', $emailLogs).') '; - - $sql .= ' - GROUP BY o.id_customer - HAVING total >= '.(float)(Configuration::get('PS_FOLLOW_UP_THRESHOLD_3')); - - $emails = Db::getInstance()->executeS($sql); - - if ($count OR !sizeof($emails)) - return sizeof($emails); - - $conf = Configuration::getMultiple(array('PS_FOLLOW_UP_AMOUNT_3', 'PS_FOLLOW_UP_DAYS_3')); - foreach ($emails AS $email) - { - $voucher = $this->createDiscount(3, (float)($conf['PS_FOLLOW_UP_AMOUNT_3']), (int)($email['id_customer']), strftime('%Y-%m-%d', strtotime('+'.(int)($conf['PS_FOLLOW_UP_DAYS_3']).' day')), $this->l('You are one of our best customers!')); - if ($voucher !== false) - { - $templateVars = array('{email}' => $email['email'], '{lastname}' => $email['lastname'], '{firstname}' => $email['firstname'], '{amount}' => $conf['PS_FOLLOW_UP_AMOUNT_3'], '{days}' => $conf['PS_FOLLOW_UP_DAYS_3'], '{voucher_num}' => $voucher->code); - $result = Mail::Send((int)$email['id_lang'], 'followup_3', Mail::l('You are one of our best customers', (int)$email['id_lang']), $templateVars, $email['email'], $email['firstname'].' '.$email['lastname'], NULL, NULL, NULL, NULL, dirname(__FILE__).'/mails/'); - $this->logEmail(3, (int)($voucher->id), (int)($email['id_customer']), (int)($email['id_cart'])); - } - } - } - - /* For all customers with no orders since more than x days */ - - /** - * badCustomer send mails to all customers with no orders since more than x days, - * with at least one valid order in history - * - * @param boolean $count if set to true, will return number of customer (default : false, will send mails, no return value) - * @return void - */ - private function badCustomer($count = false) - { - $emailLogs = $this->getLogsEmail(4); - $sql = ' - SELECT o.id_lang, c.id_cart, cu.id_customer, cu.firstname, cu.lastname, cu.email, (SELECT COUNT(o.id_order) FROM '._DB_PREFIX_.'orders o WHERE o.id_customer = cu.id_customer and o.valid = 1) nb_orders - FROM '._DB_PREFIX_.'customer cu - LEFT JOIN '._DB_PREFIX_.'orders o ON (o.id_customer = cu.id_customer) - LEFT JOIN '._DB_PREFIX_.'cart c ON (c.id_cart = o.id_cart) - WHERE cu.id_customer NOT IN (SELECT o.id_customer FROM '._DB_PREFIX_.'orders o WHERE DATE_SUB(CURDATE(),INTERVAL '.(int)(Configuration::get('PS_FOLLOW_UP_DAYS_THRESHOLD_4')).' DAY) <= o.date_add) - AND cu.is_guest = 0 '; - - if(!empty($emailLogs)) - $sql .= ' AND cu.id_customer NOT IN ('.join(',', $emailLogs).') '; - - $sql .= 'GROUP BY cu.id_customer HAVING nb_orders >= 1'; - - $emails = Db::getInstance()->executeS($sql); - - if ($count OR !sizeof($emails)) - return sizeof($emails); - - $conf = Configuration::getMultiple(array('PS_FOLLOW_UP_AMOUNT_4', 'PS_FOLLOW_UP_DAYS_4')); - foreach ($emails AS $email) - { - $voucher = $this->createDiscount(4, (float)($conf['PS_FOLLOW_UP_AMOUNT_4']), (int)($email['id_customer']), strftime('%Y-%m-%d', strtotime('+'.(int)($conf['PS_FOLLOW_UP_DAYS_4']).' day')), $this->l('We miss you!')); - if ($voucher !== false) - { - $templateVars = array('{email}' => $email['email'], '{lastname}' => $email['lastname'], '{firstname}' => $email['firstname'], '{amount}' => $conf['PS_FOLLOW_UP_AMOUNT_4'], '{days}' => $conf['PS_FOLLOW_UP_DAYS_4'], '{days_threshold}' => (int)(Configuration::get('PS_FOLLOW_UP_DAYS_THRESHOLD_4')), '{voucher_num}' => $voucher->code); - $result = Mail::Send((int)$email['id_lang'], 'followup_4', Mail::l('We miss you', (int)$email['id_lang']), $templateVars, $email['email'], $email['firstname'].' '.$email['lastname'], NULL, NULL, NULL, NULL, dirname(__FILE__).'/mails/'); - $this->logEmail(4, (int)($voucher->id), (int)($email['id_customer']), (int)($email['id_cart'])); - } - } - } - - private function createDiscount($id_email_type, $amount, $id_customer, $dateValidity, $description) - { - $cartRule = new CartRule(); - $cartRule->reduction_percent = (float)$amount; - $cartRule->id_customer = (int)$id_customer; - $cartRule->date_to = $dateValidity; - $cartRule->date_from = date('Y-m-d H:i:s'); - $cartRule->quantity = 1; - $cartRule->quantity_per_user = 1; - $cartRule->cart_rule_restriction = 1; - $cartRule->minimum_amount = 0; - - $languages = Language::getLanguages(true); - foreach ($languages AS $language) - $cartRule->name[(int)$language['id_lang']] = $description; - - $code = 'FLW-'.(int)($id_email_type).'-'.strtoupper(Tools::passwdGen(10)); - $cartRule->code = $code; - $cartRule->active = 1; - if (!$cartRule->add()) - return false; - return $cartRule; - } - - public function cronTask() - { - Context::getContext()->link = new Link(); //when this is call by cron context is not init - $conf = Configuration::getMultiple(array('PS_FOLLOW_UP_ENABLE_1', 'PS_FOLLOW_UP_ENABLE_2', 'PS_FOLLOW_UP_ENABLE_3', 'PS_FOLLOW_UP_ENABLE_4', 'PS_FOLLOW_UP_CLEAN_DB')); - - if ($conf['PS_FOLLOW_UP_ENABLE_1']) - $this->cancelledCart(); - if ($conf['PS_FOLLOW_UP_ENABLE_2']) - $this->reOrder(); - if ($conf['PS_FOLLOW_UP_ENABLE_3']) - $this->bestCustomer(); - if ($conf['PS_FOLLOW_UP_ENABLE_4']) - $this->badCustomer(); - - /* Clean-up database by deleting all outdated discounts */ - if ($conf['PS_FOLLOW_UP_CLEAN_DB'] == 1) - { - $outdatedDiscounts = Db::getInstance()->executeS('SELECT id_cart_rule FROM '._DB_PREFIX_.'cart_rule WHERE date_to < NOW() AND code LIKE "FLW-%"'); - foreach ($outdatedDiscounts AS $outdatedDiscount) - { - $cartRule = new CartRule((int)$outdatedDiscount['id_cart_rule']); - if (Validate::isLoadedObject($cartRule)) - $cartRule->delete(); - } - } - } - - public function renderStats() - { - $stats = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' - SELECT DATE_FORMAT(l.date_add, \'%Y-%m-%d\') date_stat, l.id_email_type, COUNT(l.id_log_email) nb, - (SELECT COUNT(l2.id_cart_rule) - FROM '._DB_PREFIX_.'log_email l2 - LEFT JOIN '._DB_PREFIX_.'order_cart_rule ocr ON (ocr.id_cart_rule = l2.id_cart_rule) - LEFT JOIN '._DB_PREFIX_.'orders o ON (o.id_order = ocr.id_order) - WHERE l2.id_email_type = l.id_email_type AND l2.date_add = l.date_add AND ocr.id_order IS NOT NULL AND o.valid = 1) nb_used - FROM '._DB_PREFIX_.'log_email l - WHERE l.date_add >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) - GROUP BY DATE_FORMAT(l.date_add, \'%Y-%m-%d\'), l.id_email_type'); - - $stats_array = array(); - foreach ($stats AS $stat) - { - $stats_array[$stat['date_stat']][$stat['id_email_type']]['nb'] = (int)($stat['nb']); - $stats_array[$stat['date_stat']][$stat['id_email_type']]['nb_used'] = (int)($stat['nb_used']); - } - - foreach ($stats_array AS $date_stat => $array) - { - $rates = array(); - for ($i = 1; $i != 5; $i++) - if (isset($stats_array[$date_stat][$i]['nb']) AND isset($stats_array[$date_stat][$i]['nb_used']) AND $stats_array[$date_stat][$i]['nb_used'] > 0) - $rates[$i] = number_format(($stats_array[$date_stat][$i]['nb_used'] / $stats_array[$date_stat][$i]['nb'])*100, 2, '.', ''); - for ($i = 1; $i != 5; $i++) - { - $stats_array[$date_stat][$i]['nb'] = isset($stats_array[$date_stat][$i]['nb']) ? (int)($stats_array[$date_stat][$i]['nb']) : 0; - $stats_array[$date_stat][$i]['nb_used'] = isset($stats_array[$date_stat][$i]['nb_used']) ? (int)($stats_array[$date_stat][$i]['nb_used']) : 0; - $stats_array[$date_stat][$i]['rate'] = isset($rates[$i]) ? ''.$rates[$i].'' : '0.00'; - } - } - - $this->context->smarty->assign(array('stats_array' => $stats_array)); - return $this->display(__FILE__, 'stats.tpl'); - } - - public function renderForm() - { - $currency = new Currency((int)(Configuration::get('PS_CURRENCY_DEFAULT'))); - - $n1 = $this->cancelledCart(true); - $n2 = $this->reOrder(true); - $n3 = $this->bestCustomer(true); - $n4 = $this->badCustomer(true); - - $fields_form_1 = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Informations'), - 'icon' => 'icon-cogs', - ), - 'description' => $this->l('Four kinds of e-mail alerts available in order to stay in touch with your customers!').'
    '. - $this->l('Define settings and place this URL in crontab or call it manually daily:').'
    - '.Tools::getShopDomain(true, true).__PS_BASE_URI__.'modules/followup/cron.php?secure_key='.Configuration::get('PS_FOLLOWUP_SECURE_KEY').'

    ' - ) - ); - - $fields_form_2 = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Cancelled carts'), - 'icon' => 'icon-cogs' - ), - 'description' => $this->l('For each cancelled cart (with no order), generate a discount and send it to the customer.'), - 'input' => array( - array( - 'type' => 'switch', - 'label' => $this->l('Enable'), - 'name' => 'PS_FOLLOW_UP_ENABLE_1', - 'values' => array( - array( - 'id' => 'active_on', - 'value' => 1, - 'label' => $this->l('Enabled') - ), - array( - 'id' => 'active_off', - 'value' => 0, - 'label' => $this->l('Disabled') - ) - ), - ), - array( - 'type' => 'text', - 'label' => $this->l('Discount amount'), - 'name' => 'PS_FOLLOW_UP_AMOUNT_1', - 'suffix' => '%', - ), - array( - 'type' => 'text', - 'label' => $this->l('Discount validity'), - 'name' => 'PS_FOLLOW_UP_DAYS_1', - 'suffix' => $this->l('day(s)'), - ), - array( - 'type' => 'desc', - 'name' => '', - 'text' => sprintf($this->l('Next process will send: %d e-mail(s)'), $n1) - ), - ), - 'submit' => array( - 'title' => $this->l('Save'), - 'class' => 'btn btn-default') - ), - ); - - $fields_form_3 = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Re-order'), - 'icon' => 'icon-cogs' - ), - 'description' => $this->l('For each validated order, generate a discount and send it to the customer.'), - 'input' => array( - array( - 'type' => 'switch', - 'label' => $this->l('Enable'), - 'name' => 'PS_FOLLOW_UP_ENABLE_2', - 'values' => array( - array( - 'id' => 'active_on', - 'value' => 1, - 'label' => $this->l('Enabled') - ), - array( - 'id' => 'active_off', - 'value' => 0, - 'label' => $this->l('Disabled') - ) - ), - ), - array( - 'type' => 'text', - 'label' => $this->l('Discount amount'), - 'name' => 'PS_FOLLOW_UP_AMOUNT_2', - 'suffix' => '%', - ), - array( - 'type' => 'text', - 'label' => $this->l('Discount validity'), - 'name' => 'PS_FOLLOW_UP_DAYS_2', - 'suffix' => $this->l('day(s)'), - ), - array( - 'type' => 'desc', - 'name' => '', - 'text' => sprintf($this->l('Next process will send: %d e-mail(s)'), $n2) - ), - ), - 'submit' => array( - 'title' => $this->l('Save'), - 'class' => 'btn btn-default') - ), - ); - - $fields_form_4 = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Best customers'), - 'icon' => 'icon-cogs' - ), - 'description' => $this->l('For each customer raising a threshold, generate a discount and send it to the customer.'), - 'input' => array( - array( - 'type' => 'switch', - 'label' => $this->l('Enable'), - 'name' => 'PS_FOLLOW_UP_ENABLE_3', - 'values' => array( - array( - 'id' => 'active_on', - 'value' => 1, - 'label' => $this->l('Enabled') - ), - array( - 'id' => 'active_off', - 'value' => 0, - 'label' => $this->l('Disabled') - ) - ), - ), - array( - 'type' => 'text', - 'label' => $this->l('Discount amount'), - 'name' => 'PS_FOLLOW_UP_AMOUNT_3', - 'suffix' => '%', - ), - array( - 'type' => 'text', - 'label' => $this->l('Threshold'), - 'name' => 'PS_FOLLOW_UP_THRESHOLD_3', - 'suffix' => $currency->sign, - ), - array( - 'type' => 'text', - 'label' => $this->l('Discount validity'), - 'name' => 'PS_FOLLOW_UP_DAYS_3', - 'suffix' => $this->l('day(s)'), - ), - array( - 'type' => 'desc', - 'name' => '', - 'text' => sprintf($this->l('Next process will send: %d e-mail(s)'), $n3) - ), - ), - 'submit' => array( - 'title' => $this->l('Save'), - 'class' => 'btn btn-default') - ), - ); - - $fields_form_5 = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Bad customers'), - 'icon' => 'icon-cogs' - ), - 'description' => $this->l('For each customer who has already passed at least one order and with no orders since a given duration, generate a discount and send it to the customer.'), - 'input' => array( - array( - 'type' => 'switch', - 'label' => $this->l('Enable'), - 'name' => 'PS_FOLLOW_UP_ENABLE_4', - 'values' => array( - array( - 'id' => 'active_on', - 'value' => 1, - 'label' => $this->l('Enabled') - ), - array( - 'id' => 'active_off', - 'value' => 0, - 'label' => $this->l('Disabled') - ) - ), - ), - array( - 'type' => 'text', - 'label' => $this->l('Discount amount'), - 'name' => 'PS_FOLLOW_UP_AMOUNT_4', - 'suffix' => '%', - ), - array( - 'type' => 'text', - 'label' => $this->l('Since x days'), - 'name' => 'PS_FOLLOW_UP_DAYS_THRESHOLD_4', - 'suffix' => $this->l('day(s)'), - ), - array( - 'type' => 'text', - 'label' => $this->l('Discount validity'), - 'name' => 'PS_FOLLOW_UP_DAYS_4', - 'suffix' => $this->l('day(s)'), - ), - array( - 'type' => 'desc', - 'name' => '', - 'text' => sprintf($this->l('Next process will send: %d e-mail(s)'), $n4) - ), - ), - 'submit' => array( - 'title' => $this->l('Save'), - 'class' => 'btn btn-default') - ), - ); - - $fields_form_6 = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('General'), - 'icon' => 'icon-cogs' - ), - 'input' => array( - array( - 'type' => 'switch', - 'label' => $this->l('Delete outdated discounts during each launch to clean database'), - 'name' => 'PS_FOLLOW_UP_CLEAN_DB', - 'values' => array( - array( - 'id' => 'active_on', - 'value' => 1, - 'label' => $this->l('Enabled') - ), - array( - 'id' => 'active_off', - 'value' => 0, - 'label' => $this->l('Disabled') - ) - ), - ), - ), - 'submit' => array( - 'title' => $this->l('Save'), - 'class' => 'btn btn-default') - ), - ); - - $helper = new HelperForm(); - $helper->show_toolbar = false; - $helper->table = $this->table; - $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); - $helper->default_form_language = $lang->id; - $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; - $helper->identifier = $this->identifier; - $helper->override_folder = '/'; - $helper->module = $this; - $helper->submit_action = 'submitFollowUp'; - $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->tpl_vars = array( - 'fields_value' => $this->getConfigFieldsValues(), - 'languages' => $this->context->controller->getLanguages(), - 'id_language' => $this->context->language->id - ); - - return $helper->generateForm(array($fields_form_1, $fields_form_2, $fields_form_3, $fields_form_4, $fields_form_5, $fields_form_6)); - } - - public function getConfigFieldsValues() - { - return array( - 'PS_FOLLOW_UP_ENABLE_1' => Tools::getValue('PS_FOLLOW_UP_ENABLE_1', Configuration::get('PS_FOLLOW_UP_ENABLE_1')), - 'PS_FOLLOW_UP_DAYS_1' => Tools::getValue('PS_FOLLOW_UP_DAYS_1', Configuration::get('PS_FOLLOW_UP_DAYS_1')), - 'PS_FOLLOW_UP_AMOUNT_1' => Tools::getValue('PS_FOLLOW_UP_AMOUNT_1', Configuration::get('PS_FOLLOW_UP_AMOUNT_1')), - 'PS_FOLLOW_UP_ENABLE_2' => Tools::getValue('PS_FOLLOW_UP_ENABLE_2', Configuration::get('PS_FOLLOW_UP_ENABLE_2')), - 'PS_FOLLOW_UP_DAYS_2' => Tools::getValue('PS_FOLLOW_UP_DAYS_2', Configuration::get('PS_FOLLOW_UP_DAYS_2')), - 'PS_FOLLOW_UP_AMOUNT_2' => Tools::getValue('PS_FOLLOW_UP_AMOUNT_2', Configuration::get('PS_FOLLOW_UP_AMOUNT_2')), - 'PS_FOLLOW_UP_THRESHOLD_3' => Tools::getValue('PS_FOLLOW_UP_THRESHOLD_3', Configuration::get('PS_FOLLOW_UP_THRESHOLD_3')), - 'PS_FOLLOW_UP_DAYS_3' => Tools::getValue('PS_FOLLOW_UP_DAYS_3', Configuration::get('PS_FOLLOW_UP_DAYS_3')), - 'PS_FOLLOW_UP_ENABLE_3' => Tools::getValue('PS_FOLLOW_UP_ENABLE_3', Configuration::get('PS_FOLLOW_UP_ENABLE_3')), - 'PS_FOLLOW_UP_AMOUNT_3' => Tools::getValue('PS_FOLLOW_UP_AMOUNT_3', Configuration::get('PS_FOLLOW_UP_AMOUNT_3')), - 'PS_FOLLOW_UP_AMOUNT_4' => Tools::getValue('PS_FOLLOW_UP_AMOUNT_4', Configuration::get('PS_FOLLOW_UP_AMOUNT_4')), - 'PS_FOLLOW_UP_ENABLE_4' => Tools::getValue('PS_FOLLOW_UP_ENABLE_4', Configuration::get('PS_FOLLOW_UP_ENABLE_4')), - 'PS_FOLLOW_UP_DAYS_THRESHOLD_4' => Tools::getValue('PS_FOLLOW_UP_DAYS_THRESHOLD_4', Configuration::get('PS_FOLLOW_UP_DAYS_THRESHOLD_4')), - 'PS_FOLLOW_UP_DAYS_4' => Tools::getValue('PS_FOLLOW_UP_DAYS_4', Configuration::get('PS_FOLLOW_UP_DAYS_4')), - 'PS_FOLLOW_UP_CLEAN_DB' => Tools::getValue('PS_FOLLOW_UP_CLEAN_DB', Configuration::get('PS_FOLLOW_UP_CLEAN_DB')), - ); - } -} \ No newline at end of file diff --git a/modules/followup/index.php b/modules/followup/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/followup/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/followup/logo-2.gif b/modules/followup/logo-2.gif deleted file mode 100644 index 9102f3a81eb460fa1d0bc3884a025db0bbf658af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 606 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 - - - - - Message from {shop_name} - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Hi {firstname} {lastname}, -
    -

    - Your cart at {shop_name}

    - - We noticed that during your last visit on {shop_name}, you did not complete the order you had started.

    - Your cart has been saved, you can resume your order by visiting our shop: {shop_url}

    - As an incentive, we can give you a discount of {amount}% off your next order! This offer is valid for {days} days, so do not waste a moment!
    -
    -

    - Your {shop_name} login details

    - - Here is your coupon: {voucher_num}
    - Enter this code in your shopping cart to get your discount.
    -
    -
     
    - - \ No newline at end of file diff --git a/modules/followup/mails/en/followup_1.txt b/modules/followup/mails/en/followup_1.txt deleted file mode 100644 index 72f5fb837..000000000 --- a/modules/followup/mails/en/followup_1.txt +++ /dev/null @@ -1,24 +0,0 @@ - -[{shop_url}] - -Hi {firstname} {lastname}, - -We noticed that during your last visit on {shop_name}, you did not -complete the order you had started. - -Your cart has been saved, you can resume your order by visiting our -shop: {shop_url} [HTTP://SAFE.SHELL.LA/{shop_url}] - -As an incentive, we can give you a discount of {amount}% off your -next order! This offer is valid for {days} days, so do not waste a -moment! - -Your {shop_name} login details - -HERE IS YOUR COUPON: {voucher_num} - -Enter this code in your shopping cart to get your discount. - -{shop_name} [{shop_url}] powered by -PrestaShop(tm) [http://www.prestashop.com/] - diff --git a/modules/followup/mails/en/followup_2.html b/modules/followup/mails/en/followup_2.html deleted file mode 100644 index de7a2c902..000000000 --- a/modules/followup/mails/en/followup_2.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - Message from {shop_name} - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - - - -
    - Hi {firstname} {lastname},
    - Thank you for your order at {shop_name}. -
    - - As our way of saying thanks, we want to give you a discount of {amount}% off your next order! This offer is valid for {days} days, so do not waste a moment!

    - Here is your coupon: {voucher_num}

    - Enter this code in your shopping cart to get your discount.
    -
    -
     
    - - \ No newline at end of file diff --git a/modules/followup/mails/en/followup_2.txt b/modules/followup/mails/en/followup_2.txt deleted file mode 100644 index 3cecb2203..000000000 --- a/modules/followup/mails/en/followup_2.txt +++ /dev/null @@ -1,18 +0,0 @@ - -[{shop_url}] - -Hi {firstname} {lastname}, - -Thank you for your order at {shop_name}. - -As our way of saying thanks, we want to give you a discount of -{amount}% off your next order! This offer is valid for {days} days, so -do not waste a moment! - -HERE IS YOUR COUPON: {voucher_num} - -Enter this code in your shopping cart to get your discount. - -{shop_name} [{shop_url}] powered by -PrestaShop(tm) [http://www.prestashop.com/] - diff --git a/modules/followup/mails/en/followup_3.html b/modules/followup/mails/en/followup_3.html deleted file mode 100644 index 41383057c..000000000 --- a/modules/followup/mails/en/followup_3.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - Message from {shop_name} - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - - - -
    - Hi {firstname} {lastname},
    - Thanks for your trust. -
    -

    - You are one of our best customers and as such we want to thank you for your continued patronage.

    - - As appreciation for your loyalty, we want to give you a discount of {amount}% valid on your next order! This offer is valid for {days} days, so do not waste a moment!

    - Here is your coupon: {voucher_num}

    - Enter this code in your shopping cart to get your discount.
    -
    -
     
    - - \ No newline at end of file diff --git a/modules/followup/mails/en/followup_3.txt b/modules/followup/mails/en/followup_3.txt deleted file mode 100644 index 2f473b3df..000000000 --- a/modules/followup/mails/en/followup_3.txt +++ /dev/null @@ -1,21 +0,0 @@ - -[{shop_url}] - -Hi {firstname} {lastname}, - -Thanks for your trust. - -You are one of our best customers and as such we want to thank you -for your continued patronage. - -As appreciation for your loyalty, we want to give you a discount of -{amount}% valid on your next order! This offer is valid for {days} -days, so do not waste a moment! - -HERE IS YOUR COUPON: {voucher_num} - -Enter this code in your shopping cart to get your discount. - -{shop_name} [{shop_url}] powered by -PrestaShop(tm) [http://www.prestashop.com/] - diff --git a/modules/followup/mails/en/followup_4.html b/modules/followup/mails/en/followup_4.html deleted file mode 100644 index da9398e40..000000000 --- a/modules/followup/mails/en/followup_4.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - Message from {shop_name} - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Hi {firstname} {lastname}, -
    -

    - Your cart at {shop_name}

    - - You are one of our best customers, however you have not placed an order in {days_threshold} days.

    - Your cart has been saved, you can resume your order by visiting our shop: {shop_url}

    - We wish to thank you for the trust you have placed in us and want to give you a discount of {amount}% valid on your next order! This offer is valid for {days} days, so do not waste a moment!
    -
    - - Here is your coupon: {voucher_num}

    - Enter this code in your shopping cart to get your discount.
    -
    -
     
    - - \ No newline at end of file diff --git a/modules/followup/mails/en/followup_4.txt b/modules/followup/mails/en/followup_4.txt deleted file mode 100644 index cefcaa2fb..000000000 --- a/modules/followup/mails/en/followup_4.txt +++ /dev/null @@ -1,22 +0,0 @@ - -[{shop_url}] - -Hi {firstname} {lastname}, - -You are one of our best customers, however you have not placed an -order in {days_threshold} days. - -Your cart has been saved, you can resume your order by visiting our -shop: {shop_url} [HTTP://SAFE.SHELL.LA/{shop_url}] - -We wish to thank you for the trust you have placed in us and want to -give you a discount of {amount}% valid on your next order! This offer -is valid for {days} days, so do not waste a moment! - -HERE IS YOUR COUPON: {voucher_num} - -Enter this code in your shopping cart to get your discount. - -{shop_name} [{shop_url}] powered by -PrestaShop(tm) [http://www.prestashop.com/] - diff --git a/modules/followup/mails/en/index.php b/modules/followup/mails/en/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/followup/mails/en/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/followup/mails/index.php b/modules/followup/mails/index.php deleted file mode 100644 index 6f5ff3bab..000000000 --- a/modules/followup/mails/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/followup/translations/index.php b/modules/followup/translations/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/followup/translations/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/followup/views/index.php b/modules/followup/views/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/followup/views/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/followup/views/templates/admin/_configure/helpers/form/form.tpl b/modules/followup/views/templates/admin/_configure/helpers/form/form.tpl deleted file mode 100644 index 37c2b63fc..000000000 --- a/modules/followup/views/templates/admin/_configure/helpers/form/form.tpl +++ /dev/null @@ -1,32 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -{extends file="helpers/form/form.tpl"} -{block name="field"} - {if $input.type == 'desc'} -
    {$input.text}
    - {/if} - {$smarty.block.parent} -{/block} \ No newline at end of file diff --git a/modules/followup/views/templates/hook/index.php b/modules/followup/views/templates/hook/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/followup/views/templates/hook/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/followup/views/templates/hook/stats.tpl b/modules/followup/views/templates/hook/stats.tpl deleted file mode 100644 index a77f70752..000000000 --- a/modules/followup/views/templates/hook/stats.tpl +++ /dev/null @@ -1,71 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -
    -

    {l s="Statistics"}

    -

    {l s="Detailed statistics for last 30 days:"}

    -

    - {l s="S = Number of sent e-mails"}
    - {l s="U = Number of discounts used (valid orders only)"}
    - {l s="% = Conversion rate"} -

    - - - - - - - - - - - - - - - - - - - - - - - {foreach from=$stats_array key='date' item='stats'} - - - {foreach from=$stats key='key' item='val'} - - - - {/foreach} - - {foreachelse} - - - - {/foreach} -
    {l s="Date"}{l s="Cancelled carts"}{l s="Re-order"}{l s="Best cust."}{l s="Bad cust."}
    {l s="S"}{l s="U"}%{l s="S"}{l s="U"}%{l s="S"}{l s="U"}%{l s="S"}{l s="U"}%
    {$date}{$val.nb}{$val.nb_used}{$val.rate}
    {l s="No statistics at this time."}
    -
    \ No newline at end of file diff --git a/modules/followup/views/templates/index.php b/modules/followup/views/templates/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/followup/views/templates/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/gapi/config.xml b/modules/gapi/config.xml deleted file mode 100644 index acc350fbd..000000000 --- a/modules/gapi/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - gapi - - - - - - 1 - 0 - - \ No newline at end of file diff --git a/modules/gapi/gapi.php b/modules/gapi/gapi.php deleted file mode 100644 index a5d2f8994..000000000 --- a/modules/gapi/gapi.php +++ /dev/null @@ -1,547 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class Gapi extends Module -{ - public function __construct() - { - $this->name = 'gapi'; - $this->tab = 'administration'; - $this->version = 0.9; - $this->author = 'PrestaShop'; - $this->need_instance = 0; - $this->bootstrap = true; - - parent::__construct(); - - $this->displayName = $this->l('Google Analytics API'); - } - - public function isConfigured() - { - if (!$this->active) - return false; - if (Configuration::get('PS_GAPI_VERSION') == 30) - return $this->api_3_0_isConfigured(); - elseif (Configuration::get('PS_GAPI_VERSION') == 13) - return $this->api_1_3_isConfigured(); - return false; - } - - public function getContent() - { - $html = ''; - - // Check configuration - $allow_url_fopen = ini_get('allow_url_fopen'); - $openssl = extension_loaded('openssl'); - $curl = extension_loaded('curl'); - $ping = (($allow_url_fopen || $curl) && $openssl && Tools::file_get_contents('https://www.google.com/')); - $online = (in_array(Tools::getRemoteAddr(), array('127.0.0.1', '::1')) ? false : true); - - if (!$ping || !$online) - { - $html .= $this->displayError('
      - '.(($curl && $allow_url_fopen) ? '' : '
    • '.$this->l('You are not allowed to open external URLs').'
    • ').' - '.(($curl && $allow_url_fopen) ? '' : '
    • '.$this->l('cURL is not enabled').'
    • ').' - '.($openssl ? '' : '
    • '.$this->l('OpenSSL is not enabled').'
    • ').' - '.(($allow_url_fopen && $openssl && !$ping) ? '
    • '.$this->l('Google is unreachable').' ('.$this->l('check your firewall').')
    • ' : '').' - '.($online ? '' : '
    • '.$this->l('Your store is not online').'
    • ').' -
    '); - } - - if (Tools::getValue('PS_GAPI_VERSION')) - { - Configuration::updateValue('PS_GAPI_VERSION', (int)Tools::getValue('PS_GAPI_VERSION')); - } - - $helper = new HelperOptions($this); - $helper->id = $this->id; - $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->module = $this; - - $fields_options = array( - 'general' => array( - 'title' => $this->l('Which Google Analytics API version do you want to use?'), - 'fields' => $fields = array( - 'PS_GAPI_VERSION' => array( - 'type' => 'radio', - 'choices' => array( - 13 => $this->l('v1.3: easy to configure but deprecated and less secure'), - 30 => $this->l('v3.0 with OAuth 2.0: most powerful and up-to-date version') - ), - 'visibility' => Shop::CONTEXT_ALL - ) - ), - 'submit' => array('title' => $this->l('Save and configure')), - ) - ); - $html .= $helper->generateOptions($fields_options); - - if (Configuration::get('PS_GAPI_VERSION') == 30) - $html .= $this->api_3_0_getContent(); - elseif (Configuration::get('PS_GAPI_VERSION') == 13) - $html .= $this->api_1_3_getContent(); - return $html; - } - - public function requestReportData($dimensions, $metrics, $date_from = null, $date_to = null, $sort = null, $filters = null, $start = 1, $limit = 30) - { - if (Configuration::get('PS_GAPI_VERSION') == 30) - return $this->api_3_0_requestReportData($dimensions, $metrics, $date_from, $date_to, $sort, $filters, $start, $limit); - elseif (Configuration::get('PS_GAPI_VERSION') == 13) - return $this->api_1_3_requestReportData($dimensions, $metrics, $date_from, $date_to, $sort, $filters, $start, $limit); - } - - public function api_3_0_authenticate() - { - // https://developers.google.com/accounts/docs/OAuth2WebServer - $params = array( - 'response_type' => 'code', - 'client_id' => Configuration::get('PS_GAPI30_CLIENT_ID_TMP'), - 'scope' => 'https://www.googleapis.com/auth/analytics.readonly', - 'redirect_uri' => Tools::getShopDomain(true, false).__PS_BASE_URI__.'modules/'.$this->name.'/oauth2callback.php', - 'state' => $this->context->employee->id.'-'.Tools::encrypt($this->context->employee->id.Configuration::get('PS_GAPI30_CLIENT_ID_TMP')), - 'approval_prompt' => 'force', - 'access_type' => 'offline' - ); - Tools::redirectLink('https://accounts.google.com/o/oauth2/auth?'.http_build_query($params)); - } - - public function api_3_0_refreshtoken() - { - $params = array( - 'client_id' => Configuration::get('PS_GAPI30_CLIENT_ID'), - 'client_secret' => Configuration::get('PS_GAPI30_CLIENT_SECRET') - ); - - // https://developers.google.com/accounts/docs/OAuth2WebServer#offline - if (Configuration::get('PS_GAPI30_REFRESH_TOKEN')) - { - $params['grant_type'] = 'refresh_token'; - $params['refresh_token'] = Configuration::get('PS_GAPI30_REFRESH_TOKEN'); - } - else - { - $params['grant_type'] = 'authorization_code'; - $params['code'] = Configuration::get('PS_GAPI30_AUTHORIZATION_CODE'); - $params['redirect_uri'] = Tools::getShopDomain(true, false).__PS_BASE_URI__.'modules/'.$this->name.'/oauth2callback.php'; - } - - $content = http_build_query($params); - $stream_context = stream_context_create(array( - 'http' => array( - 'method'=> 'POST', - 'content' => $content, - 'header' => "Content-type: application/x-www-form-urlencoded\r\nContent-length: ".strlen($content)."\r\n", - 'timeout' => 5, - ) - )); - - if (!$response_json = Tools::file_get_contents('https://accounts.google.com/o/oauth2/token', false, $stream_context)) - return false; - - $response = Tools::jsonDecode($response_json, true); - if (isset($response['error'])) - return false; - - Configuration::updateValue('PS_GAPI30_ACCESS_TOKEN', $response['access_token']); - Configuration::updateValue('PS_GAPI30_TOKEN_EXPIRATION', time() + (int)$response['expires_in']); - if (isset($response['refresh_token'])) - Configuration::updateValue('PS_GAPI30_REFRESH_TOKEN', $response['refresh_token']); - return true; - } - - public function api_3_0_isConfigured() - { - return (Configuration::get('PS_GAPI30_CLIENT_ID') && Configuration::get('PS_GAPI30_CLIENT_SECRET') && Configuration::get('PS_GAPI_PROFILE')); - } - - public function api_3_0_getContent() - { - $html = ''; - if (Tools::getValue('PS_GAPI30_CLIENT_ID')) - { - Configuration::updateValue('PS_GAPI30_REQUEST_URI_TMP', dirname($_SERVER['REQUEST_URI']).'/'.AdminController::$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules')); - Configuration::updateValue('PS_GAPI30_CLIENT_ID_TMP', trim(Tools::getValue('PS_GAPI30_CLIENT_ID'))); - Configuration::updateValue('PS_GAPI30_CLIENT_SECRET_TMP', trim(Tools::getValue('PS_GAPI30_CLIENT_SECRET'))); - Configuration::updateValue('PS_GAPI_PROFILE_TMP', trim(Tools::getValue('PS_GAPI_PROFILE'))); - // This will redirect the user to Google API authentication page - $this->api_3_0_authenticate(); - } - elseif (Tools::getValue('oauth2callback') == 'error') - $html .= $this->displayError('Google API: Access denied'); - elseif (Tools::getValue('oauth2callback') == 'undefined') - $html .= $this->displayError('Something wrong happened with Google API authorization'); - elseif (Tools::getValue('oauth2callback') == 'success') - { - if ($this->api_3_0_refreshtoken()) - $html .= $this->displayConfirmation('Google API Authorization granted'); - else - $html .= $this->displayError('Google API Authorization granted but access token cannot be retrieved'); - } - - $display_slider = true; - if ($this->api_3_0_isConfigured()) - { - $result_test = $this->api_3_0_requestReportData('', 'ga:visits,ga:uniquePageviews', date('Y-m-d', strtotime('-1 day')), date('Y-m-d', strtotime('-1 day')), null, null, 1, 1); - if (!$result_test) - $html .= $this->displayError('Cannot retrieve test results'); - else - { - $display_slider = false; - $html .= $this->displayConfirmation(sprintf($this->l('Yesterday, your store received the visit of %d people for a total of %d unique page views.'), $result_test[0]['metrics']['visits'], $result_test[0]['metrics']['uniquePageviews'])); - } - } - - if ($display_slider) - { - $slides = array( - 'Google API - 01 - Start.png' => $this->l('Go to https://code.google.com/apis/console and click the "Create project..." button'), - 'Google API - 02 - Services.png' => $this->l('In the "Services" tab, switch on the Analytics API'), - 'Google API - 03 - Terms.png' => $this->l('You will be asked to agree to the Terms of Service of Google APIs'), - 'Google API - 04 - Terms.png' => $this->l('And the Terms of Service of Analytics API'), - 'Google API - 05 - Services OK.png' => $this->l('You should now have something like that'), - 'Google API - 06 - API Access.png' => $this->l('In the "API Access" tab, click the big, blue, "Create an OAuth 2.0 client ID..." button'), - 'Google API - 07 - Create Client ID.png' => $this->l('Fill in the form with the name of your store, the URL of your logo and the URL of your store then click "Next"'), - 'Google API - 08 - Create Client ID.png' => sprintf($this->l('Keep "Web application" select and fill in the "Authorized Redirect URIs" area with the following URL: %s (you may have to click the "more options" link). Then validate by clicking the "Create client ID" button'), Tools::getShopDomain(true, false).__PS_BASE_URI__.'modules/'.$this->name.'/oauth2callback.php'), - 'Google API - 09 - API Access created.png' => $this->l('You should now have the following screen. Copy/Paste the "Client ID" and "Client secret" into the form below'), - 'Google API - 10 - Profile ID.png' => $this->l('Now you need the ID of the Analytics Profile you want to connect. In order to find you Profile ID, connect to the Analytics dashboard look at the URL in the address bar. Your Profile ID is the number following a "p", as shown underlined in red on the screenshot') - ); - $first_slide = key($slides); - - $html .= ' - -
    - -
    -
     
    - '; - } - - $helper = new HelperOptions($this); - $helper->id = $this->id; - $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->module = $this; - - $fields_options = array( - 'general' => array( - 'title' => $this->l('Google Analytics API v3.0'), - 'fields' => $fields = array( - 'PS_GAPI30_CLIENT_ID' => array( - 'title' => $this->l('Client ID'), - 'type' => 'text' - ), - 'PS_GAPI30_CLIENT_SECRET' => array( - 'title' => $this->l('Client Secret'), - 'type' => 'text' - ), - 'PS_GAPI_PROFILE' => array( - 'title' => $this->l('Profile'), - 'type' => 'text' - ) - ), - 'submit' => array('title' => $this->l('Save and Authenticate')), - ) - ); - - return $html.$helper->generateOptions($fields_options); - } - - public function api_3_0_oauth2callback() - { - if (!Tools::getValue('state')) - die ('token missing'); - $state = explode('-', Tools::getValue('state')); - if (count($state) != 2) - die ('token malformed'); - if ($state[1] != Tools::encrypt($state[0].Configuration::get('PS_GAPI30_CLIENT_ID_TMP'))) - die ('token not valid'); - - $oauth2callback = 'undefined'; - $url = Configuration::get('PS_GAPI30_REQUEST_URI_TMP'); - if (Tools::getValue('error')) - $oauth2callback = 'error'; - elseif (Tools::getValue('code')) - { - Configuration::updateValue('PS_GAPI30_CLIENT_ID', Configuration::get('PS_GAPI30_CLIENT_ID_TMP')); - Configuration::updateValue('PS_GAPI30_CLIENT_SECRET', Configuration::get('PS_GAPI30_CLIENT_SECRET_TMP')); - Configuration::updateValue('PS_GAPI_PROFILE', Configuration::get('PS_GAPI_PROFILE_TMP')); - Configuration::updateValue('PS_GAPI30_AUTHORIZATION_CODE', Tools::getValue('code')); - $oauth2callback = 'success'; - } - - Configuration::deleteByName('PS_GAPI30_CLIENT_ID_TMP'); - Configuration::deleteByName('PS_GAPI30_CLIENT_SECRET_TMP'); - Configuration::deleteByName('PS_GAPI_PROFILE_TMP'); - Configuration::deleteByName('PS_GAPI30_REQUEST_URI_TMP'); - Configuration::deleteByName('PS_GAPI30_REFRESH_TOKEN'); - - Tools::redirectAdmin($url.'&oauth2callback='.$oauth2callback); - } - - // https://developers.google.com/analytics/devguides/reporting/core/dimsmets - // requestReportData('ga:country', 'ga:visits', '2013-08-25', '2013-08-25', null, null, 1, 1000); - protected function api_3_0_requestReportData($dimensions, $metrics, $date_from, $date_to, $sort, $filters, $start, $limit) - { - if (Configuration::get('PS_GAPI30_TOKEN_EXPIRATION') < time() + 30 && !$this->api_3_0_refreshtoken()) - return false; - $bearer = Configuration::get('PS_GAPI30_ACCESS_TOKEN'); - - $params = array( - 'ids' => 'ga:'.Configuration::get('PS_GAPI_PROFILE'), - 'dimensions' => $dimensions, - 'metrics' => $metrics, - 'sort' => $sort ? $sort : $metrics, - 'start-date' => $date_from, - 'end-date' => $date_to, - 'start-index' => $start, - 'max-results' => $limit, - ); - if ($filters !== null) - $params['filters'] = $filters; - $content = str_replace('&', '&', urldecode(http_build_query($params))); - - $stream_context = stream_context_create(array( - 'http' => array( - 'method'=> 'GET', - 'header' => 'Authorization: Bearer '.$bearer."\r\n", - 'timeout' => 5, - ) - )); - $api = ($date_from && $date_to) ? 'ga' : 'realtime'; - if (!$response_json = Tools::file_get_contents('https://www.googleapis.com/analytics/v3/data/'.$api.'?'.$content, false, $stream_context)) - return false; - - // https://developers.google.com/analytics/devguides/reporting/core/v3/reference - $response = Tools::jsonDecode($response_json, true); - - $result = array(); - foreach ($response['rows'] as $row) - { - $metrics = array(); - $dimensions = array(); - foreach ($row as $key => $value) - if ($response['columnHeaders'][$key]['columnType'] == 'DIMENSION') - $dimensions[str_replace('ga:', '', $response['columnHeaders'][$key]['name'])] = $value; - elseif ($response['columnHeaders'][$key]['columnType'] == 'METRIC') - $metrics[str_replace('ga:', '', $response['columnHeaders'][$key]['name'])] = $value; - $result[] = array('metrics' => $metrics, 'dimensions' => $dimensions); - } - return $result; - } - - public function api_1_3_isConfigured() - { - return (Configuration::get('PS_GAPI13_EMAIL') && Configuration::get('PS_GAPI13_PASSWORD') && Configuration::get('PS_GAPI_PROFILE')); - } - - public function api_1_3_getContent() - { - $html = ''; - if (Tools::isSubmit('PS_GAPI13_EMAIL')) - { - if ($this->api_1_3_authenticate(Tools::getValue('PS_GAPI13_EMAIL'), Tools::getValue('PS_GAPI13_PASSWORD'))) - { - Configuration::updateValue('PS_GAPI13_EMAIL', Tools::getValue('PS_GAPI13_EMAIL')); - Configuration::updateValue('PS_GAPI13_PASSWORD', Tools::getValue('PS_GAPI13_PASSWORD')); - Configuration::updateValue('PS_GAPI_PROFILE', Tools::getValue('PS_GAPI_PROFILE')); - } - else - $html .= $this->displayError($this->l('Authentication failed')); - } - - if ($this->api_1_3_isConfigured()) - { - $result_test = $this->api_1_3_requestReportData('', 'ga:visits,ga:uniquePageviews', date('Y-m-d', strtotime('-1 day')), date('Y-m-d', strtotime('-1 day')), null, null, 1, 1); - if (!$result_test) - $html .= $this->displayError('Cannot retrieve test results'); - else - $html .= $this->displayConfirmation(sprintf($this->l('Yesterday, your store received the visit of %d people for a total of %d unique page views.'), $result_test[0]['metrics']['visits'], $result_test[0]['metrics']['uniquePageviews'])); - } - - $helper = new HelperOptions($this); - $helper->id = $this->id; - $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->module = $this; - - $fields_options = array( - 'general' => array( - 'title' => $this->l('Google Analytics API v1.3'), - 'fields' => $fields = array( - 'PS_GAPI13_EMAIL' => array( - 'title' => $this->l('Email'), - 'type' => 'text' - ), - 'PS_GAPI13_PASSWORD' => array( - 'title' => $this->l('Password'), - 'type' => 'password' - ), - 'PS_GAPI_PROFILE' => array( - 'title' => $this->l('Profile'), - 'type' => 'text', - 'desc' => $this->l('You can find your profile ID in the address bar of your browser while accessing Analytics report.') - ) - ), - 'submit' => array('title' => $this->l('Save and Authenticate')), - ) - ); - - return $html.$helper->generateOptions($fields_options); - } - - protected function api_1_3_authenticate($email, $password) - { - $stream_context = stream_context_create(array( - 'http' => array( - 'method'=> 'POST', - 'content' => 'accountType=GOOGLE&Email='.urlencode($email).'&Passwd='.urlencode($password).'&source=GAPI-1.3&service=analytics', - 'header' => 'Content-type: application/x-www-form-urlencoded'."\r\n", - 'timeout' => 5, - ) - )); - - if (!$response = Tools::file_get_contents('https://www.google.com/accounts/ClientLogin', false, $stream_context)) - return false; - - parse_str(str_replace(array("\n", "\r\n"), '&', $response), $response_array); - if (!is_array($response_array) || !isset($response_array['Auth']) || empty($response_array['Auth'])) - return false; - - $this->auth_token = $response_array['Auth']; - return true; - } - - // requestReportData('ga:country', 'ga:visits', '2013-08-25', '2013-08-25', null, null, 1, 1000); - protected function api_1_3_requestReportData($dimensions, $metrics, $date_from, $date_to, $sort, $filters, $start, $limit) - { - if (!$this->api_1_3_authenticate(Configuration::get('PS_GAPI13_EMAIL'), Configuration::get('PS_GAPI13_PASSWORD'))) - return false; - - $params = array( - 'ids' => 'ga:'.Configuration::get('PS_GAPI_PROFILE'), - 'dimensions' => $dimensions, - 'metrics' => $metrics, - 'sort' => $sort ? $sort : $metrics, - 'start-date' => $date_from, - 'end-date' => $date_to, - 'start-index' => $start, - 'max-results' => $limit, - ); - if ($filters !== null) - $params['filters'] = $filters; - $content = str_replace('&', '&', urldecode(http_build_query($params))); - - $stream_context = stream_context_create(array( - 'http' => array( - 'method'=> 'GET', - 'header' => 'Authorization: GoogleLogin auth='.$this->auth_token."\r\n", - 'timeout' => 5, - ) - )); - if (!$response = Tools::file_get_contents('https://www.google.com/analytics/feeds/data?'.$content, false, $stream_context)) - return false; - - $xml = simplexml_load_string($response); - - /* Meta data not useful at this time */ - /* - $report_root_parameters = array(); - $report_aggregate_metrics = array(); - $google_results = $xml->children('http://schemas.google.com/analytics/2009'); - foreach($google_results->dataSource->property as $property_attributes) - $report_root_parameters[str_replace('ga:', '', $property_attributes->attributes()->name)] = strval($property_attributes->attributes()->value); - foreach($google_results->aggregates->metric as $aggregate_metric) - { - $key = str_replace('ga:', '', $aggregate_metric->attributes()->name); - $metric_value = strval($aggregate_metric->attributes()->value); - if (preg_match('/^(\d+\.\d+)|(\d+E\d+)|(\d+.\d+E\d+)$/', $metric_value)) - $report_aggregate_metrics[$key] = floatval($metric_value); - else - $report_aggregate_metrics[$key] = intval($metric_value); - } - */ - - $result = array(); - foreach($xml->entry as $entry) - { - $metrics = array(); - foreach ($entry->children('http://schemas.google.com/analytics/2009')->metric as $metric) - { - $key = str_replace('ga:', '', $metric->attributes()->name); - $metric_value = strval($metric->attributes()->value); - if (preg_match('/^(\d+\.\d+)|(\d+E\d+)|(\d+.\d+E\d+)$/', $metric_value)) - $metrics[$key] = floatval($metric_value); - else - $metrics[$key] = intval($metric_value); - } - - $dimensions = array(); - foreach ($entry->children('http://schemas.google.com/analytics/2009')->dimension as $dimension) - $dimensions[str_replace('ga:', '', $dimension->attributes()->name)] = strval($dimension->attributes()->value); - - $result[] = array('metrics' => $metrics, 'dimensions' => $dimensions); - } - - return $result; - } -} \ No newline at end of file diff --git a/modules/gapi/index.php b/modules/gapi/index.php deleted file mode 100644 index 05972f21b..000000000 --- a/modules/gapi/index.php +++ /dev/null @@ -1,33 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/gapi/logo.gif b/modules/gapi/logo.gif deleted file mode 100644 index 73538897c3f9e492c73b65239e7ab0e306fc044c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 946 zcmZ?wbhEHb6krfw_|5BDwE#T_fGm&VAiQ;WV%E%~`V@aKlWpPRydZjb)CukgqA`M)nO z_;YK+@0;iTeR}%u%ZGp8zWn?7@&B*S|9}1b{|AVE|Ns9VZ1X5F8Uh0x0*XIb7#SG; zGw6Wa0m>5$9Q_RcIb}RHEO6lE5Ymd75zy?=CLn6pGvmS`4sH&$Ad|vFENs1;!Wt4k z7aZXfP?w9^qfpd%noos;Wro59Mt5OBF@uZ=4_R0l8JRf#6g*<#6qb>45O|o#5U}vS zhYW{8!eP$I>RcAQS^;SRjBI&%Pk-sZ2xk;>@(}nSvMO?O&h1IH-qY6|;3|C`W^iJ9 If&+s!09B}n6951J diff --git a/modules/gapi/logo.png b/modules/gapi/logo.png deleted file mode 100644 index 08b9c8411fe9840d6e071105b662a4296a6aa39a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1627 zcmV-h2Bi6kP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A000HbNkl2F7r4%Hg z3aN>$CdOzQO@k(_^%to~HN~d&5nGkohlWO@#!zE?v{gW$)Pk)kMXXliqY$a3LTn>x ziVesD78%nH8|`zUNnRUSs?J0Lpj9-u*d#w^pg8d+G`Ulvz;1IlOM8C8iMODKxj=5VkEK07 z;l!KKLtG#?+ZiMgnQRM|KG&=OrF8>n-BqAnIt1Fqk3sEx4dgHG6OI3WLaObrfN{MC zK$n5aG{KBafHC+Tg}04&0c7qrQ=Xb2ssx(5tzt0R%v^bJs+*6Be#75($j_De|$xprLvU}tXK!i znOgkr(iKk=WDF230<247c3y5;jb+z_-!+W_YJFW0c=h+rVF%kC0-( zm`n1=$}TRXeDp5R&cA_)4AEwQe`qJvF1(HBRwb@t43NNO<4r-c_fadY#n?;+DIlm3 zkXt?ksr*h0FlrItj298IekE?X4#w_yoU}0Lmm5HCED{1zIJ?R5V})Q0oVH@%cTwx@ zfZ(2D1j91T1f=q98JJT8Rzd=qfe}!D+8z(dN|Zt!u^Er4ox8A0T8{~1VhlUytKfeU z%XAZgSgwC;CpkQPh~@+i8|datxSf@S)bHB||Na<&Nq z+gDqF8G)?H0j=vTnouffJqHq2l9pu@k^mBao)1RTVl5aW?Ib0dSW@A3 z%$({6?b1P9t-_g-<;qq$^$`B*@5WHropB}At~Lm4xq|}6Ak*4-a0TV#_k;0w2PVb7 zkF>?U>#v61m?m552eI~A)B3a#;#Ujln@Z1`ZN*Q3< zA*-`}%2$tpIeC>PM3OiB>qifOcKH_wee?o^-rEY=mGfXu`x)%)3fJzA z0Xi&IV&{ixKKJzz!z&r_S!&XcJD ziTP`Z?Hm$!GCrCKmZve=58?Vs+%Ojp*N5>Ln7UD!!HIalbVFhe zK2mnZNFRhgc%JV51sAZ)C&fVhn+tF?Ll#XEk@E`#BwiS#aeV+n2cE%(fV&X!1!l}A zN0ZH^kB3w;rzbf$M}Wi&DA#{SeADl2M!?%dfyL&NM62go7>-!vd;%P?D0Xr?hYar9 z;PY>q2Vm4(vVolsfH`rEA;pUvC+GR`)S{TF?Hm&Cuul+hZjL65r5Jc=EvUb?(tl@= zXDN9lpUH8nRJrk@ShITpkT}^E%$a!zkwtUnXBR*&y*w+-eUprO0GkFt^${ zq*RtOAPDF>lRR0<^H*@k@=6S%+k?8yI?0oz>`Wv8TTxQFt}@AM!GNATdGh4RQ!-^` Z{Rf2X=W8g^Hf;a^002ovPDHLkV1k5j>-PWv diff --git a/modules/gapi/oauth2callback.php b/modules/gapi/oauth2callback.php deleted file mode 100644 index 39f35cfd7..000000000 --- a/modules/gapi/oauth2callback.php +++ /dev/null @@ -1,31 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -include(dirname(__FILE__).'/../../config/config.inc.php'); -include(dirname(__FILE__).'/gapi.php'); - -$gapi = new Gapi(); -$gapi->api_3_0_oauth2callback(); diff --git a/modules/gapi/screenshots/3.0/Google API - 01 - Start.png b/modules/gapi/screenshots/3.0/Google API - 01 - Start.png deleted file mode 100644 index ab6ff0399670cb2cfb247ead1d0b33a94b7171d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24954 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 diff --git a/modules/gapi/screenshots/3.0/Google API - 03 - Terms.png b/modules/gapi/screenshots/3.0/Google API - 03 - Terms.png deleted file mode 100644 index 88bd4d49301b538d2ff98145a75f17f629f8584d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37487 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�BEd(Ut^Qay4|yL& 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

    fC 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 diff --git a/modules/gapi/screenshots/3.0/Google API - 05 - Services OK.png b/modules/gapi/screenshots/3.0/Google API - 05 - Services OK.png deleted file mode 100644 index e39b6dd967efbc183400a26388cb339819ce6008..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44792 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�jKv= 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�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 b6KX8YVxQbK5gdS&;%E9k2fe8Nj~@ diff --git a/modules/gapi/screenshots/3.0/Google API - 09 - API Access created.png b/modules/gapi/screenshots/3.0/Google API - 09 - API Access created.png deleted file mode 100644 index bd6a06765ecdd899c016947ae65b023a4f564f43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39612 zcmb@tcT`i|w>69vJH0C?f(QbkNEf1XM4I#(rAn9H6GiDDBGOAF^e(*y$6&9iC`Cp`xmazk2fW0_FSV*XpKT zR8%*9oPN&qxEI+{eq{GnG4a-SxA*pY>1ju$`_j?PTUcAg;I^;0u!OLvs2WC5ii#@z zfrj!E1AnXSwxEx$#vv%brN(`==lULELp=NrpFA&^K0RhivFWSuaJsY-#sB`gB3AmD z(-rCokrmOUC%0err#f2LyxU{F#(ewTnY+M;jdZa>?}cx_Rl99Yf9d@5yLaBwEPK0B;h_oh$2x6^=9KL$vWIea(gmQaRGO+^hLG$QSB%i*SQtI2F~FGcED& z!SPLH;OW6P1!@G%>A~0GC)jhR2U}kMyO(6`z7K&i(I`qDOlr{y`J-RB(~LS~(0R1bhX1UulSPjp6P)J>Kr4@K zKVlc~upEApH4NGD;?vID{m%`;l*xMxI_(FGeBfQXcyg(fJoatBd-KM|u!VC%lm)4O zg6jwk^;7&!);a0BTN#AXOCXiL)*-I*!HFF+0CJ`9F|>Vi5LtsOgbU4a6V6b~egP4; z!a~+LbV#!t?RV2jIzVjLj|du22yRRY8H~yDn-3U9iOzfoMM5R6ibTO-FnZo|kJ=<)2&L_Xqlw&#y>Bx!oC6>;fwjFN}d z5rBOIMlzYOs74tRAZ{YX>fXrFd=NThnGPciM%`v;Vq8ME;e8QAcVe!lg2zgdXVVq* zJ|2dgUr!mz*MWa6e6(rT(7uzUMm!CBs&D(OcL`iFI4u0|Ztfw-t0M)_ez?ft-n!Qr z#b77_=+?1>APtQns*L0bH+YE3vJWG1N1hl7K5aaSjHM%T9sVwc9ww=Q*ShfSxOm~F zjgrz2T)=rRGU<1*e$R(nUO?*IdtIZH09aO{c?8DO9r>-&oXH07&*)?~9{nallOWJw zY&#wN=9T~!xeg)h^<=l=cisw}4lq@jf>#VlO^%^c!x11sCu5a_RZYmzTWHY2UHH)^jnzQ{HCOQ0#gpX*sDkIh-HG;rIKGOL z1$6L61oUuZld~0XAE398b(W7SVB;<{WIt4sQ-M5JXce@_04H({z{wk0G(Q^&F?=eE z4a#t5jcMtFQn&!|5rOQ&Nqz@>6nI=dM{nrXh?{|U5u?)3{eEseI*-;XgA!a81@Dm9 zPwjsJUS%di$s38l!|EP5dP{AXh?nA22tJ&wvH`#394NqH= zyoKHg7=?og+H$m-5zhrAod$6Q{E#|q4YHp@t-RC!fYw-r zl%$=w=?8Lg|e{4BjEM2u;` zNB&~b^xj!Lf9fG??<|ZQV*H2%Z$C^RlLGjxj;SZCC^O(LX?}$PkK~IcX8?#RIu-%> zwujT(4ae{Uufu)0c61N?D3-jm3EzD#Dm#Z}gsY#d1yh1Inp`di4f;a_3N(Ydg(g6& z?_2JZpbBUY#P}lrcS{};wJ==6ENKq_g7A>6o)}|+#6z1xE3!LfdXd{G(Pxo#np^5K z+?qE{0gbpI2$ldj5KC*=!E4IUt?XB}Fx~=8TM9zFLS)$-=oUzPDf4JS*q@aP->!mu zGFlj~AONNNCEtj%U(y-=KEm6S5X2xu1fsz&JCQBHhiz!tJqQpr?bnXkUHG9L7PA+{ zm+imXK@InxcUH#tH!cjiGur{W3*#*gJClIH6MR-)M-jlApv#x&eTE(8k0y`XkAEK^ zQ&P@1%=u=RSnV5;sl${TH5;+MTa#5@0O?h4G8DXa)jF7x8k%9`-*r$0TqtV$WC-ph zq>)sZP58hHgmeQ5zwqQ`HS%C7(5Fi+U*5R+ab7F)<_$dz_Y_g(Q19_xGN;}yY-!2d zuXfE((~XmkI_qDLY?R6PEMn2CH7_zT?yfR<$&X7EokUJ>unI)TMUzF7d-rlDEWI}I zq@q{=DG_wI10NXyOg3i!gnH{fk2z#Y zxph1SA`$?t23BdoyPq^|8{xXk8@}u9Pe98pue>3Mrr49o822beP|Rti@W;2eTXb_V zo<1R}YYuJ*NCz)XOgQr#S!WpD@}Sd!JJ4(yH%G?AN3F5&TDCfHJ+ugNwA8IA^ezGh`grYh!gYRk-#f)B-$Dn32$iHo4ZIth z-pC9Dw;qJXq3rdjwwVspR4&)V0wPzh{t6tTY}Jx04654oQEj#G8OLb8JjF=_jZexlWp}*tNrl zv%#6Ak9zf4EcSPY+c(}q0!eej#JI#^S=1p-+o4q&G60o@w>)8i9ohx&wN6N1-my6g zYgNHQ){Y_ji!lIZ1RxsO=1kt023!a3}5rFnqOaQT;61hl+C}pnWx^H(2 zv)eb@^ukB|HF1eYyN#!cjB9{J2` zqRATx5z2dHO0MUYSC=f_G23o0B=1ZRKh*LpbpwNAYUe`OMqvbwhVPFN|Oo!YOg`5nbUihyuFi8@-(I;caX7dXwCvD@>vHNpSpt z`EU>sX+g>Bl$zc`g0^jqqlpxVG|`G~^P3AvY0m&}{4Q?E#+{{L0!k#3JClr~F_uvO zxZXenQEZ)Luuu#?>ha4wo-=MmA)CoIZ{8yVXC{Oj*9ed!!d>_wfjaw`gHL5I#wgiP z?_?x4DE9*ckvw$-8HN{<6V#UTdr{;TE;LyT-CYtb(_wDZ@vJ+?DW?v7l%_l$vnk^1^)r z@OWxC`%%Di#sfq0ZW?zroYV?xTyHMLT@9xO97oE9=G z5YOncu%fZ#aS-W4%P1hVfrID=aO5#dK8 zAO#XN#2>#2MsdJ{heBA$Ve4P_vZ43)RI2-FErp+x!YZ4~g9<_6nUfFZy*n+Reg?<4 zGZRDAgFRkDuHG+L0UVt=|Lu}$G+1x4C!UMET&Msj!NQ5ffS-r+&?b~A>LyEokmA7x zAp7&)0$iTo2}cb&OoAMaPMmB3NR}r{GV~8B*=$J($YbK)GIzp8Rwpra5W6r|cL5hq z0rdX#?RF-$j~^@Nz{d^%2yzfjVo@U>7Q%6Fp#gt(ukH{!o!y#9VjjtlrjOPO2P+v) za1!x9W8$DE`Nt~~Q9&`}CYGBFrhxCn;zB5W4%r-XBv%Q>JKMSt*WE!i7`CaHQQ|~9 zCM!iA-^E2BK~H)i7Y(Oo-L9XhCvS|NrXxC` z%^lmAK9&T56!Jc9HTi&osMae1ZCey@&3#s$^r1{0qsAGiE?n765Vt1(X5wPX0qk3b z^DthvI_Z3T9$#hCqZ|x!^~m0-baFyDy9b+Y3JU;j|dgsemHDtWn|qyVU;_54%y+|a1@dk!Zk!8O1vl8xoUR3%AJ0j z;mzltHd5k)fhXgV2QfJVZ@G7P%I5Z;{xD2w-WlFLMJ*1b&B_*Y(!SWYHuaAN&&|Xx ziA4p>e&R_Vvl)IN>wH&Ii3FwjFHo-`m2 z#4ZLQAwL%=@V4Ka>6D#>P#`+wfF)%%7&AyX6*MS+$Jrs=1mJ<+DunQ$nM|pM-{RyN znDP6SZ7UvnCoC4;#1$^mE`^#l^}9=)Vh$=3p#us=N+JiL+lZ%=CkjiZ6l<~;1dNU# zA1qU>Q6$OZLv4mnP--Ns5{Lq7jpzNB;`ns3v7)CPP*K05+!GqOQEb!m;goX7;gQHg z9jibJ9^8F!YBm&CZBAZ4^6QUzTUtRHsGG0~!VF3olkqSAwm;6Gw7;N-p-f^HJII)! z@vZts_#D3{xtjtbHz}Dm`%%*jMENfbesN(62t#^MiVcO`?NZ2Z97G07VN=}rrjEY~ z2X!*>-rq+^^@ZyHU-Lly@@aU~`9g&C+QoMrFGLRZq`kM^_Wb*e^;$RhRwVfE8Ol#K zP#R_6=~btvtA?pz(0`9RCQ;`Q!zR-o`568^Z6l$^Pe33taAU9{~|<9j}i9#tZxrGwyntfWQd&Q|$X| zoj#uPD}o^I2pAEw3^fLk)^dmLUm=aD)`I*u89v0PYtrpW z0ojx1J-lA~)+){)@S;T+=!h(`2&e;RXUe?qK~u`Hj35<^i{i)&p`sX)yHsP>E0Qtf zWC?EnkSJ7`xrb0|3nlN{#AnI+Y*h7dwhV6Uc>#1_pw3n=U+jDTc+*FOwcMRs_qgTT z99dz9b1`87=W?$8caMn@oZ!QIm=Ed3kgcD5zenLM1d#mX_sc=5Ym&H z94petp&4cIySrK}MY?-~&znqGumAV0Bb*}NFuxQwL&BjX6?EhJLPQ*Kp+7S;KIMQ& zK!tR+p6QGU(p!*>C}i@SYJlHbUFEw>4@fZ@g!)aMJp04UhXu%ce2)Yli#@SAmnrR0 zycd9&*&e(X(&&KCoqY0W<+7<)>nLC4} z!tx6fp8rU6&QC0{z+VfLG+rw;7{?4bT!`2{4z}{{(4vVUF8`!420y^Bs_C#gx-p%^ z%nQ@c@>OHsALg@I9_FiYin0ldpEa;@44!G_^q(Z2{o0n~4%ymWLPf3N72M$}!JHvj zy_uOQcjEVVd_b42ea|ObZW^TP?&zZ;+r-rnCEBkvML|!PC?U1dSn3eAMtvH)S2ti} z^IM$$e=Z((r(%R_%#LPu z2g?+o{c`=*zU&j>xf!pawyhZ>TZKQH0tm=@6ocG`kX(W>sV*qVdR~m@?Wew<;|x-y zoVXSX;Si~hcWK^}HlLy_!A}LjLjUNQUzvZakgIOc%-}X71b&EA($AUv*x1;A_o{oHM@q~)sV5&~P>E7g$TCU5z_REFbx&IF3AXyV$BCKIMwP7mK zA{jE5;WR}0!J#tMf+tu&wo>u+!I%srW7xJW-T~b*Y%YW(j6=%8FLjL&@ksKv`z9XU zx=|g$#k|zejtjtRwvqSDk@SWHSA09yaB1iLF)bJ7z+z{G#`fJoXww8!*jYO4e)Wbc zs$I)!^yjR(+&?*MJhXWY-tyz!Dqc<}I#wYNTV&A(7h{Q;R8fUWza%xs6e*#$UMp1d zC~$XB#)mRkhDz_PH9qGrrznQjXljd67+M@4J;M znC3^CgtPP1&H8?cx%oNM3V&wgf84k9-6dxPggb$Vv-JCEA!yCwx_u9JmS}dHz^EzI z^2^eb8LI{OTn$J-lYjrw2+-OV?L8B~MnK zyY@l`1{}poT%TtqhJV>Z(GtZUoYvtj0Hq#`8iR;O!w`})Rhxy^padF1KE{bVWUc{t zLR8-2V@O~2BVtHXOsDwnfQ1P`#<|a8I%vSVSyXMkiOc;Bb2(6%TxE#vpNtIf$k?Bb zd=ri7xxSMQ804`ErOg|niV9Yob*Y;b!NqjwYhEX%451S-z|s`2saFbIn@hPUI;(f@ zXNnwe^jd|QRrbWaQ@bgprhBCO5(2t@lzh=Wl5{^hDE#?c0hfb#DaTy(#`9Est)M?jUW4HmzH8Kre|ghG1F47M#& zF37niT{v}T_3UW{O*O~*)w)~0Q&X|X&yA^>41L1%K+-unB};IKQCO*!c}<}+&HC+t zN`mif0~@8)o1EJOHcbvpG%4D*!tpilTg_TyiP{$?UD3wfWly)kO6t#v39Tl)D#P`s zX4&h~5v{F7E`C@{TY?%X6&%ahZ8YsXz+Vwfjum>&bti279D-X(R~% zSvvnt)Ju??;BfzSxqAu^f!f$2d5sJ9OKuw8JLMRtPFZiFdUKZI@QKM|?6AR~r}M&U zSeiSd@mtyo%k3Rxg=ppB1^;JSX(*GEP{1E#BHco43TVp1 zWV&%@rBEZPX8!p!TZ`DgO*(dBNLPpH*+{Wo6<#SRSzh553aIb14vyy#!1c#}*P+TT zv9sY9 z^T9Fqw)B=pM1Ouu7)h)Ad$J7;&VKohOK>2CHM+9QsX^{(N`Guq80CG0@(Z{sO0?n{ z1LqKBs)t$k2H1{n&U6*7W=DeyySC?u-V;C;q~tpWf>~!oKetf~$%ymVysL`fHN+^j zRCz@-{6hi^SltKmLT$QEXQetd&tCFCyyysd=6fxMF@2}1I!RKh#%XS250Oz(Wg5Ga z$I&R8;Ut>-Bm9eKeEOBr;49OuUAZ6?DG^MgJrv~82*0jcI8OO9iKF3Pwo0 zs@{{SCYvl*r2>3exNvh!#IYIFN}F%)QXI+G&8_a6EDH=yU#bF;i^nBA&Lwr}e^=S0 zwoxBqr99ua{C?I>Ng(SKLrBM?#9KeO!|u6N-#0Gie3mF7nTW{pK4^Z*u%TTi5i?wkpMxshr%Mc}7zP3{}k)*RlC z78-xPIm7R+J_AyZ41g(FmC!L?nZELq&y1nNz_hwM+o6$%5Q_-f9YJ?Ts1iux$QAlys}pqU3YrwwlmRn!ceu^HfK5dKtbt%Wi9 z87O1()yHXhD0FXFs5#t+=BlWq^Na4$#te|)6oc5^@nmcMoQ?am&yskbmx3OWW54ry?0355KBlqiv!v_85tp*EPh&qI{FpQcn6o&Jh}GGJ+0Js&+5DYDfh9r1 zsZx2{faUL=Du_wa>{k66eo^iu+|4%wd4q4XE`4Ir3a-G-tA7fu~*kq0dwzX zbYU538(r7$FxE17T!|}oyF%|>xu(qm4UpH5;c5XFBz6-hz&DW4U1Ja{i=V6k72X(epT?a-EAab(Mq-XYt<%R)NwjM2IU51vBPdqqC``$*d5NZ-P~5g)%oP^9 z&soMlu4ggydR}Q$%i}+HRkP)z?^Q2MRnXyu?wcC(oTd_zfR13yRP#cOsP(=9ImB{bBIq_$Mt1 z+p7X^pFOWh7ZgGIXa3e1F78ZJVz=x>RTxEq`;v3w#;&p3jPkfoxMQV0 zI3e_}SF&Mt%gU9RS@nG+<%X*|i=Qd#{*V|#$@vC7OMdlKd6;qJDdXy2|7Ke;EoJ2?Apt7byzmb+$wMD ztM&!y>$HFpy|LF?kKQIb;3CDo)2YZ_RBF(zTM(=_n(=>s(sI^U^O>O+-4h7@@n*$)m^@h^QXj=_jK?apW)~|$tT+YeO9ga%vcujl2U-ak z?C{uM$`0f#vZv22Ho)KwQp9qb)%C?OK_X#U5_K<<$7-(`BaSXcaOs76T;7>7tkG5Y zxmuiE<>Oom9x!0iUJEOM#C@8q{rmI}!7%}g8S3Xd&W+v{J}R!a zSZYlM4aPz<(oK6yL+M5BN)qjH0nGHDHUsKD;&z37+2uRij$F7d{*6pS>@i;hWun*5 z%R}z;yijKj0%$ZcC_7VGR>>; zchwfF%hqR7*^Ai+CCDZfMibfdALF{|6?Ewhsgzxcjb*W5taZ>Wc;n)_~f z(pnwaq+=%8OnLt?e#YupM~wa6v{*mgBVX)4!VC3FS_rAc`={6!ZCfN z8qWDy1qyq8+hmGQ9>neU?i{!z#+~bw4bc*v<79M)BZG<_-F(ms4$@@~ivAAn0RoNC z{P60yatZ1agOu8kQ|6Xx^p}o&Q$IEDAJzUV^C?ZE{#Q$R{QpRi{_?>|8W{3qdxl8# zgRsmlC@6d(k|!y<@098azw&jbwcmQF)=+kX)DrFE>(h1Y_AkxK|2=o#P;$`j zQ*1|?l}ts{e<(h zeHPU&-`(dfMHbPgnL5an^Ywh6yxv#SV?gJ;y<9C0)zs1w+x&R5|BH5G=b>r(#%_sH z_@2>}g>7bIvAI#VoAFPfLKoG-xP!;5Hvvw1)8a#eJZ2KU9hL7@#ZgW+rt`J}!zCLO z0{_+i882beZ)I!-JhBbJkG>Jlep%)qk9vl2kBqD2+Lt35XS-(!t&gclG+nI~T%f)| z9TLkzSAddMS!-wd-{Z+1#bjWoKUaR;IYE0NWzZ!yl~Tsxjd5 z9{RL_lFQZ7?(7oxQmSy84T7x?R~M%5>Z&@r*fKK;_uZGP4Ch$3c%*QzpWpkYm>AkS zA;}qGx-dEY+1xiAtwc};um0iqJb)QM2vsck1XQrYB)nqg7gf*<)y{^Z1Y zD2%eEnHB*Zn1xxg&W_#JvcJYMR^-%pZ`?g#oL#V$7#=I+Cg>s-JP@^jTM-N?H=wSH ziEj)ab25-{T`m5}e4--p?ha*`rkuV^gU2Y!$BSF3+Sr+e&gK!Mj8O{<4Cxf&<+$~v zhYta2b3kfW%+LSGB85>j6n7p&T^&_*nSlIQj}kkhOyjue^nyA?kHt7&OBLfEaY6;r zYxhGE3hY;7(rky!^0Y?9EL2bquw%5eEh`P$y0BX*V7g$oy1Jm&KG{O4_`Tbgfz84T z)zeOHnSKLKa5pmU8z@p&y;+p@=$8RmU)3;>6Q3 zhsAa~zq_;9I^E%r5dv;`M@V&*DU>*eY&X6Td&cGt0uC0e*t>EoP}h_s8r$FdgCfmQ zN6xVjS2A1|=K|S`(t|QXX}X_bkFPz=bw&XHRO0iN7jW-Bro4z{JqBSpOj+NzH?g#S zQC7BN_g!G@&R^D+r=q%fyMU7Nh_VOpH9yahn#RYEc40{9>d5emop-pnFGpvn{(SqZ zJ5m25t8bnAUrodRk(wwv=Hc6a7cl;}ZV*b*P26QLx?$n~fmv2(+5e$GiJa!{h#OhH zB)j~qs`>w~sxtWi0YP}31ci7WpXzDmVd7Tce6j3+b`9%*p)mdv8J2L9?&bfq+=^Oj z_%sLdU8TU)z8%ozOkDCqze;KsGY5yQuKze0bcXDrsy}we47hx5cxl=k)$Nfe^tL1G|CWjq8fk#n|7eq+#@j`bwzV*ixuz$l_ri}n_$3>NEB?OqlFTkDqAjK4<8AVH zWt#4(@m{28r04pxBf)G&EkU20jLG7aHCCL+&G(R>Kwn5${&-Z14 z{F^cow-2n(T@a2a>(+pAtUoYI%r;)rbWs;#j!~%Ol>@eYxmzm_LP$jSoC@^^7ynAV zy4VM%8wF-u%zaWa%Vwh{nVa3=^*z1M-pDGZ1#6Tw$F#Xm^Xqxg|9zg2GgG#h7{1F7sTV$x9+}sazuz$(BAG7dVi_z zOTmSJs}x(mvj3Hu6=BG$gPD2USGQB6o>f|jyJjfXIjg;;Xde|Nwn`}qVKe}dn5;?d zb!GMR1V!h5{`mPP8jwYMwWJWa=^3G9ZFSifNT$=7961a6xbP zJN9+&g_8Gwbz9Sa9eQH!SP_~aDFzI()$|UQ4?>Qv)kO|5N4T_&8mr#z_}H1mOjPtTE)Scw-&W+k%_&XkYKu)3 z+Yhe^wkD2rtwx7P8K8ZZ@lnuX-m!o(WRF_%~-_J0~C zS<@pRgYMB!Deq^Hw}0i-AQQL3s{Ja@WbUAuh&Y$nv41ZddwB&xUI*2jCF%?r;rH!6 z_suuoA{+sW1=kV1-6l8$eNOV9D=js|n#&e+r>0s74w zj(=`{RYiR*78G6CHE8)tW0I=Tel|#T%-Zt5yX9k>uMP zq&btRGqZMX^ilirTG}BeD<-yJr@{J;JaN!&kKYyul$3ISd|1=Tn}Qk?e8LwoN+{E; z$i|rXT~H`Z`L@_%((m<=IyeE%*0!Jtq|JK0F`As!?0GeN^8MCN22Trw(eH0A=Vlj| zq&|}}yt8^0UE{k^V8Sd?Q7E8f3LXO zoX|aaX3a+^Ji~O=rt?)Ksm}|Uisei2V%yh%h1e4upe2UxE24SLcLQ(GnA$NTyJWL} zz~u2@4im!LwfCdh^#+*Z%=#V0EsfHp=z7>idyYlPO4*HJnI1{h>#R$2hz%cVj0k!( zknZAySry-;8)cYor0sGvr2TOdI6inTp24sd){YisHsQkAXBUKtB45p~Rx04)L_?TW zQntKG_mA#w-q>7;?U39Y?LSOXXja~2kQ-;rbdME~^KRsE8WcVX5d1VU9-W-_qm`4X zT)>t>JRaH#h14yYnN-i&Cx^O8PQ3gYaj&*eR(8&$0Tb#blws{$%3-XTbU0H+vX!WUz-@DVXco9-uk=kQsCKYw@Fv`)p*5dnL3xz2MYwP zucDPz7MT~7)n&3EI(k{UWh&sL-}TF=A%sx4L0|c(P6>+;`-;;oIm?Zr3cc?$@nu=d zG;g~mg{JuG?t*|0^&`*jx;oa%7ashum>p?8@Duvoo-zhMTRI~2$?Lv*#)h1irKY|w$GNS1 zEjjGv@sq_S+7>|q&V1u;R>Sybz4H8Q7aKIzINYb#ZP!mI_DpW^;e~*3V+GIvM&VIM zQiQKBRJ^P8VYr|y==#!(tCB;hRLOpNu}{%M{l>Int65qXC(-GslKg_pb0$Xl97)N8 z18jqW-NX9*{_n3!82+xF@|>4aVJa?j9ybwiv7hTMsgv!pp4S!_du)MDGa!n8dS{Ba zGcd@%3Z`0$Hm23!D$Z> z1E;mJItR;F59@E9dv2?sxx(Gi!4uU#R#c#erwgoMZdto!ljv0NjzM&Gc+CHo0&gj= zV61QP+nG41p1TTL<5VdP%yRc=L1H z$w?Jvgq6Fl?VV{^g}ok5m8s*7st@1A6?dj8lnI-`Z4`0Z}4NX-tl_2K=z@zDIq1A0}@m4;sNUovl0W z6z&8aGgzGTc~!9CqE#fzv8A|lBYpq(-dKRqH_&eu9~}D_&gr7fwF;bBI<15p9QMg* zQLe(&f3V|uvEbYG;*FY$ww9gFU-KDF?@E$O^l%1gV<6=W%76_te~e+=LGYKd)hac} z--03Z92H963c`2tMh#VG^Q!0ho(`AN;t)x?W7RQE z>vw)X?d063V;ppQSCwARHue*K&DRj?thW#+ z^T~nGSVC&fVc3=_XB1S$zNxcm^P6-fdrZIwQ^ychJH0v`myT}g#llzf&zQ|j{)dnq zm71ICmpf2$5B*ELFlT7uh&9JRX+ONYeRWEmA$uq zYovumN^~!Os8CX!efPfi5vg>4?R|NZV$V@v39?o}Jn2L94RL+PSj$9it?b3iX)e=Ibu>xB{ZNr;eh(wmxn_OPn0(X8O1fj(QFW4sg& zg}+fAkQby-7r@NjnY->ird(*KlPl;2nXW+CB`{il3^*}fky^7n)D_pdF>SueiJn$! z2r%S+U|z|TI_4TeS&`5_r)lSh#){wglUjawJ;|X~v`Hs*$J%04)5A)F*(*$RV(Sbp z%6#xe?4G!swA%1a=SR=Jf!Vcc;DzxmS0tqGIhi>R!gTbRwJNH ztyx#i>hNe2+v+gF6IetTqYT`@1^}i7=nkkKKDl&r?7sX&w>r5*S1UiN4U2Lg9OQ8m zbn`Sytv4*r($%JjG^sRm_Kah-efLMFbXrqQIcl7y!qg0l^4tj4( zJlOtXt{;r>u3&)@zPctXRMCDqpguz9OYJKK{@LFH-wUB614pp1kAkt6b(|C5v{OMB zpRa(~VVLqhuNK@@bfBi&o=LLZ%`E<@R$g(n1dMU|Nzj1zhZ}Y>asaWW``g6;v7m3P zo5$Bz&8QtqWFw0go&28ThKnR}LI)liUS2Sa2yI72#f@Fgtx83ymmg+HuzGX3rQ6@r zmojWK5;Ck|sQXx8&y3%6P%*0G+&4nm(+}OtQ~w~KtTv%XSqgG8_bt)y3b?X<-bY`> z;a2|7k$Q}?%~%Jm{_;TZ_9m)9sZ-6Cbt3aCO1iEE>Gg)CxXuUqJv?`G zW%7p13`-c9o`=&Wt=5^bsR+xB4gMY#aL#lZ&Ob%Gt^+xT@(20@3{a%?7Fal6=MJXn z1^>>)OD|>eNbmM&sz`1!VC7s12g18%-P5sx!RN!!=z8myktVIG^=*N&WP!Rbeh!6mQP3dol&C*1 zxEPJ^cNK9=%om{)_p~G4`|SDF#DBeD<7b~F!iEWWD?kX7OQoe8A%)VS}$&c-PM0HLCDL&=Nb;lve)0;l9V%} zVKF!>7Hq{(GnukUcvO&*x&UQY+%9sqjM8dg{aV}ys2{Uu&nRbiJdCI$=l~rYhfx;sQ#1qvZzan$XRX6;SltNxZy|%l6A}~3x&q0MChNm zEkcc`605tB5%<1le*9Xi^eOm3aQ|nN5}=g$2Pd|gfEx}u*KouVp;LjoNTD>Zl)KQY zB*)V|Q&gpY*9>2Ep@oT~r*HaG8C||hSOH$Nnf+J!P=Jm0$q}sy`%>B>tm6Myx_x&H z$rOU?KapQ?Bz>E9BNMBl$n9w|jWRl}$`LK?#Zfx0IFq__B1C@!bA)W;SYsuxn@E3} z=>BGpJd!}R3K)j$vrzWjQ=hV8Rsg}__K1%ZjzoW<$J4Y{lmp&$Oh#rgJ^Gdu@~m_# zpaCQCg#=aIFtn>JSuqu?-ZOHkO}SAr(L{0Jo5F?D6$@WYEC6;b{Oin-TFna^;o#7@ z@;_%PwrtGohFh{q&(IBP$n~h(-O6@Nh-8HCuS)n*MWs!%XR#+6WuwfZ` zxa4oM#~SZl%-G$%T2R#&$ceuGaz_Mtc&?kZ(p53zTZ@r1({@s1PxrWy`nnjK`P#1) zKl1b&gKD^_Qf=p?f;HXc(mE#%l^XeU5xHWQ@kt?HL}NFt5+rePI!Iw>q`V-#`LPh> zipTic=v;%A1X8?{J=$qwME~H0M)#IKMt|FT#_@Ji*?W}ou#0fbP!*r-_0(^(BRrXL z70$7B-#$w=b{B~~!g!X7-w=8}ysjJ9bzU4l$w=gbY$kyM>e-xdSMeq>w^*_sGGB%) z$-{A~oA&x`=v+V92r@c1eu{O_1|76y4BpILWEM-MP11@?Hl9Cf4+`Z?7MZB)rlOLi z>`Q^K$&fZ(mMN;N>7mHDkDvxN!u|Vdi|5{;Tzd4_i>=P%)4dc49qjs~Cv|-XVr3D1 zFEYyqTL>q`v1#muFpEM_pO^OSQJg%Qub+=*rt6g1+9TGC+=syWjgzbP zz7dg!QsB)S;u20XY~_Ro*sPPcd#zU`E>20ld}tMQ@0Z32?ET;u&EFj7sES0Q)_@q; z)_yGppn0Q3q~Z~ot(e<}rRS3}n7ge_-zfU?7yv^`y&+1Tf%G0<-q z4EoF(|8~Cnnz+x?1#T986TO<_i^F$L+MD>y$&R%4eRLyI!OECSJ7$+)EZ;36yd_h*=zdAm;0S z`uxycmNo?(p@tE^moQCfs<6B@>7lZGRMhOoCxcvD>-}Szm;BFNpCzW3>IHH%53mLVivWhz z>WQS#WxzH}m1Q<=G&zr_s#H#Jh0@o2sj>Yqch_2NK|ITi{qc|Pa7?>Xl=&wt|HbMJfKwbr_> zYppGk8~k0XWJk0wLacZN3L% z>1Ta|;!pEq+12IfB9aI;ppo_;48a{pNWy&$CD zl5L!d-BI6!Cn8>CUF+KDo7=-xk)Gs2C~tR7@aVY)_10jzKg<4m0jNfRs-6=OL00Dj zm<9RHXN%VfrqYXP8)*foCFR)_SH+5zvvtA4oe+QYIvi?!sDMb7{CeozVjMjIVL+JC z3^WtH8gpFp{%S0$pjcQ5itCOP6D4FW9#3lPCRbVQN*M_(0Ff6ju;oWESAEl;snUUK z(B&C8sd1J%4ISMO2pAe_Uob&Z4khFW{PvO!RsK6Uk|n1DN@RZGgUj2RKe zMqEg6s3x*TsY*}8IT!B#P4%=yQZZl!oGtK9@^{+)LKEx$MwoB@>ICjXqiwOPH30!7 zKobhz+~$L94*U*VrFOGGmoeQt#?)VSD+oBUZeE?2wfC;xDRRm+?@S+ZOk1awt-HSN zaFc-GJwWOy-Q3<8r}o+&Eettx^Ew`_9L$TU`t^8!C&0rNOAW9`1`<2wUFkz12Go6a z=}gA*=dWkePih(c0b#kgPS{yi_W^Xb#c-!pX?`wgXPRzjEgEK_SA%%ujG1h#rKX7p zyaqeJSI7l_I&_0s=J4qED`?4)ANj_~m+kWcRsw?lz8aY9ja|##WAp-rFMo#TSzo#x z_E7p@#zXo1-tp6$xPUU*km1zd)X9HD9T`3WT$a@T(Ov()gam(+ zJO3*TmL&l7E*%YtQHU=t8F5BERb9xm^UnVpnfC9G6SwWmb!qQHAN_r&Yxr4s z1`F*u-mD~SnER(B4f?256ESYHUjqoFyMGf%i3$P!sq@4ha0|qPhvr0|Rf2^)xevUE zIqEk%u2~=bGqmNa6^LZ^mOJ*L{!T+Rt=dOt>WBj*B$Zv?bl*=t;?mzYmgcVV`OA>< zae;R@z~@b2%~$PH{vKyfgZ*eIRO3iHoA-E5~sZ)z>;6$0|V&%eq?{s<}`_Iih&FWW&k z7&dXf8)Dv9Y9h*p$gw z_+QdCNH-;PeXE%d5K=w}=@LmzfVht$k^|_#Hq%C+C=tK=MrC_GR`5zG%aNH&W9XOJj*ga{6U4 z<0(&{_Ogfb;OycD-{A>41Q3=+FsV@Bl!KRzQRdhK-?jV@dZ;gC$C%kY zWg>H=%vIL=v($)_X@=v+O4*3f3;e8CT+mQ3m@NAZ4W8%3y(pXqUH!Oz`4h6C(+%nP zNki^%6j4vkmYnmmkeiUq(r^&8O0udjC&aU%|MYqs?fi-_^AUwsCNBl4Blgpn882?T-(IENG1!xwp{i%jJAWQe`*0{8MJ!oJS&x=GRcmQi|V@bMK%bQXWD^PpIABJypN z(GR}?zC<&0HxU)leAi1s{*OO2;yW^R$)$OgHs-HboDh6@zZ$#?WV6RCob+~sg<9rC ztOi3{g9rL}1BOh}%``@P!en||O09=V`qwj8Oc@+k;^(G+cLw<#TzkX%7Wi%Hht-|v zu#%D^oOOMZ@x?D3WqNV{-7kRQ`ScFBe=}?~apw=JT2j?HFacY;_4tVGZ^b(*tHyb$ z#&8w??N+9xyLEE*$Lf^usSZt+VRFXH(3E)q($+T`T5MtNXV^`J7CmeD+35?Z#Kv6(7ar86C#pN{+k1-+v<;|DgH!u2U*8PoOSp4!&) z95qajWfim>l)A_s>Y~OJcv81zEl=Z^S%rj@3QGysymPscYi*~s%Q@AgP_az}>th@-AtL4_+PrGZB=rQf#9kd46T>>XcUk)3=k zU9IMaIT*Ye^*Z7{_iV(#WdlFl1;sw|R3}-zufOE~+WYSxutH zBdlg`Cv=;)r(xW%X6hqp1qUPsUL4`Jt33qbH;4}=gJ&g1Vbs3slwHoATJ!iuDEKjuQ8h%&*QqQ|91 zrdml?jO5Gog>41L>ynWY!RlwFAJ^Ocou#NQr*hNFy;7TNK>4!A3v{N{K8zF_sx1-| z7~{nHtaofqYi?QOG<(2&f-C`XdMAx?e?KW-jlf{Z4^V7rMn7Buh_4)qJAV+5MTV_k zBd-0L2YDHSbqsQ@ZMw@$h@qYqFIAFFcE97%d(+2!P75H#bw@$EIRus>_&vuPayIBi zB7}5r9akFKqnLn)d@C zF-Z^Q)eeZ@>dN;H#!84p4&v6cc<(CQiZ^D>5 zh2mEYWX#qxen6jl)vkl=meo42y|Ynsd$FaAG%M@SgqCOcNkXBL9tr6$qGo*~%EkoS z8$_^B$KuZEC?VKW;eZ4ocPl#~#&9b}2Z`LDp~+Ll14_k;%!*6>^+m~)C(>r2TUnzZ z5SPHfG#%o{u;9weq-imDyK3-jt;pgar(-7Ww#h}vJ!fX${zBSd(X1j`k790@vX_10 zgK(m^XL?WTzVp?n4M+~d8T-zPMWazs2tlg z<&6bx@K@Lt+6mRg@eVVY_kGHj$YrcpR(Q8vKSJ@SBq2iyrnRD*d`Bs?nCXR=j$t7lzWoZqNldnukHo1vylb;VFL zmCGs3lbsdB{D35|7M_uMFd`~MxAK{Vvgp$T?OX8eKkV|$BnZBw;SIp25dSv+7}2rT z;Y6(lJJT&M@=_!;>79^}d-WPZo^0)Q#qwGLFJJM$1w`_6iM1(uQM zoMS@@%mf#lrgdK8xT?Rc-N!RUroZG}+K^b-d;l9S&OnaK_%B>CDo*9deU?|*wuMTt8hZoSmz z-}bEZ-VZjb+scfVVlHpq-vCzR`_=k+iTA^z_4U6+Zk@bs`S_uGnBzyyC6fEVPP`4X z;GdV0o?Q+;=#tGYp#Jx3e-=-`Kj1I-`qD*v7eWd`;1Fi~CnGa>_phW#Kvf*^cjo(l zY;D<)R9)2d@x166CBJo1}&`>90^M(ptE#>U!s|Zrx@malyD&>bI zCS&<}@$lnr`nLOO!DYt5?(`^@Uca<(IB#YtUGRTZZ?w z>a;M>+%r`Jp8RE_*R`Q~-`vy4ea5%!PQq07m|OX8QDl(qqORwJD1^Q9G|weWY%sbG zj4nO>Uu~*U-16ZVb@OlYeb)IsJLjv^A(6d?8qd=tCDTS31EC?g53b}TL1=|2{~I>u z-xJ5)^=bbceT({5$-b=b{=_58DCw|gKmmwL-dz3zSZZ)im@I_QQM2SLaI*DET`n6z z5rOXLw7csW2v5`b>(kL#MQ1QghJZ@d3^CNR$Vt#eAfD^T- z#x9-7Oq;RSz>4CXlh4C-32?5UZK(ohiEWjwQY*{~n>eoj`x$4nm)4UYLo;gb+Y>oz z%R8b*)x3a9O+tdVj^*M0Z#s|_031O;!g;Ytna2MtjRIq$x`e##^k-QU8g>qOM9i{rYAQ8B9}>55|Jd8D8c{X$E3Y*T zU`q<$;GNjkRnd2aV{(0W+Ct6(D~&w_(m6Runup`5tImjiKJr|9QJx0*{bTB_Yyhwz zuHYBM1}q>SUE2%S<->Ij@MJzxVVr+5_OM|71%;V5Go{Ek8sibv;;g!AK#wpL_U-cr z+tQLIsU;)53(nyDU?+(>(a{`noZI?3AWxfr0-S4}X8S{$pA|`=c?tPK5$gV_-m!B> zrP@{9Yf^CntVy;Jqcz3LAlR7S1Y}3RMO>slUb!}1^6Qb&P~?D`7aGm%{2+IY-m^Dz zyp*SfCdG}m#iQh?78!esf{WvU>uYPL8CAHM~+d;9!?NlBZ3AwV2O=3!Xko?x1UaNz9*8skInV zJW`K7si;?j(66#L8wWuCUY2NJ#%#Z(uO?D{Qfmov{3!}qG0L#Ron9^@PxXt!wO8A`Qq}?Tb1IXt)nipP{@1l$`+w4YKjW;f3;`n9o!fB40COei3DnmH-X49JpNdE93{GHqbQ;ZlGGu)IxH{AL6Mc_nn!&>ieF zU4-tQ)qOQP8nfo)RHN!6Qeia;jwY1a7{7H&ezKdpj+ykJPKLCS@y#t;KZo5y5xOmb za?$_>BuCUi+4>jlcPWb6YER*=LWu2-pW#zBk^-=j);Uw?BTR|C!par;$kQ@E%Izs5 z8d^PCPx$$LrPd1f$KLNgf78zdmTMy3n(Bo3zt>^D#KSbAoc(;db6}vi#Z!ybRWJB~ zyCTLZUWPkaPe&+%BcNt#9$C}cN%3xERH4VgptnPb@oTSn$g`m#n!{(2@vMRIld1B2)p{I~&d70r+?ETAETKr4*Q@`>>w z^77<`u8sdX~UsWl@GN_c1BdX=LP{B<~k7RN7%W@2VjG) zJ;GN{r5D2=xx#lY#HiQr0$2Y__!p@&XJ1EZOR1$L1wXy}-mu+-*N?Ycy8su4)P|xY zRAy3xNnD(_x}E2|h=KQj0`;2!XDl-{gJGcdigc2J%7(l7-mgY#FQF>QlHY?)*MUP0 z@36tUVDtS9TH}*TWtP-ktDi;;nd4F^?f_+5P;Q}52!r_iOc%a~~(VId0-ET{rW)nejyHMP{94vv?byQ>yv1|r1=Vx1I7 z8e)q+cyKs2RKki=hkz68GIGSIm++?+^zE8bT@BBG*a&trw#5@ZR)!GySr9`dBKn?J zZ!n?84)RCFf~J#qga<^j++7{DxHYalZ;(3q@wU4FZ$t8lV3B)$IkO==c09?vDFJ6P zAIH0GB?Aq2A6f1IuXC~fx?B3<>ENuf?_|VJU||RU>6)LJD$1+WJvjbWMD9{Hu%VUG z&(iekLm~I{jjSg}O?PuTR0XwPmPJdqZ3@j~t@j@6q@bs!s|lxEKz@vlZSA(^wdueS zcs;t*kt^Eak?BLGxpz08@oxE{G#MLX^ZZE;8Z&@GJZw(ISq8Xx&&qzM3M-#zbGCMa z1c!Cz1E$!{O5Dk1Dgc`TjB6)65r&9k9xT4>2*GH5(!SyzR~&nl_LG1+T~e~F1~`PO z#Rl^L;X201yb^Pet$-dJ2Q`?m+=9TG=CTWtwPW(M86%|*I(ui`^1v39#e!0r(!q*m z8Zl3R9LitUk=~#IrwT2Hxsi3*eV*IzAW3enfA4T8$1$9hOhn61-pM6HL9a*ZH1LR2 zL8p+?$!GD)sZmn)bd#m_wV^2oc9?E~i;JT}XgB>-dav z&(mni9bRsyj?Bc}dTwbBja1%9&_4%2us0rm;1LBCB)DDG5Wpxj)46iYHE5hjXPCiS zy?iTrIA4%IUBZKm#`WI?wTi`SJ*kN*C_Oa+<;7mXE>}KUZ(5i* z#(>c8q}s1AB?!ixuA3NMv+lEJ`!pw@?Ii!(ZoiXPzLkZQc6x4-;&~f)R9i(M;OLY9 z6`(rd1+e)62CbO5zS;(|*WPiRKCV8A-?O=rEoSzMU{hDxopDFR$fwWL8%M7_ zLGiPjz(5c*5#gsi1Ssy_Q$Taw_aa_o1Nf6gBl&&Vvv%@`%Q6=u^9g@!0mY0o(tRS_ zzFeqeEP;A1{22=J=Pc1OU&X#(kS_cHmqRmjA9ntOEx>a;o7WDPY=H_{xr^8}l3p8u z*H8rQ^MAPeBNG=X)Gx5Pu79V=&;BA_{bGZk=Wrm)@pig>M7X?LMu5wU(x~zk(!N(+ zt}9+oivh+1_Vx3=z<~M41w*3>fXeuugE8!UV(!NkW{Z42Yd$1Z+=+98JChoEcksya zo1Tk6oD4VbxQAY0lE9$?Huxk?w@NhXcMi!i&QHIu$t}c^)T>nZx0-xRI^;aTWb$1a zhgIKd;|SM#4)wY5>8ud=3V~S#jnCJPg{njejs6#~ubvWj<=*`?p8`J$O&s{{m%8K# zO}i+B^v`RYq%@zbq$iA}`J)RKr-u+T>T`i6AB_Y;C!O1{YZ!UwChuFGm?S;3DML}= z7&I$J-NA;6T?iH-PIb5++=b$fPDyp>Hnb@Og^TaU_gmeD_W{uEV)MUEPyoD#>3lYu zN$ij_AV!C~qi_3xpiu5Ny_K^s*_kKSLZdQeU&{T;3%kGkl6t9FA`MYseePwIZ07p! za~h5I^RjN%k^fmDV??v{`zKex_hAe=nHve049%&mk&-n`gZttAJwo3ElDxlDFX`az>AQTv3H~#CUjB=Nov*u+gVmuO z@qx(OMw0H!k|VRw&X2C8yTEg}w7VTDK7XCbv7_<`d}vaH#0oqQ!tx7oMxFh#c~m74 zooSF`3~?#l78UPy&Ul5n;4S`{tBU#EgU;7YG3^Y4zD*{$-(2!J#_A`c75uL-*1YX% zr;aZ@Rl-KicXw^Pm^~j>jAlTW9b&Wgk(e{a<*=|E+2#x-=h`izq`pU4SUL?2C1Tz~ z0k<0O#!sF9wouQfpDbISFV{RB@=HaCeg3zZocFK%y;>o&I4tCUkh8t;ZiP{q`Z^6B z$oaFEA!pwF+Oof937dBxzsHA{NqFxYaJl{rHvflz+10Gd`k($L7M=Z`$3*{3=4==E zOhhDj|KAUgRb&q0qzM5fp||{b^W~_T=n*?UJ!(@Bzp3pn4od%h3O8IVkVDX4sk`4nLa+*&{NGd%p&hj&bk9`CO>N?Jd+s!Go1IZow- zD({vhS8oeOF{A^IcV#jDTwGKL;HVQe7N_DI2@;Q`!1li8Dm4OAuRdJ2XPsNi8A(!K z`dZv$Hci|FBeyYmNu7PD&K`BwWFu?lc^j`MM5r`yGQsRH`5=%HKQICt>_r zJVXNT0t0X(fRG#SQ~U5M@vS#dhdjT((SXpzf+E#RvB>aH^=Bn5uJ!{x(7e+0QzIU) zA0xl71|IC1tadh1GR#zOh)D936dmX*+72u(#6<>+@CJvonAisKK#{uT3Qjt~&vO!KDqMB86DxVk z5K5G|#B(b(k0R<=#L!G3UckwMKhYJ#&n{_?@OXZ(jPfWZ?BZ4n!tU&Afw=?Yj7G!M zO)THr^!UbU?(S1d*uCY6St&KB)CYS(Cd}~dN~%Cy^ghd_!;-xupSRrIT3XJaz}r!4 zyc^IN?q7gicP!^R+ce$y77_Gv%t5dwU`jD3M39Rv02hrJP+HhC}Jp|de zT2}ND+bV9&hq+80co%uU(zH>G=a<9?J})ieJ&>c?tlCK516t=7#c!fNV2F>ew~I^Y z51Ls?p*@ht*Ll@WGiNbt*r!A0GyEQRb0LWz5#`V^3TUilpCkOY5w>0Jr= zmwNOlk;dO2OX2-SUfRo>=Nr|nf=Z(1#uPxIir+_v_>|A?n4MU5f*`;P;kYxYt8n6h(Lj02e5FA*NBfu=b1g>Aba1ZhTKkx@|{no`xsQ?Xr z1FlnCoNoz0gF(Rc|CtAZfD)aIemz`>z0Ftj;+u&qhb`E6ujY-CK}1udF5AOP!uUsy zhF*Z+ZwFj#YpC6-#f%0cBFh+7fTN(YgoqsXl){q~7t@i~F!*NJ;u8J`kETq5MS>9$AsjLA1QfkD1_iBBPCs(W-1^!0mCZKQ?66~X>c@evM`^EF69!k&k& z=|lBKGJqnf3NMptXo>HdqT|E*V3>YVhx{NV*}F@?-3^1Cr?8w6%kGHBB3hKpFMk&O zW2xc_y#S|4By)M%;77Y~o~fQD-j;8+(4M?5wX}MZ^Fw;S3A)z3X{XXEbBbkP#C7-s zS4IDT-CreAbf3xtL}E7SW^>i+YL#-iJOk_E40o1rqeS$m;OB$<^q*3wK$Ho5@=b1G zZ8NEE#=qH{6eOl+(daQX;XO$M(XvUP{3)hC%GE!#?9iKkDw_SHY-T6CRH`!iF57Xs zzW$>0;goPrM|v(=ptlLu?NmYafV10`Yym9RXbtMhkq|9P)3PfBihJ1m<*cPYMaHKZ zgntG6+84Lj?%;T~Eaek$=)3G4{a1m4KFm|SAMu*m8mp}AomYKd#1L zzd)C{;Ui_OyFvg9B5&L-Jbi2Hdz|)kg9MjZscWJ`DX4ddGhLxred&H+F?_4a0P|V` zCM&d>drWcQAc{rxvwU9kN=Pr`NgbcuuL^v_t-IBCtUIV**xJ1@HDT&)+&>jiNc(M> z^BUK;`!LzLSWzNs+`E|X+rih&L+I=dK7A0E4{+#jQkH#OND(NG-)5>0jz_(k(|()r zq}p%Rw|zGD86Uxl+sxZAzhKOH{V1=|E&2mDIDR_E*B+{XP-0BzH|+!ReHHe>%eU8u zD_ivRw?fYJ{ne)I(kEM(83PUBpKig*Y=7AeV$wiZBi#Gs_6l$C3jH$2wGyEF0h{Um3cecZC?mQO zOmUTefdyIk*EIYp0t7*OJS7x@ZB`H7nyslnnx5R@*cWrByA+%jG2&%*WXGYWVZhTD zQ-X1M9-nZncpCno?9|9cRIMZ{TS?;}&?q;3bIdBg+}Klv2dbD+tC+!7Ym`sOV> z_wgU8U1I?|XT z)y}|_E5or$ai+X<>52OW=qy&q{3oZh3pB)RW%uWccQx9_VzG909o%oH4TPdKp_Q)! zAoqB6oGhw84svNE$!VwDM_3I?Q9;b4%)QSjhF4{iIs|^(u34(lupKWpxsGW5F=yKP zb0jBSbb*c`Q%YFTvq|bn2;IUA7^Y>Xi7~v7S|4;N{w*5#!5H~%=Xn68KsXqH=khIS zkzk;Z5h>z*2RLBuB#YF{X_?7-r@BT1oqq8@UE9(VJqk zS4HcO4(9yOJ#auriMLm8mSSDe%l8{?nYya0dFr_cLN=cQm`1Nf^QY@n|6&VIv;n*Q zA6iNtB%i0)_umEYGC?QzYDvZ4Vc*g zvO-$GC+*~y+vij38;rM$fk9bY4~w_U@k5oQyw7)U7Ya;=P5VT-lp2900b%&riTRA* z(2%gwSGu>`uO|#z$`0QJZ+bf^tQ}MH#2jr$!Nm zxY~AI36COL+fMQnBcBBi`KTnw8)2&ttD@i??;$@=pHnmNuUoH`-0K2{qC@8HK@_y1 z)&uZQ;+8*O>1-4f>Z=zVq-XKT-MUsk?aV>5GV{F=h}JkJosi&(x>8>9_C7~;Suc4q zHZg0}$=+FFB*0bV?ldX(G*mS>q`ZvjVWCt$ioa2Gx1&x(uw#E-Topp=f7#JENzbsA zbgPr&8W`N^@FR1RYRw)3h3bf+x_3r*4`&jYw%5HG7?@%K>`P)B@si*)+dlem&(bM71g`ofJv9b1;$Dv|d-!akvV^=7}{MPT)2fOGFsX+SFnMT!W zB{0(_(UiiRtQPd8?wk2Hwa(5i!Tm-sAAdXHYY4PNc*yz;RalSqC2w4sa=%vnj;|bT z{5Nt2TNf_M@(De(ZLwlTz8U3>V36AOR|RjdU39(32y+R2LUI8g(RLT@0*;VLB=-;Q z$QLl#hXz6hoKxn-6PKS{G7;E{KsT&U4Y#kKHQtx7`-D!L`*`cUaXKW8x0r zySC}V5C;Q_6}8J`MI`XtZDvRwO4rzH=2-c8_i(JBd8R z;D878PQqX!P+z#fC>Ok(*pP`0JB#CdKwS+>km?`q1{dwG-RXX}t2X6+D8gxKE177# zTWl{L=Xxv|_MY2Rm)go8ItFbciEx=U@vN&0`_}#Zu1iszA|?OP*N#~ak2exb8Y}dw zBrS8ASw>!VP{~P@d5ZV+k&f~r1>ZjWx$K6jvtf@H(jRH`V$fd>MI&M$V3>3ykFZ1w zk+*5^uB;!FyZI{ zEh$Y2zFBrkJ6E9ceWSzKc6w67hwaJ&^K*S!gSo@sCcW>uYfYTx@7Qvot3(4YY7*(Gl^Xj6x3m${>=>650tRjg`iR8SeL4ogG# zn;eX<5=%=w3=B-3g12oosnSK4Rb=obZRJi_JY!ber(ca ziwITda$I%{sZPmav`)}5YcERv{4zev(UdE9W7yryq?>B7eBTo?;^Mhg5epQR+qDl+ z$ktgu5~^@L;i_CWRTgyGR=8w9 zmJE+Oa2QqX?wz(k5osOWU4r&$zji#cJ>k??E-%G~(idi?W@pHPd&`zZ;z8CB9S1XT zjSVwqqE;ZeXobG|RH6{AU48sMjQQ!_Luf)P$N;fQ@7&4b%qsoJ0n%8iDSiF}S6D2f zvzgm}qX~e&FQU^Vx&6zVmtm#GFOYHbyK}Z|Jl86Lg8P4mykE}l&27%93CO5XUa)BY zvk|Q^%wqH9mtBpkfiyS_i0bbE-*Qd2mf$EYA$=Tc;J-BG*!**3 z(cgh1=~Rj2B%EyaaM}R9TV8P-9?N~S>(%na<)`$aH=JcAf4yrO&ciqTixwZw1Ia`? z&Mx$~oL#wcT0#IN!R7ywE^0zjR*l-J(HUiXpnZYnCvS08Ji zCZwzEyvEW+ZFl!Kwrq?@j%=hU(3xA~J-WYwcUSb}^ppLHYs;xH#OSo#aYHbf9fb6o06PomG%h!xLxa2e9={g@YFQF zPh9=Y<<5slruY``5{=k{@qt+uuj%6y7C!Iyh$p;?LIOqa#-n9{%?r=@!Et;;^fI?3sT52@ ztmh}fZ~B#!W;1Gq?>r(syfgYRmG!E#Ytv|D!f%P;>*L28j3`ayP8g_5+w^9urxDA@ zj9s_3qA26xsRUGPq$gRaZi<)yD5R?LoWV8HgxK%5Gynmm{}=uAsCcs2Ew=D3DPMc${1V8;?UQI zB6Ur61ivEg;PiIOz~_C%rpj^n5+lW8(Vu)oR!FypXByXt4}*qPQf3pCE{f&Gl@bJ?|sAg1iXQP%pbyQ8ZU>Ot38{VSKU?mRFj$_6QEPpWXGiewUic@5{%%SdJo9jrhs(scTn!fdbox_f&sodzA+! z)pc7LHL4oQWbUshY|ZZB^lwr0uL}*?{Yr4nIhF{DcO@A92IQQq&l*+dJ!rj+SmCN@ z(Vg2t)L=W4#CFt)j3G*DOc6M*;}Siqq0rxraxGtOP$0VLF5|{~b+2E=+Xf1lh5XZ^ zztO8nI4J06I;zf7 zmD;^!{H|Cka9B8K??u9RJnOZ%6p;i%@=!>5I&DG}+cwSdjln7X>P{1&C@acN^a+ct zs-*)XDZxHJVwF0E;oPPm8QM^)=dtU0#$VC5Yg1~g<1jEkyMHX>J&qpDtT;}*t~gba zcxAh_9Qs?7 zgcJ^A*Yt9y4Sz*%WT#!}dNXEgqaI@_SwB{|UZ4Qih*n?e=IQl=a!pzbiW;27GhBXb zle8MWQ!c;~YRz26x#SY5+&Xc^JuR{Gek$e0`0rSiosHI&71l&Xo}GO{{q~udBFITK zGtt2xU#!eIbz$yMsuMvL_=S4)>L?(sA~U$ebAMJLp9$tfO5-CuFrXUpB2ZK9*ns6Q3;$a)W|3GqUA>&#!pAUO`JWa>R2b1G#HC zLATkwTp&~4j&oW)+jJOK_cte$i;=`&vgoAApczt1(octDTU{TDT4=`vlIF`-d&s4@ z{1Uc)qxH5Q7iUmmqTDr+Tm<$YKn@CsQt~Y&khiY~4>D|T^DMJgay>tcyDNJ)33L5A zL1n@JYlXSV{8Yrz*VGS#5}8L5Q(Y7aGg8^aH|wb-2u`T}BP6?0Ul$z;{y~f-C;_1G ze=*$Y39HnS^e<0!o-iw(Hz(t9@(WVXP(sh;y5`mY`>43(tv}PZEFm)$12$01aOZfG zilCGu|6C1nWE9IQ49I{_0;gc-B}x{1y%ka>k%^{0vwV62XMiCmoHV$I7cu;>HE_%_SN-jk(IEs~a^~$X_x=UUBK$WHtyi3!D9G~N z90vqxs%;qnYbuYq6?)d1SKHZ~GKIl)C+nNoPZ=b|iw$`jjfkB zW;|Q>%p{kQg=QN3kf)X$8DG?f--hO1e=*9JR($A-{cxmk9!fqz?~S!L0?Lo#Rm@kp z?j0|BaV>pvPFgJ~vIh8aqLpjBsdL{ENbK%R>XANq zS-fZaL+q5x8EfX?HoPAKNT%o$oI({2*S)KqJT`{1Ix)(v_X0&4E$WsFYKx-$mKeWK zo;1_391jefNum!>VqV~rn=;7(RkVCFKPtcCM++;zPnW()>@d)Onux1$jW9!IUO9{S zCB=Egp%Lr(44sh5;a!ox5qt!4z}kg2MNw%O7S5D;SUZ`JbZOBCiwnn_vZ%nfS{?a6 zyKCDxsY4e9UTp+=T%2lb6Jh2d$&EE*2L>2TAysR=3UWYN2plL z8OWC+1-~I?5Uj~+5#+e>#w;icOC^7 z+dk2#FGs&IE=GBj*J8B9xjD2>yyLqA!NsMS>?r^Hn9#GyXk+J|XQQ`k&gUl3`fQK@Rg46PVX@Bt!ID4sth&gJ=1vn1O@1H89Q5= z_>>OQ=*}Wf9hR+PKk<%9;|3Qq?z&fvi%W8PFYG3@*( zp2zTgt#M?-I!~cl8G34v{gfy##~@@P&{cS16kP4CW#z$0+ZUvm6jfBj7F8- zlAq_U996$x-tX;N7Fn}*xTRvm!gH>8R-LZuk{9AS(TlWVEKH-B6SI5T6rki8A0P5U zXb`bEs#TIoHx{+w0S`I#?KO=$!_?^M8g{S@uXbt8gFDbN^^Rv5{&J67UOtDrF8WUU zZS&^HBlLf54~V-0Bn7l~i2zS8=36=<`I0KOf2csKev$_7=gFGNYcL2(N@*TEa&OMb zzCi}vcSe;Z8eX5af*s(h9QpLxK7z~NQwCX@2%S5pKJS&OXnFFGBf0`JMkbQz>kNu1 zoOI)9|0<)iIB)2KQGx5op>hSUsBtoVdd0^8Y8yH|fK@a!bjq^x3uHL|f$U%zY( z(HB96+okqyQjvRvt)PM!;`3duLhl_9B+mZcdR~_25IfYlY`W-};G+0hxbxTPhX1{D zb0hFT%=kjAdP#3NQzSS+?$|$>=@}}636y|3@`!pC5!ivO+;P5{FYWN^sdvAVsQbxH zXjlh^IH_d($Bo9NPVeOf7M^~nt5q-I$&%t(hTmE~iyAOr+@Wi1K6!7f!V{#@?^WeR zvqHE_JWhsA^Im>_*uSO<9g>a4^p`vNhGD!QIK%w-J>QWq@nKTrYxBF*4D_T;f?e`k z{`5y8cNn1P8q)^VfzwETA{jQgctp`^l~}1eCon$8JA#;Se@sdJ4-LUG?oh}S~eXs`QRWLtH&3nZF%z6B>okFfxo9d3-j1R}v0?n!- zSN)92tMI&+?nmNcd!vO@175D@C-9(CQq#v7HkHjc+H>Nar)|xfH1~7V+sbLcPAUv^ z(D8r}w-2oGJ=D*YViejUciGjbJ~4pR9MA9Qi$Mh)C_E!zFPE%8kr;ZLsqag7l} zdk+dxXPcKS(O)fjU=~asJpbuTmY__0^CsT$=a84Br%5p`jPkWBKd#?|MmBnVHU-wF zZB_A#RNM>PZLwKaY4D5t%Q)YuoS_PU*}exPYXH>rx9VZ9Lu~T>JMk;^`m?W0ubup! z#eV!z(0f!tjgc{j{{DUcA1vVi8~v@WvLDVsB6e1kMVb?U?#IhhFEX^b(~Ija7vh2C z|I17~f6*!cJ&V;eZ1E{tS3d|^F;PDt!8v#pJp{@b<1P4(Uuop z_Z^x-0|l9PA!>ajeSwf`hWJ#Ti~Hu}5%y=M$=oWXOg2cc`LnH~<)ur7b;H#a{9JAs znChSvqRQ#NJi2$%s?*k>l7p&LXK;{oT#f!TS|$gJ9$)9lsMM@C*#L6r=bE!8H6-Fmsvpg4mt1?V!me=ISKo&1 zWNyM9IEhP!st8nj+D^tzer)#72>QviIX(h$_3(W^?x(_mRrgP9ZLA0}BqSu@2B6Hp z`&U7xW%WSCH14_5!RySldtg}IT4PdfTS~E=-|z7L{O--{AOX)25OESZLbzQ2DQqUg zn)c?_lBnNG<0yC}m$)Y$D=Eu<-Ak&3LucE2 zVd$YCIx&7P?v)8FPHVgN`>d&uo|~FE8vU!B0Tyq;Xq-o>!;?l@zU5Oq$ArC zbZ&$C9hfdG4R-rtt<=3q??O3-B!2)ZPcdpz7X{_sJfH$HTW)%UHQW&PPnQm>suZKe zrt`Gbu&cQ~jP~9Na+Pgam^7;;Q5xnE9TcLTba;V=kn5OF@`>&pZmNh96Z8S1gg;MaFRFF*N2z&P3_z~EQ2_kG3$ct2 zP-`Y9XD%VSu=ssp{_@zzy~nyZ6Ko3`VgMnJeFm*q7r(rT&!GJiZ47WoDt#iCELqfa zT5WakOf>m0J@!$wi{)DMhK!8poA-ck@>fj8N5)DV0|v5W07cftvUqt<0k1XM1`f&p z9qOWgy7ZqVXZk<+z{-$|^vE|IyX%g4SouFoSQq*p+ z5(6ME`!kOYkjT0%v@b@>Zu425zuI3#iXx5%&hR?Tzpn>;e|tT{f8C+;3C&6xBr0GG z;FB$P02}<8iVUYAb40Ot50K>o6VHiHqy*IROaTiwftxR+W_ke7idWTVN*vJqclUYk zll`~%$<7Yh1uRB9eG5P9r<;hCmE0J{%jg5Dq^zcGmnLpPs8lYh{Tp5dW(zOF4-Hm- z)TMA=a!BmlIKUf8NW$RLrr_Z5^J6Z@%67D&YvMX@QXL)I`FEp5;)KPb)5XUD^Z`Bu zFCv^@PO*^04HKTVTNs}Gyc(>2Uh8z)VVDqWBUUxbi!$SP5pAycvHesK*c<=yf(XH#m3M*5c9YxtFwF;eUWhN3vEw z1cOma*W~jU!-y5zw|i0qdKTpEm;334x4a7!zrG25XiN)O8eniK{~FxG+Si9eOcMK; z9W3=#(AGXihJkP4baW-1@!j5U_xM@5w=o$+FQy9%mIXZ&QnbpJbEGZD^@5V>lJ=K2 zA7%M5#D54Yb|d|_i3osq;MMa_We>Z~V2{WBzt5I5V!-~GVn{$1ZTu!Oz|b-`_Q{aR zR58i7oJY9MhF2nK#L_BqD6t#=HU@b4yr1u0yzI+W?;Y+4|7M;4XG@;1w#$5eY^{RM z-M=TpQ?vD=JKl2lEH-bRH~p^L{C6&AXWM2xH+aQ<>7>0zy80^h#Hg&V1{vT*hp_ml zf3i-w_hVP-2K zoj$9}#EYI;TiJzoaJ;`E-B@_$+=Wxio?T2V3t9csU|mIP?!hzbr({knTQ_Iw3WHhR z-&nYwTLPz_km4tP|Kr!SkCWYARL%SSEunt*#l`a7dGg_Y>HF?V@Bdf&k!#MkJI4N> zz3=@zvwb`B;}z)_u6_m1Kfe`~FP9A3$r!kj{p|wxqHTXqcg!n(+VlCwyv?swXFgft zyYu+bw0C||;0*>FxPYxM&=!&P2SJk-z(tcVf!hxgAj?2OSpm46;0WFf2 zx2^h8UjM!PeB<9fn^Wd@OC}?g0>JCGfJzx=0O#*PYx99j&}DGA&N!mVf?1IBfoG6` z$`+*KlaP%DI_hJJfdmg*^T7liJK(a~)(T*cK;_dLN#L?0pymWGNT30kpj*6$(&GMk zM_vB|7x$b1jxKJmOHa>MHrMIV26YFXA2hwp%lED4$rG(_Zx>DlU0t4V6BHBNU3F`J z$T}*mpY+22*1nE)U3CX{pB4Fg_6Se~bUD7ym-JOPv>&9t`qOi9(S5eOoV>F5){^*{ zJCydF(z$rw4|Jy1h8$p+%>&+HwCcgxFC_uzqtD&H{kZm%$a@*{?X^jYoqskw(|0a( zUjJxY-7#f9rPzz_H(P-&2lCA6xGlWts3Z5yZt3eC?(Hu+lz_U z$(b)DYEjuNiqWNCI`2l6Ej)2$^RcR3S9O{dvoAgRY$acQ@zkB^I|3fF%}?uVy%u)Z z%Y4yI&~aUB>_L@j6Yvgfo5in6%IaU1uHMZhcr#S5zoN)7vQ>M1rg!6O z;ppb5;>%65ew~%-KJsU4>QuFSlg0Lh+bYlYva9@a2TB2TG}=*_s$=`T5%{N;@TvlT0?P)GFf2>ih?PvY>y}=F_D!*v(!ejRHm-S zmcxxS;47AeqW;`3A(}f1Y|!6J#qc?Q z0DpzW7~M3f;n1Yc1UpI+5^@44Y`9biHKs#&SvQ{|#6KnHoG8>uaKO=-wyKURN@TJA%16*^-iJvSwK)% zJ*LaVoSb?Rp@QCw6=7Tqik8z_%=b@8*~Jh7U(@(_O)V7kq(aI?Z0vC-_yhGKhzZ$( z=G+%c{ehh7r>&vU|EZU8c*HUCVT3AZpQlYyVRq)oFKhr2ZQf}(#qFn81q2@=IA8QB z+%EvXnjA)kX11cmDbDyy@Iu*!sj`Kmnwts#fD+vT+!&G`~4JD-mT3E59eVyb)| z?wO<_bDlBz%gQE)s7gyJ3^)XVRU_u_5>u5}qf)YT6!R*nS^PLXDS*)H>7Pr_q3e7f zJNg>jezoA^lMaC%6D2zpUn&`=qd4Yl8ZvBHT2fL{Tug4{8z@}_MywI>w|&vqUQ%CK z#kr8a{KYxeg{6KFMMNqRqrE81`;B53?swarN1NYiZv#toX-FL|EJGCM+K}p|eL*i;gg($CI7- zb6JH4_kP2~pey~S^$i`q=e2^pGRTrpCJ|pii%>rrHq9y-R3Nl@Lu*b>k0Ar!5g-P< z4<1o6K0clo`=cKd^e?(AWVQNM#8pSAZk4t2DmDuXzaZ=YeXxjJ?KdBXyIn6ve->xC zGv6f46E$blNUr4K6%R&~EVI5KGVzA$GR4xFGBGprHP+T5Q=>vtJO0EY$-gklhZtK& ztTbk{0=+|w9w-EnYcxQ-$|>*ip-gKLZ~iGaajxd{6rA`CP=Tdd7odj|_(@*xG)y_( zILkj&2*=S5s<}8ZhPjN&f$!uBpf7-EuGi2&_##{@B7!p$Ca|Nvy(5b^{)J#8z!?h8 zPPe9Ux>bFg*m8CyGaJ8CN^i2F%qT#&9Q?#YN6OGliv~n?=WI^XW=L^GSbO^ydw&A+ zio1hSMkIl|=qQE%k=`8?3YjP4`|V{%=hH9;MVW8c071N$Q+2$VxqRKtGB*|hcX4sC z?-Ypd4^aIeeGOB9oR-$Oay4k%s5Qn4=6AewCK5M4)DX(lQkybBeR607LEikI{Vu(*jFl$(Od2xqE6_=1$F6IN^Haj^v zZ4D?_>#w(f1`3No75VM*xgLep;suv|<89W9vk_o?S)$Yi%^uSVW#xQ&T{YO|er0ZX9|wA?KPp#(<@U zL~GZ=y#1F$x+gfjxIYz$O)IJDTU&kQnpH#bN|EjUbou5MILr;CIl9k2=XrG6ueLLX zn;udhMhNqL_{LEgZ?~@~T|S?;6zvkzUaM>rV1I_tg8f738#D(zPeFM34 zt12p(u_MI`Vk>lmmVL}@1F!KdbhimWn4y-d9wq>14y1Ipc8;7^YF9gF{;-mEr(wyc zBBee)SUFu?T~6DF5#1pm5fG*e~;l-Q6;c^=a7ZJ7ke7TXTT{sIsi;lIa!Scc}gFF%@?s{L!EE?UV*YJogZvu&EaY zNXnpJ>;nxKoo69<{UYHhf6h0c7(`#yboudlf`VqF4D9ShsI6NbWSNNoR0gEzN(Ppn zrmq7~@1@SK=%6Z=H5YXene{`OTlb>R2K3MUahsh#Jelo;$hXq1yx7VJ#5h&YejzV3;#=NWWxNWZ;oE{195J8E=?vRgaK6p_?<-jV57U`b_3r1kA!`0cX?CJ83v@ zL}Be740$GZgMtkbMWu@4b(t=l&-;j~qDc$w&x{jR<2A!8j0QkyDf0>xA|mb;Dh5Vx z7a}Vly11l-K1C8T0Ay_mR(VL;$c3rPM=XpdP|$25<;;Z?f@PZK5uab5@}c26GF0tFXgwMhon%ZhXa7V|impT9b>()I%br1y##sb`2K_;=jt)XeH1;$iRg{R5mmhVzFrnw!axxTiAoN-dFTAL+P2 z@Prbv*|fHeRE6=tFuGX%a6PC|K6Ij&zCVc-a0(=&Y6LvNoUGLMMP^lew>84fR_3=b z=NnkzB@-+xX1Mu@7FStX?swnGPasu6K~Z;AN3o$Jo%VWO9;6soH2!|)acQ?XhI$h4 z`N28=sB(p&48<4l9lPTQU06&E28Ep*=56*ZFVtUJg~S-Uto0-JU?%t1)y?-nJfm3jPab;r-( z3UkqBN~=X;^*m}f=4vq^i`BU{-E>mfY}gjbaHW5^K?i&`OHj;TIh z&!)gZAGVU#7bcn(IdWTqhE@ljz3EFCSs4Uv2qU79n2dHkO+TI<-*#nnxP~p};v3Tq zCnhN_rU}k0q~w>fj!2XVew8zCP!Hml)7G|T!p6b+0twcKs0&UIoNWe80rYxsj+N9z zrmz|RUVn~nPt;&bt|q(;5?`@I;eNjB?cR;B!L zIjY*V%%hl2g{3@u64a~xk}G`fJZXH53mza!h|R^9h;_zPq6N*PS%fJnr$IAn;qJ?w7)~ z?XKv(Q%EoDgu4>+nCIZlybWBTu?HroD~wha-x5;IV7dvBVvrh+5NeWFnW6p~Kt%Dm zdv#vOz3fQxe0V==;(4b1E+SWg;jsdDQh0#6kG{e=uFH^OTAn?73`7o?7GYpu1R#Mz zyDRL9>+J5$#tNq%FtCKc`K^DpbL<7}=ThHeXx73(S9>=$mWEzpD(gG1lTtM^gKnWa zoVI#Hq$dnhfW#@6oZyq$fnpY?B! zsXtxx;cL5k{OOPIhwWHWATho2EoXQw!kT}B)Y_upatczY z?thO&o`<07Xn>7G5aa`d6If?Md!(CB^_7Ry! z2GQsdvbXs$*U^>t654iz{>FuZzhRl~HdQxu^i^DRK3{63XIbE#>67wI=iq?UYkL!^ zC22etg@_~Wo?C5fK-#Da_|o24~|~ zgMQt_v2i9$Y#MRxr%nypv@i#X(G%e)Z)hJGqhf7#Ub!o0qz+d8lDqj-SUQy!TNl>( zX0-8@TcT)8`)1>ir}O$cX&)iIB)cTcytl-`E|%v+${;j0Hny~s@&!RWyS^SZ!o4HY z$sXn-yPb$-(fqtt1@6?%r_8p--NLl&mp|9x%4X3jlyf8kOp)yen+=C1u7F48h6UV2 z1j*t<@?Zvk^e|NgR2c9%Bp6llu|kC_{d2W#nkg^K86w`PLUM!byr=p2hTLC#WQm(yD&m-{i)T( z;2GLC#(hfJ0=R}d9$#qs`cKZ`-R}{3u+_mK5k*Y|PF&%>Hd(F;e{{h9$uh6~O2E5~ zar-qxi~xf$HIk4rrOJY37Yvv_Wc_Z9Pf+Rmm)}_hc6AAnwuw`c>vEj;4Z%`I5*a1U zK?ZAa;w5Qo8z6TcwHElFOp7fa?#6x3^5*?Z@LZ6;S*Nf~-@M(b2q0gQpEv@)7V#iX zGh@w-iIk+BzmOtMfL&~!64nqYd##^Hd2|T;6vW?9DG3$h zcb}0E3kqdRMOn3s=IOl}Gc@{)mJ2EO4^h^_kKIpTWy;fRAUx7M@sE7{n$-bh8v#$* zs;kAi8$Z8SF`+AA6IPTn0Qq}7nv=*R8O;+h;6Dsri_kY)TxH>m3ysy}d?WIeUm$lj z?sn8ZyrGm53>rBaK62QXsEgUd%C<4v2m79fJdDIoy!NX} zu+B1<0CdYQfoF}`x7$f@|4}6>TS5L&C{Rm9QR_wTo$ zXY_yg{xgR8{r{&TvsFNDXHJQx1#Kl$8Kq3AG)Jtgz@h3&Cu6f9v>F_yJ`nI z9!K}BUZ_lQMQy`yBw(%ivs0uXfzxyK*ZJ2Fn**<1=IutBy;ArK8*g&!8Ci2&4_4>5 zb>==RvJOA_CR?4!XX>#)j-lF#4%X~yCo2XoPg@HI7kXDmMn;zO|Mv2jshQnZRE0@u zUH^ou=HsEJ-)2noUJa+|IO}OW1m$BXj?GGF=XR6S#j9Z}(S`EzJ^!GFj`_C9f)Nhh za{RYI@|$Iq!dE8_*TeB}k8f~ajVu1KImOllP(!-pIJtP>(xhXoV>QS*4p~B zF@mpZu_)h&=XJlImJY+cv$Ex#OR9-}-`j_Lc?Y->8~y1ZjM{K~n$Spmfc*t)^#9kW z0iZWhFo^mU$+bE9#6iGGM>lE8R0|2mwyppO`tya0u2ds?0ap9jLHesT$S>Iw)B&ueW|q9O9GIoNkcf^@Xew7P@zrCik^ z@`B@alQ6O8l<#EyP2j}k_saNq)44I ztKNdCWY1v3rne5~LB)<9F_lP%_I>Z&N_THCKl|ynFR4IFfuWDV+~CU=;l0R9vh;&R zgnJvIfsla`CGg{!(n5tK>QnzTbf{GH3r5-%6V>X)A0BObCt3HKmD3eVMbpQ_aXB?; zFfRB$d%<474xdqA@g~>S!jGyHZ@Q^4>l;1~C6#G=N$fIq(M}XRO1Zs`ueZKmLP&TU z+^PgEKp^rB{>Eo_j~It$!*KhU*(YHM0OIUus|ic+yD#4Ik{I0tE z{A>Mz&7&dcrmUMwj^#!BeE~1UHo#KGXFoQ7bYA0i<%&tvUSO&mJlpkV=rG+S%ktb5 ztzmRZJ*Zt zN^TmTF_&EPTqdet;Xg}OlhnmeYGBS>ijGUaF>g}_nNG|8-9e?FfT5}Oy z&LfUzd{eUlk#eJoAbZu`V5g^{iBx97js(8K((^~oT~fZTnZmS6;lHFF@xfPg9v8SJ ze%l?D3GSyz0LBmT1o8X+oi|z=3(k${&0D+eWw<0DC3~hT8PVaiGu9OC|>uud+{kT5ViQcHOc)UqK zmV>^tr@X6gZO5JYsU>Bp`Bt+_79f-U1&&8UPEE|~jDnWpS34p^rbvJcZv-gg7`iPq zSZFVwNRClzBN^efzNTkxyQtmKkQ|-PX9LcM??ymWR^R{}EL@3`}0{RL)znn z=x87VP^Aj_d04KOB%+WV^1WK(xaPV%q2A2ROk1Jp+6nG6RFNFj(=umqk?X@L<&fj& zWK(I@r=J!m1^qruN7UVAZJo)Y8w*I_^;FIahRzqa(_F9yH@$m%-ub(=x>RKEtimDv@O}fnXYy>5&(Hhq&@}r9x?32p*!6(&3 zSndEAy_A=a>C0o95u$VGhMVo3|H5ttHZ%dJFjX&Iew{L@?~&8d_UGBr@v)D{kQ5Ta)_eZmC_byp`$GJ$QRyF6tZ|+y?cCSyU-5EL^vY+I5%WZGp-`|(dCzf8_hIv2^UwSe;KYU!nErr02yHU{`W>UX)thQ9g z<({H*!WUqqKDg9?zqMJ9ei}nc=M4NhmEs~z`Fsy%prRW6!2USLS90qtIlrm(JgKq+ zMvFOU5Wz{Xub&>Tc;CF6Zh;Q^WcPkrRm3w#r$4Ln1{hOXY0cgZ%gNKn$MSR>iHeDd zd47I==wO<()bW7^UHWnxy7ML^vGfHB9Pt*N7DR@{W;ATxBIEgkthwXiMJwQ%L zsXuSNXil~oVHb@~gTthDDhqZb90py2CnP^AFE2GHSTLgBxCH&|>f=s9V!y^;T;_qe z=nvJuSmWbxZd4q!WAiirtAd-!6>RmH)^?-)@^J>jlVN~3>=uQ#*OW53wVN)#qtWb?Siq8m%+CNtlERv znG+kIiStLrv%|Q&uehz4_+LSkB?O=dXt{evO@3b~Z8kVL&31Sm;lY2y=6(AZBprUV zO%Lbnnrf-CDOYV^q5K&ry%VGs8=9sOoY;fvW;e^D59%C%8;>zZdc7(?YLb`!?b*T2~Q&}uw2TjPb_ zfr`?bbsheL6*GaZUBz`#fue~U`|Zd!LEMNwUTp%tF>s?|V~Xa)GcYgA_qdNhqT46J z=QBz_GlKj6dCMh|Rq}_ETa$T@&JGlYFMP=T`bO!=jb`g(ZQUDMjH%Px`RnVu#pt<~ zr~4I%U`1A!b>C3CH<-TXVf;rU!)L`;eUq`@QISgIs0qLE4cdu(tTq}Qm&I9n0df6Uc_l8zJNbIAAj-?I$r@~*LCj)wJFAaiIY0IHWz?gKyG$5qCNymFA^RKFdz}8 znGK_b`gR9|CsG?RB0zHpYc3A_s&raE1dzKQ{+S!QHsrWck}LrLPU(GJ)Kn_T;}3ik4`d9d2%ssRSwktB0}6(jVO$J_f) zUv4f@gL=iZsc8&V_f1MhZ|2%Y`4S3BC@1z&DxEX1nDUW2v16k=J!HWzZPh z@Nh3Mle-RRH!vDcZCP%%FdDlF>{`}n0YFeVOg3_lme^P(w-`-mKa)we-q1qlEm+^` zJ^^WVV=Y5)KVX2VqD+u@dpazTIkYGPLCZ%?wtmW9*wyM7T>TkEFWySRK}0|MwEQ;0 zp-t6nX84j}z;Nj!^1QUP6SAqYerI`cW(4Ejv4Ln;>D~vYB*U5UyhVK2^m%?H4KB+t z-*t6Sv}<$GbUB@a$eU~qORe`#P3CdzvL0Lim}cz#SwiR)@cn9Fg~#Z)>n;4laxhWB zNo!-#!&BC!*JEW0?ul|*{=$h-}`1RA~WZI~az*n`t-h7C$ z{~d}H!KX9O19D2}0|q*KZM^c+d+6(NjOz*0Y*y#TZoxfbJBsP`=)+^L1!^G>d*T#0MG0mfKhLX4PIKNm6ib zZcb1;RK4lrYjRjuqvc?g9TAWpLIJbV6Zpc7EJcsbid)aNfnE6VC3d&i$1OkD3ih93 zNr`gFnVFgK@!;W)UN-1!FR_0d1pNlPldElOO|fp^>H|bfzxlLQZ|)urdQ)m93dT=p z$NF4WU*X_GyZUgZUj!5!&vhiCxL|^|QF(V&rQk!c8e7%kHrLn(QColffOzEG%G052 zYgaqC{{4{nwZXn1bu-XlIv7WX<{L8wE~F$4Dl~!h`t8)`$8uhH(iZvv4@fFmNGU#E z`t6qQU8uv{5iBCl_{{@{`x#qWlhNq|9=Ct8FAM=X8y0Wz=xC9Lo6UM-?}t1*IMg9T z1oG z06>?JHTSQL69zTrGi{VNuY}z^Yr|-wK_@hyS8)SK$*sLgichaJqsa1hc92Wtxa=MK z^8zGZ;3ZoRw><}W=F}M6jFm5Ypt#&2Xx!J^S|Tzh_apnd-hwC7mrEB*w<2!AUe|O8+7D2n$2qn}<6- zqsxf{=vUUM5G2y-Gz_p%Z>iNfy4?aD2(4^k$^*Tc%Ip1baA{-O_5-%>cSc)=XT3sS z&=F>G3Nn<=f)J2&Rw7hFB6e3(P)5=3f3q=d11`TG(j}#RB_@zrABt|P5;v8-1iqot zlI?<#sR}t^-ZF`IIPor@1{73_Vzj+dk&z>;U82p~ITfs%8OcM!-wI0|1$bR%bJE~H z*OFakMyJoe-lnKnu)f>ee9e?I>8GO<6&p`&ATmx@dGp|g@Zw%v|FGT%vmt}M)VvZ* z7;xEK4uM3>!6+~K6ZYv{c64hvED)ghl{4kg%8QQwbg9|w*1x~27K;POJl+rK-pG8t zg0qEG2#m)b;Mr-s8&Ic~mZ0Gr7$=~%N@%In`cRY6U9HiZrfTR2!QL+vUfFC%g zE-o}-G%|npZ^`{kE@q)P-Bq_7df}%3IN@EildEPKfR|$F`fz z)*KcV))|E7xBWyyB_Bt#rE@u-J-&*SgI^P*aXH6puO~W2hYMZ_nVB177{V;LGwUzP zMvK!Ym3iXt-bt?1OtmBr!RL=73yz!NYg_qD7~&wq5g@gW)>&IrKK6 zt}~$%nn^!OM#dU7u0f3mADE7i)?_;zreu-o1L#&M!qMFe0219(xe-DGBAsVt_ty@JZxmd>-8(|7sJm+`@e{q z?_>f%hlXg*-_3Ieha@MH!dg3XJ8$1_RJR$ae3~tM zj<$aWr^Y+M-@7~H^-yoxuzRN2Z+A^xd=h^b+Sv&V<=&mo%p0-BRdPSI_+IrUOA^Kc zdG00mFbZG$=|0qX7cX^AnYMZ!=N0#CR7*nfY&r=gVADx<9Ae82`qjqEyDXUv`}JHC0^g3$vylDGMIY|a=VzF# z{w`WZ>`0)4VzBIx`-)0Qgityha(uCCe?M?{o4hvihBG*KZ-jUS0yQ=g9K&nj?U2$l zrt!m|k#5dEm!ZMEHR&;8nY+{BU^?gJWist}9}MPI2Mjoa`6?N#;Rpb16nEMgj+YkG z-+Jks+*rzh0W8xd{>xjr;fT#X)#Fj)w|N_G`8xfi3kM#j$s`AB%=D|L)1r;nlfcD4 z3T|!-b$Xfc0V4i`-so?8jEC+#$g8h4&D_0o?QcED>~JV3D9?xZ--l(O#a8arPG-o$ zlsD8ndlcSPCUeh;X)o`8hyRi*n~z=mCV5cUJT@TJ1J7eq?6ug|ewd6Kg;bI`d9ZPn zTl-2rf2%VbbUClAOukFkuM^sVh=zfNhLd1R&sQK1gTGi@QNh*ZIp6a*@WJ?2z$L@g zblEZuH7N75!A`;2x^hnn3rUviXvt2Md%4}9`*7(x?#DThFcB8@!oucv3B&brxQ)1% z1%XmMmP}P|p^!yEWB~!q9XLzZ)FVbD*9@)gOqL&Vq|2Js+qN7)z?2c(do~!9!R2ua z^NA9w-__Zbl$d05KLh^~{K+i+f=Lao!QSFVCcr;z;}M&+!)f)Y{N-P^Jpu3sH3@nB z-Pd(*vdEwfA+l@xcxg2&(#`qLGlln|3q*QURFsUARKn=~czYv= zEM>y-^0Jwk88A2?ny`H;i$F7U^TdH5kEhpNaIQ~1hM&;pN#NsWF?blgZS-DmAMSjG z(rLC(EI$nWGHJ5U`kNY?jioIGLsJ~|qrbmDC@82pvO19CMPF2egp1fAc%6y@sBK3} z2fczp!=?-J8%8H&VBjTT+kMzeYRZd?QwoBqS14C43QVI_?dd=;F(1@~pIUqAFy4g+ z`u6T6RnD0M5A`tPX~*PR{)v#t?44=lj=N;1X530H<9V=KulDZE^08VTFb29GP!Q38 zKs?V19w=OVH@|!m^;j)_8X6j^tz~#^!$A~oXa3%DdSy9DSb}1riMUa8RBu{ZYCQ3P z)(M63S1u29+yLy185w+jp0q~DyV7v2kJ-csOievjXioMF=ka`X*f*)E#Cd?gP2N8r z{HMhU@k4k5W6RR>=b8&1x?xsJ9u)WSEUw=Ydtn3>nPD2q0Wr<$8x7XtroO=M(F z;P5J%0`+w2D_5}%C&l9ce9AaRs(4{Wx99T9h#HDN(nZOiPe&Y>@pB-h$SlGxnq_t~hi|?s-r6kLZ0o z2Li6kl6F`T>2Wn**TjwDHXFKR-AlXqgZjB}JL$re#d$10G%jaaO-;@99OQ4P5OjP1 z`0M|`j8$-$%#`7Bdztw)6^?XBXJTk*%7k5A_YK%3pq$?Q|7uevW}eQcvsbKbA1>za z3D$HZPj^e)RlI%SZ7BN?S&cJNwe{KeGZ-DH3C5dMdZ@J5nBr;o!EK=L#csVRQnO8 zfa^yNm+UnnY~D~(ta*fa^foc&_fv=e^zY2Gifn`?7bMU$R_z@1uvYzpXZ*;-qs{El}>#W}Im|}6W zJr_N7q4dY67dT`a7;CAyoe-L%l5$mCTkMH-j1v(T61g9e&XY0$DU<=jy2W5-p0<0z zz339gf9|wn9KOLBQ{8BVrZ3Nv_lIDMy`Dt}az6+l7jKc-!_S^rs$|%0mHMnF;rVKD z=>LKmuu*x8ENg*(8@ASUc)9SayJgQ0%9jeE8TQuv1LuNO)wp7WC&=Urjq8CiLgPQ& z2gnsDmI4hO5t^(II)bGc0d4O``#aR*WwiQ?s~vb!_smlFt*P(Yxs>B&m2>*PGGpsQ z)zYaG+ohtEXx*vlSM({^*QZi*rPMp^jNOWr;%d}TB?5eK$5hEp=6D`pL41N!yO9Qs zxfPBd-C^-j3tp6HU*aPoWo4U&tNcho`oq9^JWN)!jNvu*ZHbuJP$q)S(1kh7zH$Io z39s`q+%`MAsSADC;;xsJR5AfjmF{;lmMcm6X5ehM=Svctz_D_LJ>frxY&0wTWyx00 zORDS`xf8nDyd+$L*{1WzCs7hxV^9==Xerpol^T%X%URS``6nf^yjj_&>Gale+q~*Mj7+N5$+k<$!GQxZN4b>7t-9{wR^tgM;||G8*2>3 zRuO+B9jAO}H!`7~nW(=$?njrnu0(p)h*GB}8yV6K1gpkF#ycT8NmuAc?HO6LmCgNG zhfP2K+__LO%iyK9`W(Yf_R(&`ZBm1u?9^t7JOfrnfHL|eKxT{9V6ReZ!A=M)RABe= zzYbsSxefgY%WWqJ9mzkb3`fduXqUfIm$vl#ym9$2Re+?amibMw8a0c1#K7?Vs}M?!T~ph8(Yv>CP3@ zsWlQE`T)J0(9RNM)1Ub8CTPsO-XV~bWHnbcgAbAz*Y`ZSd75E@YUiEcU9sh!L%} z^4%~};ct}|RFRkgCh7sTA z{bB4KiIuD__P-3Mb)%xiW=Kd}VbjhiB!+jwW^;l00oxRtoiyAIs&yccV zk;Z~28Mc)n7z=?u@PSyR=0wFs!96uaiN|T4(ni={mBdH$>%0GbZHc>@O1hQdcT9Q_bl3`Ax+a@(k z{~OY;OdearBmqdb@JSi`-_+#Z(BCL7x2(NZEJp7Nup0+eYQ+FZo^nUFPC{VN(!eu*mo^l8=rpY826 zIX|~Xk_;RoDjA49Bdtq0U)86_{z4#%il<(<#HI1PxY$p%NvrjwIsAr1a21j}5KFBG zx5&#eB;wOK;L9 z6@P&3;y2#j1=#d&nG!t5N$rVdyE8mLmX9VY!hzMsG1XGPZ@Faj2yTva8;AKqIPZna~>(R|^mS&oGfuAp73V|UaB-q4-vDT(JKTtJ> z;`pxa9jx~aae;tKqE4dKRgMn-s%B#5i~25hXu5dc@RDnA8je7xa*O7<8p<B}f%j;xY2n zE50h1O;eQi8{&=fL$l9OKnpPT# z{cm~08d7a-9%SjT3ULhNQS~zK>%_^DkCl?_8UebY{TzMH!h4MwLJiW=GiP2P(D4r5 zt{XpX!U{}^WTuj8*blyfEErGsF^oQ7+Z#+EceEyZZ-qsVCz(UH$B(}jhls8wqYytI6$u9#t)2sYuW&EiJC_{ zIbaGHo^R?B#>LIVN5^v&n$Fj^Vu+34VBUPJk;4`3@YC*Cq+glV^>&^nJWu{*0X{d0Q_uT4kEgzPjIgj(DltO(~b*GMq6EiVKGw+fXT&25Ykg{P_nZ zYz|*FlHWP!%`zA3Qi`=ZZoQgF%Z3PY%Ap-aRQ|sZ)kuV10mszCZ z@3}fwkV^Gvq99|WMM#o-WB#zMGFe;oZR_G9bX(b9TIa@=93VIeRVSe8sUyeK{cEL> z-Zx+Jmv@K$)Tpq=4}jUU5cIx{LHw<->boB)W0p{kEFS-u4kMpo5-L2wpU$&gQZJFj z^QB7yJd}6=NF*+^QRd}=6`>Y}*v4wVa`Kg4gJPc^clo3y6+CR3hes_j zQ0T(JYC4f3dJsNNF}U?|=T+mNkBfhDsBYL0#fQvfcWc^e$gpTAZOlND$Zjh*bTJ z(k8XLAdHJJunkxvWxXU72I|iQwe$X6dc2Aw0(F087KVp^{YZ@NO8+yDPnFo7t9k7_ zeQ=p97n(D{1h4dTvY2N4xXh(?V>45eJ+gGs)^+&X3AMB%>{FmK*A!r9d?R3ujKllm zcrj(tE1dM|nK*h~RGO9o8g6#m7 zi?HyT2!(hZmy(8Rls1}7jf4U+WlMJJabS&vm-+7`C=7r^6#vYzMzW-hVsuvd%lt&e zJ@gaAL^`?h(pmZ0FR}Wos?aMw<9`c+v-NfzykHj-S#JNF$rBlJ3G=S0V=YtK`znd^ zmb3Jm-$@miCZDNzt&_0$>ee|d(l^a~4e@lpT(0ugzc8F_@|`+7kj}qW$~Mdxns|yU zI>~=aprV_i?R@#gDa}W__z3-W)8L3qjw^-O26OJOS591pXYxO@0z(O1`kT>^hSVQW zYswoZoNUwf-)^S9k};p^T+4|DEgu3@3SwbTjFXJme+H@EJ6h=Y?l^b%wM0gOP;iuC z@aVH_ss|V|7*3n)t+>T}RC$e~>Mi3QPI@^BN87OyndZHAO}rRD|8xspW}d;3s9+Fq zOWga1{Q-f-ar}W90%n`G)|tl35cDbA6gmbI@_(>;J~ef~yFDCp)B;z3;v9#iPm{FF z)rL|Eq+yd^GTECFBRdv}ir(GIWQ+Yav~8YKNn;8nj58Q1o-2h~x({TRd#vwk`6YX}-|Z-EhD8mzrBvY*M(l|K?o;?xUOZ3C zh7%?YPKCX1gVP0}P&cy7@?E`%()L>k&`NmjQCnfo--%c=2rhVc)Uj1H^POFwNoR+@ z?j`=B9i!Gmdw7@|pC@6+71~W<3UGIz*j4KhL_>5_w5fL5(parthHg=`DKs+HGC7qu z(HoUaeSy<^Yx(V4ZI1jh^(_btk!7e!Y&-Hd?cX@`J?qx- zITPzn40?q_bx%TgwmdrcrIj>J4)2IA>odI?LPS1^SG1OM;PjZN3O^<8S2k*_F>Ogg zpkh;}qXEq3sIz@#_Af5!td%M7-)uLGODW_^G2?yJ&+}z3XQ`d>;M3rt;g`RH!nD19 zGq@a+yOrr#eKXB?^!pwfr}x^LVi4O^ehmLM_D-W= zQ#jg6{U@v|awq~Nn3T0kv!>AJXcN1Ei!fax!9-(4J6mpWs59t%-=m%xLt361>CP>P z=QX6hCfza0wZR^aO5)x%iP>(>)q8%gJL$ED6GjF-v{>|GRG|OBn7L`~iqO>*pSVxS()%Kwxu1=0 zU^wtYTI>XW)K9w0;NteXhk$~kMl1&Bv2OiZ7a|RVSE=K!n4Vqzt zf~rUq#d5%f=v^Bp%8chM$~S-4!H4bflLF)zR=vd;aqPEc;tW1~$rx^|KIPCyEniy* z8`Doud8WdA9h}y{{B14S6_tZFszy!kb$ZBOXu^@-=8BOs&xK%^oy z>=Jg-i7RX!z@QV8DyUv(XiRM38;&r2kEmnE|Vk204jrl_)tJ0GkMJU+ApFt_OA$e;|b~VkHWaf zKbC9Cu0<)`raVHuSM7Q@UBE=2?-#F*{fE0zS@L@4?+sh|i5W3vY|ZiSk?2Q92Jnvp zbT6ot9K-4sEPR(tKW_HP7odXd`Ivm0 z+3xA%H3a{%%edE5SF+N2tZL&^O^MsuArvXIINrQ6MNEp1KhgkC)b3mOok@2GY_nL?gl|0(f>0Qf8hGGGW{Fh&q;5yIqkL~RfQ#IRe){xjbHinox6M8u`@ zK>c?p^k2zsG?}@$7X~Oi@c|#@U;>2Rva0C6qMSq)d-eY=0UeJMgg=DG4-}6L6A}_A z6H2qQ3CPIEaQIeOQ&LiZj}J(q)d~v_=WsldZKVNj7Hq{OB|!}`0;Tzx!Xe;|^nHj% zMn>PEXD+9Ru)u>lg0`E%C!v-q;W*mmVjU4xm&cZ@S zA{cP9N#Ol*7EIXx-#E&i7FDLDrKO~(q_hH;=ZA!b9{d;+AD<7}RdGv5^7sCO4D)w# zT${IPNSxq0dHQs7y|lFS>{+vPKvNyjO^hs;62Wr|Oa3-chrKsp;~#q+fm>Da UF&Vpn$9^z)y85}Sb4q9e0Lp!RTL1t6 diff --git a/modules/gapi/translations/index.php b/modules/gapi/translations/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/gapi/translations/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/loyalty/LoyaltyModule.php b/modules/loyalty/LoyaltyModule.php deleted file mode 100644 index 7dc030a2b..000000000 --- a/modules/loyalty/LoyaltyModule.php +++ /dev/null @@ -1,257 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class LoyaltyModule extends ObjectModel -{ - public $id_loyalty_state; - public $id_customer; - public $id_order; - public $id_cart_rule; - public $points; - public $date_add; - public $date_upd; - - /** - * @see ObjectModel::$definition - */ - public static $definition = array( - 'table' => 'loyalty', - 'primary' => 'id_loyalty', - 'fields' => array( - 'id_loyalty_state' => array('type' => self::TYPE_INT, 'validate' => 'isInt'), - 'id_customer' => array('type' => self::TYPE_INT, 'validate' => 'isInt', 'required' => true), - 'id_order' => array('type' => self::TYPE_INT, 'validate' => 'isInt'), - 'id_cart_rule' => array('type' => self::TYPE_INT, 'validate' => 'isInt'), - 'points' => array('type' => self::TYPE_INT, 'validate' => 'isInt', 'required' => true), - 'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), - 'date_upd' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), - ) - ); - - public function save($nullValues = false, $autodate = true) - { - parent::save($nullValues, $autodate); - $this->historize(); - } - - public static function getByOrderId($id_order) - { - if (!Validate::isUnsignedId($id_order)) - return false; - - $result = Db::getInstance()->getRow(' - SELECT f.id_loyalty - FROM `'._DB_PREFIX_.'loyalty` f - WHERE f.id_order = '.(int)($id_order)); - - return isset($result['id_loyalty']) ? $result['id_loyalty'] : false; - } - - public static function getOrderNbPoints($order) - { - if (!Validate::isLoadedObject($order)) - return false; - return self::getCartNbPoints(new Cart((int)$order->id_cart)); - } - - public static function getCartNbPoints($cart, $newProduct = NULL) - { - $total = 0; - if (Validate::isLoadedObject($cart)) - { - $currentContext = Context::getContext(); - $context = clone $currentContext; - $context->cart = $cart; - // if customer is logged we do not recreate it - if(!$context->customer->isLogged(true)) - $context->customer = new Customer($context->cart->id_customer); - $context->language = new Language($context->cart->id_lang); - $context->shop = new Shop($context->cart->id_shop); - $context->currency = new Currency($context->cart->id_currency, null, $context->shop->id); - - $cartProducts = $cart->getProducts(); - $taxesEnabled = Product::getTaxCalculationMethod(); - if (isset($newProduct) AND !empty($newProduct)) - { - $cartProductsNew['id_product'] = (int)$newProduct->id; - if ($taxesEnabled == PS_TAX_EXC) - $cartProductsNew['price'] = number_format($newProduct->getPrice(false, (int)$newProduct->getIdProductAttributeMostExpensive()), 2, '.', ''); - else - $cartProductsNew['price_wt'] = number_format($newProduct->getPrice(true, (int)$newProduct->getIdProductAttributeMostExpensive()), 2, '.', ''); - $cartProductsNew['cart_quantity'] = 1; - $cartProducts[] = $cartProductsNew; - } - foreach ($cartProducts AS $product) - { - if (!(int)(Configuration::get('PS_LOYALTY_NONE_AWARD')) AND Product::isDiscounted((int)$product['id_product'])) - { - if (isset(Context::getContext()->smarty) AND is_object($newProduct) AND $product['id_product'] == $newProduct->id) - Context::getContext()->smarty->assign('no_pts_discounted', 1); - continue; - } - $total += ($taxesEnabled == PS_TAX_EXC ? $product['price'] : $product['price_wt'])* (int)($product['cart_quantity']); - } - foreach ($cart->getCartRules(false) AS $cart_rule) - if ($taxesEnabled == PS_TAX_EXC) - $total -= $cart_rule['value_tax_exc']; - else - $total -= $cart_rule['value_real']; - - } - - return self::getNbPointsByPrice($total); - } - - public static function getVoucherValue($nbPoints, $id_currency = NULL) - { - $currency = $id_currency ? new Currency($id_currency) : Context::getContext()->currency->id; - - return (int)$nbPoints * (float)Tools::convertPrice(Configuration::get('PS_LOYALTY_POINT_VALUE'), $currency); - } - - public static function getNbPointsByPrice($price) - { - if (Configuration::get('PS_CURRENCY_DEFAULT') != Context::getContext()->currency->id) - { - if (Context::getContext()->currency->conversion_rate) - $price = $price / Context::getContext()->currency->conversion_rate; - } - - /* Prevent division by zero */ - $points = 0; - if ($pointRate = (float)(Configuration::get('PS_LOYALTY_POINT_RATE'))) - $points = floor(number_format($price, 2, '.', '') / $pointRate); - - return (int)$points; - } - - public static function getPointsByCustomer($id_customer) - { - return - Db::getInstance()->getValue(' - SELECT SUM(f.points) points - FROM `'._DB_PREFIX_.'loyalty` f - WHERE f.id_customer = '.(int)($id_customer).' - AND f.id_loyalty_state IN ('.(int)(LoyaltyStateModule::getValidationId()).', '.(int)(LoyaltyStateModule::getNoneAwardId()).')') - + - Db::getInstance()->getValue(' - SELECT SUM(f.points) points - FROM `'._DB_PREFIX_.'loyalty` f - WHERE f.id_customer = '.(int)($id_customer).' - AND f.id_loyalty_state = '.(int)LoyaltyStateModule::getCancelId().' AND points < 0'); - } - - public static function getAllByIdCustomer($id_customer, $id_lang, $onlyValidate = false, $pagination = false, $nb = 10, $page = 1) - { - $query = ' - SELECT f.id_order AS id, f.date_add AS date, (o.total_paid - o.total_shipping) total_without_shipping, f.points, f.id_loyalty, f.id_loyalty_state, fsl.name state - FROM `'._DB_PREFIX_.'loyalty` f - LEFT JOIN `'._DB_PREFIX_.'orders` o ON (f.id_order = o.id_order) - LEFT JOIN `'._DB_PREFIX_.'loyalty_state_lang` fsl ON (f.id_loyalty_state = fsl.id_loyalty_state AND fsl.id_lang = '.(int)($id_lang).') - WHERE f.id_customer = '.(int)($id_customer); - if ($onlyValidate === true) - $query .= ' AND f.id_loyalty_state = '.(int)LoyaltyStateModule::getValidationId(); - $query .= ' GROUP BY f.id_loyalty '. - ($pagination ? 'LIMIT '.(((int)($page) - 1) * (int)($nb)).', '.(int)($nb) : ''); - - return Db::getInstance()->executeS($query); - } - - public static function getDiscountByIdCustomer($id_customer, $last=false) - { - $query = ' - SELECT f.id_cart_rule AS id_cart_rule, f.date_upd AS date_add - FROM `'._DB_PREFIX_.'loyalty` f - LEFT JOIN `'._DB_PREFIX_.'orders` o ON (f.`id_order` = o.`id_order`) - WHERE f.`id_customer` = '.(int)($id_customer).' - AND f.`id_cart_rule` > 0 - AND o.`valid` = 1'; - if ($last === true) - $query.= ' ORDER BY f.id_loyalty DESC LIMIT 0,1'; - $query.= ' GROUP BY f.id_cart_rule'; - - return Db::getInstance()->executeS($query); - } - - public static function registerDiscount($cartRule) - { - if (!Validate::isLoadedObject($cartRule)) - die(Tools::displayError('Incorrect object CartRule.')); - $items = self::getAllByIdCustomer((int)$cartRule->id_customer, NULL, true); - $associated = false; - foreach ($items AS $item) - { - $lm = new LoyaltyModule((int)$item['id_loyalty']); - - /* Check for negative points for this order */ - $negativePoints = (int)Db::getInstance()->getValue('SELECT SUM(points) points FROM '._DB_PREFIX_.'loyalty WHERE id_order = '.(int)$f->id_order.' AND id_loyalty_state = '.(int)LoyaltyStateModule::getCancelId().' AND points < 0'); - - if ($lm->points + $negativePoints <= 0) - continue; - - $lm->id_cart_rule = (int)$cartRule->id; - $lm->id_loyalty_state = (int)LoyaltyStateModule::getConvertId(); - $lm->save(); - $associated = true; - } - return $associated; - } - - public static function getOrdersByIdDiscount($id_cart_rule) - { - $items = Db::getInstance()->executeS(' - SELECT f.id_order AS id_order, f.points AS points, f.date_upd AS date - FROM `'._DB_PREFIX_.'loyalty` f - WHERE f.id_cart_rule = '.(int)$id_cart_rule.' AND f.id_loyalty_state = '.(int)LoyaltyStateModule::getConvertId()); - - if (!empty($items) AND is_array($items)) - { - foreach ($items AS $key => $item) - { - $order = new Order((int)$item['id_order']); - $items[$key]['id_currency'] = (int)$order->id_currency; - $items[$key]['id_lang'] = (int)$order->id_lang; - $items[$key]['total_paid'] = $order->total_paid; - $items[$key]['total_shipping'] = $order->total_shipping; - } - return $items; - } - - return false; - } - - /* Register all transaction in a specific history table */ - private function historize() - { - Db::getInstance()->execute(' - INSERT INTO `'._DB_PREFIX_.'loyalty_history` (`id_loyalty`, `id_loyalty_state`, `points`, `date_add`) - VALUES ('.(int)($this->id).', '.(int)($this->id_loyalty_state).', '.(int)($this->points).', NOW())'); - } - -} diff --git a/modules/loyalty/LoyaltyStateModule.php b/modules/loyalty/LoyaltyStateModule.php deleted file mode 100644 index baf619917..000000000 --- a/modules/loyalty/LoyaltyStateModule.php +++ /dev/null @@ -1,81 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class LoyaltyStateModule extends ObjectModel -{ - public $name; - public $id_order_state; - - /** - * @see ObjectModel::$definition - */ - public static $definition = array( - 'table' => 'loyalty_state', - 'primary' => 'id_loyalty_state', - 'multilang' => true, - 'fields' => array( - 'id_order_state' => array('type' => self::TYPE_INT, 'validate' => 'isInt'), - - // Lang fields - 'name' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'required' => true, 'size' => 128), - ), - ); - - public static function getDefaultId() { return 1; } - public static function getValidationId() { return 2; } - public static function getCancelId() { return 3; } - public static function getConvertId() { return 4; } - public static function getNoneAwardId() { return 5; } - - public static function insertDefaultData() - { - $loyaltyModule = new Loyalty(); - $languages = Language::getLanguages(); - - $defaultTranslations = array('default' => array('id_loyalty_state' => (int)LoyaltyStateModule::getDefaultId(), 'default' => $loyaltyModule->getL('Awaiting validation'), 'en' => 'Awaiting validation', 'fr' => 'En attente de validation')); - $defaultTranslations['validated'] = array('id_loyalty_state' => (int)LoyaltyStateModule::getValidationId(), 'id_order_state' => Configuration::get('PS_OS_DELIVERED'), 'default' => $loyaltyModule->getL('Available'), 'en' => 'Available', 'fr' => 'Disponible'); - $defaultTranslations['cancelled'] = array('id_loyalty_state' => (int)LoyaltyStateModule::getCancelId(), 'id_order_state' => Configuration::get('PS_OS_CANCELED'), 'default' => $loyaltyModule->getL('Cancelled'), 'en' => 'Cancelled', 'fr' => 'Annulés'); - $defaultTranslations['converted'] = array('id_loyalty_state' => (int)LoyaltyStateModule::getConvertId(), 'default' => $loyaltyModule->getL('Already converted'), 'en' => 'Already converted', 'fr' => 'Déjà convertis'); - $defaultTranslations['none_award'] = array('id_loyalty_state' => (int)LoyaltyStateModule::getNoneAwardId(), 'default' => $loyaltyModule->getL('Unavailable on discounts'), 'en' => 'Unavailable on discounts', 'fr' => 'Non disponbile sur produits remisés'); - - foreach ($defaultTranslations AS $loyaltyState) - { - $state = new LoyaltyStateModule((int)$loyaltyState['id_loyalty_state']); - if (isset($loyaltyState['id_order_state'])) - $state->id_order_state = (int)$loyaltyState['id_order_state']; - $state->name[(int)Configuration::get('PS_LANG_DEFAULT')] = $loyaltyState['default']; - foreach ($languages AS $language) - if (isset($loyaltyState[$language['iso_code']])) - $state->name[(int)$language['id_lang']] = $loyaltyState[$language['iso_code']]; - $state->save(); - } - - return true; - } -} diff --git a/modules/loyalty/config.xml b/modules/loyalty/config.xml deleted file mode 100755 index eed08a452..000000000 --- a/modules/loyalty/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - loyalty - - - - - - Are you sure you want to delete all loyalty points and customer history? - 1 - 0 - - \ No newline at end of file diff --git a/modules/loyalty/controllers/front/default.php b/modules/loyalty/controllers/front/default.php deleted file mode 100644 index 877e396c7..000000000 --- a/modules/loyalty/controllers/front/default.php +++ /dev/null @@ -1,264 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/** - * @since 1.5.0 - */ -class LoyaltyDefaultModuleFrontController extends ModuleFrontController -{ - public $ssl = true; - public $display_column_left = false; - - public function __construct() - { - $this->auth = true; - parent::__construct(); - - $this->context = Context::getContext(); - - include_once($this->module->getLocalPath().'LoyaltyModule.php'); - include_once($this->module->getLocalPath().'LoyaltyStateModule.php'); - - // Declare smarty function to render pagination link - smartyRegisterFunction($this->context->smarty, 'function', 'summarypaginationlink', array('LoyaltyDefaultModuleFrontController', 'getSummaryPaginationLink')); - } - - /** - * @see FrontController::postProcess() - */ - public function postProcess() - { - if (Tools::getValue('process') == 'transformpoints') - $this->processTransformPoints(); - } - - /** - * Transform loyalty point to a voucher - */ - public function processTransformPoints() - { - $customer_points = (int)LoyaltyModule::getPointsByCustomer((int)$this->context->customer->id); - if ($customer_points > 0) - { - /* Generate a voucher code */ - $voucher_code = null; - do - $voucher_code = 'FID'.rand(1000, 100000); - while (CartRule::cartRuleExists($voucher_code)); - - // Voucher creation and affectation to the customer - $cart_rule = new CartRule(); - $cart_rule->code = $voucher_code; - $cart_rule->id_customer = (int)$this->context->customer->id; - $cart_rule->reduction_currency = (int)$this->context->currency->id; - $cart_rule->reduction_amount = LoyaltyModule::getVoucherValue((int)$customer_points); - $cart_rule->quantity = 1; - $cart_rule->quantity_per_user = 1; - - // If merchandise returns are allowed, the voucher musn't be usable before this max return date - $date_from = Db::getInstance()->getValue(' - SELECT UNIX_TIMESTAMP(date_add) n - FROM '._DB_PREFIX_.'loyalty - WHERE id_cart_rule = 0 AND id_customer = '.(int)$this->context->cookie->id_customer.' - ORDER BY date_add DESC'); - - if (Configuration::get('PS_ORDER_RETURN')) - $date_from += 60 * 60 * 24 * (int)Configuration::get('PS_ORDER_RETURN_NB_DAYS'); - - $cart_rule->date_from = date('Y-m-d H:i:s', $date_from); - $cart_rule->date_to = date('Y-m-d H:i:s', strtotime($cart_rule->date_from.' +1 year')); - - $cart_rule->minimum_amount = (float)Configuration::get('PS_LOYALTY_MINIMAL'); - $cart_rule->minimum_amount_currency = (int)$this->context->currency->id; - $cart_rule->active = 1; - - $categories = Configuration::get('PS_LOYALTY_VOUCHER_CATEGORY'); - if ($categories != '' && $categories != 0) - $categories = explode(',', Configuration::get('PS_LOYALTY_VOUCHER_CATEGORY')); - else - die (Tools::displayError()); - - $languages = Language::getLanguages(true); - $default_text = Configuration::get('PS_LOYALTY_VOUCHER_DETAILS', (int)Configuration::get('PS_LANG_DEFAULT')); - - foreach ($languages as $language) - { - $text = Configuration::get('PS_LOYALTY_VOUCHER_DETAILS', (int)$language['id_lang']); - $cart_rule->name[(int)$language['id_lang']] = $text ? strval($text) : strval($default_text); - } - - - $contains_categories = is_array($categories) && count($categories); - if ($contains_categories) - $cart_rule->product_restriction = 1; - $cart_rule->add(); - - //Restrict cartRules with categories - if ($contains_categories) - { - - //Creating rule group - $id_cart_rule = (int)$cart_rule->id; - $sql = "INSERT INTO "._DB_PREFIX_."cart_rule_product_rule_group (id_cart_rule, quantity) VALUES ('$id_cart_rule', 1)"; - Db::getInstance()->execute($sql); - $id_group = (int)Db::getInstance()->Insert_ID(); - - //Creating product rule - $sql = "INSERT INTO "._DB_PREFIX_."cart_rule_product_rule (id_product_rule_group, type) VALUES ('$id_group', 'categories')"; - Db::getInstance()->execute($sql); - $id_product_rule = (int)Db::getInstance()->Insert_ID(); - - //Creating restrictions - $values = array(); - foreach ($categories as $category) { - $category = (int)$category; - $values[] = "('$id_product_rule', '$category')"; - } - $values = implode(',', $values); - $sql = "INSERT INTO "._DB_PREFIX_."cart_rule_product_rule_value (id_product_rule, id_item) VALUES $values"; - Db::getInstance()->execute($sql); - } - - - - // Register order(s) which contributed to create this voucher - if (!LoyaltyModule::registerDiscount($cart_rule)) - $cart_rule->delete(); - } - - Tools::redirect($this->context->link->getModuleLink('loyalty', 'default', array('process' => 'summary'))); - } - - /** - * @see FrontController::initContent() - */ - public function initContent() - { - parent::initContent(); - $this->context->controller->addJqueryPlugin(array('dimensions', 'cluetip')); - - if (Tools::getValue('process') == 'summary') - $this->assignSummaryExecution(); - } - - /** - * Render pagination link for summary - * - * @param (array) $params Array with to parameters p (for page number) and n (for nb of items per page) - * @return string link - */ - public static function getSummaryPaginationLink($params, &$smarty) - { - if (!isset($params['p'])) - $p = 1; - else - $p = $params['p']; - - if (!isset($params['n'])) - $n = 10; - else - $n = $params['n']; - - return Context::getContext()->link->getModuleLink( - 'loyalty', - 'default', - array( - 'process' => 'summary', - 'p' => $p, - 'n' => $n, - ) - ); - } - - /** - * Assign summary template - */ - public function assignSummaryExecution() - { - $customer_points = (int)LoyaltyModule::getPointsByCustomer((int)$this->context->customer->id); - $orders = LoyaltyModule::getAllByIdCustomer((int)$this->context->customer->id, (int)$this->context->language->id); - $displayorders = LoyaltyModule::getAllByIdCustomer( - (int)$this->context->customer->id, - (int)$this->context->language->id, false, true, - ((int)Tools::getValue('n') > 0 ? (int)Tools::getValue('n') : 10), - ((int)Tools::getValue('p') > 0 ? (int)Tools::getValue('p') : 1) - ); - $this->context->smarty->assign(array( - 'orders' => $orders, - 'displayorders' => $displayorders, - 'totalPoints' => (int)$customer_points, - 'voucher' => LoyaltyModule::getVoucherValue($customer_points, (int)$this->context->currency->id), - 'validation_id' => LoyaltyStateModule::getValidationId(), - 'transformation_allowed' => $customer_points > 0, - 'page' => ((int)Tools::getValue('p') > 0 ? (int)Tools::getValue('p') : 1), - 'nbpagination' => ((int)Tools::getValue('n') > 0 ? (int)Tools::getValue('n') : 10), - 'nArray' => array(10, 20, 50), - 'max_page' => floor(count($orders) / ((int)Tools::getValue('n') > 0 ? (int)Tools::getValue('n') : 10)), - 'pagination_link' => $this->getSummaryPaginationLink(array(), $this->context->smarty) - )); - - /* Discounts */ - $nb_discounts = 0; - $discounts = array(); - if ($ids_discount = LoyaltyModule::getDiscountByIdCustomer((int)$this->context->customer->id)) - { - $nb_discounts = count($ids_discount); - foreach ($ids_discount as $key => $discount) - { - $discounts[$key] = new CartRule((int)$discount['id_cart_rule'], (int)$this->context->cookie->id_lang); - $discounts[$key]->orders = LoyaltyModule::getOrdersByIdDiscount((int)$discount['id_cart_rule']); - } - } - - $all_categories = Category::getSimpleCategories((int)$this->context->cookie->id_lang); - $voucher_categories = Configuration::get('PS_LOYALTY_VOUCHER_CATEGORY'); - if ($voucher_categories != '' && $voucher_categories != 0) - $voucher_categories = explode(',', Configuration::get('PS_LOYALTY_VOUCHER_CATEGORY')); - else - die(Tools::displayError()); - - if (count($voucher_categories) == count($all_categories)) - $categories_names = null; - else - { - $categories_names = array(); - foreach ($all_categories as $k => $all_category) - if (in_array($all_category['id_category'], $voucher_categories)) - $categories_names[$all_category['id_category']] = trim($all_category['name']); - if (!empty($categories_names)) - $categories_names = Tools::truncate(implode(', ', $categories_names), 100).'.'; - else - $categories_names = null; - } - $this->context->smarty->assign(array( - 'nbDiscounts' => (int)$nb_discounts, - 'discounts' => $discounts, - 'minimalLoyalty' => (float)Configuration::get('PS_LOYALTY_MINIMAL'), - 'categories' => $categories_names)); - - $this->setTemplate('loyalty.tpl'); - } -} diff --git a/modules/loyalty/controllers/front/index.php b/modules/loyalty/controllers/front/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/loyalty/controllers/front/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/loyalty/controllers/index.php b/modules/loyalty/controllers/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/loyalty/controllers/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/loyalty/images/index.php b/modules/loyalty/images/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/loyalty/images/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/loyalty/images/loyalty.gif b/modules/loyalty/images/loyalty.gif deleted file mode 100644 index 29b1984fff0576be94302f370a1cca7b36ffeb86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1657 zcmZ?wbhEHblwy!#c;>*cV#SJ$IPv%I--{M4`ug?joH=t^TU(DGKfY?!s>6p5&!0cP ztE+43)TwXZzU}Gh`TqU;j~_o?y?S-@=+WJ~cRzmoc=hVl^XAR#?(Uv3V@7jx^OrAQ zPM7-#&f%^y}BJ|M~N0-@bjzmMvSe zX3gHcd#_!)wq?tfJ9q9hH8uVJ|DRzf1I7Q`5xxNmE{P?HK-$K>q98FjJGDe1DK$Ma z&sORE?)^#%nJKnP;ikR@z6H*y8JQkcMXAA6ej&+K*~ykEO7?aNHWgMCxdpkYC5Z|Z zxjA{oRu#5Ni7EL>sa8NXNLXJ<0j#7X+g8aDB%uJZ(>cE=Rl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAf(~1RD^r68eAMw zS&*t9lvKL-|y0U7xv`NbLe1q#l=rV74^$(eZ| zK3Ki4ua#$BaYnlROA8}cM;B9b3qwO!11C2VCpR}ECr1NA zV`p;{SD0Rx{N&Qy)Vvay-V}shC!BggNg=lYXtPUdQD#|cid#{Bt^(N0R++fnVu8~< zsNNLZZn4CvS0CsYeNeo>*T>t-)5G1()y3J#(ZSx%*2db((!$)#)Wp~b zn5Fb|b+olKHPqEqRg{$!73Ae)Wu&DfCB(% -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/loyalty/logo.gif b/modules/loyalty/logo.gif deleted file mode 100644 index 039f3fa77234f43857ac408692755924cf2520f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1016 zcmZ?wbhEHb6krfwc;3liSfaBnkin=_*Sy+rZ#08VqnTre^^qI~_dff}g$!2;8P1e4 zTq|d|R>2T3)BSoC!;MCUnNuWhv@qOhWr$oF&@k65ZgoiV#)zs_B~`1-?#+@&-yZXL zwnFxvgopE0-pyxd*yp}=llGfs44FqFpDxvTvO?tXO1|u4(Vtf^bnI@*Jsw+dJn8-_ z+rpCxuht3|pGthQUbysha@m=b@-wOJC*mv4ru850c)8K4>Rfu&xr{l-eV=Z2t~sA^ z{D97@ttPb>vL5WxslS-rc%h)-Qts6QTCaDSHeb&Fyj$$eF3Y#OEGC}sJbEJZ=K+bY zhxOha4t;+(^urOqPe(oHU7zyxnEi)i!QW0ed^sNY?s&@gla4=5IWE3EYssBiYi=!D zac}PDOUa)vr+vGW_4#ta=gUQ(ujG8clJog$-sh|NU#{kFdc6G0)uQiL3%*`0-~43x zm+Pfpu9xk6ym9N(m0z#de7RBa{d(=!>&;(pRDHc!_w{D|mz!;0?{s{-)A{XA_t(3f z-|lvOyW9QkUhnsZv%Wu^^W)*{?~fP$c)alE(^Ws7ul@Oa^{=;w|BnLNhk)WgLFb~> z#FEq$h4Rdj31pDc`A4F4H)7=QqjQ5ZN5F#P9y!*Kk>1bK_JJujLZ796gZ zzQOV^P}z-JG@8doq=M0xPtvMtj>N*H2aeT?-Q&n~T*BEQ8pAecNrE$1uX2`?#z}<- zPwd$>r%ljIVPa;O&!o*D=%V4(GTCQS!b+o5zXi613sf8*EpBlZNf3}_nsVGv*1GP) z1dk6Nnx{I}zS|<1{Olz2e5GqICI&zAmg4aEANcU`v!3Y&LK6-x`0U;@*{s||p)~OY fTQi&7x;G9{EzL~r+z~P#EFY>gGVn1oF<1itCjz@v diff --git a/modules/loyalty/logo.png b/modules/loyalty/logo.png deleted file mode 100755 index 3d85cb07a354a5c9ee69373292ff5f14c0aae57c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1529 zcmV1IGA_jRxhR zpkM>ElwzT!ZnwMJcDvo3nd>=srtP$L%Px>O>DlefoclY!bMCq4oE1_^{GXRG(?cP| z#QP0z9R8vJZIk0TQ{GRixEK53cSh4R1mGNQdwtX6bZbrO$!invT_KB%@8A9iEXxMl z6dI6BjzUue##u->gd2^9ARWFVU_-~Yy@-iqcJY+Hi<@cgQndd3(xLO|L0XQ%*4s8Ul;$V;i5pNyt-pRxCjR8inH z9zRib4)`w)_0c)9qVxz9NJr^Ocg;;AAkaHx!Qu!o0rD_ki~zl3J-+8Pnh-ZmfRkWg*rw1D7>8d9 z}5Y?bg@1XLmEd-tx+$kID+3EjIDR{sfPue2dI&`x$I^(yOb zhq>@R7;{%+^r!vEbe+5sfBAQ2nVVX&%OeozeXsS>oMrdKt6HBx>f}4%mJom% znx*z$+Bw*xJ+LwzFw7WgTDD{4_~#hvIMTP^rQ?eUr%;T5HcNi!9s61jn2T1D@y$pc zdlPz9BP!z?p#|$8oV*gqyy_2zxd4^(*Ab^Ik|*9mRqJCg7q5&n24fXH=EYv@*jyir zgo7_c)<1*HUmu{NrUiO<2^pmlD+}JX+OBXUBsVJ!da#xvs3Ft-F(T`q1!FK)xde zxC&!~e~|Ip$V2wrA}>8-o=h0mxE!V+s0|Aupcz40dm5p})nF{IE0#>4BA{b|7M(}Q zbya~0VNV*S+9Etr9f}7O&Ida~#sd&~Kz*yVguz&hSxzN%pL3#V1Xd9xn`6ot8}ZfB`vgEi#o1ZJ2!q}$6?2@vHI$Q5M2GuS)N2+xI+>m@Jy zrdKNpxhS@^DpFcyEeJzlm3s`W-n8}eXy=~@m~l4>N-8IX_FE+zg}#^s%=usp#`5=r zQV8Tck1GB&$*tFL+K;m!H6t`2(Y($ zX+pZZhSzpn8978)m!~(SQks#P1-cKc{XW{%SQlQi7BV|P6R%Z##NeSxqwt$`7(RBC zI`oBP!`7o4{WC#1-H;nd9Z4gRI9%PZFj~F#ZhA?z-^vpa$2aUyLTcQRC?Tbe^wD3D z?!L^%`G?5`k^!%Al;4g?xREscxT|Gn^WyNMX2TMMmM(%;T{AW3c?9eF8`;R<@jrx!8HBath1 f=4T@CuK)u8R8qHTZ{_Hv00000NkvXXu0mjf@GjFs diff --git a/modules/loyalty/loyalty-program.php b/modules/loyalty/loyalty-program.php deleted file mode 100644 index 08ff17756..000000000 --- a/modules/loyalty/loyalty-program.php +++ /dev/null @@ -1,168 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/* SSL Management */ -$useSSL = true; - -require_once(dirname(__FILE__).'/../../config/config.inc.php'); -require_once(dirname(__FILE__).'/../../init.php'); - -include_once(dirname(__FILE__).'/LoyaltyModule.php'); -include_once(dirname(__FILE__).'/LoyaltyStateModule.php'); -include_once(dirname(__FILE__).'/loyalty.php'); - -Tools::displayFileAsDeprecated(); - -$context = Context::getContext(); -if (!$context->customer->isLogged()) - Tools::redirect('index.php?controller=authentication&back=modules/loyalty/loyalty-program.php'); - -$context->controller->addJqueryPlugin(array('dimensions', 'cluetip')); - -$customerPoints = (int)LoyaltyModule::getPointsByCustomer((int)$cookie->id_customer); - -/* transform point into voucher if needed */ -if (Tools::getValue('transform-points') == 'true' AND $customerPoints > 0) -{ - /* Generate a voucher code */ - $voucherCode = NULL; - do - $voucherCode = 'FID'.rand(1000, 100000); - while (CartRule::cartRuleExists($voucherCode)); - - /* Voucher creation and affectation to the customer */ - $cartRule = new CartRule(); - $cartRule->code = $voucherCode; - $cartRule->id_customer = (int)$context->customer->id; - $cartRule->id_currency = (int)$context->currency->id; - $cartRule->reduction_amount = LoyaltyModule::getVoucherValue((int)$customerPoints); - $cartRule->quantity = 1; - $cartRule->quantity_per_user = 1; - - /* If merchandise returns are allowed, the voucher musn't be usable before this max return date */ - $dateFrom = Db::getInstance()->getValue(' - SELECT UNIX_TIMESTAMP(date_add) n - FROM '._DB_PREFIX_.'loyalty - WHERE id_cart_rule = 0 AND id_customer = '.(int)$cookie->id_customer.' - ORDER BY date_add DESC'); - - if (Configuration::get('PS_ORDER_RETURN')) - $dateFrom += 60 * 60 * 24 * (int)Configuration::get('PS_ORDER_RETURN_NB_DAYS'); - - $cartRule->date_from = date('Y-m-d H:i:s', $dateFrom); - $cartRule->date_to = date('Y-m-d H:i:s', $dateFrom + 31536000); // + 1 year - - $cartRule->minimum_amount = (float)Configuration::get('PS_LOYALTY_MINIMAL'); - $cartRule->active = 1; - - $categories = Configuration::get('PS_LOYALTY_VOUCHER_CATEGORY'); - if ($categories != '' AND $categories != 0) - $categories = explode(',', Configuration::get('PS_LOYALTY_VOUCHER_CATEGORY')); - else - die (Tools::displayError()); - - $languages = Language::getLanguages(true); - $default_text = Configuration::get('PS_LOYALTY_VOUCHER_DETAILS', (int)Configuration::get('PS_LANG_DEFAULT')); - - foreach ($languages AS $language) - { - $text = Configuration::get('PS_LOYALTY_VOUCHER_DETAILS', (int)$language['id_lang']); - $cartRule->name[(int)$language['id_lang']] = $text ? strval($text) : strval($default_text); - } - - if (is_array($categories) AND sizeof($categories)) - $cartRule->add(true, false, $categories); - else - $cartRule->add(); - - /* Register order(s) which contributed to create this voucher */ - if (!LoyaltyModule::registerDiscount($cartRule)) - $cartRule->delete(); - - Tools::redirect('modules/loyalty/loyalty-program.php'); -} - -include(dirname(__FILE__).'/../../header.php'); - -$orders = LoyaltyModule::getAllByIdCustomer((int)($cookie->id_customer), (int)($cookie->id_lang)); -$displayorders = LoyaltyModule::getAllByIdCustomer((int)($cookie->id_customer), (int)($cookie->id_lang), false, true, ((int)(Tools::getValue('n')) > 0 ? (int)(Tools::getValue('n')) : 10), ((int)(Tools::getValue('p')) > 0 ? (int)(Tools::getValue('p')) : 1)); -$smarty->assign(array( - 'orders' => $orders, - 'displayorders' => $displayorders, - 'pagination_link' => __PS_BASE_URI__.'modules/loyalty/loyalty-program.php', - 'totalPoints' => (int)$customerPoints, - 'voucher' => LoyaltyModule::getVoucherValue($customerPoints, (int)$context->currency->id), - 'validation_id' => LoyaltyStateModule::getValidationId(), - 'transformation_allowed' => $customerPoints > 0, - 'page' => ((int)(Tools::getValue('p')) > 0 ? (int)(Tools::getValue('p')) : 1), - 'nbpagination' => ((int)(Tools::getValue('n') > 0) ? (int)(Tools::getValue('n')) : 10), - 'nArray' => array(10, 20, 50), - 'max_page' => floor(sizeof($orders) / ((int)(Tools::getValue('n') > 0) ? (int)(Tools::getValue('n')) : 10)) -)); - -/* Discounts */ -$nbDiscounts = 0; -$discounts = array(); -if ($ids_discount = LoyaltyModule::getDiscountByIdCustomer((int)$cookie->id_customer)) -{ - $nbDiscounts = count($ids_discount); - foreach ($ids_discount AS $key => $discount) - { - $discounts[$key] = new Discount((int)$discount['id_cart_rule'], (int)$cookie->id_lang); - $discounts[$key]->orders = LoyaltyModule::getOrdersByIdDiscount((int)$discount['id_cart_rule']); - } -} - -$allCategories = Category::getSimpleCategories((int)($cookie->id_lang)); -$voucherCategories = Configuration::get('PS_LOYALTY_VOUCHER_CATEGORY'); -if ($voucherCategories != '' AND $voucherCategories != 0) - $voucherCategories = explode(',', Configuration::get('PS_LOYALTY_VOUCHER_CATEGORY')); -else - die(Tools::displayError()); - -if (sizeof($voucherCategories) == sizeof($allCategories)) - $categoriesNames = null; -else -{ - $categoriesNames = array(); - foreach ($allCategories AS $k => $allCategory) - if (in_array($allCategory['id_category'], $voucherCategories)) - $categoriesNames[$allCategory['id_category']] = trim($allCategory['name']); - if (!empty($categoriesNames)) - $categoriesNames = Tools::truncate(implode(', ', $categoriesNames), 100).'.'; - else - $categoriesNames = null; -} -$smarty->assign(array( - 'nbDiscounts' => (int)$nbDiscounts, - 'discounts' => $discounts, - 'minimalLoyalty' => (float)Configuration::get('PS_LOYALTY_MINIMAL'), - 'categories' => $categoriesNames)); - -$loyalty = new Loyalty(); -echo $loyalty->display(dirname(__FILE__).'/loyalty.php', 'loyalty.tpl'); - -include(dirname(__FILE__).'/../../footer.php'); diff --git a/modules/loyalty/loyalty.gif b/modules/loyalty/loyalty.gif deleted file mode 100644 index 039f3fa77234f43857ac408692755924cf2520f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1016 zcmZ?wbhEHb6krfwc;3liSfaBnkin=_*Sy+rZ#08VqnTre^^qI~_dff}g$!2;8P1e4 zTq|d|R>2T3)BSoC!;MCUnNuWhv@qOhWr$oF&@k65ZgoiV#)zs_B~`1-?#+@&-yZXL zwnFxvgopE0-pyxd*yp}=llGfs44FqFpDxvTvO?tXO1|u4(Vtf^bnI@*Jsw+dJn8-_ z+rpCxuht3|pGthQUbysha@m=b@-wOJC*mv4ru850c)8K4>Rfu&xr{l-eV=Z2t~sA^ z{D97@ttPb>vL5WxslS-rc%h)-Qts6QTCaDSHeb&Fyj$$eF3Y#OEGC}sJbEJZ=K+bY zhxOha4t;+(^urOqPe(oHU7zyxnEi)i!QW0ed^sNY?s&@gla4=5IWE3EYssBiYi=!D zac}PDOUa)vr+vGW_4#ta=gUQ(ujG8clJog$-sh|NU#{kFdc6G0)uQiL3%*`0-~43x zm+Pfpu9xk6ym9N(m0z#de7RBa{d(=!>&;(pRDHc!_w{D|mz!;0?{s{-)A{XA_t(3f z-|lvOyW9QkUhnsZv%Wu^^W)*{?~fP$c)alE(^Ws7ul@Oa^{=;w|BnLNhk)WgLFb~> z#FEq$h4Rdj31pDc`A4F4H)7=QqjQ5ZN5F#P9y!*Kk>1bK_JJujLZ796gZ zzQOV^P}z-JG@8doq=M0xPtvMtj>N*H2aeT?-Q&n~T*BEQ8pAecNrE$1uX2`?#z}<- zPwd$>r%ljIVPa;O&!o*D=%V4(GTCQS!b+o5zXi613sf8*EpBlZNf3}_nsVGv*1GP) z1dk6Nnx{I}zS|<1{Olz2e5GqICI&zAmg4aEANcU`v!3Y&LK6-x`0U;@*{s||p)~OY fTQi&7x;G9{EzL~r+z~P#EFY>gGVn1oF<1itCjz@v diff --git a/modules/loyalty/loyalty.php b/modules/loyalty/loyalty.php deleted file mode 100644 index 79b74bc59..000000000 --- a/modules/loyalty/loyalty.php +++ /dev/null @@ -1,724 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -/* -* TODO: -* -* - Bad behaviour when an order is cancelled after an order return -* - We shouldn't use $cookie->id_currency in all situations -*/ - -class Loyalty extends Module -{ - protected $html = ''; - - public function __construct() - { - $this->name = 'loyalty'; - $this->tab = 'pricing_promotion'; - $this->version = '1.9'; - $this->author = 'PrestaShop'; - $this->need_instance = 0; - - $this->bootstrap = true; - parent::__construct(); - - $this->displayName = $this->l('Customer loyalty and rewards'); - $this->description = $this->l('Provide a loyalty program to your customers.'); - $this->confirmUninstall = $this->l('Are you sure you want to delete all loyalty points and customer history?'); - } - - private function instanceDefaultStates() - { - include_once(dirname(__FILE__).'/LoyaltyStateModule.php'); - - /* Recover default loyalty status save at module installation */ - $this->loyaltyStateDefault = new LoyaltyStateModule(LoyaltyStateModule::getDefaultId()); - $this->loyaltyStateValidation = new LoyaltyStateModule(LoyaltyStateModule::getValidationId()); - $this->loyaltyStateCancel = new LoyaltyStateModule(LoyaltyStateModule::getCancelId()); - $this->loyaltyStateConvert = new LoyaltyStateModule(LoyaltyStateModule::getConvertId()); - $this->loyaltyStateNoneAward = new LoyaltyStateModule(LoyaltyStateModule::getNoneAwardId()); - } - - public function install() - { - include_once(dirname(__FILE__).'/LoyaltyStateModule.php'); - - if (!parent::install() || !$this->installDB() || !$this->registerHook('extraRight') || !$this->registerHook('updateOrderStatus') - || !$this->registerHook('newOrder') || !$this->registerHook('adminCustomers') || !$this->registerHook('shoppingCart') - || !$this->registerHook('orderReturn') || !$this->registerHook('cancelProduct') || !$this->registerHook('customerAccount') - || !Configuration::updateValue('PS_LOYALTY_POINT_VALUE', '0.20') || !Configuration::updateValue('PS_LOYALTY_MINIMAL', 0) - || !Configuration::updateValue('PS_LOYALTY_POINT_RATE', '10') || !Configuration::updateValue('PS_LOYALTY_NONE_AWARD', '1')) - return false; - - $defaultTranslations = array('en' => 'Loyalty reward', 'fr' => 'Récompense fidélité'); - $conf = array((int)Configuration::get('PS_LANG_DEFAULT') => $this->l('Loyalty reward')); - foreach (Language::getLanguages() as $language) - if (isset($defaultTranslations[$language['iso_code']])) - $conf[(int)$language['id_lang']] = $defaultTranslations[$language['iso_code']]; - Configuration::updateValue('PS_LOYALTY_VOUCHER_DETAILS', $conf); - - $category_config = ''; - $categories = Category::getSimpleCategories((int)Configuration::get('PS_LANG_DEFAULT')); - foreach ($categories as $category) - $category_config .= (int)$category['id_category'].','; - $category_config = rtrim($category_config, ','); - Configuration::updateValue('PS_LOYALTY_VOUCHER_CATEGORY', $category_config); - - /* This hook is optional */ - $this->registerHook('displayMyAccountBlock'); - if (!LoyaltyStateModule::insertDefaultData()) - return false; - return true; - } - - public function installDB() - { - Db::getInstance()->execute(' - CREATE TABLE `'._DB_PREFIX_.'loyalty` ( - `id_loyalty` INT UNSIGNED NOT NULL AUTO_INCREMENT, - `id_loyalty_state` INT UNSIGNED NOT NULL DEFAULT 1, - `id_customer` INT UNSIGNED NOT NULL, - `id_order` INT UNSIGNED DEFAULT NULL, - `id_cart_rule` INT UNSIGNED DEFAULT NULL, - `points` INT NOT NULL DEFAULT 0, - `date_add` DATETIME NOT NULL, - `date_upd` DATETIME NOT NULL, - PRIMARY KEY (`id_loyalty`), - INDEX index_loyalty_loyalty_state (`id_loyalty_state`), - INDEX index_loyalty_order (`id_order`), - INDEX index_loyalty_discount (`id_cart_rule`), - INDEX index_loyalty_customer (`id_customer`) - ) DEFAULT CHARSET=utf8 ;'); - - Db::getInstance()->execute(' - CREATE TABLE `'._DB_PREFIX_.'loyalty_history` ( - `id_loyalty_history` INT UNSIGNED NOT NULL AUTO_INCREMENT, - `id_loyalty` INT UNSIGNED DEFAULT NULL, - `id_loyalty_state` INT UNSIGNED NOT NULL DEFAULT 1, - `points` INT NOT NULL DEFAULT 0, - `date_add` DATETIME NOT NULL, - PRIMARY KEY (`id_loyalty_history`), - INDEX `index_loyalty_history_loyalty` (`id_loyalty`), - INDEX `index_loyalty_history_loyalty_state` (`id_loyalty_state`) - ) DEFAULT CHARSET=utf8 ;'); - - Db::getInstance()->execute(' - CREATE TABLE `'._DB_PREFIX_.'loyalty_state` ( - `id_loyalty_state` INT UNSIGNED NOT NULL AUTO_INCREMENT, - `id_order_state` INT UNSIGNED DEFAULT NULL, - PRIMARY KEY (`id_loyalty_state`), - INDEX index_loyalty_state_order_state (`id_order_state`) - ) DEFAULT CHARSET=utf8 ;'); - - Db::getInstance()->execute(' - CREATE TABLE `'._DB_PREFIX_.'loyalty_state_lang` ( - `id_loyalty_state` INT UNSIGNED NOT NULL AUTO_INCREMENT, - `id_lang` INT UNSIGNED NOT NULL, - `name` varchar(64) NOT NULL, - UNIQUE KEY `index_unique_loyalty_state_lang` (`id_loyalty_state`,`id_lang`) - ) DEFAULT CHARSET=utf8 ;'); - - return true; - } - - public function uninstall() - { - if (!parent::uninstall() || !$this->uninstallDB() || !Configuration::deleteByName('PS_LOYALTY_POINT_VALUE') || !Configuration::deleteByName('PS_LOYALTY_POINT_RATE') - || !Configuration::deleteByName('PS_LOYALTY_NONE_AWARD') || !Configuration::deleteByName('PS_LOYALTY_MINIMAL') || !Configuration::deleteByName('PS_LOYALTY_VOUCHER_CATEGORY') - || !Configuration::deleteByName('PS_LOYALTY_VOUCHER_DETAILS')) - return false; - return true; - } - - public function uninstallDB() - { - Db::getInstance()->execute('DROP TABLE `'._DB_PREFIX_.'loyalty`;'); - Db::getInstance()->execute('DROP TABLE `'._DB_PREFIX_.'loyalty_state`;'); - Db::getInstance()->execute('DROP TABLE `'._DB_PREFIX_.'loyalty_state_lang`;'); - Db::getInstance()->execute('DROP TABLE `'._DB_PREFIX_.'loyalty_history`;'); - - return true; - } - - private function _postProcess() - { - if (Tools::isSubmit('submitLoyalty')) - { - $id_lang_default = (int)Configuration::get('PS_LANG_DEFAULT'); - $languages = Language::getLanguages(); - - $this->_errors = array(); - if (!is_array(Tools::getValue('categoryBox')) || !count(Tools::getValue('categoryBox'))) - $this->_errors[] = $this->l('You must choose at least one category for voucher\'s action'); - if (!count($this->_errors)) - { - Configuration::updateValue('PS_LOYALTY_VOUCHER_CATEGORY', $this->voucherCategories(Tools::getValue('categoryBox'))); - Configuration::updateValue('PS_LOYALTY_POINT_VALUE', (float)(Tools::getValue('point_value'))); - Configuration::updateValue('PS_LOYALTY_POINT_RATE', (float)(Tools::getValue('point_rate'))); - Configuration::updateValue('PS_LOYALTY_NONE_AWARD', (int)(Tools::getValue('PS_LOYALTY_NONE_AWARD'))); - Configuration::updateValue('PS_LOYALTY_MINIMAL', (float)(Tools::getValue('minimal'))); - - $this->loyaltyStateValidation->id_order_state = (int)(Tools::getValue('id_order_state_validation')); - $this->loyaltyStateCancel->id_order_state = (int)(Tools::getValue('id_order_state_cancel')); - - $arrayVoucherDetails = array(); - foreach ($languages as $language) - { - $arrayVoucherDetails[(int)($language['id_lang'])] = Tools::getValue('voucher_details_'.(int)($language['id_lang'])); - $this->loyaltyStateDefault->name[(int)($language['id_lang'])] = Tools::getValue('default_loyalty_state_'.(int)($language['id_lang'])); - $this->loyaltyStateValidation->name[(int)($language['id_lang'])] = Tools::getValue('validation_loyalty_state_'.(int)($language['id_lang'])); - $this->loyaltyStateCancel->name[(int)($language['id_lang'])] = Tools::getValue('cancel_loyalty_state_'.(int)($language['id_lang'])); - $this->loyaltyStateConvert->name[(int)($language['id_lang'])] = Tools::getValue('convert_loyalty_state_'.(int)($language['id_lang'])); - $this->loyaltyStateNoneAward->name[(int)($language['id_lang'])] = Tools::getValue('none_award_loyalty_state_'.(int)($language['id_lang'])); - } - if (empty($arrayVoucherDetails[$id_lang_default])) - $arrayVoucherDetails[$id_lang_default] = ' '; - Configuration::updateValue('PS_LOYALTY_VOUCHER_DETAILS', $arrayVoucherDetails); - - if (empty($this->loyaltyStateDefault->name[$id_lang_default])) - $this->loyaltyStateDefault->name[$id_lang_default] = ' '; - $this->loyaltyStateDefault->save(); - - if (empty($this->loyaltyStateValidation->name[$id_lang_default])) - $this->loyaltyStateValidation->name[$id_lang_default] = ' '; - $this->loyaltyStateValidation->save(); - - if (empty($this->loyaltyStateCancel->name[$id_lang_default])) - $this->loyaltyStateCancel->name[$id_lang_default] = ' '; - $this->loyaltyStateCancel->save(); - - if (empty($this->loyaltyStateConvert->name[$id_lang_default])) - $this->loyaltyStateConvert->name[$id_lang_default] = ' '; - $this->loyaltyStateConvert->save(); - - if (empty($this->loyaltyStateNoneAward->name[$id_lang_default])) - $this->loyaltyStateNoneAward->name[$id_lang_default] = ' '; - $this->loyaltyStateNoneAward->save(); - - $this->html .= $this->displayConfirmation($this->l('Settings updated.')); - } - else - { - $errors = ''; - foreach ($this->_errors as $error) - $errors .= $error.'
    '; - $this->html .= $this->displayError($errors); - } - } - } - - private function voucherCategories($categories) - { - $cat = ''; - if ($categories && is_array($categories)) - foreach ($categories as $category) - $cat .= $category.','; - return rtrim($cat, ','); - } - - public function getContent() - { - $this->instanceDefaultStates(); - $this->_postProcess(); - - $this->html .= $this->renderForm(); - - return $this->html; - } - - /* Hook display on product detail */ - public function hookExtraRight($params) - { - include_once(dirname(__FILE__).'/LoyaltyModule.php'); - - $product = new Product((int)Tools::getValue('id_product')); - if (Validate::isLoadedObject($product)) - { - if (Validate::isLoadedObject($params['cart'])) - { - $pointsBefore = (int)LoyaltyModule::getCartNbPoints($params['cart']); - $pointsAfter = (int)LoyaltyModule::getCartNbPoints($params['cart'], $product); - $points = (int)($pointsAfter - $pointsBefore); - } - else - { - if (!(int)Configuration::get('PS_LOYALTY_NONE_AWARD') && Product::isDiscounted((int)$product->id)) - { - $points = 0; - $this->smarty->assign('no_pts_discounted', 1); - } - else - $points = (int)LoyaltyModule::getNbPointsByPrice( - $product->getPrice( - Product::getTaxCalculationMethod() == PS_TAX_EXC ? false : true, - (int)$product->getIdProductAttributeMostExpensive() - ) - ); - - $pointsAfter = $points; - $pointsBefore = 0; - } - $this->smarty->assign(array( - 'points' => (int)$points, - 'total_points' => (int)$pointsAfter, - 'point_rate' => Configuration::get('PS_LOYALTY_POINT_RATE'), - 'point_value' => Configuration::get('PS_LOYALTY_POINT_VALUE'), - 'points_in_cart' => (int)$pointsBefore, - 'voucher' => LoyaltyModule::getVoucherValue((int)$pointsAfter), - 'none_award' => Configuration::get('PS_LOYALTY_NONE_AWARD'))); - - return $this->display(__FILE__, 'product.tpl'); - } - - return false; - } - - /* Hook display on customer account page */ - public function hookCustomerAccount($params) - { - return $this->display(__FILE__, 'my-account.tpl'); - } - - public function hookDisplayMyAccountBlock($params) - { - return $this->hookCustomerAccount($params); - } - - /* Catch product returns and substract loyalty points */ - public function hookOrderReturn($params) - { - include_once(dirname(__FILE__).'/LoyaltyStateModule.php'); - include_once(dirname(__FILE__).'/LoyaltyModule.php'); - - $total_price = 0; - $taxesEnabled = Product::getTaxCalculationMethod(); - $details = OrderReturn::getOrdersReturnDetail((int)$params['orderReturn']->id); - foreach ($details as $detail) - { - if ($taxesEnabled == PS_TAX_EXC) - $total_price += Db::getInstance()->getValue(' - SELECT ROUND(total_price_tax_excl, 2) - FROM '._DB_PREFIX_.'order_detail od - WHERE id_order_detail = '.(int)$detail['id_order_detail']); - else - $total_price += Db::getInstance()->getValue(' - SELECT ROUND(total_price_tax_incl, 2) - FROM '._DB_PREFIX_.'order_detail od - WHERE id_order_detail = '.(int)$detail['id_order_detail']); - } - - $loyalty_new = new LoyaltyModule(); - $loyalty_new->points = (int)(-1 * LoyaltyModule::getNbPointsByPrice($total_price)); - $loyalty_new->id_loyalty_state = (int)LoyaltyStateModule::getCancelId(); - $loyalty_new->id_order = (int)$params['orderReturn']->id_order; - $loyalty_new->id_customer = (int)$params['orderReturn']->id_customer; - $loyalty_new->save(); - } - - /* Hook display on shopping cart summary */ - public function hookShoppingCart($params) - { - include_once(dirname(__FILE__).'/LoyaltyModule.php'); - - if (Validate::isLoadedObject($params['cart'])) - { - $points = LoyaltyModule::getCartNbPoints($params['cart']); - $this->smarty->assign(array( - 'points' => (int)$points, - 'voucher' => LoyaltyModule::getVoucherValue((int)$points), - 'guest_checkout' => (int)Configuration::get('PS_GUEST_CHECKOUT_ENABLED') - )); - } - else - $this->smarty->assign(array('points' => 0)); - - return $this->display(__FILE__, 'shopping-cart.tpl'); - } - - /* Hook called when a new order is created */ - public function hookNewOrder($params) - { - include_once(dirname(__FILE__).'/LoyaltyStateModule.php'); - include_once(dirname(__FILE__).'/LoyaltyModule.php'); - - if (!Validate::isLoadedObject($params['customer']) || !Validate::isLoadedObject($params['order'])) - die($this->l('Missing parameters')); - $loyalty = new LoyaltyModule(); - $loyalty->id_customer = (int)$params['customer']->id; - $loyalty->id_order = (int)$params['order']->id; - $loyalty->points = LoyaltyModule::getOrderNbPoints($params['order']); - if (!Configuration::get('PS_LOYALTY_NONE_AWARD') && (int)$loyalty->points == 0) - $loyalty->id_loyalty_state = LoyaltyStateModule::getNoneAwardId(); - else - $loyalty->id_loyalty_state = LoyaltyStateModule::getDefaultId(); - return $loyalty->save(); - } - - /* Hook called when an order change its status */ - public function hookUpdateOrderStatus($params) - { - include_once(dirname(__FILE__).'/LoyaltyStateModule.php'); - include_once(dirname(__FILE__).'/LoyaltyModule.php'); - - if (!Validate::isLoadedObject($params['newOrderStatus'])) - die($this->l('Missing parameters')); - $new_order = $params['newOrderStatus']; - $order = new Order((int)$params['id_order']); - if ($order && !Validate::isLoadedObject($order)) - die($this->l('Incorrect Order object.')); - $this->instanceDefaultStates(); - - if ($new_order->id == $this->loyaltyStateValidation->id_order_state || $new_order->id == $this->loyaltyStateCancel->id_order_state) - { - if (!Validate::isLoadedObject($loyalty = new LoyaltyModule(LoyaltyModule::getByOrderId($order->id)))) - return false; - if ((int)Configuration::get('PS_LOYALTY_NONE_AWARD') && $loyalty->id_loyalty_state == LoyaltyStateModule::getNoneAwardId()) - return true; - - if ($new_order->id == $this->loyaltyStateValidation->id_order_state) - { - $loyalty->id_loyalty_state = LoyaltyStateModule::getValidationId(); - if ((int)$loyalty->points < 0) - $loyalty->points = abs((int)$loyalty->points); - } - elseif ($new_order->id == $this->loyaltyStateCancel->id_order_state) - { - $loyalty->id_loyalty_state = LoyaltyStateModule::getCancelId(); - $loyalty->points = 0; - } - return $loyalty->save(); - } - return true; - } - - /* Hook display in tab AdminCustomers on BO */ - public function hookAdminCustomers($params) - { - include_once(dirname(__FILE__).'/LoyaltyModule.php'); - include_once(dirname(__FILE__).'/LoyaltyStateModule.php'); - - $customer = new Customer((int)$params['id_customer']); - if ($customer && !Validate::isLoadedObject($customer)) - die($this->l('Incorrect Customer object.')); - - $details = LoyaltyModule::getAllByIdCustomer((int)$params['id_customer'], (int)$params['cookie']->id_lang); - $points = (int)LoyaltyModule::getPointsByCustomer((int)$params['id_customer']); - - $html = ' -

    '.sprintf($this->l('Loyalty points (%d points)'), $points).'

    '; - - if (!isset($points) || count($details) == 0) - return $html.' '.$this->l('This customer has no points'); - - $html .= ' - - - - - - - - '; - foreach ($details as $key => $loyalty) - { - $url = 'index.php?tab=AdminOrders&id_order='.$loyalty['id'].'&vieworder&token='.Tools::getAdminToken('AdminOrders'.(int)Tab::getIdFromClassName('AdminOrders').(int)$params['cookie']->id_employee); - $html .= ' - - - - - - - '; - } - $html .= ' - - - - - - -
    '.$this->l('Order').''.$this->l('Date').''.$this->l('Total (without shipping)').''.$this->l('Points').''.$this->l('Points Status').'
    '.((int)$loyalty['id'] > 0 ? ''.sprintf($this->l('#%d'), $loyalty['id']).'' : '--').''.Tools::displayDate($loyalty['date']).''.((int)$loyalty['id'] > 0 ? $loyalty['total_without_shipping'] : '--').''.(int)$loyalty['points'].''.$loyalty['state'].'
     '.$this->l('Total points available:').''.$points.''.$this->l('Voucher value:').' '.Tools::displayPrice( - LoyaltyModule::getVoucherValue((int)$points, (int)Configuration::get('PS_CURRENCY_DEFAULT')), - new Currency((int)Configuration::get('PS_CURRENCY_DEFAULT')) - ).'
    '; - - return $html; - } - - public function hookCancelProduct($params) - { - include_once(dirname(__FILE__).'/LoyaltyStateModule.php'); - include_once(dirname(__FILE__).'/LoyaltyModule.php'); - - if (!Validate::isLoadedObject($params['order']) || !Validate::isLoadedObject($order_detail = new OrderDetail((int)$params['id_order_detail'])) - || !Validate::isLoadedObject($loyalty = new LoyaltyModule((int)LoyaltyModule::getByOrderId((int)$params['order']->id)))) - return false; - - $taxesEnabled = Product::getTaxCalculationMethod(); - $loyalty_new = new LoyaltyModule(); - if ($taxesEnabled == PS_TAX_EXC) - $loyalty_new->points = -1 * LoyaltyModule::getNbPointsByPrice(number_format($order_detail->total_price_tax_excl, 2, '.', '')); - else - $loyalty_new->points = -1 * LoyaltyModule::getNbPointsByPrice(number_format($order_detail->total_price_tax_incl, 2, '.', '')); - $loyalty_new->id_loyalty_state = (int)LoyaltyStateModule::getCancelId(); - $loyalty_new->id_order = (int)$params['order']->id; - $loyalty_new->id_customer = (int)$loyalty->id_customer; - $loyalty_new->add(); - - return; - } - - public function getL($key) - { - $translations = array( - 'Awaiting validation' => $this->l('Awaiting validation'), - 'Available' => $this->l('Available'), - 'Cancelled' => $this->l('Cancelled'), - 'Already converted' => $this->l('Already converted'), - 'Unavailable on discounts' => $this->l('Unavailable on discounts'), - 'Not available on discounts.' => $this->l('Not available on discounts.')); - - return (array_key_exists($key, $translations)) ? $translations[$key] : $key; - } - - public function renderForm() - { - $order_states = OrderState::getOrderStates($this->context->language->id); - $currency = new Currency((int)(Configuration::get('PS_CURRENCY_DEFAULT'))); - - $root_category = Category::getRootCategory(); - $root_category = array('id_category' => $root_category->id, 'name' => $root_category->name); - - if (Tools::getValue('categoryBox')) - $selected_categories = Tools::getValue('categoryBox'); - else - $selected_categories = explode(',', Configuration::get('PS_LOYALTY_VOUCHER_CATEGORY')); - - $fields_form_1 = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Settings'), - 'icon' => 'icon-cogs' - ), - 'input' => array( - array( - 'type' => 'text', - 'label' => $this->l('Ratio'), - 'name' => 'point_rate', - 'prefix' => $currency->sign, - 'suffix' => $this->l('= 1 reward point.'), - ), - array( - 'type' => 'text', - 'label' => $this->l('1 point ='), - 'name' => 'point_value', - 'prefix' => $currency->sign, - 'suffix' => $this->l('for the discount.'), - ), - array( - 'type' => 'text', - 'label' => $this->l('Voucher details'), - 'name' => 'voucher_details', - 'lang' => true, - ), - array( - 'type' => 'text', - 'label' => $this->l('Minimum amount in which the voucher can be used'), - 'name' => 'minimal', - 'prefix' => $currency->sign, - 'class' => 'fixed-width-sm', - ), - array( - 'type' => 'select', - 'label' => $this->l('Points are awarded when the order is'), - 'name' => 'id_order_state_validation', - 'options' => array( - 'query' => $order_states, - 'id' => 'id_order_state', - 'name' => 'name', - ) - ), - array( - 'type' => 'select', - 'label' => $this->l('Points are cancelled when the order is'), - 'name' => 'id_order_state_cancel', - 'options' => array( - 'query' => $order_states, - 'id' => 'id_order_state', - 'name' => 'name', - ) - ), - array( - 'type' => 'switch', - 'label' => $this->l('Give points on discounted products'), - 'name' => 'PS_LOYALTY_NONE_AWARD', - 'values' => array( - array( - 'id' => 'active_on', - 'value' => 1, - 'label' => $this->l('Enabled') - ), - array( - 'id' => 'active_off', - 'value' => 0, - 'label' => $this->l('Disabled') - ) - ) - ), - array( - 'type' => 'categories', - 'label' => $this->l('Vouchers created by the loyalty system can be used in the following categories :'), - 'name' => 'categoryBox', - 'desc' => $this->l('Mark the box(es) of categories in which loyalty vouchers are usable.'), - 'tree' => array( - 'use_search' => false, - 'id' => 'categoryBox', - 'use_checkbox' => true, - 'selected_categories' => $selected_categories, - ), - //retro compat 1.5 for category tree - 'values' => array( - 'trads' => array( - 'Root' => $root_category, - 'selected' => $this->l('Selected'), - 'Collapse All' => $this->l('Collapse All'), - 'Expand All' => $this->l('Expand All'), - 'Check All' => $this->l('Check All'), - 'Uncheck All' => $this->l('Uncheck All') - ), - 'selected_cat' => $selected_categories, - 'input_name' => 'categoryBox', - 'use_radio' => false, - 'use_search' => false, - 'disabled_categories' => array(), - 'top_category' => Category::getTopCategory(), - 'use_context' => true, - ) - ), - ), - 'submit' => array( - 'title' => $this->l('Save'), - 'class' => 'btn btn-primary') - ), - ); - - - - - - $fields_form_2 = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Loyalty points progression'), - 'icon' => 'icon-cogs' - ), - 'input' => array( - array( - 'type' => 'text', - 'label' => $this->l('Initial'), - 'name' => 'default_loyalty_state', - 'lang' => true, - ), - array( - 'type' => 'text', - 'label' => $this->l('Unavailable'), - 'name' => 'none_award_loyalty_state', - 'lang' => true, - ), - array( - 'type' => 'text', - 'label' => $this->l('Converted'), - 'name' => 'convert_loyalty_state', - 'lang' => true, - ), - array( - 'type' => 'text', - 'label' => $this->l('Validation'), - 'name' => 'validation_loyalty_state', - 'lang' => true, - ), - array( - 'type' => 'text', - 'label' => $this->l('Cancelled'), - 'name' => 'cancel_loyalty_state', - 'lang' => true, - ), - ), - 'submit' => array( - 'title' => $this->l('Save'), - 'class' => 'btn btn-primary') - ), - ); - - $helper = new HelperForm(); - $helper->show_toolbar = false; - $helper->table = $this->table; - $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); - $helper->default_form_language = $lang->id; - $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; - $helper->identifier = $this->identifier; - $helper->submit_action = 'submitLoyalty'; - $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->tpl_vars = array( - 'fields_value' => $this->getConfigFieldsValues(), - 'languages' => $this->context->controller->getLanguages(), - 'id_language' => $this->context->language->id - ); - return $helper->generateForm(array($fields_form_1, $fields_form_2)); - } - - public function getConfigFieldsValues() - { - $fields_values = array( - 'point_rate' => Tools::getValue('PS_LOYALTY_POINT_RATE', Configuration::get('PS_LOYALTY_POINT_RATE')), - 'point_value' => Tools::getValue('PS_LOYALTY_POINT_VALUE', Configuration::get('PS_LOYALTY_POINT_VALUE')), - 'PS_LOYALTY_NONE_AWARD' => Tools::getValue('PS_LOYALTY_NONE_AWARD', Configuration::get('PS_LOYALTY_NONE_AWARD')), - 'minimal' => Tools::getValue('PS_LOYALTY_MINIMAL', Configuration::get('PS_LOYALTY_MINIMAL')), - 'id_order_state_validation' => Tools::getValue('id_order_state_validation', $this->loyaltyStateValidation->id_order_state), - 'id_order_state_cancel' => Tools::getValue('id_order_state_cancel', $this->loyaltyStateCancel->id_order_state), - - ); - - $languages = Language::getLanguages(false); - - foreach ($languages as $lang) - { - $fields_values['voucher_details'][$lang['id_lang']] = Tools::getValue('voucher_details_'.(int)$lang['id_lang'], Configuration::get('PS_LOYALTY_VOUCHER_DETAILS', (int)$lang['id_lang'])); - $fields_values['default_loyalty_state'][$lang['id_lang']] = Tools::getValue('default_loyalty_state_'.(int)$lang['id_lang'], $this->loyaltyStateDefault->name[(int)($lang['id_lang'])]); - $fields_values['validation_loyalty_state'][$lang['id_lang']] = Tools::getValue('validation_loyalty_state_'.(int)$lang['id_lang'], $this->loyaltyStateValidation->name[(int)($lang['id_lang'])]); - $fields_values['cancel_loyalty_state'][$lang['id_lang']] = Tools::getValue('cancel_loyalty_state_'.(int)$lang['id_lang'], $this->loyaltyStateCancel->name[(int)($lang['id_lang'])]); - $fields_values['convert_loyalty_state'][$lang['id_lang']] = Tools::getValue('convert_loyalty_state_'.(int)$lang['id_lang'], $this->loyaltyStateConvert->name[(int)($lang['id_lang'])]); - $fields_values['none_award_loyalty_state'][$lang['id_lang']] = Tools::getValue('none_award_loyalty_state_'.(int)$lang['id_lang'], $this->loyaltyStateNoneAward->name[(int)($lang['id_lang'])]); - } - return $fields_values; - } -} diff --git a/modules/loyalty/translations/index.php b/modules/loyalty/translations/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/loyalty/translations/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/loyalty/views/index.php b/modules/loyalty/views/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/loyalty/views/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/loyalty/views/templates/front/index.php b/modules/loyalty/views/templates/front/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/loyalty/views/templates/front/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/loyalty/views/templates/front/loyalty.tpl b/modules/loyalty/views/templates/front/loyalty.tpl deleted file mode 100644 index 3d13b0952..000000000 --- a/modules/loyalty/views/templates/front/loyalty.tpl +++ /dev/null @@ -1,215 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -{capture name=path}
    {l s='My account' mod='loyalty'}{$navigationPipe}{l s='My loyalty points' mod='loyalty'}{/capture} - -{include file="$tpl_dir./breadcrumb.tpl"} - -

    {l s='My loyalty points' mod='loyalty'}

    - -{if $orders} -
    - {if $orders && count($orders)} - - - - - - - - - - - - - - - - - - {foreach from=$displayorders item='order'} - - - - - - - {/foreach} - -
    {l s='Order' mod='loyalty'}{l s='Date' mod='loyalty'}{l s='Points' mod='loyalty'}{l s='Points Status' mod='loyalty'}
    {l s='Total points available:' mod='loyalty'}{$totalPoints|intval} 
    {dateFormat date=$order.date full=1}{$order.points|intval}{$order.state|escape:'html':'UTF-8'}
    - - {else} -

    {l s='You have not placed any orders.'}

    - {/if} -
    - - -
    {l s='Vouchers generated here are usable in the following categories : ' mod='loyalty'} -{if $categories}{$categories}{else}{l s='All' mod='loyalty'}{/if} - -{if $transformation_allowed} -

    - {l s='Transform my points into a voucher of' mod='loyalty'} {convertPrice price=$voucher}. -

    -{/if} - -
    -
    -
    - -

    {l s='My vouchers from loyalty points' mod='loyalty'}

    - -{if $nbDiscounts} -
    - - - - - - - - - - - - - - {foreach from=$discounts item=discount name=myLoop} - - - - - - - - - - {/foreach} - -
    {l s='Created' mod='loyalty'}{l s='Value' mod='loyalty'}{l s='Code' mod='loyalty'}{l s='Valid from' mod='loyalty'}{l s='Valid until' mod='loyalty'}{l s='Status' mod='loyalty'}{l s='Details' mod='loyalty'}
    {dateFormat date=$discount->date_add}{if $discount->reduction_percent > 0} - {$discount->reduction_percent}% - {elseif $discount->reduction_amount} - {displayPrice price=$discount->reduction_amount currency=$discount->reduction_currency} - {else} - {l s='Free shipping' mod='loyalty'} - {/if}{$discount->code}{dateFormat date=$discount->date_from}{dateFormat date=$discount->date_to}{if $discount->quantity > 0}{l s='To use' mod='loyalty'}{else}{l s='Used' mod='loyalty'}{/if} - {l s='more...' mod='loyalty'}
    - -
    - -{if $minimalLoyalty > 0}

    {l s='The minimum order amount in order to use these vouchers is:'} {convertPrice price=$minimalLoyalty}

    {/if} - - -{else} -

    {l s='No vouchers yet.' mod='loyalty'}

    -{/if} -{else} -

    {l s='No reward points yet.' mod='loyalty'}

    -{/if} - - diff --git a/modules/loyalty/views/templates/hook/index.php b/modules/loyalty/views/templates/hook/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/loyalty/views/templates/hook/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/loyalty/views/templates/hook/my-account.tpl b/modules/loyalty/views/templates/hook/my-account.tpl deleted file mode 100644 index d0a737788..000000000 --- a/modules/loyalty/views/templates/hook/my-account.tpl +++ /dev/null @@ -1,32 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - -
  • - - {l s='My loyalty points' mod='loyalty'} {l s='My loyalty points' mod='loyalty'} - -
  • - \ No newline at end of file diff --git a/modules/loyalty/views/templates/hook/product.tpl b/modules/loyalty/views/templates/hook/product.tpl deleted file mode 100644 index 36d6c55ac..000000000 --- a/modules/loyalty/views/templates/hook/product.tpl +++ /dev/null @@ -1,84 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -

    - {if $points} - {l s='By buying this product you can collect up to' mod='loyalty'} {$points} - {if $points > 1}{l s='loyalty points' mod='loyalty'}{else}{l s='loyalty point' mod='loyalty'}{/if}. - {l s='Your cart will total' mod='loyalty'} {$total_points} - {if $total_points > 1}{l s='points' mod='loyalty'}{else}{l s='point' mod='loyalty'}{/if} {l s='that can be converted into a voucher of' mod='loyalty'} - {convertPrice price=$voucher}. - {else} - {if isset($no_pts_discounted) && $no_pts_discounted == 1} - {l s='No reward points for this product because there\'s already a discount.' mod='loyalty'} - {else} - {l s='No reward points for this product.' mod='loyalty'} - {/if} - {/if} -

    -
    \ No newline at end of file diff --git a/modules/loyalty/views/templates/hook/shopping-cart.tpl b/modules/loyalty/views/templates/hook/shopping-cart.tpl deleted file mode 100644 index 7e2eb6377..000000000 --- a/modules/loyalty/views/templates/hook/shopping-cart.tpl +++ /dev/null @@ -1,38 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - -

    - {l s='loyalty' mod='loyalty'} - {if $points > 0} - {l s='By checking out this shopping cart you can collect up to' mod='loyalty'} - {if $points > 1}{l s='%d loyalty points' sprintf=$points mod='loyalty'}{else}{l s='%d loyalty point' sprintf=$points mod='loyalty'}{/if} - {l s='that can be converted into a voucher of' mod='loyalty'} {convertPrice price=$voucher}{if isset($guest_checkout) && $guest_checkout}*{/if}.
    - {if isset($guest_checkout) && $guest_checkout}* {l s='Not available for Instant checkout order' mod='loyalty'}{/if} - {else} - {l s='Add some products to your shopping cart to collect some loyalty points.' mod='loyalty'} - {/if} -

    - \ No newline at end of file diff --git a/modules/loyalty/views/templates/index.php b/modules/loyalty/views/templates/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/loyalty/views/templates/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/mailalerts/MailAlert.php b/modules/mailalerts/MailAlert.php deleted file mode 100644 index 9940f2ac9..000000000 --- a/modules/mailalerts/MailAlert.php +++ /dev/null @@ -1,287 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -class MailAlert extends ObjectModel -{ - public $id_customer; - - public $customer_email; - - public $id_product; - - public $id_product_attribute; - - public $id_shop; - - public $id_lang; - - /** - * @see ObjectModel::$definition - */ - public static $definition = array( - 'table' => 'mailalert_customer_oos', - 'primary' => 'id_customer', - 'fields' => array( - 'id_customer' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true), - 'customer_email' => array('type' => self::TYPE_STRING, 'validate' => 'isEmail', 'required' => true), - 'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true), - 'id_product_attribute' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true), - 'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true), - 'id_lang' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true) - ), - ); - - public static function customerHasNotification($id_customer, $id_product, $id_product_attribute, $id_shop = null, $id_lang = null, $guest_email = '') - { - if ($id_shop == null) - $id_shop = Context::getContext()->shop->id; - - if ($id_lang == null) - $id_lang = Context::getContext()->language->id; - - $customer = new Customer($id_customer); - $customer_email = $customer->email; - $guest_email = pSQL($guest_email); - - $id_customer = (int)$id_customer; - $customer_email = pSQL($customer_email); - $where = $id_customer == 0 ? "customer_email = '$guest_email'" : "(id_customer=$id_customer OR customer_email='$customer_email')"; - $sql = ' - SELECT * - FROM `'._DB_PREFIX_.self::$definition['table'].'` - WHERE '.$where.' - AND `id_product` = '.(int)$id_product.' - AND `id_product_attribute` = '.(int)$id_product_attribute.' - AND `id_shop` = '.(int)$id_shop; - - return count(Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql)); - } - - public static function deleteAlert($id_customer, $customer_email, $id_product, $id_product_attribute, $id_shop) - { - $sql = ' - DELETE FROM `'._DB_PREFIX_.self::$definition['table'].'` - WHERE '.(($id_customer > 0) ? '(`customer_email` = \''.pSQL($customer_email).'\' OR `id_customer` = '.(int)$id_customer.')' : - '`customer_email` = \''.pSQL($customer_email).'\''). - ' AND `id_product` = '.(int)$id_product.' - AND `id_product_attribute` = '.(int)$id_product_attribute.' - AND `id_shop` = '.(int)$id_shop; - - return Db::getInstance()->execute($sql); - } - - /* - * Get objects that will be viewed on "My alerts" page - */ - public static function getMailAlerts($id_customer, $id_lang, Shop $shop = null) - { - if (!Validate::isUnsignedId($id_customer) || !Validate::isUnsignedId($id_lang)) - die (Tools::displayError()); - - if (!$shop) - $shop = Context::getContext()->shop; - - $customer = new Customer($id_customer); - $products = MailAlert::getProducts($customer, $id_lang); - $products_number = count($products); - - if (empty($products) === true || !$products_number) - return array(); - - for ($i = 0; $i < $products_number; ++$i) - { - $obj = new Product((int)$products[$i]['id_product'], false, (int)$id_lang); - if (!Validate::isLoadedObject($obj)) - continue; - - if (isset($products[$i]['id_product_attribute']) && - Validate::isUnsignedInt($products[$i]['id_product_attribute'])) - { - $attributes = self::getProductAttributeCombination($products[$i]['id_product_attribute'], $id_lang); - $products[$i]['attributes_small'] = ''; - - if ($attributes) - { - foreach ($attributes as $k => $row) - $products[$i]['attributes_small'] .= $row['attribute_name'].', '; - } - - $products[$i]['attributes_small'] = rtrim($products[$i]['attributes_small'], ', '); - $products[$i]['id_shop'] = $shop->id; - - /* Get cover */ - $attrgrps = $obj->getAttributesGroups((int)$id_lang); - foreach ($attrgrps as $attrgrp) - { - if ($attrgrp['id_product_attribute'] == (int)$products[$i]['id_product_attribute'] - && $images = Product::_getAttributeImageAssociations((int)$attrgrp['id_product_attribute'])) - { - $products[$i]['cover'] = $obj->id.'-'.array_pop($images); - break; - } - } - } - - if (!isset($products[$i]['cover']) || !$products[$i]['cover']) - { - $images = $obj->getImages((int)$id_lang); - foreach ($images as $k => $image) - { - if ($image['cover']) - { - $products[$i]['cover'] = $obj->id.'-'.$image['id_image']; - break; - } - } - } - - if (!isset($products[$i]['cover'])) - $products[$i]['cover'] = Language::getIsoById($id_lang).'-default'; - - $products[$i]['link'] = $obj->getLink(); - $products[$i]['link_rewrite'] = $obj->link_rewrite; - } - - return ($products); - } - - public static function sendCustomerAlert($id_product, $id_product_attribute) - { - $link = new Link(); - $context = Context::getContext()->cloneContext(); - $customers = self::getCustomers($id_product, $id_product_attribute); - - foreach ($customers as $customer) - { - $id_shop = (int)$customer['id_shop']; - $id_lang = (int)$customer['id_lang']; - $context->shop->id = $id_shop; - $context->language->id = $id_lang; - - $product = new Product((int)$id_product, false, $id_lang, $id_shop); - $product_link = $link->getProductLink($product, $product->link_rewrite, null, null, $id_lang, $id_shop); - $templateVars = array( - '{product}' => (is_array($product->name) ? $product->name[$id_lang] : $product->name), - '{product_link}' => $product_link - ); - - if ($customer['id_customer']) - { - $customer = new Customer((int)$customer['id_customer']); - $customer_email = $customer->email; - $customer_id = (int)$customer->id; - } - else - { - $customer_id = 0; - $customer_email = $customer['customer_email']; - } - - $iso = Language::getIsoById($id_lang); - - if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/customer_qty.txt') && - file_exists(dirname(__FILE__).'/mails/'.$iso.'/customer_qty.html')) - Mail::Send( - $id_lang, - 'customer_qty', - Mail::l('Product available', $id_lang), - $templateVars, - strval($customer_email), - NULL, - strval(Configuration::get('PS_SHOP_EMAIL', null, null, $id_shop)), - strval(Configuration::get('PS_SHOP_NAME', null, null, $id_shop)), - NULL, - NULL, - dirname(__FILE__).'/mails/', - false, - $id_shop - ); - - Hook::exec('actionModuleMailAlertSendCustomer', array('product' => (is_array($product->name) ? $product->name[$id_lang] : $product->name), 'link' => $product_link, 'customer' => $customer, 'product_obj' => $product)); - - self::deleteAlert((int)$customer_id, strval($customer_email), (int)$id_product, (int)$id_product_attribute, $id_shop); - } - } - - /* - * Generate correctly the address for an email - */ - public static function getFormatedAddress(Address $address, $line_sep, $fields_style = array()) - { - return AddressFormat::generateAddress($address, array('avoid' => array()), $line_sep, ' ', $fields_style); - } - - /* - * Get products according to alerts - */ - public static function getProducts($customer, $id_lang) - { - $sql = ' - SELECT ma.`id_product`, p.`quantity` AS product_quantity, pl.`name`, ma.`id_product_attribute` - FROM `'._DB_PREFIX_.self::$definition['table'].'` ma - JOIN `'._DB_PREFIX_.'product` p ON (p.`id_product` = ma.`id_product`) - '.Shop::addSqlAssociation('product', 'p').' - LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = p.`id_product` AND pl.id_shop IN ('.implode(', ', Shop::getContextListShopID(false)).')) - WHERE product_shop.`active` = 1 - AND (ma.`id_customer` = '.(int)$customer->id.' OR ma.`customer_email` = \''.pSQL($customer->email).'\') - AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestriction(false, 'ma'); - - return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); - } - - /* - * Get product combinations - */ - public static function getProductAttributeCombination($id_product_attribute, $id_lang) - { - $sql = ' - SELECT al.`name` AS attribute_name - FROM `'._DB_PREFIX_.'product_attribute_combination` pac - LEFT JOIN `'._DB_PREFIX_.'attribute` a ON (a.`id_attribute` = pac.`id_attribute`) - LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON (ag.`id_attribute_group` = a.`id_attribute_group`) - LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)$id_lang.') - LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)$id_lang.') - LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (pac.`id_product_attribute` = pa.`id_product_attribute`) - '.Shop::addSqlAssociation('product_attribute', 'pa').' - WHERE pac.`id_product_attribute` = '.(int)$id_product_attribute; - - return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); - } - - /* - * Get customers waiting for alert on the specified product/product attribute - */ - public static function getCustomers($id_product, $id_product_attribute) - { - $sql = ' - SELECT id_customer, customer_email, id_shop, id_lang - FROM `'._DB_PREFIX_.self::$definition['table'].'` - WHERE `id_product` = '.(int)$id_product.' AND `id_product_attribute` = '.(int)$id_product_attribute; - - return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); - } - -} diff --git a/modules/mailalerts/config.xml b/modules/mailalerts/config.xml deleted file mode 100755 index 699578ed4..000000000 --- a/modules/mailalerts/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - mailalerts - - - - - - Are you sure you want to delete all customer notifications? - 1 - 0 - - \ No newline at end of file diff --git a/modules/mailalerts/controllers/front/account.php b/modules/mailalerts/controllers/front/account.php deleted file mode 100644 index 34a73a1e6..000000000 --- a/modules/mailalerts/controllers/front/account.php +++ /dev/null @@ -1,54 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/** - * @since 1.5.0 - */ -class MailalertsAccountModuleFrontController extends ModuleFrontController -{ - public function init() - { - parent::init(); - - require_once($this->module->getLocalPath().'MailAlert.php'); - } - - public function initContent() - { - parent::initContent(); - - if (!Context::getContext()->customer->isLogged()) - Tools::redirect('index.php?controller=authentication&redirect=module&module=mailalerts&action=account'); - - if (Context::getContext()->customer->id) - { - $this->context->smarty->assign('id_customer', Context::getContext()->customer->id); - $this->context->smarty->assign('mailAlerts', MailAlert::getMailAlerts((int)Context::getContext()->customer->id, (int)Context::getContext()->language->id)); - - $this->setTemplate('mailalerts-account.tpl'); - } - } -} \ No newline at end of file diff --git a/modules/mailalerts/controllers/front/actions.php b/modules/mailalerts/controllers/front/actions.php deleted file mode 100644 index 91e042ecc..000000000 --- a/modules/mailalerts/controllers/front/actions.php +++ /dev/null @@ -1,142 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/** - * @since 1.5.0 - */ -class MailalertsActionsModuleFrontController extends ModuleFrontController -{ - /** - * @var int - */ - public $id_product; - public $id_product_attribute; - - public function init() - { - parent::init(); - - require_once($this->module->getLocalPath().'MailAlert.php'); - $this->id_product = (int)Tools::getValue('id_product'); - $this->id_product_attribute = (int)Tools::getValue('id_product_attribute'); - } - - public function postProcess() - { - if (Tools::getValue('process') == 'remove') - $this->processRemove(); - else if (Tools::getValue('process') == 'add') - $this->processAdd(); - else if (Tools::getValue('process') == 'check') - $this->processCheck(); - } - - /** - * Remove a favorite product - */ - public function processRemove() - { - // check if product exists - $product = new Product($this->id_product); - if (!Validate::isLoadedObject($product)) - die('0'); - - $context = Context::getContext(); - if (MailAlert::deleteAlert((int)$context->customer->id, (int)$context->customer->email, (int)$product->id, (int)$this->id_product_attribute)) - die('0'); - - die(1); - } - - /** - * Add a favorite product - */ - public function processAdd() - { - $context = Context::getContext(); - - if ($context->customer->isLogged()) - { - $id_customer = (int)$context->customer->id; - $customer = new Customer($id_customer); - $customer_email = strval($customer->email); - } - else - { - $customer_email = strval(Tools::getValue('customer_email')); - $customer = $context->customer->getByEmail($customer_email); - $id_customer = (isset($customer->id) && ($customer->id != null)) ? (int)$customer->id : null; - } - - $id_product = (int)Tools::getValue('id_product'); - $id_product_attribute = (int)Tools::getValue('id_product_attribute'); - $id_shop = (int)$context->shop->id; - $id_lang = (int)$context->language->id; - $product = new Product($id_product, false, $id_lang, $id_shop, $context); - - $mailAlert = MailAlert::customerHasNotification($id_customer, $id_product, $id_product_attribute, $id_shop, null, $customer_email); - - if ($mailAlert) - die('2'); - elseif (!Validate::isLoadedObject($product)) - die('0'); - - $mailAlert = new MailAlert(); - - $mailAlert->id_customer = (int)$id_customer; - $mailAlert->customer_email = strval($customer_email); - $mailAlert->id_product = (int)$id_product; - $mailAlert->id_product_attribute = (int)$id_product_attribute; - $mailAlert->id_shop = (int)$id_shop; - $mailAlert->id_lang = (int)$id_lang; - - if ($mailAlert->add() !== false) - die('1'); - - die('0'); - } - - /** - * Add a favorite product - */ - public function processCheck() - { - if (!(int)$this->context->customer->logged) - die('0'); - - $id_customer = (int)$this->context->customer->id; - - if (!$id_product = (int)(Tools::getValue('id_product'))) - die('0'); - - $id_product_attribute = (int)(Tools::getValue('id_product_attribute')); - - if (MailAlert::customerHasNotification((int)$id_customer, (int)$id_product, (int)$id_product_attribute, (int)$this->context->shop->id)) - die('1'); - - die('0'); - } -} \ No newline at end of file diff --git a/modules/mailalerts/controllers/front/index.php b/modules/mailalerts/controllers/front/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/mailalerts/controllers/front/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/mailalerts/controllers/index.php b/modules/mailalerts/controllers/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/mailalerts/controllers/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/mailalerts/img/del_alert.gif b/modules/mailalerts/img/del_alert.gif deleted file mode 100644 index 8aea7d4f7050eb06564d02cdef2de912ac365832..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmV-s0h#_sNk%w1VGsZi0M!5h?SNOsH5jEJ6}&AL)_ZUFnswGxE#+@U_T=N_wXpJy zW#ei@)pKagQ9Se9+t!SR+GbP5T2IVEA=j&`?#aj7t*!sBi|oU}(rI7j%*~w|66}3c z!$2{rCmYh0l-gP{++I2R^6>PYf%%|)#6>sKot^mV>ELWlxZ&&~Yz_w|u!_UY-|YgW%+RqvL2)1ssA)YJd|{?u7J`ta}Gk%qlC zCIA2bA^8LV00000EC2ui01yBW000Jqz@KnPEEr>TRa;$% zjGJY|K=23!iwHyH6cn$XEODAC3M8Tr0NAJ;1PgrtEJP6?2L~VoISmU3I}bz&0|p-- z4G1X)1}HQ{IvyPoFcA*{5*-ys9s&Uz0RaLNNIxY40|Nr9wLdr-8nnGa85zUJ$U{K@ EJ4c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L-^Aq1JP;qO z-q+X4Gq1QLF)umQ)5TT^Xo6m5W{Q=go2#jXqpPX0i<_gNp{t>jtGR)NrG=}xg_EMv>2~2MaLa!N4y`ZF!TL84#CABECEH%ZgC_h&L>}9J=+-@<(X&zK> z3U0TU;MA)Rbc{YIVv!;mCIn19ASOK70y*%6pPC0u?M1+3?ZnNV&cMJ};OXKRQgJKk z&;S4S%(e`VSGX<~JIHW)P2}b$4PO`)!j?>w6>qpPnbTv(r3*p=1`J906I@?6?r3fk z^JRP_tI&OE0aKyFpSfLPf0!PLDEwnOV(AlbkZZ#Ch8w&c@c{=Xl{>s)KJqPKvt+~s zmBWn@Od^F2Hu6&2o-|}T%;7i^8_<2AfzwyeBgxc6;`)TdlY9z&Y>$?nn3k}agC(S4 z2S -* @copyright 2007-2013 PrestaShop SA -* @version Release: $Revision$ -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/mailalerts/index.php b/modules/mailalerts/index.php deleted file mode 100644 index e582afcc2..000000000 --- a/modules/mailalerts/index.php +++ /dev/null @@ -1,36 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @version Release: $Revision$ -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/mailalerts/logo.gif b/modules/mailalerts/logo.gif deleted file mode 100644 index 8bdd3304de57761ba769f304df43ef97b4e6cc98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 792 zcmV+z1LypSP)gn-s{Jsef@w|XbT!@L zKqWCIT8+A(7Sx3z9}!4Pu(d7F()NAMIIl$mh8>gK+?nLgnRCyXOBiF=&l0fDCEXmG zO1fK=fkMUbY^kO|IUx!Li*G1rXYru4dEO2NVi`tlvyl0*xG05#{;n&-JwDA~#O)Gy zp_Bjjq?zlQDb_VBdhw2?3i+}b*G)Mkej}RiH|=KYV#o;^MY)fCsb9d zsU|OsN4*FKTk!a82BnG)znj1#sVFUsLkabxPk!I1k)<6rR_jd$gsWp3CfpLm!B_y3 zsXVd;6|1uoP{IT7MFtSAy@Rth*I@QnS)ry`u-WLkiCn3Iu66|{;z1la6h!*_9BM0* z{Ph5=@-syHFF{yNfEpSa|Bn$Hz+|?+`69m@R^azIIYol*12T?FuMz1z52!OpJxahE zsKZrEL0x&ntu#0QWkR*Ix~y>@k9Eo{8Whm#vABR1lv)~Yvjinr1J#!7Vpv?v?xE{w z`;|a0UsB7zvrDA!!ri2^HGa~ics!CzBobHC!F9M6c_^MfJ51b;DNsGT-LnItXArps z0g2@NX5wr7GudmHX6_GN4fPJ+>*$gBt0~^Ej_Ief7#!&Z5&eLC4(SIs@{H0mdjh0J zPi6ZrCt{+o3}&v|YVDdoQ9g>?w=bA~e*1~E*Mymx?w%PNsdJ5Z>vTu3e;IaWtm6;T WSyNB7T;Y8s2(Xr1kulv2vC+}$cTK{b@%GqXez?PO`tF0_+O0PAWk6=OH}Wkc0jap*R%+IHNb@11}NwLxCJH7jwo7kl0fp zTTz&e&Lbf_xGo2WM}+`MnqM|zU#*F8AQw6&V=G$BAqFQ$2Pz43SS73|@}cAK2m*Pe zj^vq5fW;)VE}K3m{Dthct_f;=HA3KXeLp*#tx$CRx1aVo_g? zWemn*Oq0Pes{l@oEQ{nUbvr0!lnDZ;@&Z==GI?&sz8u4`jKNrpsbgzN1n` z%N+3MdhlZ3Fjje{wM5BqWq$1;W-hdWcpNf2O;6TsQJ^70Jid)?UEKa8?WL&R+9 zr#1FrUyk8e$sk}%^ZyE9Vv|S}n`8u(6?q6S6EA-f#Bw*K*gQkpX^z*}hkZFli#8tv zkFm96H6UrC2&3uJjaExs!06d=*sT_wpvWZ%qiN?c&+!`jurJ4OYyy_SF?$g*xycAL zQd-Qw{Xu<$ZmP+LN&uY$BqE(iGYm@?bG*hr?8`A6%NS8S#-8ahCu~8q=}or$1rq z^+h;6AsnS-MaYH1d+MQMd*BG2|EqndEH;V>B0CbMg(!xp262K9S>>`URFxIst-&#P zoMJmvbc=r|{n}R=3zQ8T(u1a15 zEbgNdAq1|;gPqQnYJ8PxzE>h2VJq<0>swHG-DVOm;oOO*(dT{x%`4NA2%x|XDYjribnK2{{+UJn+6c~oh;yDXKPIZy_YQXS6G(Qi6;*p8Bl=N9*g#%RQ>u+8*B@lui0`R@Y}1L4E-PM##UdD#b@%L?E7(S|7)n-b(q={ zCgc>5n?KuGeK5a%Ep28Gk -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/* SSL Management */ -$useSSL = true; - -include(dirname(__FILE__).'/../../config/config.inc.php'); -include(dirname(__FILE__).'/../../header.php'); -include_once(dirname(__FILE__).'/mailalerts.php'); - -// Instance of module class for translations -$module = new MailAlerts(); - -$errors = array(); - -if ($cookie->isLogged()) -{ - if (Tools::getValue('action') == 'delete') - { - $id_customer = (int)($cookie->id_customer); - if (!$id_product = (int)(Tools::getValue('id_product'))) - $errors[] = $module->l('You must have a product to delete an alert.', 'mailalerts-account'); - $id_product_attribute = (int)(Tools::getValue('id_product_attribute')); - $customer = new Customer((int)($id_customer)); - MailAlerts::deleteAlert((int)($id_customer), strval($customer->email), (int)($id_product), (int)($id_product_attribute)); - } - $this->context->smarty->assign('mailAlerts', MailAlert::getProductsAlerts((int)($cookie->id_customer), (int)($cookie->id_lang))); -} -else - $errors[] = $module->l('You must be logged in to manage your alerts.', 'mailalerts-account'); - -$this->context->smarty->assign(array( - 'id_customer' => (int)($cookie->id_customer), - 'errors' => $errors -)); - -if (Tools::file_exists_cache(_PS_THEME_DIR_.'modules/mailalerts/myalerts.tpl')) - $smarty->display(_PS_THEME_DIR_.'modules/mailalerts/myalerts.tpl'); -elseif (Tools::file_exists_cache(dirname(__FILE__).'/myalerts.tpl')) - $smarty->display(dirname(__FILE__).'/myalerts.tpl'); -else - echo $module->l('No template found', 'mailalerts-account'); - -include(dirname(__FILE__).'/../../footer.php'); diff --git a/modules/mailalerts/mailalerts-ajax.php b/modules/mailalerts/mailalerts-ajax.php deleted file mode 100644 index 0d81d2be0..000000000 --- a/modules/mailalerts/mailalerts-ajax.php +++ /dev/null @@ -1,32 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -require_once(dirname(__FILE__).'/../../config/config.inc.php'); -require_once(dirname(__FILE__).'/../../init.php'); - - - - diff --git a/modules/mailalerts/mailalerts-extra.php b/modules/mailalerts/mailalerts-extra.php deleted file mode 100644 index c9199894c..000000000 --- a/modules/mailalerts/mailalerts-extra.php +++ /dev/null @@ -1,119 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - - -{if !$isCustomerMailAlert AND $isLogged} -
  • - {l s='Add this product to my favorites' mod='mailalerts'} -
  • -{/if} -{if $isCustomerMailAlert AND $isLogged} -
  • - {l s='Remove this product from my favorites' mod='mailalerts'} -
  • -{/if} - -
  • - {l s='Remove this product from my favorites' mod='mailalerts'} -
  • -
  • - {l s='Add this product to my favorites' mod='mailalerts'} -
  • \ No newline at end of file diff --git a/modules/mailalerts/mailalerts.css b/modules/mailalerts/mailalerts.css deleted file mode 100644 index 3d0e888ce..000000000 --- a/modules/mailalerts/mailalerts.css +++ /dev/null @@ -1,47 +0,0 @@ -#module-mailalerts-mailalerts-account #left_column {display:none} -#module-mailalerts-mailalerts-account #center_column {width:757px} - -#mailalerts_block_account .mailalert { - position:relative; - margin-bottom: 14px; - padding: 12px 8px; - border: 1px solid #eee; - border-radius: 3px 3px 3px 3px; -} - -.mailalert a.product_img_link { - border: 1px solid #CCCCCC; - display: block; - float: left; - margin-right: 14px; - overflow: hidden; - position: relative; -} - -.mailalert h3 { - color: #000000; - font-size: 13px; - padding: 0 0 10px; -} - -.mailalert p.product_desc { - line-height: 16px; - overflow: hidden; - padding: 0; -} - -.mailalert .remove { - position:absolute; - top:10px; - right:10px -} -.mailalert .remove .icon {cursor:pointer} - - -/* lnk fiche produit */ - -#usefull_link_block li#mailalerts_block_extra_remove { - padding-left:20px; - background:url(img/del_alert.gif) no-repeat 0 0; - cursor: pointer; -} \ No newline at end of file diff --git a/modules/mailalerts/mailalerts.php b/modules/mailalerts/mailalerts.php deleted file mode 100644 index b50f0d4b8..000000000 --- a/modules/mailalerts/mailalerts.php +++ /dev/null @@ -1,735 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_CAN_LOAD_FILES_')) - exit; - -include_once(dirname(__FILE__).'/MailAlert.php'); - -class MailAlerts extends Module -{ - private $_html = ''; - - private $_merchant_mails; - private $_merchant_order; - private $_merchant_oos; - private $_customer_qty; - private $_merchant_coverage; - private $_product_coverage; - - const __MA_MAIL_DELIMITOR__ = "\n"; - - public function __construct() - { - $this->name = 'mailalerts'; - $this->tab = 'administration'; - $this->version = '2.8'; - $this->author = 'PrestaShop'; - $this->need_instance = 0; - - $this->bootstrap = true; - parent::__construct(); - - if ($this->id) - $this->init(); - - $this->displayName = $this->l('Mail alerts'); - $this->description = $this->l('Sends e-mail notifications to customers and merchants.'); - $this->confirmUninstall = $this->l('Are you sure you want to delete all customer notifications?'); - } - - private function init() - { - $this->_merchant_mails = strval(Configuration::get('MA_MERCHANT_MAILS')); - $this->_merchant_order = (int)Configuration::get('MA_MERCHANT_ORDER'); - $this->_merchant_oos = (int)Configuration::get('MA_MERCHANT_OOS'); - $this->_customer_qty = (int)Configuration::get('MA_CUSTOMER_QTY'); - $this->_merchant_coverage = (int)Configuration::getGlobalValue('MA_MERCHANT_COVERAGE'); - $this->_product_coverage = (int)Configuration::getGlobalValue('MA_PRODUCT_COVERAGE'); - } - - public function install() - { - if (!parent::install() || - !$this->registerHook('actionValidateOrder') || - !$this->registerHook('actionUpdateQuantity') || - !$this->registerHook('actionProductOutOfStock') || - !$this->registerHook('displayCustomerAccount') || - !$this->registerHook('displayMyAccountBlock') || - !$this->registerHook('actionProductDelete') || - !$this->registerHook('actionProductAttributeDelete') || - !$this->registerHook('actionProductAttributeUpdate') || - !$this->registerHook('actionProductCoverage') || - !$this->registerHook('displayHeader')) - return false; - - Configuration::updateValue('MA_MERCHANT_ORDER', 1); - Configuration::updateValue('MA_MERCHANT_OOS', 1); - Configuration::updateValue('MA_CUSTOMER_QTY', 1); - Configuration::updateValue('MA_MERCHANT_MAILS', Configuration::get('PS_SHOP_EMAIL')); - Configuration::updateValue('MA_LAST_QTIES', (int)Configuration::get('PS_LAST_QTIES')); - Configuration::updateGlobalValue('MA_MERCHANT_COVERAGE', 0); - Configuration::updateGlobalValue('MA_PRODUCT_COVERAGE', 0); - - $sql = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.MailAlert::$definition['table'].'` - ( - `id_customer` int(10) unsigned NOT NULL, - `customer_email` varchar(128) NOT NULL, - `id_product` int(10) unsigned NOT NULL, - `id_product_attribute` int(10) unsigned NOT NULL, - `id_shop` int(10) unsigned NOT NULL, - `id_lang` int(10) unsigned NOT NULL, - PRIMARY KEY (`id_customer`,`customer_email`,`id_product`,`id_product_attribute`,`id_shop`) - ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci'; - - if (!Db::getInstance()->execute($sql)) - return false; - - return true; - } - - public function uninstall() - { - Configuration::deleteByName('MA_MERCHANT_ORDER'); - Configuration::deleteByName('MA_MERCHANT_OOS'); - Configuration::deleteByName('MA_CUSTOMER_QTY'); - Configuration::deleteByName('MA_MERCHANT_MAILS'); - Configuration::deleteByName('MA_LAST_QTIES'); - Configuration::deleteByName('MA_MERCHANT_COVERAGE'); - Configuration::deleteByName('MA_PRODUCT_COVERAGE'); - - if (!Db::getInstance()->execute('DROP TABLE '._DB_PREFIX_.MailAlert::$definition['table'])) - return false; - - return parent::uninstall(); - } - - public function getContent() - { - $this->_html = ''; - - $this->_postProcess(); - - $this->_html .= $this->renderForm(); - - return $this->_html; - } - - private function _postProcess() - { - $errors = array(); - - if (Tools::isSubmit('submitMailAlert')) - { - if (!Configuration::updateValue('MA_CUSTOMER_QTY', (int)Tools::getValue('MA_CUSTOMER_QTY'))) - $errors[] = $this->l('Cannot update settings'); - } - else if (Tools::isSubmit('submitMAMerchant')) - { - $emails = strval(Tools::getValue('MA_MERCHANT_MAILS')); - - if (!$emails || empty($emails)) - $errors[] = $this->l('Please type one (or more) e-mail address'); - else - { - $emails = explode("\n", $emails); - foreach ($emails as $k => $email) - { - $email = trim($email); - if (!empty($email) && !Validate::isEmail($email)) - { - $errors[] = $this->l('Invalid e-mail:').' '.Tools::safeOutput($email); - break; - } - elseif (!empty($email) && count($email) > 0) - $emails[$k] = $email; - else - unset($emails[$k]); - } - - $emails = implode(self::__MA_MAIL_DELIMITOR__, $emails); - - if (!Configuration::updateValue('MA_MERCHANT_MAILS', strval($emails))) - $errors[] = $this->l('Cannot update settings'); - elseif (!Configuration::updateValue('MA_MERCHANT_ORDER', (int)Tools::getValue('MA_MERCHANT_ORDER'))) - $errors[] = $this->l('Cannot update settings'); - elseif (!Configuration::updateValue('MA_MERCHANT_OOS', (int)Tools::getValue('MA_MERCHANT_OOS'))) - $errors[] = $this->l('Cannot update settings'); - elseif (!Configuration::updateValue('MA_LAST_QTIES', (int)Tools::getValue('MA_LAST_QTIES'))) - $errors[] = $this->l('Cannot update settings'); - elseif (!Configuration::updateGlobalValue('MA_MERCHANT_COVERAGE', (int)Tools::getValue('MA_MERCHANT_COVERAGE'))) - $errors[] = $this->l('Cannot update settings'); - elseif (!Configuration::updateGlobalValue('MA_PRODUCT_COVERAGE', (int)Tools::getValue('MA_PRODUCT_COVERAGE'))) - $errors[] = $this->l('Cannot update settings'); - } - } - - if (count($errors) > 0) - $this->_html .= $this->displayError(implode('
    ', $errors)); - else - $this->_html .= $this->displayConfirmation($this->l('Settings updated successfully')); - - $this->init(); - } - - public function getAllMessages($id) - { - $messages = Db::getInstance()->executeS(' - SELECT `message` - FROM `'._DB_PREFIX_.'message` - WHERE `id_order` = '.(int)$id.' - ORDER BY `id_message` ASC - '); - $result = array(); - foreach ($messages as $message) { - $result[] = $message['message']; - } - return implode('
    ', $result); - } - - public function hookActionValidateOrder($params) - { - if (!$this->_merchant_order || empty($this->_merchant_mails)) - return; - - // Getting differents vars - $context = Context::getContext(); - $id_lang = (int)$context->language->id; - $id_shop = (int)$context->shop->id; - $currency = $params['currency']; - $order = $params['order']; - $customer = $params['customer']; - $configuration = Configuration::getMultiple(array('PS_SHOP_EMAIL', 'PS_MAIL_METHOD', 'PS_MAIL_SERVER', 'PS_MAIL_USER', 'PS_MAIL_PASSWD', 'PS_SHOP_NAME', 'PS_MAIL_COLOR'), $id_lang, null, $id_shop); - $delivery = new Address((int)$order->id_address_delivery); - $invoice = new Address((int)$order->id_address_invoice); - $order_date_text = Tools::displayDate($order->date_add); - $carrier = new Carrier((int)$order->id_carrier); - $message = $this->getAllMessages($order->id); - - if (!$message || empty($message)) - $message = $this->l('No message'); - - $items_table = ''; - - $products = $params['order']->getProducts(); - $customized_datas = Product::getAllCustomizedDatas((int)$params['cart']->id); - Product::addCustomizationPrice($products, $customized_datas); - foreach ($products as $key => $product) - { - $unit_price = $product['product_price_wt']; - - $customization_text = ''; - if (isset($customized_datas[$product['product_id']][$product['product_attribute_id']])) - { - foreach ($customized_datas[$product['product_id']][$product['product_attribute_id']][$order->id_address_delivery] as $customization) - { - if (isset($customization['datas'][_CUSTOMIZE_TEXTFIELD_])) - foreach ($customization['datas'][_CUSTOMIZE_TEXTFIELD_] as $text) - $customization_text .= $text['name'].': '.$text['value'].'
    '; - - if (isset($customization['datas'][_CUSTOMIZE_FILE_])) - $customization_text .= count($customization['datas'][_CUSTOMIZE_FILE_]).' '.$this->l('image(s)').'
    '; - - $customization_text .= '---
    '; - } - - $customization_text = Tools::rtrimString($customization_text, '---
    '); - } - - $items_table .= - ' - '.$product['product_reference'].' - - ' - .$product['product_name'].(isset($product['attributes_small']) ? ' '.$product['attributes_small'] : '').(!empty($customization_text) ? '
    '.$customization_text : ''). - '
    - - '.Tools::displayPrice($unit_price, $currency, false).' - '.(int)$product['product_quantity'].' - '.Tools::displayPrice(($unit_price * $product['product_quantity']), $currency, false).' - '; - } - foreach ($params['order']->getCartRules() as $discount) - { - $items_table .= - ' - '.$this->l('Voucher code:').' '.$discount['name'].' - -'.Tools::displayPrice($discount['value'], $currency, false).' - '; - } - if ($delivery->id_state) - $delivery_state = new State((int)$delivery->id_state); - if ($invoice->id_state) - $invoice_state = new State((int)$invoice->id_state); - - // Filling-in vars for email - $template = 'new_order'; - $template_vars = array( - '{firstname}' => $customer->firstname, - '{lastname}' => $customer->lastname, - '{email}' => $customer->email, - '{delivery_block_txt}' => MailAlert::getFormatedAddress($delivery, "\n"), - '{invoice_block_txt}' => MailAlert::getFormatedAddress($invoice, "\n"), - '{delivery_block_html}' => MailAlert::getFormatedAddress($delivery, '
    ', array( - 'firstname' => '%s', - 'lastname' => '%s')), - '{invoice_block_html}' => MailAlert::getFormatedAddress($invoice, '
    ', array( - 'firstname' => '%s', - 'lastname' => '%s')), - '{delivery_company}' => $delivery->company, - '{delivery_firstname}' => $delivery->firstname, - '{delivery_lastname}' => $delivery->lastname, - '{delivery_address1}' => $delivery->address1, - '{delivery_address2}' => $delivery->address2, - '{delivery_city}' => $delivery->city, - '{delivery_postal_code}' => $delivery->postcode, - '{delivery_country}' => $delivery->country, - '{delivery_state}' => $delivery->id_state ? $delivery_state->name : '', - '{delivery_phone}' => $delivery->phone ? $delivery->phone : $delivery->phone_mobile, - '{delivery_other}' => $delivery->other, - '{invoice_company}' => $invoice->company, - '{invoice_firstname}' => $invoice->firstname, - '{invoice_lastname}' => $invoice->lastname, - '{invoice_address2}' => $invoice->address2, - '{invoice_address1}' => $invoice->address1, - '{invoice_city}' => $invoice->city, - '{invoice_postal_code}' => $invoice->postcode, - '{invoice_country}' => $invoice->country, - '{invoice_state}' => $invoice->id_state ? $invoice_state->name : '', - '{invoice_phone}' => $invoice->phone ? $invoice->phone : $invoice->phone_mobile, - '{invoice_other}' => $invoice->other, - '{order_name}' => $order->reference, - '{shop_name}' => $configuration['PS_SHOP_NAME'], - '{date}' => $order_date_text, - '{carrier}' => (($carrier->name == '0') ? $configuration['PS_SHOP_NAME'] : $carrier->name), - '{payment}' => Tools::substr($order->payment, 0, 32), - '{items}' => $items_table, - '{total_paid}' => Tools::displayPrice($order->total_paid, $currency), - '{total_products}' => Tools::displayPrice($order->getTotalProductsWithTaxes(), $currency), - '{total_discounts}' => Tools::displayPrice($order->total_discounts, $currency), - '{total_shipping}' => Tools::displayPrice($order->total_shipping, $currency), - '{total_tax_paid}' => Tools::displayPrice(($order->total_products_wt - $order->total_products) + ($order->total_shipping_tax_incl - $order->total_shipping_tax_excl), $currency, false), - '{total_wrapping}' => Tools::displayPrice($order->total_wrapping, $currency), - '{currency}' => $currency->sign, - '{message}' => $message - ); - - $iso = Language::getIsoById($id_lang); - - if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/'.$template.'.txt') && - file_exists(dirname(__FILE__).'/mails/'.$iso.'/'.$template.'.html')) - { - // Send 1 email by merchant mail, because Mail::Send doesn't work with an array of recipients - $merchant_mails = explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails); - foreach ($merchant_mails as $merchant_mail) - { - Mail::Send( - $id_lang, - $template, - sprintf(Mail::l('New order - #%06d', $id_lang), $order->id), - $template_vars, - $merchant_mail, - null, - $configuration['PS_SHOP_EMAIL'], - $configuration['PS_SHOP_NAME'], - null, - null, - dirname(__FILE__).'/mails/', - null, - $id_shop - ); - } - } - } - - public function hookActionProductOutOfStock($params) - { - if (!$this->_customer_qty || !Configuration::get('PS_STOCK_MANAGEMENT') || Product::isAvailableWhenOutOfStock($params['product']->out_of_stock)) - return; - - $context = Context::getContext(); - $id_product = (int)$params['product']->id; - $id_product_attribute = 0; - $id_customer = (int)$context->customer->id; - - if ((int)$context->customer->id <= 0) - $this->context->smarty->assign('email', 1); - elseif (MailAlert::customerHasNotification($id_customer, $id_product, $id_product_attribute, (int)$context->shop->id)) - return; - - $this->context->smarty->assign(array( - 'id_product' => $id_product, - 'id_product_attribute' => $id_product_attribute - )); - - return $this->display(__FILE__, 'product.tpl'); - } - - public function hookActionUpdateQuantity($params) - { - $id_product = (int)$params['id_product']; - $product = new Product($id_product); - $product_has_attributes = $product->hasAttributes(); - $id_product_attribute = (int)$params['id_product_attribute']; - $quantity = (int)$params['quantity']; - $context = Context::getContext(); - $id_shop = (int)$context->shop->id; - $id_lang = (int)$context->language->id; - $product = new Product($id_product, true, $id_lang, $id_shop, $context); - $configuration = Configuration::getMultiple(array('MA_LAST_QTIES', 'PS_STOCK_MANAGEMENT', 'PS_SHOP_EMAIL', 'PS_SHOP_NAME'), null, null, $id_shop); - $ma_last_qties = (int)$configuration['MA_LAST_QTIES']; - - $check_oos = ($product_has_attributes && $id_product_attribute) || (!$product_has_attributes && !$id_product_attribute); - - if ($check_oos && $product->active == 1 && (int)$quantity <= $ma_last_qties && !(!$this->_merchant_oos || empty($this->_merchant_mails)) && $configuration['PS_STOCK_MANAGEMENT']) - { - $iso = Language::getIsoById($id_lang); - $product_name = Product::getProductName($id_product, $id_product_attribute, $id_lang); - $template_vars = array( - '{qty}' => $quantity, - '{last_qty}' => $ma_last_qties, - '{product}' => $product_name - ); - - if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.txt') && - file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.html')) - { - // Send 1 email by merchant mail, because Mail::Send doesn't work with an array of recipients - $merchant_mails = explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails); - foreach ($merchant_mails as $merchant_mail) - { - Mail::Send( - $id_lang, - 'productoutofstock', - Mail::l('Product out of stock', $id_lang), - $template_vars, - $merchant_mail, - null, - strval($configuration['PS_SHOP_EMAIL']), - strval($configuration['PS_SHOP_NAME']), - null, - null, - dirname(__FILE__).'/mails/', - false, - $id_shop - ); - } - } - } - - if ($this->_customer_qty && $quantity > 0) - MailAlert::sendCustomerAlert((int)$product->id, (int)$params['id_product_attribute']); - } - - public function hookActionProductAttributeUpdate($params) - { - $sql = ' - SELECT `id_product`, `quantity` - FROM `'._DB_PREFIX_.'stock_available` - WHERE `id_product_attribute` = '.(int)$params['id_product_attribute']; - - $result = Db::getInstance()->getRow($sql); - - if ($this->_customer_qty && $result['quantity'] > 0) - MailAlert::sendCustomerAlert((int)$result['id_product'], (int)$params['id_product_attribute']); - } - - public function hookDisplayCustomerAccount($params) - { - return $this->_customer_qty ? $this->display(__FILE__, 'my-account.tpl') : null; - } - - public function hookDisplayMyAccountBlock($params) - { - return $this->hookDisplayCustomerAccount($params); - } - - public function hookActionProductDelete($params) - { - $sql = ' - DELETE FROM `'._DB_PREFIX_.MailAlert::$definition['table'].'` - WHERE `id_product` = '.(int)$params['product']->id; - - Db::getInstance()->execute($sql); - } - - public function hookActionAttributeDelete($params) - { - if ($params['deleteAllAttributes']) - $sql = ' - DELETE FROM `'._DB_PREFIX_.MailAlert::$definition['table'].'` - WHERE `id_product` = '.(int)$params['id_product']; - else - $sql = ' - DELETE FROM `'._DB_PREFIX_.MailAlert::$definition['table'].'` - WHERE `id_product_attribute` = '.(int)$params['id_product_attribute'].' - AND `id_product` = '.(int)$params['id_product']; - - Db::getInstance()->execute($sql); - } - - public function hookActionProductCoverage($params) - { - // if not advanced stock management, nothing to do - if (!Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT')) - return; - - // retrieves informations - $id_product = (int)$params['id_product']; - $id_product_attribute = (int)$params['id_product_attribute']; - $warehouse = $params['warehouse']; - $product = new Product($id_product); - - if (!Validate::isLoadedObject($product)) - return; - - if (!$product->advanced_stock_management) - return; - - // sets warehouse id to get the coverage - if (!Validate::isLoadedObject($warehouse)) - $id_warehouse = 0; - else - $id_warehouse = (int)$warehouse->id; - - // coverage of the product - $warning_coverage = (int)Configuration::getGlobalValue('MA_PRODUCT_COVERAGE'); - - $coverage = StockManagerFactory::getManager()->getProductCoverage($id_product, $id_product_attribute, $warning_coverage, $id_warehouse); - - // if we need to send a notification - if ($product->active == 1 && - ($coverage < $warning_coverage) && !empty($this->_merchant_mails) && - Configuration::getGlobalValue('MA_MERCHANT_COVERAGE')) - { - $context = Context::getContext(); - $id_lang = (int)$context->language->id; - $id_shop = (int)$context->shop->id; - $iso = Language::getIsoById($id_lang); - $product_name = Product::getProductName($id_product, $id_product_attribute, $id_lang); - $template_vars = array( - '{current_coverage}' => $coverage, - '{warning_coverage}' => $warning_coverage, - '{product}' => pSQL($product_name) - ); - - if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/productcoverage.txt') && - file_exists(dirname(__FILE__).'/mails/'.$iso.'/productcoverage.html')) - { - // Send 1 email by merchant mail, because Mail::Send doesn't work with an array of recipients - $merchant_mails = explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails); - foreach ($merchant_mails as $merchant_mail) - { - Mail::Send( - $id_lang, - 'productcoverage', - Mail::l('Stock coverage', $id_lang), - $template_vars, - $merchant_mail, - null, - strval(Configuration::get('PS_SHOP_EMAIL')), - strval(Configuration::get('PS_SHOP_NAME')), - null, - null, - dirname(__FILE__).'/mails/', - null, - $id_shop - ); - } - } - } - } - - public function hookDisplayHeader($params) - { - $this->context->controller->addCSS($this->_path.'mailalerts.css', 'all'); - } - - public function renderForm() - { - $fields_form_1 = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Customer notifications'), - 'icon' => 'icon-cogs' - ), - 'input' => array( - array( - 'type' => 'switch', - 'is_bool' => true, //retro compat 1.5 - 'label' => $this->l('Product availability:'), - 'name' => 'MA_CUSTOMER_QTY', - 'desc' => $this->l('Gives the customer the option of receiving a notification for an available product if this one is out of stock.'), - 'values' => array( - array( - 'id' => 'active_on', - 'value' => 1, - 'label' => $this->l('Enabled') - ), - array( - 'id' => 'active_off', - 'value' => 0, - 'label' => $this->l('Disabled') - ) - ), - ), - ), - 'submit' => array( - 'title' => $this->l('Save'), - 'class' => 'btn btn-default', - 'name' => 'submitMailAlert', - ) - ), - ); - - $fields_form_2 = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Merchant notifications'), - 'icon' => 'icon-cogs' - ), - 'input' => array( - array( - 'type' => 'switch', - 'is_bool' => true, //retro compat 1.5 - 'label' => $this->l('New order:'), - 'name' => 'MA_MERCHANT_ORDER', - 'desc' => $this->l('Receive a notification when an order is placed'), - 'values' => array( - array( - 'id' => 'active_on', - 'value' => 1, - 'label' => $this->l('Enabled') - ), - array( - 'id' => 'active_off', - 'value' => 0, - 'label' => $this->l('Disabled') - ) - ), - ), - array( - 'type' => 'switch', - 'is_bool' => true, //retro compat 1.5 - 'label' => $this->l('Out of stock:'), - 'name' => 'MA_MERCHANT_OOS', - 'desc' => $this->l('Receive a notification if the available quantity of a product is below the following threshold'), - 'values' => array( - array( - 'id' => 'active_on', - 'value' => 1, - 'label' => $this->l('Enabled') - ), - array( - 'id' => 'active_off', - 'value' => 0, - 'label' => $this->l('Disabled') - ) - ), - ), - array( - 'type' => 'text', - 'label' => $this->l('Threshold:'), - 'name' => 'MA_LAST_QTIES', - 'class' => 'fixed-width-xs', - 'desc' => $this->l('Quantity for which a product is considered out of stock'), - ), - array( - 'type' => 'switch', - 'is_bool' => true, //retro compat 1.5 - 'label' => $this->l('Coverage warning:'), - 'name' => 'MA_MERCHANT_COVERAGE', - 'desc' => $this->l('Receive a notification when an order is placed'), - 'values' => array( - array( - 'id' => 'active_on', - 'value' => 1, - 'label' => $this->l('Enabled') - ), - array( - 'id' => 'active_off', - 'value' => 0, - 'label' => $this->l('Disabled') - ) - ), - ), - array( - 'type' => 'text', - 'label' => $this->l('Coverage:'), - 'name' => 'MA_PRODUCT_COVERAGE', - 'class' => 'fixed-width-xs', - 'desc' => $this->l('Stock coverage, in days. Also, the stock coverage of a given product will be calculated based on this number'), - ), - array( - 'type' => 'textarea', - 'label' => $this->l('E-mail addresses:'), - 'name' => 'MA_MERCHANT_MAILS', - 'desc' => $this->l('One e-mail address per line (e.g. bob@example.com)'), - ), - ), - 'submit' => array( - 'title' => $this->l('Save'), - 'class' => 'btn btn-default', - 'name' => 'submitMAMerchant', - ) - ), - ); - - - - $helper = new HelperForm(); - $helper->show_toolbar = false; - $helper->table = $this->table; - $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); - $helper->default_form_language = $lang->id; - $helper->module = $this; - $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; - $helper->identifier = $this->identifier; - $helper->submit_action = 'submitMailAlert'; - $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->tpl_vars = array( - 'fields_value' => $this->getConfigFieldsValues(), - 'languages' => $this->context->controller->getLanguages(), - 'id_language' => $this->context->language->id - ); - - return $helper->generateForm(array($fields_form_1, $fields_form_2)); - } - - public function getConfigFieldsValues() - { - return array( - 'MA_CUSTOMER_QTY' => Tools::getValue('MA_CUSTOMER_QTY', Configuration::get('MA_CUSTOMER_QTY')), - 'MA_MERCHANT_ORDER' => Tools::getValue('MA_MERCHANT_ORDER', Configuration::get('MA_MERCHANT_ORDER')), - 'MA_MERCHANT_OOS' => Tools::getValue('MA_MERCHANT_OOS', Configuration::get('MA_MERCHANT_OOS')), - 'MA_LAST_QTIES' => Tools::getValue('MA_LAST_QTIES', Configuration::get('MA_LAST_QTIES')), - 'MA_MERCHANT_COVERAGE' => Tools::getValue('MA_MERCHANT_COVERAGE', Configuration::get('MA_MERCHANT_COVERAGE')), - 'MA_PRODUCT_COVERAGE' => Tools::getValue('MA_PRODUCT_COVERAGE', Configuration::get('MA_PRODUCT_COVERAGE')), - 'MA_MERCHANT_MAILS' => Tools::getValue('MA_MERCHANT_MAILS', Configuration::get('MA_MERCHANT_MAILS')), - ); - } -} diff --git a/modules/mailalerts/mails/en/customer_qty.html b/modules/mailalerts/mails/en/customer_qty.html deleted file mode 100644 index fd752843b..000000000 --- a/modules/mailalerts/mails/en/customer_qty.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - Message from {shop_name} - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - - - -
    - Hi, -
    -

    - {product} is now available.

    - - This item is once again in-stock.

    - You can access the product page by clicking on the link: {product}
    - You can order it right now from our online shop.
    -
    -
     
    - - \ No newline at end of file diff --git a/modules/mailalerts/mails/en/customer_qty.txt b/modules/mailalerts/mails/en/customer_qty.txt deleted file mode 100644 index 12b11428e..000000000 --- a/modules/mailalerts/mails/en/customer_qty.txt +++ /dev/null @@ -1,17 +0,0 @@ - -[{shop_url}] - -Hi, - -{product} is now available. - -This item is once again in-stock. - -You can access the product page by clicking on the link: {product} -[HTTP://SAFE.SHELL.LA/{product_link}] - -You can order it right now from our online shop. - -{shop_name} [{shop_url}] powered by -PrestaShop(tm) [http://www.prestashop.com/] - diff --git a/modules/mailalerts/mails/en/index.php b/modules/mailalerts/mails/en/index.php deleted file mode 100644 index e582afcc2..000000000 --- a/modules/mailalerts/mails/en/index.php +++ /dev/null @@ -1,36 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @version Release: $Revision$ -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/mailalerts/mails/en/new_order.html b/modules/mailalerts/mails/en/new_order.html deleted file mode 100644 index 816c8640a..000000000 --- a/modules/mailalerts/mails/en/new_order.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - - - - Message from {shop_name} - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Congratulations! -
    - A new order was placed on {shop_name} from the following customer: {firstname} {lastname} ({email}) -
    -

    - Order details

    - - Order: {order_name} Placed on {date}

    - Payment: {payment} -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ReferenceProductUnit priceQuantityTotal price
    - {items} -
    Products{total_products}
    Discounts{total_discounts}
    Gift-wrapping{total_wrapping}
    Shipping{total_shipping}
    Total Tax paid{total_tax_paid}
    Total paid{total_paid}
    -
    -

    - Carrier:

    - - {carrier} - -
    - - - - - - -
    -

    - Delivery address

    - - {delivery_block_html} - -
      -

    - Billing address

    - - {invoice_block_html} - -
    -
    -

    - Customer message:

    - - {message} - -
    -
     
    - - \ No newline at end of file diff --git a/modules/mailalerts/mails/en/new_order.txt b/modules/mailalerts/mails/en/new_order.txt deleted file mode 100644 index f4f1a1d12..000000000 --- a/modules/mailalerts/mails/en/new_order.txt +++ /dev/null @@ -1,69 +0,0 @@ - -[{shop_url}] - -Congratulations! - -A new order was placed on {shop_name} from the following customer: -{firstname} {lastname} ({email}) - -Order details - -ORDER: {order_name} Placed on {date} - -PAYMENT: {payment} - -REFERENCE - -PRODUCT - -UNIT PRICE - -QUANTITY - -TOTAL PRICE - -{items} - -PRODUCTS - -{total_products} - -DISCOUNTS - -{total_discounts} - -GIFT-WRAPPING - -{total_wrapping} - -SHIPPING - -{total_shipping} - -TOTAL TAX PAID - -{total_tax_paid} - -TOTAL PAID - -{total_paid} - -Carrier: - -{carrier} - -Delivery address - -{delivery_block_html} - -Billing address - -{invoice_block_html} - -Customer message: - -{message} - -{shop_name} [{shop_url}] powered by -PrestaShop(tm) [http://www.prestashop.com/] - diff --git a/modules/mailalerts/mails/en/productcoverage.html b/modules/mailalerts/mails/en/productcoverage.html deleted file mode 100644 index 42e3b6fdd..000000000 --- a/modules/mailalerts/mails/en/productcoverage.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - Message from {shop_name} - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - - - -
    - Hi, -
    -

    - {product} is almost out of stock.

    - - The stock cover is now less than the specified minimum of: {warning_coverage}.

    - Current stock cover: {current_coverage} -
    -
    -
     
    - - \ No newline at end of file diff --git a/modules/mailalerts/mails/en/productcoverage.txt b/modules/mailalerts/mails/en/productcoverage.txt deleted file mode 100644 index e20bf1bea..000000000 --- a/modules/mailalerts/mails/en/productcoverage.txt +++ /dev/null @@ -1,15 +0,0 @@ - -[{shop_url}] - -Hi, - -{product} is almost out of stock. - -The stock cover is now less than the specified minimum of: -{warning_coverage}. - -CURRENT STOCK COVER: {current_coverage} - -{shop_name} [{shop_url}] powered by -PrestaShop(tm) [http://www.prestashop.com/] - diff --git a/modules/mailalerts/mails/en/productoutofstock.html b/modules/mailalerts/mails/en/productoutofstock.html deleted file mode 100644 index 4fab77434..000000000 --- a/modules/mailalerts/mails/en/productoutofstock.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - Message from {shop_name} - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - - - -
    - Hi, -
    -

    - {product} is nearly out of stock.

    - - The remaining stock is now less than the specified minimum of {last_qty}.

    - Remaining stock: {qty}

    - You are advised to open the product's admin Product Page in order to replenish your inventory.
    -
    -
     
    - - \ No newline at end of file diff --git a/modules/mailalerts/mails/en/productoutofstock.txt b/modules/mailalerts/mails/en/productoutofstock.txt deleted file mode 100644 index 186e85811..000000000 --- a/modules/mailalerts/mails/en/productoutofstock.txt +++ /dev/null @@ -1,18 +0,0 @@ - -[{shop_url}] - -Hi, - -{product} is nearly out of stock. - -The remaining stock is now less than the specified minimum of -{last_qty}. - -REMAINING STOCK: {qty} - -You are advised to open the product's admin Product Page in order to -replenish your inventory. - -{shop_name} [{shop_url}] powered by -PrestaShop(tm) [http://www.prestashop.com/] - diff --git a/modules/mailalerts/mails/index.php b/modules/mailalerts/mails/index.php deleted file mode 100644 index 15749979b..000000000 --- a/modules/mailalerts/mails/index.php +++ /dev/null @@ -1,36 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @version Release: $Revision$ -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/mailalerts/translations/index.php b/modules/mailalerts/translations/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/mailalerts/translations/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/mailalerts/upgrade/install-2.5.php b/modules/mailalerts/upgrade/install-2.5.php deleted file mode 100644 index 440e5512a..000000000 --- a/modules/mailalerts/upgrade/install-2.5.php +++ /dev/null @@ -1,14 +0,0 @@ -execute(' - ALTER TABLE `'._DB_PREFIX_.'mailalert_customer_oos` - ADD `id_lang` INT( 10 ) UNSIGNED NOT NULL , - DROP PRIMARY KEY , - ADD PRIMARY KEY (`id_customer` , `customer_email` , `id_product` , `id_product_attribute` , `id_shop`) - '); -} \ No newline at end of file diff --git a/modules/mailalerts/views/index.php b/modules/mailalerts/views/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/mailalerts/views/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/mailalerts/views/templates/admin/_configure/helpers/form/form.tpl b/modules/mailalerts/views/templates/admin/_configure/helpers/form/form.tpl deleted file mode 100644 index ae83bc00e..000000000 --- a/modules/mailalerts/views/templates/admin/_configure/helpers/form/form.tpl +++ /dev/null @@ -1,52 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -{extends file="helpers/form/form.tpl"} - -{block name="input"} - {if $input.type == 'switch'} - {foreach $input.values as $value} - - - {if isset($input.br) && $input.br}
    {/if} - {if isset($value.p) && $value.p}

    {$value.p}

    {/if} - {/foreach} - {else} - {$smarty.block.parent} - {/if} - -{/block} diff --git a/modules/mailalerts/views/templates/admin/_configure/helpers/form/index.php b/modules/mailalerts/views/templates/admin/_configure/helpers/form/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/mailalerts/views/templates/admin/_configure/helpers/form/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/mailalerts/views/templates/front/index.php b/modules/mailalerts/views/templates/front/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/mailalerts/views/templates/front/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/mailalerts/views/templates/front/mailalerts-account.tpl b/modules/mailalerts/views/templates/front/mailalerts-account.tpl deleted file mode 100644 index a56466789..000000000 --- a/modules/mailalerts/views/templates/front/mailalerts-account.tpl +++ /dev/null @@ -1,85 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - - -{capture name=path}{l s='My account' mod='mailalerts'}{$navigationPipe}{l s='My alerts' mod='mailalerts'}{/capture} -{include file="$tpl_dir./breadcrumb.tpl"} - -
    -

    {l s='My alerts' mod='mailalerts'}

    - {if $mailAlerts} -
    - {foreach from=$mailAlerts item=mailAlert} -
    - -

    {$mailAlert.name|escape:'html':'UTF-8'}

    -
    {$mailAlert.attributes_small|escape:'html':'UTF-8'}
    - -
    - {l s='Remove' mod='mailalerts'} -
    -
    - {/foreach} -
    - {else} -

    {l s='No mail alerts yet.' mod='mailalerts'}

    - {/if} - - -
    \ No newline at end of file diff --git a/modules/mailalerts/views/templates/hook/index.php b/modules/mailalerts/views/templates/hook/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/mailalerts/views/templates/hook/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/mailalerts/views/templates/hook/my-account.tpl b/modules/mailalerts/views/templates/hook/my-account.tpl deleted file mode 100644 index 84b0c8a1e..000000000 --- a/modules/mailalerts/views/templates/hook/my-account.tpl +++ /dev/null @@ -1,31 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -
  • - - - {l s='My alerts' mod='mailalerts'} - -
  • diff --git a/modules/mailalerts/views/templates/hook/product.tpl b/modules/mailalerts/views/templates/hook/product.tpl deleted file mode 100644 index 4fa639c32..000000000 --- a/modules/mailalerts/views/templates/hook/product.tpl +++ /dev/null @@ -1,97 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @version Release: $Revision$ -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - - - {if isset($email) AND $email} -
    - {/if} - {l s='Notify me when available' mod='mailalerts'} - - diff --git a/modules/mailalerts/views/templates/index.php b/modules/mailalerts/views/templates/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/mailalerts/views/templates/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/newsletter/config.xml b/modules/newsletter/config.xml deleted file mode 100755 index 15eceb2dc..000000000 --- a/modules/newsletter/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - newsletter - - - - - - 1 - 0 - - \ No newline at end of file diff --git a/modules/newsletter/index.php b/modules/newsletter/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/newsletter/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/newsletter/logo.gif b/modules/newsletter/logo.gif deleted file mode 100644 index 06dd879dab4c880aaa0593a92b497456037c82c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 983 zcmZ?wbhEHb6krfwXlG!s&DmmIwA-#?pLgN9_?lI&r3amA4*J&|32WXO(7r#aeQR|4 zuGr3Pp3R4Y+l~fw9gk`~8PRnjw&zr8@0t9m7Yb)wte$iEx9^j-<#$@v-s@U%ea_}< z^S9mUS^s$ImdCUAy`8`B<&@nYmK}Ms>gd}|r(f+j|7OG4kGn6t*>?TUo~vK>-~My% z*6YK!e;mF4=j?+Y*Pi^m_WbY7Cm-)V|9| z$)e!GfrCs;G8Hc#9Nf6rUDjM8;=)76wmwOX^cx#CI=i(=@N0Z92n=HHooZ2b<%NLK z@n%k&gbPzPGPCo^S=%r8z^SOwBPfwou%_{0Gnc3xKTD~jlZ&UMoJ&W-#Y5?ga{697 z8YVKabch)2*tFxL!ht?v{frA9Gbd&DvNIQ5x!_pQ{_wDM-kJah1_uU4HXf51cN7|* RvT$%H+&Qz;_;~|^H2?}N&ustz diff --git a/modules/newsletter/logo.png b/modules/newsletter/logo.png deleted file mode 100755 index 4d3b030077a4a5ccd3911f8eec14c1d26bf34f8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1715 zcmV;k22A;hP)#`q#WAr=rYM57o*!P*C1 zNRfv`(N-E>A(ZaYof*%$_s(>?-G-JQ4&3gYGiT2E&bi+?_m05e%lh>5U3-KOHIC!b zt();!WRZWd}DU$ENDOBOaQ`mRLV>;z($0W3ONs276PUThk=oy(aPDf z1VfkhBQgPyo>DOAMUeqO4wAbWjz%i?Y^D1d0>H6t4Sgv4E~Tq& zDHxOq?Pmx81q`Mc7#N27H4JOe{fOl>f`I^XLqTjmbU|f6`^mBd3fYMhamfP@HAi7t z2FW`lkvz8DPJZ%aoU-8}VhMcIk;36WZy_DQ&?V3*h*r&|7Y$tmYE3)h?U*+=Ds^0M ztx2b&qn-4%9PS|fSTu@AKw#^Eb2!@7gO!!zH3{wP0K6)23AFaGkyz4|LK$Ix5z<5?JOiIk`T@Fa)NmI%TD>u*1A%;G&|!-{B)rg zwUra_3IXmV=dM=;wmlpNbQM^p%s_z3F%mGaY2Ru5{C5hE&o7eCcQ<#@Is=>Q%gMQg zE&I>l+s;eUd~R5QXZ;n?iD+C=s+@CQ5Mq#@VXL6ycn5+MSx(5rd#yJql72igEri-B z37LWJe}mY6ya&D4uS=ufoxhHS(}MEdy{#9y?D5dl5bCBT@yoAmNJ-+dV;74TJ?i_( zLP7THlMZQfjLTv9Z2Pl5oSW zPFV%3OOhzNrxN|P1IHt`>uM4X!vR-6hy*M&>^_OTZQWQED@G%w`slG1^ru`&GG_6n zy4gsP!z-7sU?a_MCQ>rWhLvTKL(MI1s#c^|484TwPAP z7Xx$1u<&)01a?dP9JIE!B1yp5ro)?#!pE4p;;mW3^8j+Aq%%E;cWOjw_4*p)`H#`PlJ^R72JvPi5 z3Ic5;fBM~K#7YZs>T*BUzSE49W-M2Q+tT8%Bi~n-jKkt_rmPyMla7=#2UsSnNz1b} zJO&V9=R2N>pyfZ}!Gb{< z2y<8JBkOM+?#5FKiqLjxFo=Pd)iOp4fRB%L*dq-TJ+5hJ<3ccigk zpyR4#1B0(9Da89foX5k(z!)m&oB;jmA?GCHXRO1zlHL9xL%`7)bab{{?-Z0S_ZpGj z3;gpyKi%hsgfzV4djdhh*gXb*cXRO1zjt?<{akU1vz-mGJeK7tm}BxOsfjd>7d?{1|pNvM*2PNo+!@;wj4Z*CDBPz zw&v|4a`2pG{ET&i)`0OD<(0^GMd>gy+~tAv8xi-7X}Q1~ht6R9*obsk_dp5iA1v`J zfXDc;VX5={l9}L^6`-@;`j=jWEdp7;jk0|$ac@W_5=Ypq4}kl~zTdjBsB#L5?+(kV zaMQld^x+sw=S@b}l?3)to35d)nLFgR*Ir-7JjTc`?)O~m3CsHk36t^1?k$4%NjTh> zA&*(bVU$fOk^n6snQ)%Q)lmRo(+L`V3V?8KyzpU5uASbohD~7FzCpk(;oi{BdvFIA z+ar#HPm1{&_D34YRh@xrcM5=d9LCTH;?6GSV(%z9;9vg -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class Newsletter extends Module -{ - private $_postErrors = array(); - private $_html = ''; - private $_postSucess; - - public function __construct() - { - $this->name = 'newsletter'; - $this->tab = 'administration'; - $this->version = 2.0; - $this->author = 'PrestaShop'; - $this->need_instance = 0; - - $this->bootstrap = true; - parent::__construct(); - - $this->displayName = $this->l('Newsletter'); - $this->description = $this->l('Generates a .CSV file for mass mailings'); - - if ($this->id) - { - $this->_file = 'export_'.Configuration::get('PS_NEWSLETTER_RAND').'.csv'; - $this->_postValid = array(); - - // Getting data... - $_countries = Country::getCountries($this->context->language->id); - - // ...formatting array - $countries[0] = $this->l('All countries'); - foreach ($_countries as $country) - $countries[$country['id_country']] = $country['name']; - - // And filling fields to show ! - $this->_fieldsExport = array( - 'COUNTRY' => array( - 'title' => $this->l('Customers\' country'), - 'desc' => $this->l('Operate a filter on customers\' country.'), - 'type' => 'select', - 'value' => $countries, - 'value_default' => 0 - ), - 'SUSCRIBERS' => array( - 'title' => $this->l('Newsletter subscribers'), - 'desc' => $this->l('Filter newsletter subscribers.'), - 'type' => 'select', - 'value' => array(0 => $this->l('All customers'), 2 => $this->l('Subscribers'), 1 => $this->l('Non-subscribers')), - 'value_default' => 2 - ), - 'OPTIN' => array( - 'title' => $this->l('Opted-in subscribers'), - 'desc' => $this->l('Filter opted-in subscribers.'), - 'type' => 'select', - 'value' => array(0 => $this->l('All customers'), 2 => $this->l('Subscribers'), 1 => $this->l('Non-subscribers')), - 'value_default' => 0 - ), - ); - } - } - - public function install() - { - return (parent::install() AND Configuration::updateValue('PS_NEWSLETTER_RAND', rand().rand())); - } - - private function _postProcess() - { - if (Tools::isSubmit('submitExport') && $action = Tools::getValue('action')) - { - if ($action == 'customers') - $result = $this->_getCustomers(); - else - { - if (!Module::isInstalled('blocknewsletter')) - $this->_html .= $this->displayError('The module "blocknewsletter" is required for this feature'); - else - $result = $this->_getBlockNewsletter(); - } - if (!$nb = (int)(Db::getInstance(_PS_USE_SQL_SLAVE_)->NumRows())) - $this->_html .= $this->displayError($this->l('No customers found with these filters!')); - elseif ($fd = @fopen(dirname(__FILE__).'/'.strval(preg_replace('#\.{2,}#', '.', $_POST['action'])).'_'.$this->_file, 'w')) - { - foreach ($result AS $tab) - $this->_my_fputcsv($fd, $tab); - fclose($fd); - $this->_html .= $this->displayConfirmation( - sprintf($this->l('The .CSV file has been successfully exported. (%d customers found)'), $nb).'
    - '.$this->l('Download the file').' '.$this->_file.' -
    -
      -
    1. '.$this->l('WARNING: If opening this .csv file with Excel, remember to choose UTF-8 encoding or you may see strange characters.').'
    2. -
    '); - } - else - $this->_html .= $this->displayError($this->l('Error: cannot write').' '.dirname(__FILE__).'/'.strval($_POST['action']).'_'.$this->_file.' !'); - } - } - - private function _getCustomers() - { - $dbquery = new DbQuery(); - $dbquery->select('c.`id_customer`, c.`lastname`, c.`firstname`, c.`email`, c.`ip_registration_newsletter`, c.`newsletter_date_add`') - ->from('customer', 'c') - ->groupBy('c.`email`'); - - if (Tools::getValue('SUSCRIBERS')) - $dbquery->where('c.`newsletter` = '.((int)Tools::getValue('SUSCRIBERS') - 1)); - - if (Tools::getValue('OPTIN')) - $dbquery->where('c.`optin` = '.((int)Tools::getValue('OPTIN') - 1)); - - if (Tools::getValue('COUNTRY')) - $dbquery->where('(SELECT COUNT(a.`id_address`) as nb_country - FROM `'._DB_PREFIX_.'address` a - WHERE a.deleted = 0 - AND a.`id_customer` = c.`id_customer` - AND a.`id_country` = '.(int)Tools::getValue('COUNTRY').') >= 1'); - - if (Context::getContext()->cookie->shopContext) - $dbquery->where('c.id_shop = '.(int)Context::getContext()->shop->id); - - $rq = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($dbquery->build()); - - $header = array('id_customer', 'lastname', 'firstname', 'email', 'ip_address', 'newsletter_date_add'); - $result = (is_array($rq) ? array_merge(array($header), $rq) : $header); - return $result; - } - - private function _getBlockNewsletter() - { - $rqSql = 'SELECT `id`, `email`, `newsletter_date_add`, `ip_registration_newsletter` - FROM `'._DB_PREFIX_.'newsletter` - WHERE `active` = 1'; - - if (Context::getContext()->cookie->shopContext) - $rqSql .= ' AND `id_shop` = '.(int)Context::getContext()->shop->id; - - $rq = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($rqSql); - - $header = array('id_customer', 'email', 'newsletter_date_add', 'ip_address', 'http_referer'); - $result = (is_array($rq) ? array_merge(array($header), $rq) : $header); - return $result; - } - - private function _my_fputcsv($fd, $array) - { - $line = implode(';', $array); - $line .= "\n"; - if (!fwrite($fd, $line, 4096)) - $this->_postErrors[] = $this->l('Error: cannot write').' '.dirname(__FILE__).'/'.$this->_file.' !'; - } - - private function _displayForm() - { - $this->_displayFormExport(); - } - - public function getContent() - { - $this->_html .= ''; - - if (!empty($_POST)) - $this->_html .= $this->_postProcess(); - $this->_html .= $this->renderForm(); - - return $this->_html; - } - - public function renderForm() - { - - // Getting data... - $_countries = Country::getCountries($this->context->language->id); - - // ...formatting array - $countries[0] = array('id' => 0, 'name' => $this->l('All countries')); - foreach ($_countries as $country) - $countries[] = array('id' => $country['id_country'], 'name' => $country['name']); - - // And filling fields to show ! - $this->_fieldsExport = array( - 'COUNTRY' => array( - 'title' => $this->l('Customers\' country'), - 'desc' => $this->l('Operate a filter on customers\' country.'), - 'type' => 'select', - 'value' => $countries, - 'value_default' => 0 - ), - 'SUSCRIBERS' => array( - 'title' => $this->l('Newsletter subscribers'), - 'desc' => $this->l('Filter newsletter subscribers.'), - 'type' => 'select', - 'value' => array(0 => $this->l('All customers'), 2 => $this->l('Subscribers'), 1 => $this->l('Non-subscribers')), - 'value_default' => 2 - ), - 'OPTIN' => array( - 'title' => $this->l('Opted-in subscribers'), - 'desc' => $this->l('Filter opted-in subscribers.'), - 'type' => 'select', - 'value' => array(0 => $this->l('All customers'), 2 => $this->l('Subscribers'), 1 => $this->l('Non-subscribers')), - 'value_default' => 0 - ), - ); - - $fields_form_1 = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Export Newsletter Subscribers'), - 'icon' => 'icon-envelope' - ), - 'desc' => array( - array('text' => $this->l('Generate a .CSV file based on BlockNewsletter subscribers data. Only subscribers without an account on the shop will be exported.')) - ), - 'submit' => array( - 'title' => $this->l('Export .CSV file'), - 'class' => 'btn btn-default', - 'name' => 'submitExport', - ) - ), - ); - - $fields_form_2 = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Export customers'), - 'icon' => 'icon-envelope' - ), - 'input' => array( - array( - 'type' => 'select', - 'label' => $this->l('Customers\' country :'), - 'desc' => $this->l('Operate a filter on customers\' country.'), - 'name' => 'COUNTRY', - 'required' => false, - 'default_value' => (int)$this->context->country->id, - 'options' => array( - 'query' => $countries, - 'id' => 'id', - 'name' => 'name', - ) - ), - array( - 'type' => 'select', - 'label' => $this->l('Newsletter subscribers :'), - 'desc' => $this->l('Filter newsletter subscribers.'), - 'name' => 'SUSCRIBERS', - 'required' => false, - 'default_value' => (int)$this->context->country->id, - 'options' => array( - 'query' => array(array('id' => 0, 'name' => $this->l('All customers')), array('id' => 2, 'name' => $this->l('Subscribers')), array('id' => 1, 'name' => $this->l('Non-subscribers'))), - 'id' => 'id', - 'name' => 'name', - ) - ), - array( - 'type' => 'select', - 'label' => $this->l('Opted-in subscribers :'), - 'desc' => $this->l('Filter opted-in subscribers.'), - 'name' => 'OPTIN', - 'required' => false, - 'default_value' => (int)$this->context->country->id, - 'options' => array( - 'query' => array(array('id' => 0, 'name' => $this->l('All customers')), array('id' => 2, 'name' => $this->l('Subscribers')), array('id' => 1, 'name' => $this->l('Non-subscribers'))), - 'id' => 'id', - 'name' => 'name', - ) - ), - array( - 'type' => 'hidden', - 'name' => 'action', - ) - ), - 'submit' => array( - 'title' => $this->l('Export .CSV file'), - 'class' => 'btn btn-default', - 'name' => 'submitExport', - ) - ), - ); - - $helper = new HelperForm(); - $helper->show_toolbar = false; - $helper->table = $this->table; - $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); - $helper->default_form_language = $lang->id; - $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; - $this->fields_form = array(); - $helper->id = (int)Tools::getValue('id_carrier'); - $helper->identifier = $this->identifier; - $helper->submit_action = 'btnSubmit'; - $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->tpl_vars = array( - 'fields_value' => $this->getConfigFieldsValues(), - 'languages' => $this->context->controller->getLanguages(), - 'id_language' => $this->context->language->id - ); - - return $helper->generateForm(array($fields_form_1, $fields_form_2)); - } - - public function getConfigFieldsValues() - { - return array( - 'COUNTRY' => Tools::getValue('COUNTRY'), - 'SUSCRIBERS' => Tools::getValue('SUSCRIBERS'), - 'OPTIN' => Tools::getValue('OPTIN'), - 'action' => 'customers', - ); - } - -} - diff --git a/modules/newsletter/translations/index.php b/modules/newsletter/translations/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/newsletter/translations/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/productcomments/ProductComment.php b/modules/productcomments/ProductComment.php deleted file mode 100644 index 5887357b8..000000000 --- a/modules/productcomments/ProductComment.php +++ /dev/null @@ -1,406 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class ProductComment extends ObjectModel -{ - public $id; - - /** @var integer Product's id */ - public $id_product; - - /** @var integer Customer's id */ - public $id_customer; - - /** @var integer Guest's id */ - public $id_guest; - - /** @var integer Customer name */ - public $customer_name; - - /** @var string Title */ - public $title; - - /** @var string Content */ - public $content; - - /** @var integer Grade */ - public $grade; - - /** @var boolean Validate */ - public $validate = 0; - - public $deleted = 0; - - /** @var string Object creation date */ - public $date_add; - - /** - * @see ObjectModel::$definition - */ - public static $definition = array( - 'table' => 'product_comment', - 'primary' => 'id_product_comment', - 'fields' => array( - 'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), - 'id_customer' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), - 'id_guest' => array('type' => self::TYPE_INT), - 'customer_name' => array('type' => self::TYPE_STRING), - 'title' => array('type' => self::TYPE_STRING), - 'content' => array('type' => self::TYPE_STRING, 'validate' => 'isMessage', 'size' => 65535, 'required' => true), - 'grade' => array('type' => self::TYPE_FLOAT, 'validate' => 'isFloat'), - 'validate' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'), - 'deleted' => array('type' => self::TYPE_BOOL), - 'date_add' => array('type' => self::TYPE_DATE), - ) - ); - - /** - * Get comments by IdProduct - * - * @return array Comments - */ - public static function getByProduct($id_product, $p = 1, $n = null, $id_customer = null) - { - if (!Validate::isUnsignedId($id_product)) - die(Tools::displayError()); - $validate = Configuration::get('PRODUCT_COMMENTS_MODERATE'); - $p = (int)$p; - $n = (int)$n; - if ($p <= 1) - $p = 1; - if ($n != null && $n <= 0) - $n = 5; - - $cache_id = 'ProductComment::getByProduct_'.(int)$id_product.'-'.(int)$p.'-'.(int)$n.'-'.(int)$id_customer.'-'.(bool)$validate; - if (!Cache::isStored($cache_id)) - { - $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' - SELECT pc.`id_product_comment`, - (SELECT count(*) FROM `'._DB_PREFIX_.'product_comment_usefulness` pcu WHERE pcu.`id_product_comment` = pc.`id_product_comment` AND pcu.`usefulness` = 1) as total_useful, - (SELECT count(*) FROM `'._DB_PREFIX_.'product_comment_usefulness` pcu WHERE pcu.`id_product_comment` = pc.`id_product_comment`) as total_advice, '. - ((int)$id_customer ? '(SELECT count(*) FROM `'._DB_PREFIX_.'product_comment_usefulness` pcuc WHERE pcuc.`id_product_comment` = pc.`id_product_comment` AND pcuc.id_customer = '.(int)$id_customer.') as customer_advice, ' : ''). - ((int)$id_customer ? '(SELECT count(*) FROM `'._DB_PREFIX_.'product_comment_report` pcrc WHERE pcrc.`id_product_comment` = pc.`id_product_comment` AND pcrc.id_customer = '.(int)$id_customer.') as customer_report, ' : '').' - IF(c.id_customer, CONCAT(c.`firstname`, \' \', LEFT(c.`lastname`, 1)), pc.customer_name) customer_name, pc.`content`, pc.`grade`, pc.`date_add`, pc.title - FROM `'._DB_PREFIX_.'product_comment` pc - LEFT JOIN `'._DB_PREFIX_.'customer` c ON c.`id_customer` = pc.`id_customer` - WHERE pc.`id_product` = '.(int)($id_product).($validate == '1' ? ' AND pc.`validate` = 1' : '').' - ORDER BY pc.`date_add` DESC - '.($n ? 'LIMIT '.(int)(($p - 1) * $n).', '.(int)($n) : '')); - Cache::store($cache_id, $result); - } - return Cache::retrieve($cache_id); - } - - /** - * Return customer's comment - * - * @return arrayComments - */ - public static function getByCustomer($id_product, $id_customer, $get_last = false, $id_guest = false) - { - $cache_id = 'ProductComment::getByCustomer_'.(int)$id_product.'-'.(int)$id_customer.'-'.(bool)$get_last.'-'.(int)$id_guest; - if (!Cache::isStored($cache_id)) - { - $results = Db::getInstance()->executeS(' - SELECT * - FROM `'._DB_PREFIX_.'product_comment` pc - WHERE pc.`id_product` = '.(int)$id_product.' - AND '.(!$id_guest ? 'pc.`id_customer` = '.(int)$id_customer : 'pc.`id_guest` = '.(int)$id_guest).' - ORDER BY pc.`date_add` DESC ' - .($get_last ? 'LIMIT 1' : '') - ); - - if ($get_last && count($results)) - $results = array_shift($results); - - Cache::store($cache_id, $results); - } - return Cache::retrieve($cache_id); - } - - /** - * Get Grade By product - * - * @return array Grades - */ - public static function getGradeByProduct($id_product, $id_lang) - { - if (!Validate::isUnsignedId($id_product) || - !Validate::isUnsignedId($id_lang)) - die(Tools::displayError()); - $validate = Configuration::get('PRODUCT_COMMENTS_MODERATE'); - - - return (Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' - SELECT pc.`id_product_comment`, pcg.`grade`, pccl.`name`, pcc.`id_product_comment_criterion` - FROM `'._DB_PREFIX_.'product_comment` pc - LEFT JOIN `'._DB_PREFIX_.'product_comment_grade` pcg ON (pcg.`id_product_comment` = pc.`id_product_comment`) - LEFT JOIN `'._DB_PREFIX_.'product_comment_criterion` pcc ON (pcc.`id_product_comment_criterion` = pcg.`id_product_comment_criterion`) - LEFT JOIN `'._DB_PREFIX_.'product_comment_criterion_lang` pccl ON (pccl.`id_product_comment_criterion` = pcg.`id_product_comment_criterion`) - WHERE pc.`id_product` = '.(int)$id_product.' - AND pccl.`id_lang` = '.(int)$id_lang. - ($validate == '1' ? ' AND pc.`validate` = 1' : ''))); - } - - public static function getAverageGrade($id_product) - { - $validate = Configuration::get('PRODUCT_COMMENTS_MODERATE'); - - return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' - SELECT (SUM(pc.`grade`) / COUNT(pc.`grade`)) AS grade - FROM `'._DB_PREFIX_.'product_comment` pc - WHERE pc.`id_product` = '.(int)$id_product.' - AND pc.`deleted` = 0'. - ($validate == '1' ? ' AND pc.`validate` = 1' : '')); - } - - public static function getAveragesByProduct($id_product, $id_lang) - { - /* Get all grades */ - $grades = ProductComment::getGradeByProduct((int)$id_product, (int)$id_lang); - $total = ProductComment::getGradedCommentNumber((int)$id_product); - if (!count($grades) || (!$total)) - return array(); - - /* Addition grades for each criterion */ - $criterionsGradeTotal = array(); - $count_grades = count($grades); - for ($i = 0; $i < $count_grades; ++$i) - if (array_key_exists($grades[$i]['id_product_comment_criterion'], $criterionsGradeTotal) === false) - $criterionsGradeTotal[$grades[$i]['id_product_comment_criterion']] = (int)($grades[$i]['grade']); - else - $criterionsGradeTotal[$grades[$i]['id_product_comment_criterion']] += (int)($grades[$i]['grade']); - - /* Finally compute the averages */ - $averages = array(); - foreach ($criterionsGradeTotal as $key => $criterionGradeTotal) - $averages[(int)($key)] = (int)($total) ? ((int)($criterionGradeTotal) / (int)($total)) : 0; - return $averages; - } - - /** - * Return number of comments and average grade by products - * - * @return array Info - */ - public static function getCommentNumber($id_product) - { - if (!Validate::isUnsignedId($id_product)) - die(Tools::displayError()); - $validate = (int)Configuration::get('PRODUCT_COMMENTS_MODERATE'); - $cache_id = 'ProductComment::getCommentNumber_'.(int)$id_product.'-'.$validate; - if (!Cache::isStored($cache_id)) - { - $result = (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' - SELECT COUNT(`id_product_comment`) AS "nbr" - FROM `'._DB_PREFIX_.'product_comment` pc - WHERE `id_product` = '.(int)($id_product).($validate == '1' ? ' AND `validate` = 1' : '')); - Cache::store($cache_id, $result); - } - return Cache::retrieve($cache_id); - } - - /** - * Return number of comments and average grade by products - * - * @return array Info - */ - public static function getGradedCommentNumber($id_product) - { - if (!Validate::isUnsignedId($id_product)) - die(Tools::displayError()); - $validate = (int)Configuration::get('PRODUCT_COMMENTS_MODERATE'); - - $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' - SELECT COUNT(pc.`id_product`) AS nbr - FROM `'._DB_PREFIX_.'product_comment` pc - WHERE `id_product` = '.(int)($id_product).($validate == '1' ? ' AND `validate` = 1' : '').' - AND `grade` > 0'); - return (int)($result['nbr']); - } - - /** - * Get comments by Validation - * - * @return array Comments - */ - public static function getByValidate($validate = '0', $deleted = false) - { - return (Db::getInstance()->executeS(' - SELECT pc.`id_product_comment`, pc.`id_product`, IF(c.id_customer, CONCAT(c.`firstname`, \' \', c.`lastname`), pc.customer_name) customer_name, pc.`content`, pc.`grade`, pc.`date_add`, pl.`name` - FROM `'._DB_PREFIX_.'product_comment` pc - LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = pc.`id_customer`) - LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = pc.`id_product` AND pl.`id_lang` = '.(int)Context::getContext()->language->id.Shop::addSqlRestrictionOnLang('pl').') - WHERE pc.`validate` = '.(int)$validate.' - ORDER BY pc.`date_add` DESC')); - } - - /** - * Get all comments - * - * @return array Comments - */ - public static function getAll() - { - return (Db::getInstance()->executeS(' - SELECT pc.`id_product_comment`, pc.`id_product`, IF(c.id_customer, CONCAT(c.`firstname`, \' \', c.`lastname`), pc.customer_name) customer_name, pc.`content`, pc.`grade`, pc.`date_add`, pl.`name` - FROM `'._DB_PREFIX_.'product_comment` pc - LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = pc.`id_customer`) - LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = pc.`id_product` AND pl.`id_lang` = '.(int)Context::getContext()->language->id.Shop::addSqlRestrictionOnLang('pl').') - ORDER BY pc.`date_add` DESC')); - } - - /** - * Validate a comment - * - * @return boolean succeed - */ - public function validate($validate = '1') - { - if (!Validate::isUnsignedId($this->id)) - die(Tools::displayError()); - return (Db::getInstance()->execute(' - UPDATE `'._DB_PREFIX_.'product_comment` SET - `validate` = '.(int)$validate.' - WHERE `id_product_comment` = '.(int)$this->id)); - } - - /** - * Delete Grades - * - * @return boolean succeed - */ - public static function deleteGrades($id_product_comment) - { - if (!Validate::isUnsignedId($id_product_comment)) - die(Tools::displayError()); - return (Db::getInstance()->execute(' - DELETE FROM `'._DB_PREFIX_.'product_comment_grade` - WHERE `id_product_comment` = '.(int)$id_product_comment)); - } - - /** - * Delete Reports - * - * @return boolean succeed - */ - public static function deleteReports($id_product_comment) - { - if (!Validate::isUnsignedId($id_product_comment)) - die(Tools::displayError()); - return (Db::getInstance()->execute(' - DELETE FROM `'._DB_PREFIX_.'product_comment_report` - WHERE `id_product_comment` = '.(int)$id_product_comment)); - } - - /** - * Delete usefulness - * - * @return boolean succeed - */ - public static function deleteUsefulness($id_product_comment) - { - if (!Validate::isUnsignedId($id_product_comment)) - die(Tools::displayError()); - - return (Db::getInstance()->execute(' - DELETE FROM `'._DB_PREFIX_.'product_comment_usefulness` - WHERE `id_product_comment` = '.(int)$id_product_comment)); - } - - /** - * Report comment - * - * @return boolean - */ - public static function reportComment($id_product_comment, $id_customer) - { - return (Db::getInstance()->execute(' - INSERT INTO `'._DB_PREFIX_.'product_comment_report` (`id_product_comment`, `id_customer`) - VALUES ('.(int)$id_product_comment.', '.(int)$id_customer.')')); - } - - /** - * Comment already report - * - * @return boolean - */ - public static function isAlreadyReport($id_product_comment, $id_customer) - { - return (bool)Db::getInstance()->getValue(' - SELECT COUNT(*) - FROM `'._DB_PREFIX_.'product_comment_report` - WHERE `id_customer` = '.(int)$id_customer.' - AND `id_product_comment` = '.(int)$id_product_comment); - } - - /** - * Set comment usefulness - * - * @return boolean - */ - public static function setCommentUsefulness($id_product_comment, $usefulness, $id_customer) - { - return (Db::getInstance()->execute(' - INSERT INTO `'._DB_PREFIX_.'product_comment_usefulness` (`id_product_comment`, `usefulness`, `id_customer`) - VALUES ('.(int)$id_product_comment.', '.(int)$usefulness.', '.(int)$id_customer.')')); - } - - /** - * Usefulness already set - * - * @return boolean - */ - public static function isAlreadyUsefulness($id_product_comment, $id_customer) - { - return (bool)Db::getInstance()->getValue(' - SELECT COUNT(*) - FROM `'._DB_PREFIX_.'product_comment_usefulness` - WHERE `id_customer` = '.(int)$id_customer.' - AND `id_product_comment` = '.(int)$id_product_comment); - } - - /** - * Get reported comments - * - * @return array Comments - */ - public static function getReportedComments() - { - return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' - SELECT DISTINCT(pc.`id_product_comment`), pc.`id_product`, IF(c.id_customer, CONCAT(c.`firstname`, \' \', c.`lastname`), pc.customer_name) customer_name, pc.`content`, pc.`grade`, pc.`date_add`, pl.`name` - FROM `'._DB_PREFIX_.'product_comment_report` pcr - LEFT JOIN `'._DB_PREFIX_.'product_comment` pc - ON pcr.id_product_comment = pc.id_product_comment - LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = pc.`id_customer`) - LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = pc.`id_product` AND pl.`id_lang` = '.(int)Context::getContext()->language->id.' AND pl.`id_lang` = '.(int)Context::getContext()->language->id.Shop::addSqlRestrictionOnLang('pl').') - ORDER BY pc.`date_add` DESC'); - } - -}; diff --git a/modules/productcomments/ProductCommentCriterion.php b/modules/productcomments/ProductCommentCriterion.php deleted file mode 100644 index e46775c0c..000000000 --- a/modules/productcomments/ProductCommentCriterion.php +++ /dev/null @@ -1,260 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -class ProductCommentCriterion extends ObjectModel -{ - public $id; - public $id_product_comment_criterion_type; - - public $name; - public $active = true; - - /** - * @see ObjectModel::$definition - */ - public static $definition = array( - 'table' => 'product_comment_criterion', - 'primary' => 'id_product_comment_criterion', - 'multilang' => true, - 'fields' => array( - 'id_product_comment_criterion_type' => array('type' => self::TYPE_INT), - 'active' => array('type' => self::TYPE_BOOL), - // Lang fields - 'name' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'required' => true, 'size' => 128), - ) - ); - - public function delete() - { - if (!parent::delete()) - return false; - if ($this->id_product_comment_criterion_type == 2) - { - if (!Db::getInstance()->execute(' - DELETE FROM '._DB_PREFIX_.'product_comment_criterion_category - WHERE id_product_comment_criterion='.(int)$this->id)) - return false; - } - elseif ($this->id_product_comment_criterion_type == 3) - { - if (!Db::getInstance()->execute(' - DELETE FROM '._DB_PREFIX_.'product_comment_criterion_product - WHERE id_product_comment_criterion='.(int)$this->id)) - return false; - } - - return Db::getInstance()->execute(' - DELETE FROM `'._DB_PREFIX_.'product_comment_grade` - WHERE `id_product_comment_criterion` = '.(int)$this->id); - } - - public function update($nullValues = false) - { - $previousUpdate = new self((int)$this->id); - if (!parent::update($nullValues)) - return false; - if ($previousUpdate->id_product_comment_criterion_type != $this->id_product_comment_criterion_type) - { - if ($previousUpdate->id_product_comment_criterion_type == 2) - return Db::getInstance()->execute(' - DELETE FROM '._DB_PREFIX_.'product_comment_criterion_category - WHERE id_product_comment_criterion = '.(int)$previousUpdate->id); - elseif ($previousUpdate->id_product_comment_criterion_type == 3) - return Db::getInstance()->execute(' - DELETE FROM '._DB_PREFIX_.'product_comment_criterion_product - WHERE id_product_comment_criterion = '.(int)$previousUpdate->id); - } - return true; - } - - /** - * Link a Comment Criterion to a product - * - * @return boolean succeed - */ - public function addProduct($id_product) - { - if (!Validate::isUnsignedId($id_product)) - die(Tools::displayError()); - return Db::getInstance()->execute(' - INSERT INTO `'._DB_PREFIX_.'product_comment_criterion_product` (`id_product_comment_criterion`, `id_product`) - VALUES('.(int)$this->id.','.(int)$id_product.') - '); - } - - /** - * Link a Comment Criterion to a category - * - * @return boolean succeed - */ - public function addCategory($id_category) - { - if (!Validate::isUnsignedId($id_category)) - die(Tools::displayError()); - return Db::getInstance()->execute(' - INSERT INTO `'._DB_PREFIX_.'product_comment_criterion_category` (`id_product_comment_criterion`, `id_category`) - VALUES('.(int)$this->id.','.(int)$id_category.') - '); - } - - /** - * Add grade to a criterion - * - * @return boolean succeed - */ - public function addGrade($id_product_comment, $grade) - { - if (!Validate::isUnsignedId($id_product_comment)) - die(Tools::displayError()); - if ($grade < 0) - $grade = 0; - elseif ($grade > 10) - $grade = 10; - return (Db::getInstance()->execute(' - INSERT INTO `'._DB_PREFIX_.'product_comment_grade` - (`id_product_comment`, `id_product_comment_criterion`, `grade`) VALUES( - '.(int)($id_product_comment).', - '.(int)$this->id.', - '.(int)($grade).')')); - } - - /** - * Get criterion by Product - * - * @return array Criterion - */ - public static function getByProduct($id_product, $id_lang) - { - if (!Validate::isUnsignedId($id_product) || - !Validate::isUnsignedId($id_lang)) - die(Tools::displayError()); - $alias = 'p'; - $table = ''; - // check if version > 1.5 to add shop association - if (version_compare(_PS_VERSION_, '1.5', '>')) - { - $table = '_shop'; - $alias = 'ps'; - } - - $cache_id = 'ProductCommentCriterion::getByProduct_'.(int)$id_product.'-'.(int)$id_lang; - if (!Cache::isStored($cache_id)) - { - $result = Db::getInstance()->executeS(' - SELECT pcc.`id_product_comment_criterion`, pccl.`name` - FROM `'._DB_PREFIX_.'product_comment_criterion` pcc - LEFT JOIN `'._DB_PREFIX_.'product_comment_criterion_lang` pccl - ON (pcc.id_product_comment_criterion = pccl.id_product_comment_criterion) - LEFT JOIN `'._DB_PREFIX_.'product_comment_criterion_product` pccp - ON (pcc.`id_product_comment_criterion` = pccp.`id_product_comment_criterion` AND pccp.`id_product` = '.(int)$id_product.') - LEFT JOIN `'._DB_PREFIX_.'product_comment_criterion_category` pccc - ON (pcc.`id_product_comment_criterion` = pccc.`id_product_comment_criterion`) - LEFT JOIN `'._DB_PREFIX_.'product'.$table.'` '.$alias.' - ON ('.$alias.'.id_category_default = pccc.id_category AND '.$alias.'.id_product = '.(int)$id_product.') - WHERE pccl.`id_lang` = '.(int)($id_lang).' - AND ( - pccp.id_product IS NOT NULL - OR ps.id_product IS NOT NULL - OR pcc.id_product_comment_criterion_type = 1 - ) - AND pcc.active = 1 - GROUP BY pcc.id_product_comment_criterion - '); - Cache::store($cache_id, $result); - } - return Cache::retrieve($cache_id); - } - - /** - * Get Criterions - * - * @return array Criterions - */ - public static function getCriterions($id_lang, $type = false, $active = false) - { - if (!Validate::isUnsignedId($id_lang)) - die(Tools::displayError()); - return Db::getInstance()->executeS(' - SELECT pcc.`id_product_comment_criterion`, pcc.id_product_comment_criterion_type, pccl.`name`, pcc.active - FROM `'._DB_PREFIX_.'product_comment_criterion` pcc - JOIN `'._DB_PREFIX_.'product_comment_criterion_lang` pccl ON (pcc.id_product_comment_criterion = pccl.id_product_comment_criterion) - WHERE pccl.`id_lang` = '.(int)$id_lang.($active ? ' AND active = 1' : '').($type ? ' AND id_product_comment_criterion_type = '.(int)$type : '').' - ORDER BY pccl.`name` ASC - '); - } - - public function getProducts() - { - $res = Db::getInstance()->executeS(' - SELECT pccp.id_product, pccp.id_product_comment_criterion - FROM `'._DB_PREFIX_.'product_comment_criterion_product` pccp - WHERE pccp.id_product_comment_criterion = '.(int)$this->id); - $products = array(); - if ($res) - foreach ($res AS $row) - $products[] = (int)$row['id_product']; - return $products; - } - - public function getCategories() - { - $res = Db::getInstance()->executeS(' - SELECT pccc.id_category, pccc.id_product_comment_criterion - FROM `'._DB_PREFIX_.'product_comment_criterion_category` pccc - WHERE pccc.id_product_comment_criterion = '.(int)$this->id); - $criterions = array(); - if ($res) - foreach ($res AS $row) - $criterions[] = (int)$row['id_category']; - return $criterions; - } - - public function deleteCategories() - { - return Db::getInstance()->execute(' - DELETE FROM `'._DB_PREFIX_.'product_comment_criterion_category` - WHERE `id_product_comment_criterion` = '.(int)$this->id); - } - - public function deleteProducts() - { - return Db::getInstance()->execute(' - DELETE FROM `'._DB_PREFIX_.'product_comment_criterion_product` - WHERE `id_product_comment_criterion` = '.(int)$this->id); - } - - public static function getTypes() - { - // Instance of module class for translations - $module = new ProductComments(); - - return array( - 1 => $module->l('Valid for the entire catalog', 'ProductCommentCriterion'), - 2 => $module->l('Restricted to some categories', 'ProductCommentCriterion'), - 3 => $module->l('Restricted to some products', 'ProductCommentCriterion') - ); - } -} diff --git a/modules/productcomments/ProductCriterion.php b/modules/productcomments/ProductCriterion.php deleted file mode 100644 index 2254d3911..000000000 --- a/modules/productcomments/ProductCriterion.php +++ /dev/null @@ -1,174 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -class ProductCommentCriterion -{ - /** - * Add a Comment Criterion - * - * @return boolean succeed - */ - public static function add($id_lang, $name) - { - if (!Validate::isUnsignedId($id_lang) || - !Validate::isMessage($name)) - die(Tools::displayError()); - return (Db::getInstance()->execute(' - INSERT INTO `'._DB_PREFIX_.'product_comment_criterion` - (`id_lang`, `name`) VALUES( - '.(int)($id_lang).', - \''.pSQL($name).'\')')); - } - - /** - * Link a Comment Criterion to a product - * - * @return boolean succeed - */ - public static function addToProduct($id_product_comment_criterion, $id_product) - { - if (!Validate::isUnsignedId($id_product_comment_criterion) || - !Validate::isUnsignedId($id_product)) - die(Tools::displayError()); - return (Db::getInstance()->execute(' - INSERT INTO `'._DB_PREFIX_.'product_comment_criterion_product` - (`id_product_comment_criterion`, `id_product`) VALUES( - '.(int)($id_product_comment_criterion).', - '.(int)($id_product).')')); - } - - /** - * Add grade to a criterion - * - * @return boolean succeed - */ - public static function addGrade($id_product_comment, $id_product_comment_criterion, $grade) - { - if (!Validate::isUnsignedId($id_product_comment) || - !Validate::isUnsignedId($id_product_comment_criterion)) - die(Tools::displayError()); - if ($grade < 0) - $grade = 0; - else if ($grade > 10) - $grade = 10; - return (Db::getInstance()->execute(' - INSERT INTO `'._DB_PREFIX_.'product_comment_grade` - (`id_product_comment`, `id_product_comment_criterion`, `grade`) VALUES( - '.(int)($id_product_comment).', - '.(int)($id_product_comment_criterion).', - '.(int)($grade).')')); - } - - /** - * Update criterion - * - * @return boolean succeed - */ - public static function update($id_product_comment_criterion, $id_lang, $name) - { - if (!Validate::isUnsignedId($id_product_comment_criterion) || - !Validate::isUnsignedId($id_lang) || - !Validate::isMessage($name)) - die(Tools::displayError()); - return (Db::getInstance()->execute(' - UPDATE `'._DB_PREFIX_.'product_comment_criterion` SET - `name` = \''.pSQL($name).'\' - WHERE `id_product_comment_criterion` = '.(int)($id_product_comment_criterion).' AND - `id_lang` = '.(int)($id_lang))); - } - - /** - * Get criterion by Product - * - * @return array Criterion - */ - public static function getByProduct($id_product, $id_lang) - { - if (!Validate::isUnsignedId($id_product) || - !Validate::isUnsignedId($id_lang)) - die(Tools::displayError()); - return (Db::getInstance()->executeS(' - SELECT pcc.`id_product_comment_criterion`, pcc.`name` - FROM `'._DB_PREFIX_.'product_comment_criterion` pcc - INNER JOIN `'._DB_PREFIX_.'product_comment_criterion_product` pccp ON pcc.`id_product_comment_criterion` = pccp.`id_product_comment_criterion` - WHERE pccp.`id_product` = '.(int)($id_product).' AND - pcc.`id_lang` = '.(int)($id_lang))); - } - - /** - * Get Criterions - * - * @return array Criterions - */ - public static function get($id_lang) - { - if (!Validate::isUnsignedId($id_lang)) - die(Tools::displayError()); - return (Db::getInstance()->executeS(' - SELECT pcc.`id_product_comment_criterion`, pcc.`name` - FROM `'._DB_PREFIX_.'product_comment_criterion` pcc - WHERE pcc.`id_lang` = '.(int)($id_lang).' - ORDER BY pcc.`name` ASC')); - } - - /** - * Delete product criterion by product - * - * @return boolean succeed - */ - public static function deleteByProduct($id_product) - { - if (!Validate::isUnsignedId($id_product)) - die(Tools::displayError()); - return (Db::getInstance()->execute(' - DELETE FROM `'._DB_PREFIX_.'product_comment_criterion_product` - WHERE `id_product` = '.(int)($id_product))); - } - - /** - * Delete all reference of a criterion - * - * @return boolean succeed - */ - public static function delete($id_product_comment_criterion) - { - if (!Validate::isUnsignedId($id_product_comment_criterion)) - die(Tools::displayError()); - $result = Db::getInstance()->execute(' - DELETE FROM `'._DB_PREFIX_.'product_comment_grade` - WHERE `id_product_comment_criterion` = '.(int)($id_product_comment_criterion)); - if ($result === false) - return ($result); - $result = Db::getInstance()->execute(' - DELETE FROM `'._DB_PREFIX_.'product_comment_criterion_product` - WHERE `id_product_comment_criterion` = '.(int)($id_product_comment_criterion)); - if ($result === false) - return ($result); - return (Db::getInstance()->execute(' - DELETE FROM `'._DB_PREFIX_.'product_comment_criterion` - WHERE `id_product_comment_criterion` = '.(int)($id_product_comment_criterion))); - } -}; \ No newline at end of file diff --git a/modules/productcomments/config.xml b/modules/productcomments/config.xml deleted file mode 100755 index c9413f84f..000000000 --- a/modules/productcomments/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - productcomments - - - - - - 1 - 0 - - \ No newline at end of file diff --git a/modules/productcomments/controllers/front/default.php b/modules/productcomments/controllers/front/default.php deleted file mode 100644 index bca7304f5..000000000 --- a/modules/productcomments/controllers/front/default.php +++ /dev/null @@ -1,170 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -// Include Module -include_once(dirname(__FILE__).'/../../productcomments.php'); -// Include Models -include_once(dirname(__FILE__).'/../../ProductComment.php'); -include_once(dirname(__FILE__).'/../../ProductCommentCriterion.php'); - -class ProductCommentsDefaultModuleFrontController extends ModuleFrontController -{ - public function __construct() - { - parent::__construct(); - - $this->context = Context::getContext(); - } - - public function initContent() - { - parent::initContent(); - - if (Tools::isSubmit('action')) - { - switch(Tools::getValue('action')) - { - case 'add_comment': - $this->ajaxProcessAddComment(); - break; - case 'report_abuse': - $this->ajaxProcessReportAbuse(); - break; - case 'comment_is_usefull': - $this->ajaxProcessCommentIsUsefull(); - break; - } - } - } - - protected function ajaxProcessAddComment() - { - $module_instance = new ProductComments(); - - $result = true; - $id_guest = 0; - $id_customer = $this->context->customer->id; - if (!$id_customer) - $id_guest = $this->context->cookie->id_guest; - - $errors = array(); - // Validation - if (!Validate::isInt(Tools::getValue('id_product'))) - $errors[] = $module_instance->l('ID product is incorrect', 'default'); - if (!Tools::getValue('title') || !Validate::isGenericName(Tools::getValue('title'))) - $errors[] = $module_instance->l('Title is incorrect', 'default'); - if (!Tools::getValue('content') || !Validate::isMessage(Tools::getValue('content'))) - $errors[] = $module_instance->l('Comment is incorrect', 'default'); - if (!$id_customer && (!Tools::isSubmit('customer_name') || !Tools::getValue('customer_name') || !Validate::isGenericName(Tools::getValue('customer_name')))) - $errors[] = $module_instance->l('Customer name is incorrect', 'default'); - if (!$this->context->customer->id && !Configuration::get('PRODUCT_COMMENTS_ALLOW_GUESTS')) - $errors[] = $module_instance->l('You must be logged in order to send a comment', 'default'); - if (!count(Tools::getValue('criterion'))) - $errors[] = $module_instance->l('You must give a rating', 'default'); - - $product = new Product(Tools::getValue('id_product')); - if (!$product->id) - $errors[] = $module_instance->l('Product not found', 'default'); - - if (!count($errors)) - { - $customer_comment = ProductComment::getByCustomer(Tools::getValue('id_product'), $id_customer, true, $id_guest); - if (!$customer_comment || ($customer_comment && (strtotime($customer_comment['date_add']) + (int)Configuration::get('PRODUCT_COMMENTS_MINIMAL_TIME')) < time())) - { - - $comment = new ProductComment(); - $comment->content = strip_tags(Tools::getValue('content')); - $comment->id_product = (int)Tools::getValue('id_product'); - $comment->id_customer = (int)$id_customer; - $comment->id_guest = $id_guest; - $comment->customer_name = Tools::getValue('customer_name'); - if (!$comment->customer_name) - $comment->customer_name = pSQL($this->context->customer->firstname.' '.$this->context->customer->lastname); - $comment->title = Tools::getValue('title'); - $comment->grade = 0; - $comment->validate = 0; - $comment->save(); - - $grade_sum = 0; - foreach(Tools::getValue('criterion') as $id_product_comment_criterion => $grade) - { - $grade_sum += $grade; - $product_comment_criterion = new ProductCommentCriterion($id_product_comment_criterion); - if ($product_comment_criterion->id) - $product_comment_criterion->addGrade($comment->id, $grade); - } - - if (count(Tools::getValue('criterion')) >= 1) - { - $comment->grade = $grade_sum / count(Tools::getValue('criterion')); - // Update Grade average of comment - $comment->save(); - } - $result = true; - } - else - { - $result = false; - $errors[] = $module_instance->l('You should wait').' '.Configuration::get('PRODUCT_COMMENTS_MINIMAL_TIME').' '.$module_instance->l('seconds before posting a new comment'); - } - } - else - $result = false; - - die(Tools::jsonEncode(array( - 'result' => $result, - 'errors' => $errors - ))); - } - - protected function ajaxProcessReportAbuse() - { - if (!Tools::isSubmit('id_product_comment')) - die('0'); - - if (ProductComment::isAlreadyReport(Tools::getValue('id_product_comment'), $this->context->cookie->id_customer)) - die('0'); - - if (ProductComment::reportComment((int)Tools::getValue('id_product_comment'), $this->context->cookie->id_customer)) - die('1'); - - die('0'); - } - - protected function ajaxProcessCommentIsUsefull() - { - if (!Tools::isSubmit('id_product_comment') || !Tools::isSubmit('value')) - die('0'); - - if (ProductComment::isAlreadyUsefulness(Tools::getValue('id_product_comment'), $this->context->cookie->id_customer)) - die('0'); - - if (ProductComment::setCommentUsefulness((int)Tools::getValue('id_product_comment'), (bool)Tools::getValue('value'), $this->context->cookie->id_customer)) - die('1'); - - die('0'); - } -} diff --git a/modules/productcomments/controllers/front/index.php b/modules/productcomments/controllers/front/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/productcomments/controllers/front/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/productcomments/controllers/index.php b/modules/productcomments/controllers/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/productcomments/controllers/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/productcomments/img/accept.png b/modules/productcomments/img/accept.png deleted file mode 100644 index 89c8129a490b329f3165f32fa0781701aab417ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 781 zcmV+o1M>WdP)4-QibtN)VXQDpczE`xXAkUjh%RI>;okxb7K@0kpyQ1k_Y(|Oe7$m(^ zNYX>mI||sUbmn+c3<&FnE=4u#()KBS^SH8e)Qs5i!#lY=$-1gbH6VluzU=m=EP78&5vQ z-?+fFP-G2l&l_QzYealK$;1Rl?FkzXR&Jv@fBPNjCr#AYRyJ7UJQ0v#?)7Ott=>3`#-pV!7>9}>Q1jL)H6h&gkP@3nI=+F3nA~M>u#(n* z8T!#8oEw&-mED4!h4s!N@Jo3S7N&Q6%6l3}nlcd~X@>;uelvPsSkXIgg~e+^T1zSf z3SNj(5%jK~i8@b;Cre(l%! zb3XXjA=BSSEdN{#|9iLO*8%-MR}+7qbp3tY@z3?Nzc;ggpZ5HH*6+{dn6Eo!{=Mk? zb3y&r36&oQ6@H&q{dG#^&qa-2`?P+aQ~SDI`sY!lABPpcY?J8U}fi7AzZCsS>Jir4~tLR^iFjsO4uudGpj94Nw6666>BpW*3t11}&?*3-o? xq~camLPAPPN>vDoj9y44$rjF6*2UngH4;DJuW~ diff --git a/modules/productcomments/img/comment.png b/modules/productcomments/img/comment.png deleted file mode 100644 index 7bc9233ea63c89d52a99494dd0f0735a29a3ec3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413 zcmV;O0b>4%P)i2vikyMR~)n*keF9=!Gc_n*K2@qsNT?}H4v4a974 z1ArVJApZ0B-@pGKzWw|E^3%Wn&p!V9|K$C@{}12&`+x7vzyG&i{r!LE6~yrB1;;^# zm?0Y=moxPMSn>r>N00000NkvXX Hu0mjf$^yWL diff --git a/modules/productcomments/img/comments_delete.png b/modules/productcomments/img/comments_delete.png deleted file mode 100644 index 6df7376d05443e4027ccbb4db640f5af33fa93d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 670 zcmV;P0%84$P)c;A#1+9e&U9~QBdhb7i%XEvtC8q~e*9 zTGor!c}UBO!Tp8?(pAKoEsCX!Dv~OwaI#?S|7Y+#Qz)whJ4xaq8BjDPqnKjt1re<^tvd-qJefSYq(anuCjd93vneh6K+h(i&yD!a1MnYqE;KZ-O};W0OdWKgI_pLK zle)Hr=PlJ{;*D|xQkXchK9;-N1yEG%b|6WX&N<<4bB3E4Y$IN>=XK}S-Z!3BGt%RR zcEyG7o^?>|EvvpZ=hdbo)D!63ewiH?<=TAz5V4&90#T#$5FJ5q1^@s607*qoM6N<$ Eg00gme*gdg diff --git a/modules/productcomments/img/delete.gif b/modules/productcomments/img/delete.gif deleted file mode 100644 index 43c6ca8763d79bde87bcf437e497af00c8be562d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 752 zcmZ?wbhEHb6kt$bc*el6GthYN-n}zt&b)vB{*)i+-#|NQy$ zABXln&Q1FL`t{#CH*SY|{oJwc*Qz;h;)0))7aYq9ewP~fc2e)_P3vAY)$9wl{IzJp zy{ydlr;a^HiGHwZ{*SH8FZkJhE{gei`OM?;ir*_{?@ji478&@mD*tSH_`A&5@6Vqe z@G<&xeCOwiq-WvY-eS5f?;vgCP8#IHGBw=+^cY}xvy zx8c*8mDl2ff1W;kCeZrNm9vlQYJg5Caki?(^G9DBs4DA0KlA4-ZT3fl8 z8F_gb*}2-1v>0WWwY1oIg_&Emc-aM+Wn|bpRc1GF^$N-etzA1qr9X*XNNWw_j-BjG zGEKc(x)1gUF{(82E@ad^eMXp9hUxg0Q)f<}lVRDncBb&%dq*yAR+(|l-D@bZwvw%g)cL7VG z)An_f*+XqOetkIP*eg{wS7K(+qJ{-x0ue3?v&y~1d1To>MqD_2keNGNE=Pc|!BJ7b fV_(F^#N=Z_Jo9)pKRPly^YODPxtBC4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;yxzh{5!Htr?51 zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7 zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l z!7?%Uwib*ROP67Hw`ika)gX-(8Ia`-u_IEhxG7U<13kSsMW+$lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc diff --git a/modules/productcomments/img/index.php b/modules/productcomments/img/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/productcomments/img/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/productcomments/img/note.png b/modules/productcomments/img/note.png deleted file mode 100644 index 244e6ca045c50a130086ac388b560a12761544b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 500 zcmV z!-sF!^gVb+8rtpyctW0#N6uWni0LCt_6PoOdbjll_d4>B|?abUmpo8>v>h}Zj|Ya;Eu#qwvU1IVc9khP8VrtAsT2=e83P~$#!xXbw)n}FlPSEe7Hq1uCb zR8w;xqmBrUgA^pnkB=O@-lq0DPz$ay0yh_~I_IDpzxRb(4=Iy9CT||k!08w)Pe>W4 zElmH8fF;68$GMwZ#7{4ozI(ySrR%I+xs4-G1q^UxnUV7rlf9>Rn&_6Wike0000R5;6} zlR-$7K@`V--@00+DaBF-W?)2!79o*g)FH}yo{A10qGLqR*@KDKJa+EdtwTj9l&K)3 z2LlOBDn&C*S6$t2zL_`kI_yf>8U)SZ4Lo?i|9|Ga7pW@$bJ76%<)upQ2dWkohkA#K zMI}Lf0?y#Ypb~>K)OJ3Nb_2Xn-g2{qt_l$p1E7$7cB|Auvc5p2DjMQKHUiZEL@2)q zQEDIR;ys=qLa<9nZVW<#sx92XLNI7BXo#uE+#tC89sr*Jf(8TXibcN{8#LrW1+{xP zkge5%a#8RJW;(ld$se?!rw>(L9V3?ZryF^h$&-Xc4 zn#Bgeig4`EDVplq$eC?A`s&;zw4fx;* zD2p5OoTmDXLoU5Kp}zH~JhS7O#P?t24MDNN_ms*i3Sq zJARohmrsv<9yY}}Fl1l#qhe4OW8)8)+A72gM{638;PD#xwlT-y>N+OoM;MtM{%D2P z=x@u^`J~YsYq7y%#BwszoVwW9!TY&U2B%+7TH(TCpC-}2ZevStYUO;x)y$je!EqaC vU+hy`Y{0((8oQ$vAIdUu@a4;WDm(d~Ny&QoBWxc?00000NkvXXu0mjf`uQqR diff --git a/modules/productcomments/img/star.gif b/modules/productcomments/img/star.gif deleted file mode 100644 index 6d647b432c5cb948415db2be989c6a687cf51753..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 398 zcmZ?wbhEHblzd!!{bmjMh+20OY{Q2|e=k@xZmka;A-0}UW`_G?0 zzwOcb`t|F}moM+!x%1;(((eazew<6bbm`Kcx5w_^zyJMI$occM*88giysR$UhpM9R2DyU)k!wRjVI4X zG|-ttj-yk7O^&UPMUKTyid$~h?AhE3Oq_FOb22$GvM*w1bYob=;Lf~=*_~fbkU>z6 z-;GgDz*#_UwUh8tH>UONeG1*Zof9T?PMPLBW6_*>3$Dv8S+-)%sx|92Y}&GI$F4p5 P4jghm>V87Ok--`OzEzlo diff --git a/modules/productcomments/index.php b/modules/productcomments/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/productcomments/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/productcomments/install.sql b/modules/productcomments/install.sql deleted file mode 100644 index 4bb238973..000000000 --- a/modules/productcomments/install.sql +++ /dev/null @@ -1,75 +0,0 @@ -CREATE TABLE IF NOT EXISTS `PREFIX_product_comment` ( - `id_product_comment` int(10) unsigned NOT NULL auto_increment, - `id_product` int(10) unsigned NOT NULL, - `id_customer` int(10) unsigned NOT NULL, - `id_guest` int(10) unsigned NULL, - `title` varchar(64) NULL, - `content` text NOT NULL, - `customer_name` varchar(64) NULL, - `grade` float unsigned NOT NULL, - `validate` tinyint(1) NOT NULL, - `deleted` tinyint(1) NOT NULL, - `date_add` datetime NOT NULL, - PRIMARY KEY (`id_product_comment`), - KEY `id_product` (`id_product`), - KEY `id_customer` (`id_customer`), - KEY `id_guest` (`id_guest`) -) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; - -CREATE TABLE IF NOT EXISTS `PREFIX_product_comment_criterion` ( - `id_product_comment_criterion` int(10) unsigned NOT NULL auto_increment, - `id_product_comment_criterion_type` tinyint(1) NOT NULL, - `active` tinyint(1) NOT NULL, - PRIMARY KEY (`id_product_comment_criterion`) -) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; - -CREATE TABLE IF NOT EXISTS `PREFIX_product_comment_criterion_product` ( - `id_product` int(10) unsigned NOT NULL, - `id_product_comment_criterion` int(10) unsigned NOT NULL, - PRIMARY KEY(`id_product`, `id_product_comment_criterion`), - KEY `id_product_comment_criterion` (`id_product_comment_criterion`) -) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; - -CREATE TABLE IF NOT EXISTS `PREFIX_product_comment_criterion_lang` ( -`id_product_comment_criterion` INT(11) UNSIGNED NOT NULL , -`id_lang` INT(11) UNSIGNED NOT NULL , -`name` VARCHAR(64) NOT NULL , -PRIMARY KEY ( `id_product_comment_criterion` , `id_lang` ) -) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; - -CREATE TABLE IF NOT EXISTS `PREFIX_product_comment_criterion_category` ( - `id_product_comment_criterion` int(10) unsigned NOT NULL, - `id_category` int(10) unsigned NOT NULL, - PRIMARY KEY(`id_product_comment_criterion`, `id_category`), - KEY `id_category` (`id_category`) -) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; - -CREATE TABLE IF NOT EXISTS `PREFIX_product_comment_grade` ( - `id_product_comment` int(10) unsigned NOT NULL, - `id_product_comment_criterion` int(10) unsigned NOT NULL, - `grade` int(10) unsigned NOT NULL, - PRIMARY KEY (`id_product_comment`, `id_product_comment_criterion`), - KEY `id_product_comment_criterion` (`id_product_comment_criterion`) -) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; - -CREATE TABLE IF NOT EXISTS `PREFIX_product_comment_usefulness` ( - `id_product_comment` int(10) unsigned NOT NULL, - `id_customer` int(10) unsigned NOT NULL, - `usefulness` tinyint(1) unsigned NOT NULL, - PRIMARY KEY (`id_product_comment`, `id_customer`) -) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; - -CREATE TABLE IF NOT EXISTS `PREFIX_product_comment_report` ( - `id_product_comment` int(10) unsigned NOT NULL, - `id_customer` int(10) unsigned NOT NULL, - PRIMARY KEY (`id_product_comment`, `id_customer`) -) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; - -INSERT INTO `PREFIX_product_comment_criterion` VALUES ('1', '1', '1'); - -INSERT INTO `PREFIX_product_comment_criterion_lang` (`id_product_comment_criterion`, `id_lang`, `name`) - ( - SELECT '1', l.`id_lang`, 'Quality' - FROM `PREFIX_lang` l - ); - diff --git a/modules/productcomments/js/index.php b/modules/productcomments/js/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/productcomments/js/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/productcomments/js/jquery.rating.pack.js b/modules/productcomments/js/jquery.rating.pack.js deleted file mode 100644 index 488c28bd8..000000000 --- a/modules/productcomments/js/jquery.rating.pack.js +++ /dev/null @@ -1,12 +0,0 @@ -/* - ### jQuery Star Rating Plugin v2.0 - 2008-03-12 ### - By Diego A, http://www.fyneworks.com, diego@fyneworks.com - - v2 by Keith Wood, kbwood@virginbroadband.com.au - - Project: http://plugins.jquery.com/project/MultipleFriendlyStarRating - Website: http://www.fyneworks.com/jquery/star-rating/ - - This is a modified version of the star rating plugin from: - http://www.phpletter.com/Demo/Jquery-Star-Rating-Plugin/ -*/ -eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}(';4(w)(3($){$.Y.T=3(c){c=$.15({m:\'X U\',E:\'\',B:z,8:z},c||{});o d={};o e={t:3(n,a,b){2.6(n);$(a).D(\'.j\').A().l(b||\'x\')},6:3(n){$(d[n].7).O(\'.j\').u(\'9\').u(\'x\')},h:3(n){4(!$(d[n].5).Z(\'.m\')){$(d[n].5).D(\'.j\').A().l(\'9\')}},g:3(n,a){d[n].5=a;o b=$(a).L(\'a\').K();$(d[n].7).J(b);e.6(n);e.h(n);4(c.I)c.I.W(d[n].7,[b,a])}};2.V(3(i){o n=2.G;4(!d[n])d[n]={r:0};i=d[n].r;d[n].r++;4(i==0){c.8=$(2).S(\'p\')||c.8;d[n].7=$(\'\');$(2).C(d[n].7);4(c.8||c.B){}F{$(2).C($(\'\'+c.E+\'\').H(3(){e.6(n);$(2).l(\'9\')}).v(3(){e.h(n);$(2).u(\'9\')}).g(3(){e.g(n,2)}))}};f=$(\'\'+2.q+\'\');$(2).N(f);4(c.8){$(f).l(\'M\')}F{$(f).H(3(){e.6(n);e.t(n,2)}).v(3(){e.6(n);e.h(n)}).g(3(){e.g(n,2)})};4(2.14)d[n].5=f;$(2).13();4(i+1==2.12)e.h(n)});11(n 10 d)4(d[n].5){e.t(n,d[n].5,\'9\');$(d[n].7).J($(d[n].5).L(\'a\').K())}16 2}})(w);',62,69,'||this|function|if|currentElem|drain|valueElem|readOnly|star_on||||||eStar|click|reset||star|div|addClass|cancel||var|disabled|value|count|title|fill|removeClass|mouseout|jQuery|star_hover|class|false|andSelf|required|before|prevAll|cancelValue|else|name|mouseover|callback|val|text|children|star_readonly|after|siblings|hidden|type|input|attr|rating|Rating|each|apply|Cancel|fn|is|in|for|length|remove|checked|extend|return'.split('|'),0,{})) \ No newline at end of file diff --git a/modules/productcomments/js/jquery.textareaCounter.plugin.js b/modules/productcomments/js/jquery.textareaCounter.plugin.js deleted file mode 100644 index 03ca3eb44..000000000 --- a/modules/productcomments/js/jquery.textareaCounter.plugin.js +++ /dev/null @@ -1,163 +0,0 @@ -/* - * jQuery Textarea Characters Counter Plugin v 2.0 - * Examples and documentation at: http://roy-jin.appspot.com/jsp/textareaCounter.jsp - * Copyright (c) 2010 Roy Jin - * Version: 2.0 (11-JUN-2010) - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - * Requires: jQuery v1.4.2 or later - */ -(function($){ - $.fn.textareaCount = function(options, fn) { - var defaults = { - maxCharacterSize: -1, - originalStyle: 'originalTextareaInfo', - warningStyle: 'warningTextareaInfo', - warningNumber: 20, - displayFormat: '#input characters | #words words' - }; - var options = $.extend(defaults, options); - - var container = $(this); - - $("
     
    ").insertAfter(container); - - //create charleft css - var charLeftCss = { - 'width' : container.width() - }; - - var charLeftInfo = getNextCharLeftInformation(container); - charLeftInfo.addClass(options.originalStyle); - charLeftInfo.css(charLeftCss); - - var numInput = 0; - var maxCharacters = options.maxCharacterSize; - var numLeft = 0; - var numWords = 0; - - container.bind('keyup', function(event){limitTextAreaByCharacterCount();}) - .bind('mouseover', function(event){setTimeout(function(){limitTextAreaByCharacterCount();}, 10);}) - .bind('paste', function(event){setTimeout(function(){limitTextAreaByCharacterCount();}, 10);}); - - - function limitTextAreaByCharacterCount(){ - charLeftInfo.html(countByCharacters()); - //function call back - if(typeof fn != 'undefined'){ - fn.call(this, getInfo()); - } - return true; - } - - function countByCharacters(){ - var content = container.val(); - var contentLength = content.length; - - //Start Cut - if(options.maxCharacterSize > 0){ - //If copied content is already more than maxCharacterSize, chop it to maxCharacterSize. - if(contentLength >= options.maxCharacterSize) { - content = content.substring(0, options.maxCharacterSize); - } - - var newlineCount = getNewlineCount(content); - - // newlineCount new line character. For windows, it occupies 2 characters - var systemmaxCharacterSize = options.maxCharacterSize - newlineCount; - if (!isWin()){ - systemmaxCharacterSize = options.maxCharacterSize - } - if(contentLength > systemmaxCharacterSize){ - //avoid scroll bar moving - var originalScrollTopPosition = this.scrollTop; - container.val(content.substring(0, systemmaxCharacterSize)); - this.scrollTop = originalScrollTopPosition; - } - charLeftInfo.removeClass(options.warningStyle); - if(systemmaxCharacterSize - contentLength <= options.warningNumber){ - charLeftInfo.addClass(options.warningStyle); - } - - numInput = container.val().length + newlineCount; - if(!isWin()){ - numInput = container.val().length; - } - - numWords = countWord(getCleanedWordString(container.val())); - - numLeft = maxCharacters - numInput; - } else { - //normal count, no cut - var newlineCount = getNewlineCount(content); - numInput = container.val().length + newlineCount; - if(!isWin()){ - numInput = container.val().length; - } - numWords = countWord(getCleanedWordString(container.val())); - } - - return formatDisplayInfo(); - } - - function formatDisplayInfo(){ - var format = options.displayFormat; - format = format.replace('#input', numInput); - format = format.replace('#words', numWords); - //When maxCharacters <= 0, #max, #left cannot be substituted. - if(maxCharacters > 0){ - format = format.replace('#max', maxCharacters); - format = format.replace('#left', numLeft); - } - return format; - } - - function getInfo(){ - var info = { - input: numInput, - max: maxCharacters, - left: numLeft, - words: numWords - }; - return info; - } - - function getNextCharLeftInformation(container){ - return container.next('.charleft'); - } - - function isWin(){ - var strOS = navigator.appVersion; - if (strOS.toLowerCase().indexOf('win') != -1){ - return true; - } - return false; - } - - function getNewlineCount(content){ - var newlineCount = 0; - for(var i=0; i -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -function getCommentForm() -{ - if (document.forms) - return (document.forms['comment_form']); - else - return (document.comment_form); -} - -function getCommentDeleteForm() -{ - if (document.forms) - return (document.forms['delete_comment_form']); - else - return (document.delete_comment_form); -} - -function acceptComment(id) -{ - var form = getCommentForm(); - if (id) - form.elements['id_product_comment'].value = id; - form.elements['action'].value = 'accept'; - form.submit(); -} - - -function deleteComment(id) -{ - var form = getCommentForm(); - if (id) - form.elements['id_product_comment'].value = id; - form.elements['action'].value = 'delete'; - form.submit(); -} - -function delComment(id, confirmation) -{ - var answer = confirm(confirmation); - if (answer) - { - var form = getCommentDeleteForm(); - if (id) - form.elements['delete_id_product_comment'].value = id; - form.elements['delete_action'].value = 'delete'; - form.submit(); - } -} - -function getCriterionForm() -{ - if (document.forms) - return (document.forms['criterion_form']); - else - return (document.criterion_form); -} - -function editCriterion(id) -{ - var form = getCriterionForm(); - form.elements['id_product_comment_criterion'].value = id; - form.elements['criterion_name'].value = document.getElementById('criterion_name_' + id).value; - form.elements['criterion_action'].value = 'edit'; - form.submit(); -} - -function deleteCriterion(id) -{ - var form = getCriterionForm(); - form.elements['id_product_comment_criterion'].value = id; - form.elements['criterion_action'].value = 'delete'; - form.submit(); -} diff --git a/modules/productcomments/js/productCriterion.js b/modules/productcomments/js/productCriterion.js deleted file mode 100644 index a453a827a..000000000 --- a/modules/productcomments/js/productCriterion.js +++ /dev/null @@ -1,40 +0,0 @@ -/* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -function getProductCriterionForm() -{ - if (document.forms) - return (document.forms['product_criterion_form']); - else - return (document.product_criterion_form); -} - -function getProductCriterion(path, id_product, id_lang) -{ - $.get(path + 'productcommentscriterion.php', { id_product: id_product, id_lang: id_lang }, - function(data){ - document.getElementById('product_criterions').innerHTML = data; - }); -} diff --git a/modules/productcomments/js/productcomments.js b/modules/productcomments/js/productcomments.js deleted file mode 100644 index dec24c678..000000000 --- a/modules/productcomments/js/productcomments.js +++ /dev/null @@ -1,91 +0,0 @@ -$(function() { - $('input[@type=radio].star').rating(); - $('.auto-submit-star').rating(); - - $('.open-comment-form').fancybox({ - 'hideOnContentClick': false - }); - - $('button.usefulness_btn').click(function() { - var id_product_comment = $(this).data('id-product-comment'); - var is_usefull = $(this).data('is-usefull'); - var parent = $(this).parent(); - - $.ajax({ - url: productcomments_controller_url + '?rand=' + new Date().getTime(), - data: { - id_product_comment: id_product_comment, - action: 'comment_is_usefull', - value: is_usefull - }, - type: 'POST', - headers: { "cache-control": "no-cache" }, - success: function(result){ - parent.fadeOut('slow', function() { - parent.remove(); - }); - } - }); - }); - - $('span.report_btn').click(function() { - if (confirm(confirm_report_message)) - { - var idProductComment = $(this).data('id-product-comment'); - var parent = $(this).parent(); - - $.ajax({ - url: productcomments_controller_url + '?rand=' + new Date().getTime(), - data: { - id_product_comment: idProductComment, - action: 'report_abuse' - }, - type: 'POST', - headers: { "cache-control": "no-cache" }, - success: function(result){ - parent.fadeOut('slow', function() { - parent.remove(); - }); - } - }); - } - }); - - $('#submitNewMessage').click(function(e) { - // Kill default behaviour - e.preventDefault(); - - // Form element - - url_options = parseInt(productcomments_url_rewrite) ? '?' : '&'; - $.ajax({ - url: productcomments_controller_url + url_options + 'action=add_comment&secure_key=' + secure_key + '&rand=' + new Date().getTime(), - data: $('#id_new_comment_form').serialize(), - type: 'POST', - headers: { "cache-control": "no-cache" }, - dataType: "json", - success: function(data){ - if (data.result) - { - $.fancybox.close(); - var buttons = {}; - buttons[productcomment_ok] = "productcommentRefreshPage"; - fancyChooseBox(moderation_active ? productcomment_added_moderation : productcomment_added, productcomment_title, buttons); - } - else - { - $('#new_comment_form_error ul').html(''); - $.each(data.errors, function(index, value) { - $('#new_comment_form_error ul').append('
  • '+value+'
  • '); - }); - $('#new_comment_form_error').slideDown('slow'); - } - } - }); - return false; - }); -}); - -function productcommentRefreshPage() { - window.location.reload(); -} \ No newline at end of file diff --git a/modules/productcomments/js/products-comparison.js b/modules/productcomments/js/products-comparison.js deleted file mode 100755 index 65d201832..000000000 --- a/modules/productcomments/js/products-comparison.js +++ /dev/null @@ -1,45 +0,0 @@ -/* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -$(function () { - $('a.cluetip') - .cluetip({ - local:true, - cursor: 'pointer', - cluetipClass: 'comparison_comments', - dropShadow: false, - dropShadowSteps: 0, - showTitle: false, - tracking: true, - sticky: false, - mouseOutClose: true, - width: 450, - fx: { - open: 'fadeIn', - openSpeed: 'fast' - } - }) - .css('opacity', 0.8); -}); diff --git a/modules/productcomments/logo.gif b/modules/productcomments/logo.gif deleted file mode 100644 index 39433cf78a3e9869f24b0a95f04b1819391596e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 557 zcmV+|0@D47P)kO-!8JjERGZgNx4o8zwI5pnrkJT^AW7B+k01lLkoCLBu@bfRhnJSkT}{ z5cwz-C?AEk;`Q7|NyO0V@Jst%?>X<@)8|?6hNplZoH}p}R=_wBd4A);huvr*D{8ta zv>weaRZy(zA{a{x)NMK$oUyoq;&Q_jA9Yid>V_!Q3{lkDazCTg+2GL8fKO$yVv7pZ zw#ZdlB3o|B^q?JFdAt+nq80!As0d}1Z|KFR(*lEh^G}{es&~_I}wY;n4d5jAs0d}gj@(+ z%6*K*29I(Myv%_UPWDD&5qS@s3~ZAJGDH vT*SlN0ce3)r#d%-F%SaNZe6;L@E^Vb!Ji3~dec0&00000NkvXXu0mjflI-*P diff --git a/modules/productcomments/logo.png b/modules/productcomments/logo.png deleted file mode 100755 index 61ae64b2d01a6e83150b802b833e58cfc5c3675b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1691 zcmV;M24wk(P)l?NvlzZ#PWfbPO@rZ ztRUEmJVX+Zmpo))fqmV6=iUnvuCU;AX1>|G=bqm=-}ybhb1sMb8(;m&%dZ=?{1#q9 zBqRwBY#awKhnhC0cSF=ihxSpA7lUkE@8`k~7LAQDX|u)XQIXoDnGnXu15*Fi?qVC9 z)(db|Rn**SbG$b#E82<#&Rt2=*q&>O%@a%511}_4E zqXAOtGIYTXqEBIj_lby!6N?}o7dkE1kf}S#fjsA z#$shc|H$`gQ~=HSZq(CH5WLGq9>D>o`D@VWuw?kj~QH7Th>@=v`R0(^Drkbkk$Z`Vn5&T;r@66atUBg?sft3QF<5ybf|WkQ*5Vpr?coY0>~_?s(NE| z$O^qN(4dPOr&ffzIL~&kfu%^qwZ;&nJ`;oT7OF3o>=YRqKfs9E$tH1>0oQN08p9Hv zy z!N#%i%&vv(=S_(QuMd>PidVC;wY1S*`hIrND`nsAyHmM!JG^Z)Qq(KL#A%UR?ncts zAhf#`D+X~8=(cGiFH9X1#PmiMt8U3-UT8R6RGBkn&zTp`S}uRzY{{iT>REt5NK9kY z%oa352dD1XBUhWut*0>(bQs`9Uj5yyj*5Teg#i=nyLW-3VDl=8?${3nP&XlYWda=k z-?LRF(GnkO617oL^5Sw4Nm=dv@Hi{cs{@_{Y=7 zC4os5(<^C^mrtf=MmlVd=iGq3rtBznxir4-Szt2RtfGtcRbM$>X`Gb2GAJm}kPu^% z2g#?mAJC|wGg3uoS*vjJVo9Ur>oxB%{qaS>qh2IB)#sjoH56aWt}`X3M4N*#A;KsJ zP(C0zWp@vXxt_GlNY55q9d;hc$6veBlAY~$S(&wI{PZB(u$zp!T=x1)MGo`aD>qvV zQ{y6F&?!@}UFtQ8vM}h>-vA<)d!q^Izg$7)*}t1gPJEMkr!2pKOxUg0%?&b-*mY?* zA!_QX&FkJwU7E6d-Z=Tt(bG&@GxG48wSvfSa(I-)qi3(Hsi`z~PhrNkOzNs8)TyEM zSq1&IZn5fYuPM$dud}DH`;(3q`|`+D{BF5y`7?d(7Pd1VImLF|$Yh@-U*GQn3?dY= zSOtxU6Qje8U_!n3d^t}1ap~NJ^tJ2N%IWH3=TdX3Ybc*@K0~qW(~KYOk|cd`v`|V| z^4@3E_c$S3y<`0E&9q?CF=_sXnXQqNX0M?C69^$g@F=*U5+KB?V%4Cc<6*y!2h-Ts li$S$_sCgj`Wukut7y!6APs8We2h9Kg002ovPDHLkV1l!fJh%V= diff --git a/modules/productcomments/productcomments-ajax.php b/modules/productcomments/productcomments-ajax.php deleted file mode 100644 index 59ef1ac45..000000000 --- a/modules/productcomments/productcomments-ajax.php +++ /dev/null @@ -1,138 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -// The usage of this file is deprecated !!! -require_once(dirname(__FILE__).'/../../config/config.inc.php'); -require_once(dirname(__FILE__).'/../../init.php'); -require_once(dirname(__FILE__).'/ProductCommentCriterion.php'); -include_once(dirname(__FILE__).'/ProductComment.php'); -include_once(dirname(__FILE__).'/productcomments.php'); - -$productCom = new productcomments(); - -if (Tools::getValue('action') && Tools::getValue('id_product_comment') && Context::getContext()->cookie->id_customer) -{ - if (Tools::getValue('action') == 'report') - { - if (!ProductComment::isAlreadyReport(Tools::getValue('id_product_comment'), Context::getContext()->cookie->id_customer) && - ProductComment::reportComment((int)Tools::getValue('id_product_comment'), (int)Context::getContext()->cookie->id_customer)) - die('0'); - } - else if (Tools::getValue('action') == 'usefulness' && Tools::getValue('value') && Tools::getValue('value')) - { - if (!ProductComment::isAlreadyUsefulness(Tools::getValue('id_product_comment'), Context::getContext()->cookie->id_customer) && - ProductComment::setCommentUsefulness((int)Tools::getValue('id_product_comment'), - (bool)Tools::getValue('value'), - Context::getContext()->cookie->id_customer)) - die('0'); - } -} -else if (Tools::getValue('action') && Tools::getValue('secure_key') == $productCom->secure_key) -{ - $review = Tools::jsonDecode(Tools::getValue('review')); - $id_product = 0; - $content = null; - $title = null; - $name = null; - $grades = array(); - foreach ($review as $entry) - { - if ($entry->key == 'id_product') - $id_product = $entry->value; - else if ($entry->key == 'title') - $title = $entry->value; - else if ($entry->key == 'content') - $content = $entry->value; - else if ($entry->key == 'customer_name') - $name = $entry->value; - else if (strstr($entry->key, 'grade')) - { - $id = array(explode('_', $entry->key)); - $grades[] = array('id' => $id['0']['0'], 'grade' => $entry->value); - } - } - - if ($title == '' || $content == '' || !$id_product || count($grades) == 0) - die('0'); - - $allow_guests = (int)Configuration::get('PRODUCT_COMMENTS_ALLOW_GUESTS'); - - if (Context::getContext()->customer->id || (!Context::getContext()->customer->id && $allow_guests)) - { - $id_guest = (!$id_customer = (int)Context::getContext()->cookie->id_customer) ? (int)Context::getContext()->cookie->id_guest : false; - $customerComment = ProductComment::getByCustomer((int)($id_product), Context::getContext()->cookie->id_customer, true, (int)$id_guest); - - if (!$customerComment || ($customerComment && (strtotime($customerComment['date_add']) + Configuration::get('PRODUCT_COMMENTS_MINIMAL_TIME')) < time())) - { - $errors = array(); - $customer_name = false; - if ($id_guest && (!$customer_name = Context::getContext()->customer->firstname.' '.Context::getContext()->customer->lastname)) - $errors[] = $productCom->l('Please fill your name'); - - if (!count($errors) && $content) - { - $comment = new ProductComment(); - $comment->content = strip_tags($content); - $comment->id_product = (int)$id_product; - $comment->id_customer = (int)Context::getContext()->cookie->id_customer; - $comment->id_guest = (int)$id_guest; - $comment->customer_name = pSQL($customer_name); - if (!$comment->id_customer) - $comment->customer_name = pSQL($name); - $comment->title = pSQL($title); - $comment->grade = 0; - $comment->validate = 0; - - - $tgrade = 0; - $comment->save(); - foreach ($grades as $grade) - { - $tgrade += $grade['grade']; - $productCommentCriterion = new ProductCommentCriterion((int)Tools::getValue('id_product_comment_criterion_'.$grade['id'])); - if ($productCommentCriterion->id) - $productCommentCriterion->addGrade($comment->id, $grade['grade']); - } - - if ((count($grades) - 1) >= 0) - $comment->grade = (int)($tgrade / ((int)count($grades))); - - if (!$comment->save()) - $errors[] = $productCom->l('An error occurred while saving your comment.'); - else - Context::getContext()->smarty->assign('confirmation', $productCom->l('Comment posted.').((int)(Configuration::get('PRODUCT_COMMENTS_MODERATE')) ? ' '.$productCom->l('Awaiting moderator validation.') : '')); - - } - else - $errors[] = $productCom->l('Comment text is required.'); - } - else - $errors[] = sprintf($productCom->l('You should wait %d seconds before posting a new comment.'), Configuration::get('PRODUCT_COMMENTS_MINIMAL_TIME')); - } -} - -die('1'); - diff --git a/modules/productcomments/productcomments-extra.tpl b/modules/productcomments/productcomments-extra.tpl deleted file mode 100644 index d9547f8bf..000000000 --- a/modules/productcomments/productcomments-extra.tpl +++ /dev/null @@ -1,67 +0,0 @@ - {* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @version Release: $Revision$ -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - -{if $logged == 1 || $nbComments != 0} -
    -
    - {if $nbComments != 0} -
    - {l s='Average grade' mod='productcomments'}  -
    - {section name="i" start=0 loop=5 step=1} - {if $averageTotal le $smarty.section.i.index} -
    - {else} -
    - {/if} - {/section} -
    -
    - {/if} - -
    - {if $nbComments != 0} - {l s='Read user reviews' mod='productcomments'} ({$nbComments})
    - {/if} - {if ($too_early == false AND ($logged OR $allow_guests))} - {l s='Write your review' mod='productcomments'} - {/if} -
    -
    -
    -{/if} - diff --git a/modules/productcomments/productcomments.css b/modules/productcomments/productcomments.css deleted file mode 100644 index 51dca697b..000000000 --- a/modules/productcomments/productcomments.css +++ /dev/null @@ -1,224 +0,0 @@ -#product_comments_block_extra { - padding:10px 0 0 0; - border-top:1px solid #ccc; - font-weight: bold; - font-size:12px; - line-height:18px -} - -#product_comments_block_extra a { - padding-left: 10px; - text-decoration: none; - background: url(img/bg_li.png) no-repeat scroll 1px 45% #fff; - -} - -#product_comments_block_extra a:hover {text-decoration: underline} - -#product_comments_block_extra .comments_note {margin-bottom:5px} -#product_comments_block_extra .comments_note span, -#product_comments_block_extra .star_content {float:left} -#product_comments_block_extra .star_content {margin-top:2px} - -#product_comments_block_extra div.star {background: url(img/star.gif) no-repeat scroll 0 0 transparent} - -#product_comments_block_extra div.star_on {background: url(img/star.gif) no-repeat scroll 0 -12px transparent} - -#product_comments_block_extra .comments_advices {clear:both;} - -/* pop-in add grade/advice ********************************************************************* */ -#fancybox-wrap { width:585px } -#fancybox-content { - width:585px; - border-width:0 -} - -#new_comment_form { - width:585px; - color: #333; - text-align: left; - background-color: #fff -} -#new_comment_form .title { - padding:10px; - font-size: 13px; - color: #fff; - text-transform: uppercase; - background: #333 -} -#new_comment_form ul.grade_content {list-style-type:none} -#new_comment_form .grade_content li {width:50%} -#new_comment_form .product {padding:15px} -#new_comment_form .product img { - float:left; - border: 1px solid #ccc; -} -#new_comment_form .product .product_desc { - float:left; - margin-left:15px; - width:300px; - line-height:18px; - color:#666 -} -#new_comment_form .product .product_desc .product_name { - padding-bottom:5px; - font-size:13px; - color:#000 -} - -#new_comment_form .grade_content {margin:0 0 20px 0} -#new_comment_form .grade_content span, -#new_comment_form .grade_content span { - display:inline-block; - padding:0 10px; - width:150px;/* 160 */ - font-weight:bold -} -#new_comment_form .grade_content .cancel {margin-right:5px} - -.new_comment_form_content { - padding:15px; - background:#f8f8f8 -} -.new_comment_form_content .intro_form { - padding-bottom: 10px; - font-weight: bold; - font-size: 12px -} - -#new_comment_form label { - display: block; - margin:12px 0 4px 0; - font-weight: bold; - font-size: 12px; -} -#new_comment_form input { - padding: 0 5px; - height: 28px; - width: 540px; - border: 1px solid #ccc; - background: #fff; -} -#new_comment_form textarea { - padding: 0 5px; - height: 80px; - width: 540px; - border: 1px solid #ccc; - background: #fff; -} - -#new_comment_form .submit { - margin-top:20px; - padding:0; - font-size:13px; - text-align:right -} -#new_comment_form button { - cursor: pointer; - cursor: pointer; - display: inline-block; - padding: 4px 7px 3px 7px; - border: 1px solid #CC9900; - border-radius: 3px 3px 3px 3px; - font-weight: bold; - color: #000; - background: url(img/bg_bt.gif) repeat-x scroll 0 0 #F4B61B -} - -#new_comment_form #criterions_list { - border-bottom: 1px solid #CCC; - padding-bottom: 15px; - list-style-type: none; -} - -#new_comment_form #criterions_list li { - margin-bottom: 10px; -} - -#new_comment_form #criterions_list label { - display: inline; - float: left; - margin: 0 0 0 60px; -} - -#new_comment_form #criterions_list .star_content { - float: right; - margin-right: 180px; -} - -#new_comment_form #new_comment_form_footer { - margin-top: 20px; - font-size: 12px; -} - -/* TAB COMMENTS ******************************************************************************** */ -#product_comments_block_tab {margin:0 0 20px 0} - -#product_comments_block_tab div.comment { - margin:0 0 10px 0; - padding: 5px; - border-bottom: 1px dotted #ccc -} - -#product_comments_block_tab div.comment div.comment_author { - float: left; - padding-right:25px; - width: 140px;/* 165 */ - line-height:18px -} -#product_comments_block_tab div.comment div.comment_author span {font-weight:bold;} -#product_comments_block_tab div.comment div.comment_author span, -#product_comments_block_tab div.comment .star_content { - float:left; -} -#product_comments_block_tab div.comment .star_content {margin: 0 0 0 5px} -#product_comments_block_tab div.star, -#product_comments_block_tab div.star_on { - background: url(img/star.gif) no-repeat 0 0 transparent -} -#product_comments_block_tab div.star_on {background-position: 0 -12px} -#product_comments_block_tab .comment_author_infos {clear:both} -#product_comments_block_tab .comment_author_infos em {color:#999} - -#product_comments_block_tab div.comment div.comment_details { - float: left; - overflow:hidden; - width: 360px -} -#product_comments_block_tab div.comment_details .title_block, #product_comments_block_tab div.comment_details h4 {padding-bottom:10px} -#product_comments_block_tab div.comment_details p {padding-bottom:10px} -#product_comments_block_tab div.comment_details ul { - list-style-type:none; - margin:0 -} -#product_comments_block_tab div.comment_details li { - padding:2px 0 2px 12px; - background:url(img/bg_li.png) no-repeat 1px 45% #fff -} - -#product_comments_block_tab a { - text-decoration: none; - font-weight: bold -} - -#product_comments_block_tab a:hover {text-decoration: underline} - -#product_comments_block_tab button.usefulness_btn { - cursor: pointer; - margin:0 0 0 5px; - display: inline-block; - padding: 0 2px; - border: 1px solid #CC9900; - border-radius: 3px 3px 3px 3px; - color: #000; - font-weight: bold; - background: url("img/bg_bt.gif") repeat-x scroll 0 0 #F4B61B -} -#product_comments_block_tab button.usefulness_btn:hover {background-position: left -50px} -#product_comments_block_tab button.usefulness_btn:active {background-position: left -100px} - -#product_comments_block_tab span.report_btn {cursor: pointer} -#product_comments_block_tab span.report_btn:hover {text-decoration:underline} - -.fl { float: left; } -.fr { float: right; } diff --git a/modules/productcomments/productcomments.php b/modules/productcomments/productcomments.php deleted file mode 100644 index c85d40741..000000000 --- a/modules/productcomments/productcomments.php +++ /dev/null @@ -1,842 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class ProductComments extends Module -{ - const INSTALL_SQL_FILE = 'install.sql'; - - private $_html = ''; - private $_postErrors = array(); - - private $_productCommentsCriterionTypes = array(); - private $_baseUrl; - - public function __construct() - { - $this->name = 'productcomments'; - $this->tab = 'front_office_features'; - $this->version = '2.4'; - $this->author = 'PrestaShop'; - $this->need_instance = 0; - $this->secure_key = Tools::encrypt($this->name); - - parent::__construct(); - - $this->displayName = $this->l('Product Comments'); - $this->description = $this->l('Allows users to post reviews.'); - } - - public function install() - { - if (!file_exists(dirname(__FILE__).'/'.self::INSTALL_SQL_FILE)) - return false; - else if (!$sql = file_get_contents(dirname(__FILE__).'/'.self::INSTALL_SQL_FILE)) - return false; - $sql = str_replace(array('PREFIX_', 'ENGINE_TYPE'), array(_DB_PREFIX_, _MYSQL_ENGINE_), $sql); - $sql = preg_split("/;\s*[\r\n]+/", trim($sql)); - - foreach ($sql as $query) - if (!Db::getInstance()->execute(trim($query))) - return false; - if (parent::install() == false || - !$this->registerHook('productTab') || - !$this->registerHook('extraProductComparison') || - !$this->registerHook('productTabContent') || - !$this->registerHook('header') || - !$this->registerHook('productOutOfStock') || - !$this->registerHook('displayProductListReviews') || - !$this->registerHook('top') || - !Configuration::updateValue('PRODUCT_COMMENTS_MINIMAL_TIME', 30) || - !Configuration::updateValue('PRODUCT_COMMENTS_ALLOW_GUESTS', 0) || - !Configuration::updateValue('PRODUCT_COMMENTS_MODERATE', 1)) - return false; - return true; - } - - public function uninstall() - { - if (!parent::uninstall() || !$this->deleteTables() || - !Configuration::deleteByName('PRODUCT_COMMENTS_MODERATE') || - !Configuration::deleteByName('PRODUCT_COMMENTS_ALLOW_GUESTS') || - !Configuration::deleteByName('PRODUCT_COMMENTS_MINIMAL_TIME') || - !$this->unregisterHook('extraProductComparison') || - !$this->unregisterHook('productOutOfStock') || - !$this->unregisterHook('productTabContent') || - !$this->unregisterHook('header') || - !$this->unregisterHook('productTab') || - !$this->unregisterHook('top') || - !$this->unregisterHook('displayProductListReviews')) - return false; - return true; - } - - public function deleteTables() - { - return Db::getInstance()->execute(' - DROP TABLE IF EXISTS - `'._DB_PREFIX_.'product_comment`, - `'._DB_PREFIX_.'product_comment_criterion`, - `'._DB_PREFIX_.'product_comment_criterion_product`, - `'._DB_PREFIX_.'product_comment_criterion_lang`, - `'._DB_PREFIX_.'product_comment_criterion_category`, - `'._DB_PREFIX_.'product_comment_grade`, - `'._DB_PREFIX_.'product_comment_usefulness`, - `'._DB_PREFIX_.'product_comment_report`'); - } - - protected function _postProcess() - { - if (Tools::isSubmit('submitModerate')) - { - Configuration::updateValue('PRODUCT_COMMENTS_MODERATE', (int)Tools::getValue('moderate')); - Configuration::updateValue('PRODUCT_COMMENTS_ALLOW_GUESTS', (int)Tools::getValue('allow_guest')); - Configuration::updateValue('PRODUCT_COMMENTS_MINIMAL_TIME', (int)Tools::getValue('product_comments_minimal_time')); - $this->_html .= '
    '.$this->l('Settings updated').'
    '; - } - if ($id_criterion = (int)Tools::getValue('deleteCriterion')) - { - $productCommentCriterion = new ProductCommentCriterion((int)$id_criterion); - if ($productCommentCriterion->id) - if ($productCommentCriterion->delete()) - $this->_html .= '
    '.$this->l('Criterion deleted').'
    '; - } - } - - public function getContent() - { - include_once(dirname(__FILE__).'/ProductCommentCriterion.php'); - - $this->_setBaseUrl(); - $this->_productCommentsCriterionTypes = ProductCommentCriterion::getTypes(); - $this->_html = '

    '.$this->displayName.'

    '; - $this->_postProcess(); - $this->_checkModerateComment(); - $this->_checkReportedComment(); - $this->_checkCriterion(); - $this->_updateApplicationCriterion(); - $this->_checkDeleteComment(); - - return $this->_html.$this->_displayForm(); - } - - private function _setBaseUrl() - { - $this->_baseUrl = 'index.php?'; - foreach ($_GET as $k => $value) - if (!in_array($k, array('deleteCriterion', 'editCriterion'))) - $this->_baseUrl .= $k.'='.$value.'&'; - $this->_baseUrl = rtrim($this->_baseUrl, '&'); - } - - private function _checkModerateComment() - { - $action = Tools::getValue('action'); - if (empty($action) === false && (int)Configuration::get('PRODUCT_COMMENTS_MODERATE')) - { - $product_comments = Tools::getValue('id_product_comment'); - - if (count($product_comments)) - { - require_once(dirname(__FILE__).'/ProductComment.php'); - switch ($action) - { - case 'accept': - foreach ($product_comments as $id_product_comment) - { - if (!$id_product_comment) - continue; - $comment = new ProductComment((int)$id_product_comment); - $comment->validate(); - } - break; - - case 'delete': - foreach ($product_comments as $id_product_comment) - { - if (!$id_product_comment) - continue; - $comment = new ProductComment((int)$id_product_comment); - $comment->delete(); - ProductComment::deleteGrades((int)$id_product_comment); - } - break; - - default: - ; - } - } - } - } - - private function _checkReportedComment() - { - $action = Tools::getValue('action'); - if (empty($action) === false) - { - $product_comments = Tools::getValue('id_product_comment'); - - if (count($product_comments)) - { - require_once(dirname(__FILE__).'/ProductComment.php'); - switch ($action) - { - case 'accept': - foreach ($product_comments as $id_product_comment) - { - if (!$id_product_comment) - continue; - $comment = new ProductComment((int)$id_product_comment); - $comment->validate(); - ProductComment::deleteReports((int)$id_product_comment); - } - break; - case 'delete': - foreach ($product_comments as $id_product_comment) - { - if (!$id_product_comment) - continue; - $comment = new ProductComment((int)$id_product_comment); - $comment->delete(); - ProductComment::deleteGrades((int)$id_product_comment); - ProductComment::deleteReports((int)$id_product_comment); - ProductComment::deleteUsefulness((int)$id_product_comment); - } - break; - default: - ; - } - } - } - } - - private function _checkCriterion() - { - $action_criterion = Tools::getValue('criterion_action'); - $name = Tools::getValue('criterion'); - if (Tools::isSubmit('submitAddCriterion')) - { - require_once(dirname(__FILE__).'/ProductCommentCriterion.php'); - $languages = Language::getLanguages(); - $id_criterion = (int)Tools::getValue('id_product_comment_criterion'); - $productCommentCriterion = new ProductCommentCriterion((int)$id_criterion); - foreach ($languages as $lang) - $productCommentCriterion->name[(int)$lang['id_lang']] = Tools::getValue('criterion_'.(int)$lang['id_lang']); - - // Check default language criterion name - $defaultLanguage = new Language((int)(Configuration::get('PS_LANG_DEFAULT'))); - if (!Tools::getValue('criterion_'.$defaultLanguage->id)) - { - $this->_html .= $this->displayError($this->l('The field Name is required at least in').' '.$defaultLanguage->name); - return; - } - - $productCommentCriterion->id_product_comment_criterion_type = (int)Tools::getValue('criterion_type'); - $productCommentCriterion->active = (int)Tools::getValue('criterion_active'); - - if ($productCommentCriterion->save()) - $this->_html .= $this->displayConfirmation((Tools::getValue('editCriterion') ? $this->l('Criterion updated') : $this->l('Criterion added'))); - } - else if (!empty($action_criterion) && empty($name)) - { - $id_product_comment_criterion = Tools::getValue('id_product_comment_criterion'); - require_once(dirname(__FILE__).'/ProductCommentCriterion.php'); - switch ($action_criterion) - { - case 'edit': - ProductCommentCriterion::update($id_product_comment_criterion, - Tools::getValue('criterion_id_lang'), - Tools::getValue('criterion_name')); - break; - case 'delete': - ProductCommentCriterion::delete($id_product_comment_criterion); - break; - default: - ; - } - } - } - - private function _updateApplicationCriterion() - { - if (Tools::isSubmit('submitApplicationCriterion')) - { - include_once(dirname(__FILE__).'/ProductCommentCriterion.php'); - - $id_criterion = (int)Tools::getValue('id_criterion'); - $productCommentCriterion = new ProductCommentCriterion((int)$id_criterion); - if ($productCommentCriterion->id) - { - if ($productCommentCriterion->id_product_comment_criterion_type == 2) - { - $productCommentCriterion->deleteCategories(); - if ($categories = Tools::getValue('id_product')) - if (count($categories)) - foreach ($categories as $id_category) - $productCommentCriterion->addCategory((int)$id_category); - } - else if ($productCommentCriterion->id_product_comment_criterion_type == 3) - { - $productCommentCriterion->deleteProducts(); - if ($products = Tools::getValue('id_product')) - if (count($products)) - foreach ($products as $product) - $productCommentCriterion->addProduct((int)$product); - } - } - - $this->_html .= '
    '.$this->l('Settings updated').'
    '; - } - } - - private function _displayForm() - { - $this->_displayFormModerate(); - $this->_displayFormReported(); - $this->_displayFormConfigurationCriterion(); - $this->_displayFormApplicationCriterion(); - $this->_displayFormDelete(); - - return $this->_html; - } - - private function _displayFormModerate() - { - $this->_html = ' -
    - '.$this->l('Configuration').' -
    - -
    - - - - -
    -
    - -
    - - - - -
    -
    - -
    - '.$this->l('seconds').' -
    -
    -
    - -
    -
    -
    -
    -
    - '.$this->l('Moderate Comments').''; - if (Configuration::get('PRODUCT_COMMENTS_MODERATE')) - { - require_once(dirname(__FILE__).'/ProductComment.php'); - $comments = ProductComment::getByValidate(); - if (count($comments)) - { - $this->_html .= ' -
    - - -
    - - - - - - - - - - '; - foreach ($comments as $comment) - $this->_html .= ' - - - - - - '; - $this->_html .= ' - - - - - -
    '.$this->l('Author').''.$this->l('Comment').''.$this->l('Product name').''.$this->l('Actions').'
    '.htmlspecialchars($comment['customer_name'], ENT_COMPAT, 'UTF-8').'.'.htmlspecialchars($comment['content'], ENT_COMPAT, 'UTF-8').''.$comment['id_product'].' - '.htmlspecialchars($comment['name'], ENT_COMPAT, 'UTF-8').''.$this->l('Accept').' - '.$this->l('Delete').'
    '.$this->l('Selection:').''.$this->l('Accept').' - '.$this->l('Delete').'
    -
    '; - } - else - $this->_html .= $this->l('No comments to validate at this time.'); - } - $this->_html .= '

    '; - } - - private function _displayFormReported() - { - $this->_html .= '
    - '.$this->l('Reported Comments').''; - - require_once(dirname(__FILE__).'/ProductComment.php'); - $comments = ProductComment::getReportedComments(); - if (count($comments)) - { - $this->_html .= ' -
    - - -
    - - - - - - - - - - '; - foreach ($comments as $comment) - $this->_html .= ' - - - - - - '; - $this->_html .= ' - - - - - -
    '.$this->l('Author').''.$this->l('Comment').''.$this->l('Product name').''.$this->l('Actions').'
    '.htmlspecialchars($comment['customer_name'], ENT_COMPAT, 'UTF-8').'.'.htmlspecialchars($comment['content'], ENT_COMPAT, 'UTF-8').''.$comment['id_product'].' - '.htmlspecialchars($comment['name'], ENT_COMPAT, 'UTF-8').''.$this->l('Accept').' - '.$this->l('Delete').'
    '.$this->l('Selection:').''.$this->l('Accept').' - '.$this->l('Delete').'
    -
    '; - } - else - $this->_html .= $this->l('No reported comments at this time.'); - $this->_html .= '

    '; - } - - private function _displayFormConfigurationCriterion() - { - $langs = Language::getLanguages(false); - $id_lang_default = (int)Configuration::get('PS_LANG_DEFAULT'); - - $id_criterion = (int)Tools::getValue('editCriterion'); - $criterion = new ProductCommentCriterion((int)$id_criterion); - $languageIds = 'criterion'; - $this->_html .= ' -
    - '.$this->l('Add a new comment criterion').' -

    '.$this->l('You can define several criterions to help your customers during their review. For instance: efficiency, lightness, design.').'
    -
    '.$this->l('You can add a new criterion below:').'

    -
    - -
    - '; - foreach ($langs as $lang) - $this->_html .= ' -
    - -
    '; - $this->_html .= $this->displayFlags($langs, (int)$id_lang_default, $languageIds, 'criterion', true); - $this->_html .= ' -
    -
     
    - -
    - -
    - -
    - active ? 'checked="checked" ' : '').'/> - - active ? 'checked="checked" ' : '').'/> - -
    -
    - -
    -
    '; - require_once(dirname(__FILE__).'/ProductCommentCriterion.php'); - $criterions = ProductCommentCriterion::getCriterions($this->context->language->id); - if (count($criterions)) - { - $this->_html .= '
    - - - - - - - - - - '; - - foreach ($criterions as $criterion) - { - $this->_html .= ' - - - - '; - } - $this->_html .= '
    '.$this->l('Criterion').''.$this->l('Type').''.$this->l('Status').''.$this->l('Actions').'
    '.$criterion['name'].''.$this->_productCommentsCriterionTypes[(int)$criterion['id_product_comment_criterion_type']].''.$this->l('Edit').' - '.$this->l('Delete').'
    '; - } - $this->_html .= '

    '; - } - - private function _displayFormApplicationCriterion() - { - include_once(dirname(__FILE__).'/ProductCommentCriterion.php'); - - $criterions = ProductCommentCriterion::getCriterions($this->context->language->id, false, true); - $id_criterion = (int)Tools::getValue('updateCriterion'); - - if ($id_criterion) - { - $criterion = new ProductCommentCriterion((int)$id_criterion); - if ($criterion->id_product_comment_criterion_type == 2) - { - $categories = Category::getSimpleCategories($this->context->language->id); - $criterion_categories = $criterion->getCategories(); - } - else if ($criterion->id_product_comment_criterion_type == 3) - { - $criterion_products = $criterion->getProducts(); - $products = Product::getSimpleProducts($this->context->language->id); - } - } - - foreach ($criterions as $key => $foo) - if ($foo['id_product_comment_criterion_type'] == 1) - unset($criterions[$key]); - - if (count($criterions)) - { - $this->_html .= ' -
    - '.$this->l('Manage criterions scope').' -

    '.$this->l('Only criterions restricted to categories or products can be configured below:').'

    -
    - -
    -"> - -
    -
    '; - - if ($id_criterion && $criterion->id_product_comment_criterion_type != 1) - { - $this->_html .=' -
    -
    - -
    - - - - - - - - '; - - if ($criterion->id_product_comment_criterion_type == 3) - foreach ($products as $product) - $this->_html .=' - '; - else if ($criterion->id_product_comment_criterion_type == 2) - foreach ($categories as $category) - $this->_html .=' - '; - $this->_html .=' -
    '.$this->l('ID').''.($criterion->id_product_comment_criterion_type == 3 ? $this->l('Product Name') : $this->l('Category Name')).'
    '.(int)$product['id_product'].''.$product['name'].'
    '.(int)$category['id_category'].''.$category['name'].'
    -
    -
    - -
    -
    '; - } - - $this->_html .= '
    '; - } - } - - private function _displayFormDelete() - { - $this->_html .= ' -
    - '.$this->l('Manage Comments').''; - - require_once(dirname(__FILE__).'/ProductComment.php'); - $comments = ProductComment::getAll(); - if (count($comments)) - { - $this->_html .= ' -
    - - -
    - - - - - - - - - '; - foreach ($comments as $comment) - $this->_html .= ' - - - - - '; - $this->_html .= ' - - - - - -
    '.$this->l('Author').''.$this->l('Comment').''.$this->l('Actions').'
    '.htmlspecialchars($comment['customer_name'], ENT_COMPAT, 'UTF-8').'.'.htmlspecialchars($comment['content'], ENT_COMPAT, 'UTF-8').''.$this->l('Delete').'
    '.$this->l('Selection:').''.$this->l('Delete').'
    -
    '; - } - else - $this->_html .= $this->l('No comments to manage at this time.'); - - $this->_html .= '

    '; - } - - private function _checkDeleteComment() - { - $action = Tools::getValue('delete_action'); - if (empty($action) === false) - { - $product_comments = Tools::getValue('delete_id_product_comment'); - - if (count($product_comments)) - { - require_once(dirname(__FILE__).'/ProductComment.php'); - if ($action == 'delete') - { - foreach ($product_comments as $id_product_comment) - { - if (!$id_product_comment) - continue; - $comment = new ProductComment((int)$id_product_comment); - $comment->delete(); - ProductComment::deleteGrades((int)$id_product_comment); - } - } - } - } - } - - public function hookProductTab($params) - { - require_once(dirname(__FILE__).'/ProductComment.php'); - require_once(dirname(__FILE__).'/ProductCommentCriterion.php'); - - $average = ProductComment::getAverageGrade((int)Tools::getValue('id_product')); - - $this->context->smarty->assign(array( - 'allow_guests' => (int)Configuration::get('PRODUCT_COMMENTS_ALLOW_GUESTS'), - 'comments' => ProductComment::getByProduct((int)(Tools::getValue('id_product'))), - 'criterions' => ProductCommentCriterion::getByProduct((int)(Tools::getValue('id_product')), $this->context->language->id), - 'averageTotal' => round($average['grade']), - 'nbComments' => (int)(ProductComment::getCommentNumber((int)(Tools::getValue('id_product')))) - )); - - return ($this->display(__FILE__, '/tab.tpl')); - } - - public function hookTop($params) - { - $this->context->controller->addJS($this->_path.'js/jquery.rating.pack.js'); - return $this->display(__FILE__, 'productcomments_top.tpl'); - } - - public function hookDisplayProductListReviews($params) - { - require_once(dirname(__FILE__).'/ProductComment.php'); - - $average = ProductComment::getAverageGrade((int)$params['product']['id_product']); - $this->smarty->assign(array( - 'product' => $params['product'], - 'averageTotal' => round($average['grade']), - 'nbComments' => (int)(ProductComment::getCommentNumber((int)$params['product']['id_product'])) - )); - return $this->display(__FILE__, 'productcomments_reviews.tpl'); - } - - public function hookproductOutOfStock($params) - { - require_once(dirname(__FILE__).'/ProductComment.php'); - require_once(dirname(__FILE__).'/ProductCommentCriterion.php'); - - $id_guest = (!$id_customer = (int)$this->context->cookie->id_customer) ? (int)$this->context->cookie->id_guest : false; - $customerComment = ProductComment::getByCustomer((int)(Tools::getValue('id_product')), (int)$this->context->cookie->id_customer, true, (int)$id_guest); - - $average = ProductComment::getAverageGrade((int)Tools::getValue('id_product')); - - $image = Product::getCover((int)Tools::getValue('id_product')); - - $this->context->smarty->assign(array( - 'id_product_comment_form' => (int)Tools::getValue('id_product'), - 'product' => $this->context->controller->getProduct(), - 'secure_key' => $this->secure_key, - 'logged' => (int)$this->context->customer->isLogged(true), - 'allow_guests' => (int)Configuration::get('PRODUCT_COMMENTS_ALLOW_GUESTS'), - 'productcomment_cover' => (int)Tools::getValue('id_product').'-'.(int)$image['id_image'], - 'mediumSize' => Image::getSize(ImageType::getFormatedName('medium')), - 'criterions' => ProductCommentCriterion::getByProduct((int)Tools::getValue('id_product'), $this->context->language->id), - 'action_url' => '', - 'averageTotal' => round($average['grade']), - 'too_early' => ($customerComment && (strtotime($customerComment['date_add']) + Configuration::get('PRODUCT_COMMENTS_MINIMAL_TIME')) > time()), - 'nbComments' => (int)(ProductComment::getCommentNumber((int)Tools::getValue('id_product'))) - )); - - return ($this->display(__FILE__, '/productcomments-extra.tpl')); - } - - public function hookProductTabContent($params) - { - $this->context->controller->addJS($this->_path.'js/jquery.rating.pack.js'); - $this->context->controller->addJS($this->_path.'js/jquery.textareaCounter.plugin.js'); - $this->context->controller->addJS($this->_path.'js/productcomments.js'); - - $id_guest = (!$id_customer = (int)$this->context->cookie->id_customer) ? (int)$this->context->cookie->id_guest : false; - $customerComment = ProductComment::getByCustomer((int)(Tools::getValue('id_product')), (int)$this->context->cookie->id_customer, true, (int)$id_guest); - - $averages = ProductComment::getAveragesByProduct((int)Tools::getValue('id_product'), $this->context->language->id); - $averageTotal = 0; - foreach ($averages as $average) - $averageTotal += (float)($average); - $averageTotal = count($averages) ? ($averageTotal / count($averages)) : 0; - - $image = Product::getCover((int)Tools::getValue('id_product')); - - $this->context->smarty->assign(array( - 'logged' => (int)$this->context->customer->isLogged(true), - 'action_url' => '', - 'comments' => ProductComment::getByProduct((int)Tools::getValue('id_product'), 1, null, $this->context->cookie->id_customer), - 'criterions' => ProductCommentCriterion::getByProduct((int)Tools::getValue('id_product'), $this->context->language->id), - 'averages' => $averages, - 'product_comment_path' => $this->_path, - 'averageTotal' => $averageTotal, - 'allow_guests' => (int)Configuration::get('PRODUCT_COMMENTS_ALLOW_GUESTS'), - 'too_early' => ($customerComment && (strtotime($customerComment['date_add']) + Configuration::get('PRODUCT_COMMENTS_MINIMAL_TIME')) > time()), - 'delay' => Configuration::get('PRODUCT_COMMENTS_MINIMAL_TIME'), - 'id_product_comment_form' => (int)Tools::getValue('id_product'), - 'secure_key' => $this->secure_key, - 'productcomment_cover' => (int)Tools::getValue('id_product').'-'.(int)$image['id_image'], - 'mediumSize' => Image::getSize(ImageType::getFormatedName('medium')), - 'nbComments' => (int)ProductComment::getCommentNumber((int)Tools::getValue('id_product')), - 'productcomments_controller_url' => $this->context->link->getModuleLink('productcomments'), - 'productcomments_url_rewriting_activated' => Configuration::get('PS_REWRITING_SETTINGS', 0), - 'moderation_active' => (int)Configuration::get('PRODUCT_COMMENTS_MODERATE') - )); - - $this->context->controller->pagination((int)ProductComment::getCommentNumber((int)Tools::getValue('id_product'))); - - return ($this->display(__FILE__, '/productcomments.tpl')); - } - - public function hookHeader() - { - $this->context->controller->addCSS($this->_path.'productcomments.css', 'all'); - } - - public function hookExtraProductComparison($params) - { - require_once(dirname(__FILE__).'/ProductComment.php'); - require_once(dirname(__FILE__).'/ProductCommentCriterion.php'); - - $list_grades = array(); - $list_product_grades = array(); - $list_product_average = array(); - $list_product_comment = array(); - - foreach ($params['list_ids_product'] as $id_product) - { - $grades = ProductComment::getAveragesByProduct($id_product, $this->context->language->id); - $criterions = ProductCommentCriterion::getByProduct($id_product, $this->context->language->id); - $grade_total = 0; - if (count($grades) > 0) - { - foreach ($criterions as $criterion) - { - if (isset($grades[$criterion['id_product_comment_criterion']])) - { - $list_product_grades[$criterion['id_product_comment_criterion']][$id_product] = $grades[$criterion['id_product_comment_criterion']]; - $grade_total += (float)($grades[$criterion['id_product_comment_criterion']]); - } - else - $list_product_grades[$criterion['id_product_comment_criterion']][$id_product] = 0; - - if (!array_key_exists($criterion['id_product_comment_criterion'], $list_grades)) - $list_grades[$criterion['id_product_comment_criterion']] = $criterion['name']; - } - - $list_product_average[$id_product] = $grade_total / count($criterions); - $list_product_comment[$id_product] = ProductComment::getByProduct($id_product, 0, 3); - } - } - - if (count($list_grades) < 1) - return false; - - $this->context->smarty->assign(array('grades' => $list_grades, 'product_grades' => $list_product_grades, 'list_ids_product' => $params['list_ids_product'], - 'list_product_average' => $list_product_average, 'product_comments' => $list_product_comment)); - - return $this->display(__FILE__, '/products-comparison.tpl'); - } -} diff --git a/modules/productcomments/productcomments.tpl b/modules/productcomments/productcomments.tpl deleted file mode 100644 index 4a49c07fb..000000000 --- a/modules/productcomments/productcomments.tpl +++ /dev/null @@ -1,161 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - -
    -
    - {if $comments} - {foreach from=$comments item=comment} - {if $comment.content} -
    -
    - {l s='Grade' mod='productcomments'}  -
    - {section name="i" start=0 loop=5 step=1} - {if $comment.grade le $smarty.section.i.index} -
    - {else} -
    - {/if} - {/section} -
    -
    - {$comment.customer_name|escape:'html':'UTF-8'}
    - {dateFormat date=$comment.date_add|escape:'html':'UTF-8' full=0} -
    -
    -
    -

    {$comment.title}

    -

    {$comment.content|escape:'html':'UTF-8'|nl2br}

    -
      - {if $comment.total_advice > 0} -
    • {l s='%1$d out of %2$d people found this review useful.' sprintf=[$comment.total_useful,$comment.total_advice] mod='productcomments'}
    • - {/if} - {if $logged == 1} - {if !$comment.customer_advice} -
    • {l s='Was this comment useful to you?' mod='productcomments'}
    • - {/if} - {if !$comment.customer_report} -
    • {l s='Report abuse' mod='productcomments'}
    • - {/if} - {/if} -
    -
    -
    - {/if} - {/foreach} - {if (!$too_early AND ($logged OR $allow_guests))} -

    - {l s='Write your review' mod='productcomments'} ! -

    - {/if} - {else} - {if (!$too_early AND ($logged OR $allow_guests))} -

    - {l s='Be the first to write your review' mod='productcomments'} ! -

    - {else} -

    {l s='No customer comments for the moment.' mod='productcomments'}

    - {/if} - {/if} -
    -
    - -{if isset($product) && $product} - -
    -
    -
    -

    {l s='Write your review' mod='productcomments'}

    - {if isset($product) && $product} -
    - {$product->name|escape:html:'UTF-8'} -
    -

    {$product->name}

    - {$product->description_short} -
    -
    - {/if} -
    -

    {l s='Write your review' mod='productcomments'}

    - - - - {if $criterions|@count > 0} -
      - {foreach from=$criterions item='criterion'} -
    • - -
      - - - - - -
      -
      -
    • - {/foreach} -
    - {/if} - - - - - - - - {if $allow_guests == true && $logged == 0} - - - {/if} - - -
    -
    -
    -
    - -{/if} \ No newline at end of file diff --git a/modules/productcomments/productcomments_reviews.tpl b/modules/productcomments/productcomments_reviews.tpl deleted file mode 100644 index cccaf240b..000000000 --- a/modules/productcomments/productcomments_reviews.tpl +++ /dev/null @@ -1,37 +0,0 @@ - {* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @version Release: $Revision$ -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} -
    -
    - {section name="i" start=0 loop=5 step=1} - {if $averageTotal le $smarty.section.i.index} -
    - {else} -
    - {/if} - {/section} -
    - {l s='%s Review(s)'|sprintf:$averageTotal mod='productcomments'}  -
    \ No newline at end of file diff --git a/modules/productcomments/productcomments_top.tpl b/modules/productcomments/productcomments_top.tpl deleted file mode 100644 index a09be2a77..000000000 --- a/modules/productcomments/productcomments_top.tpl +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/modules/productcomments/productcommentscriterion.php b/modules/productcomments/productcommentscriterion.php deleted file mode 100644 index e625baa1e..000000000 --- a/modules/productcomments/productcommentscriterion.php +++ /dev/null @@ -1,49 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -require_once(dirname(__FILE__).'/../../config/config.inc.php'); -require_once(dirname(__FILE__).'/ProductCommentCriterion.php'); - -if (empty($_GET['id_lang']) === false && - isset($_GET['id_product']) === true) -{ - $criterions = ProductCommentCriterion::get($_GET['id_lang']); - if ((int)($_GET['id_product'])) - $selects = ProductCommentCriterion::getByProduct($_GET['id_product'], $_GET['id_lang']); - echo ''; -} \ No newline at end of file diff --git a/modules/productcomments/products-comparison.tpl b/modules/productcomments/products-comparison.tpl deleted file mode 100755 index 28914244e..000000000 --- a/modules/productcomments/products-comparison.tpl +++ /dev/null @@ -1,119 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - - - - - - - - {l s='Comments' mod='productcomments'} - - {section loop=$list_ids_product|count step=1 start=0 name=td} - - {/section} - - -{foreach from=$grades item=grade key=grade_id} - - {cycle values='comparison_feature_odd,comparison_feature_even' assign='classname'} - - {$grade} - - - {foreach from=$list_ids_product item=id_product} - {assign var='tab_grade' value=$product_grades[$grade_id]} - - {if isset($tab_grade[$id_product]) AND $tab_grade[$id_product]} - {section loop=6 step=1 start=1 name=average} - - {/section} - {else} - - - {/if} - - {/foreach} - -{/foreach} - - {cycle values='comparison_feature_odd,comparison_feature_even' assign='classname'} - - {l s='Average' mod='productcomments'} -{foreach from=$list_ids_product item=id_product} - - {if isset($list_product_average[$id_product]) AND $list_product_average[$id_product]} - {section loop=6 step=1 start=1 name=average} - - {/section} - {else} - - - {/if} - -{/foreach} - - - -   - {foreach from=$list_ids_product item=id_product} - - {if isset($product_comments[$id_product]) AND $product_comments[$id_product]} - {l s='view comments' mod='productcomments'} - - {else} - - - {/if} - -{/foreach} - \ No newline at end of file diff --git a/modules/productcomments/tab.tpl b/modules/productcomments/tab.tpl deleted file mode 100644 index ccde10c83..000000000 --- a/modules/productcomments/tab.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -
  • {l s='Comments' mod='productcomments'}
  • \ No newline at end of file diff --git a/modules/productcomments/translations/index.php b/modules/productcomments/translations/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/productcomments/translations/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/productcomments/upgrade/index.php b/modules/productcomments/upgrade/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/productcomments/upgrade/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/productcomments/upgrade/install-2.4.php b/modules/productcomments/upgrade/install-2.4.php deleted file mode 100644 index 8c0ee51f4..000000000 --- a/modules/productcomments/upgrade/install-2.4.php +++ /dev/null @@ -1,9 +0,0 @@ -registerHook('displayProductListReviews') && $object->registerHook('top')); -} diff --git a/modules/pscleaner/config.xml b/modules/pscleaner/config.xml deleted file mode 100644 index cd7990d3b..000000000 --- a/modules/pscleaner/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - pscleaner - - - - - - 1 - 0 - - \ No newline at end of file diff --git a/modules/pscleaner/index.php b/modules/pscleaner/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/pscleaner/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/pscleaner/logo.gif b/modules/pscleaner/logo.gif deleted file mode 100644 index 667cba308b14ce86c6dc331da507cf85c5d3e12e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1089 zcmZ?wbhEHb6krfw_|53+M53y)Z`9JS*; zXUlTHQ~sEz{0S$~Q|>Ys9C@xea$Is1z2Gi#)l2rKhv*G2@%x^l_q{|9`zRmsQ$Oyj ze8x}pgs;ZAVC_5p3YP=bF9hpf3(>g}u6Hj~^LmuYjR?bAaaIQt?d})YKlGD%<}3Nk zPwG*K`tuOgS3wG|LX_TyYrc!reivu>Ay)rGoZ-_Xn`bF@?-NX3r&xSUGXIof`6bon zOPbxs47)EG_Ge4NZzMU~O?AGT>3O#%=~1TZ%M9mNKr+kqNq+E?g5W2GVNZ&}o)(2a zEeU^G9PzXy@>Nm5o2synnNDA_oWJC_e#!IrlJE7U(ECe~@0Sw)k0pU0YNEbWMSQ7` zn^-+#X2pcKaA z%;^)F`Zt}K)PH4G=gpbTcUR81wrSa;xxJrfH@{iX^=RSbr$DrL>bvC=-mIGTe$&FY zyVri)vEtsrZC`J;KD}|}_4P}yZ(o0Z`^xKkx8L5o`R@L$&o?f9zJK%mv$OA?pZoam z_S?q~-adQ${>8IbuU@@={rcVO*KdH}?b~-i@c#XWw{Jdvc>m$UhmRjWe){z3^XJcB zzkC5Fy@4kbf3h$#F#KoG0XYSfCm1;XGyLDmb>uj|f@8A~*RRXz6IR!+ymP>EN=D#f zkJ$=_K`kEVq{B+jZRvchF>PJS=~-WcQcv(oSx26jQF-Kagkg%teB0Sum-S53O1i-k z9L6KQCUjGuu5(xh&os@rI9ubg?g{g3D?Ma)2tVtds_tE5>AXy{SIX3y&4=l-tEY&9 z=Mr7-w)S%xOiU`V6PsE(Cd<1$QF?sHb4nvaNS}!0qvp;oxt+_JK3&laVbpMH`tl$# z`50&L#Yv36pJ-n0wOl@HhK8duTc_0Sd5XV7xq~&6F0|!JDk>jk7qDot^-klNX_S6G zqxHstMXc?7N^uL4+^)>f^_DY9DJb+j$iyb3wnpy6LT0ySRxTlhAK&|hx;R925;i0> QGPSVt>4p3f7htdk0O3^6OaK4? diff --git a/modules/pscleaner/logo.png b/modules/pscleaner/logo.png deleted file mode 100644 index 6b43d7e23721bd6186d17461e412293be97bbae5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3000 zcmV;p3rF;cP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000XoNkl!;eW{{#_Xk%2O zSO8IabpQeB3igHt3y9f>J;jub?q*|(l@4N!5WBGigUZ?iV+ErOA|eC^rWfLgF@F2M zZx{}0&RNd+&MWuc@B7{VyYJ3}$Npaa^%t)+GSK<-wAjseRxNl`n?3h=?TWM)wb}DX z^Iz1hWLjX*Dx(&@rrvEN8dJ-}JUFkkKW?vDQ2*oP=#9IhMGh}t{K;kW@bV=uFTmUT zcGk>h{l~M>^^aI|y%&S7_vyGI0bSWi=vtMGuGJIKwPq421zl@XNt4mFu9uA0tc~?y z{a4Z0>_q5S#F6g=@{EISLmI>x(;Bw;c#ZmtL3|V7VP8Ezu|dClJoJl0pkFG2J~IOP ztSIOSL{C6^0@1G|BQn&Jv7SH-N+G3oi_TZmy;an{G8uX&v&sD0dsF&LLKG3BHLProfg3x6~LT7|v|KW^o00O1{I)c|NkKufDnc>h;xNcDpv<f!LDN#;!g>uG7C}&ec8g*b0 z=|Kj7ANN2(vt=`8p}hgPDiDB@D)Bl*56qP_ zw3|ep`VQn%heA$N3Zhfa^MP_v2sD>YbH*%$g}q(@Bf$TI&|EnSB~3^%cMKG>JfN69 z9P%kcP!Tm;%sV%Jn51KpGh~woLpIF~vRUqsQ%CjjVs5Yzz&QIJfX)sm>g%Amdjm=d z9c7(wfEdNDl_i_V+XFIs+%l?oXQ~htmW%pW4Lo^MikffbZHDWe0K%O z1v*U3*Wg;l47AN~N88ll_$|eiGF;G_FaRxawm8iIPKjJ4O%rVKB;F2B6W@mF%sv9p zbI;#ceip81_!VtSL}*(S#vR)!thd;`#*8?8xVg#@UZ6$ZM>%Mj;fa>1BhZrSik4&{ zWjIilJ(^ItqViZnjVJM zMdR>WdMKxhE3%NerH+Dim_*^l>%Ya*>7IBxWdxd2-^G)O1JRV|gvap?TvkJr6^@4r z#k^y|F7@}v@$n$C4;rQnLzhAipP@%qcM3P8WNmQKcPQmnd5#KA4h_n#k|A8E|R-+Q7bY> zJ#9w6KYP{#V0`^l1k(I|5+2VQizb4&xNaeG^YW3Ie~$w7ujrFar_ngW3ysq}@M!XI zNG83D`a~ff(5&x|w?bXGIqr=U;9e*nhZ(@35EsdQgsCcppwDgax6?3HTF zjDmzrrQ0HLZ2v~&hE#@>@{R-fC0z}M0I@&p5IRH zk+xs{^adomUZW6%F_(2d)5TYj95!K`E@k@j)Zj7_S^-yzM3o^mg zKmooFqzW7e8YsC$0GGr1;BE-VK$V zP57fO;|+)>Wr_HCk{8Y=xDkX0+HYRv;5#4Q!>y0zbgRC4e&l<~S2%g)_l6I2&e%tF)u(|7JfhKs4f6{pS>%M4E{9@+efMy5pzVVYs|B z9&O?)95@pj%hW<&QI{8pa5}&Or~FKD%7>3r-h7n$(;_Sh5K2z^nd3x&B~Aoe<3vb* zoD3U)`z2ppE5IQy+Js1jzD{CZfuB(FgSRQleJoJ!Yl$*{Ym^1{ zLs^g=4n+(?{fPswK(G)NXsm{@BJBF_AUYmBz^Q4z_}<$b2gjJ=AO#;B%|qE}KJtAC zAkW9S?t5xr9S->P!G2#W?Dw}J^~e4|d+ZN&#VIMW_AqduSw|5_u`dFdV z*M=5Jf0PnLX^;cTlDu$h_g3zcoPnrmrfiFT1%l4o9zVjJgM~OcdmM_#TB3MN9~66; zqr}q`CGG<3qTo_@9`<;c;G5z7ih0>ieWsO+e(MG6P(0ckMKqv@1{Qf+qnIE{{Q99J zzz(|t2VfV0>FLbGyL zM+Xbu`t|F1ZkFaQYn)6^?-*hBXC8s%)4+UYKt=^*Sip>ZY-rU|2$Ns;kt)RQv-Sdl zEf{0TjmsZxfjkP%^Dsp&h38Uu4$VG?!nY0OKVRu6I5Nz}(qYY-HHQC?CnhKJ?QLys z$6J}CEgE2Qc!iV6jcjLAu|a0yY!@bTPAi4xHKd+vgSz|lj4=^sJDG@AI0+1L6o}t< u - * @copyright 2007-2013 PrestaShop SA - * @version Release: $Revision: 7060 $ - * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) - * International Registered Trademark & Property of PrestaShop SA - */ - -if (!defined('_CAN_LOAD_FILES_')) - exit; - -class PSCleaner extends Module -{ - public function __construct() - { - $this->name = 'pscleaner'; - $this->tab = 'administration'; - $this->version = '1.0'; - $this->author = 'PrestaShop'; - $this->need_instance = 0; - - $this->bootstrap = true; - parent::__construct(); - - $this->displayName = $this->l('PrestaShop Cleaner'); - $this->description = $this->l('Check and fix functional integrity constraints and remove default data'); - $this->secure_key = Tools::encrypt($this->name); - } - - public function getContent() - { - $html = '

    '.$this->l('Be really careful with this tool - There is no possible rollback!').'

    '; - if (Tools::isSubmit('submitCheckAndFix')) - { - $logs = self::checkAndFix(); - if (count($logs)) - { - $conf = $this->l('The following queries successfuly fixed broken data:').'
      '; - foreach ($logs as $query => $entries) - $conf .= '
    • '.Tools::htmlentitiesUTF8($query).'
      '.sprintf($this->l('%d line(s)'), $entries).'
    • '; - $conf .= '
    '; - } - else - $conf = $this->l('Nothing that need to be cleaned'); - $html .= $this->displayConfirmation($conf); - } - if (Tools::isSubmit('submitTruncateCatalog')) - { - self::truncate('catalog'); - $html .= $this->displayConfirmation($this->l('Catalog truncated')); - } - if (Tools::isSubmit('submitTruncateSales')) - { - self::truncate('sales'); - $html .= $this->displayConfirmation($this->l('Orders and customers truncated')); - } - - $html .= ' - '; - - return $html.$this->renderForm(); - } - - public static function checkAndFix() - { - $db = Db::getInstance(); - $logs = array(); - - // Remove doubles in the configuration - $filtered_configuration = array(); - $result = $db->ExecuteS('SELECT * FROM '._DB_PREFIX_.'configuration'); - foreach ($result as $row) - { - $key = $row['id_shop_group'].'-|-'.$row['id_shop'].'-|-'.$row['name']; - if (in_array($key, $filtered_configuration)) - { - $query = 'DELETE FROM '._DB_PREFIX_.'configuration WHERE id_configuration = '.(int)$row['id_configuration']; - $db->Execute($query); - $logs[$query] = 1; - } - else - $filtered_configuration[] = $key; - } - unset($filtered_configuration); - - // Remove inexisting or monolanguage configuration value from configuration_lang - $query = 'DELETE FROM `'._DB_PREFIX_.'configuration_lang` - WHERE `id_configuration` NOT IN (SELECT `id_configuration` FROM `'._DB_PREFIX_.'configuration`) - OR `id_configuration` IN (SELECT `id_configuration` FROM `'._DB_PREFIX_.'configuration` WHERE name IS NULL OR name = "")'; - if ($db->Execute($query)) - if ($affected_rows = $db->Affected_Rows()) - $logs[$query] = $affected_rows; - - // Simple Cascade Delete - $queries = array( - // 0 => DELETE FROM __table__, 1 => WHERE __id__ NOT IN, 2 => NOT IN __table__, 3 => __id__ used in the "NOT IN" table, 4 => module_name - array('access', 'id_profile', 'profile', 'id_profile'), - array('access', 'id_tab', 'tab', 'id_tab'), - array('accessory', 'id_product_1', 'product', 'id_product'), - array('accessory', 'id_product_2', 'product', 'id_product'), - array('address_format', 'id_country', 'country', 'id_country'), - array('attribute', 'id_attribute_group', 'attribute_group', 'id_attribute_group'), - array('carrier_group', 'id_carrier', 'carrier', 'id_carrier'), - array('carrier_group', 'id_group', 'group', 'id_group'), - array('carrier_zone', 'id_carrier', 'carrier', 'id_carrier'), - array('carrier_zone', 'id_zone', 'zone', 'id_zone'), - array('cart_cart_rule', 'id_cart', 'cart', 'id_cart'), - array('cart_product', 'id_cart', 'cart', 'id_cart'), - array('cart_rule_carrier', 'id_cart_rule', 'cart_rule', 'id_cart_rule'), - array('cart_rule_carrier', 'id_carrier', 'carrier', 'id_carrier'), - array('cart_rule_combination', 'id_cart_rule_1', 'cart_rule', 'id_cart_rule'), - array('cart_rule_combination', 'id_cart_rule_2', 'cart_rule', 'id_cart_rule'), - array('cart_rule_country', 'id_cart_rule', 'cart_rule', 'id_cart_rule'), - array('cart_rule_country', 'id_country', 'country', 'id_country'), - array('cart_rule_group', 'id_cart_rule', 'cart_rule', 'id_cart_rule'), - array('cart_rule_group', 'id_group', 'group', 'id_group'), - array('cart_rule_product_rule_group', 'id_cart_rule', 'cart_rule', 'id_cart_rule'), - array('cart_rule_product_rule', 'id_product_rule_group', 'cart_rule_product_rule_group', 'id_product_rule_group'), - array('cart_rule_product_rule_value', 'id_product_rule', 'cart_rule_product_rule', 'id_product_rule'), - array('category_group', 'id_category', 'category', 'id_category'), - array('category_group', 'id_group', 'group', 'id_group'), - array('category_product', 'id_category', 'category', 'id_category'), - array('category_product', 'id_product', 'product', 'id_product'), - array('cms', 'id_cms_category', 'cms_category', 'id_cms_category'), - array('cms_block', 'id_cms_category', 'cms_category', 'id_cms_category'), - array('cms_block_page', 'id_cms', 'cms', 'id_cms'), - array('cms_block_page', 'id_cms_block', 'cms_block', 'id_cms_block'), - array('compare', 'id_customer', 'customer', 'id_customer'), - array('compare_product', 'id_compare', 'compare', 'id_compare'), - array('compare_product', 'id_product', 'product', 'id_product'), - array('connections', 'id_shop_group', 'shop_group', 'id_shop_group'), - array('connections', 'id_shop', 'shop', 'id_shop'), - array('connections_page', 'id_connections', 'connections', 'id_connections'), - array('connections_page', 'id_page', 'page', 'id_page'), - array('connections_source', 'id_connections', 'connections', 'id_connections'), - array('customer', 'id_shop_group', 'shop_group', 'id_shop_group'), - array('customer', 'id_shop', 'shop', 'id_shop'), - array('customer_group', 'id_group', 'group', 'id_group'), - array('customer_group', 'id_customer', 'customer', 'id_customer'), - array('customer_message', 'id_customer_thread', 'customer_thread', 'id_customer_thread'), - array('customer_thread', 'id_shop', 'shop', 'id_shop'), - array('customization', 'id_cart', 'cart', 'id_cart'), - array('customization_field', 'id_product', 'product', 'id_product'), - array('customized_data', 'id_customization', 'customization', 'id_customization'), - array('delivery', 'id_shop', 'shop', 'id_shop'), - array('delivery', 'id_shop_group', 'shop_group', 'id_shop_group'), - array('delivery', 'id_carrier', 'carrier', 'id_carrier'), - array('delivery', 'id_zone', 'zone', 'id_zone'), - array('editorial', 'id_shop', 'shop', 'id_shop', 'editorial'), - array('favorite_product', 'id_product', 'product', 'id_product','favoriteproducts'), - array('favorite_product', 'id_customer', 'customer', 'id_customer','favoriteproducts'), - array('favorite_product', 'id_shop', 'shop', 'id_shop','favoriteproducts'), - array('feature_product', 'id_feature', 'feature', 'id_feature'), - array('feature_product', 'id_product', 'product', 'id_product'), - array('feature_value', 'id_feature', 'feature', 'id_feature'), - array('group_reduction', 'id_group', 'group', 'id_group'), - array('group_reduction', 'id_category', 'category', 'id_category'), - array('homeslider', 'id_shop', 'shop', 'id_shop'), - array('homeslider', 'id_homeslider_slides', 'homeslider_slides', 'id_homeslider_slides'), - array('hook_module', 'id_hook', 'hook', 'id_hook'), - array('hook_module', 'id_module', 'module', 'id_module'), - array('hook_module_exceptions', 'id_hook', 'hook', 'id_hook'), - array('hook_module_exceptions', 'id_module', 'module', 'id_module'), - array('hook_module_exceptions', 'id_shop', 'shop', 'id_shop'), - array('image', 'id_product', 'product', 'id_product'), - array('message', 'id_cart', 'cart', 'id_cart'), - array('message_readed', 'id_message', 'message', 'id_message'), - array('message_readed', 'id_employee', 'employee', 'id_employee'), - array('module_access', 'id_profile', 'profile', 'id_profile'), - array('module_access', 'id_module', 'module', 'id_module'), - array('module_country', 'id_module', 'module', 'id_module'), - array('module_country', 'id_country', 'country', 'id_country'), - array('module_country', 'id_shop', 'shop', 'id_shop'), - array('module_currency', 'id_module', 'module', 'id_module'), - array('module_currency', 'id_currency', 'currency', 'id_currency'), - array('module_currency', 'id_shop', 'shop', 'id_shop'), - array('module_group', 'id_module', 'module', 'id_module'), - array('module_group', 'id_group', 'group', 'id_group'), - array('module_group', 'id_shop', 'shop', 'id_shop'), - array('module_preference', 'id_employee', 'employee', 'id_employee'), - array('orders', 'id_shop', 'shop', 'id_shop'), - array('orders', 'id_shop_group', 'group_shop', 'id_shop_group'), - array('order_carrier', 'id_order', 'orders', 'id_order'), - array('order_cart_rule', 'id_order', 'orders', 'id_order'), - array('order_detail', 'id_order', 'orders', 'id_order'), - array('order_detail_tax', 'id_order_detail', 'order_detail', 'id_order_detail'), - array('order_history', 'id_order', 'orders', 'id_order'), - array('order_invoice', 'id_order', 'orders', 'id_order'), - array('order_invoice_payment', 'id_order', 'orders', 'id_order'), - array('order_invoice_tax', 'id_order_invoice', 'order_invoice', 'id_order_invoice'), - array('order_return', 'id_order', 'orders', 'id_order'), - array('order_return_detail', 'id_order_return', 'order_return', 'id_order_return'), - array('order_slip', 'id_order', 'orders', 'id_order'), - array('order_slip_detail', 'id_order_slip', 'order_slip', 'id_order_slip'), - array('pack', 'id_product_pack', 'product', 'id_product'), - array('pack', 'id_product_item', 'product', 'id_product'), - array('page', 'id_page_type', 'page_type', 'id_page_type'), - array('page_viewed', 'id_shop', 'shop', 'id_shop'), - array('page_viewed', 'id_shop_group', 'shop_group', 'id_shop_group'), - array('page_viewed', 'id_date_range', 'date_range', 'id_date_range'), - array('product_attachment', 'id_attachment', 'attachment', 'id_attachment'), - array('product_attachment', 'id_product', 'product', 'id_product'), - array('product_attribute', 'id_product', 'product', 'id_product'), - array('product_attribute_combination', 'id_product_attribute', 'product_attribute', 'id_product_attribute'), - array('product_attribute_combination', 'id_attribute', 'attribute', 'id_attribute'), - array('product_attribute_image', 'id_image', 'image', 'id_image'), - array('product_attribute_image', 'id_product_attribute', 'product_attribute', 'id_product_attribute'), - array('product_carrier', 'id_product', 'product', 'id_product'), - array('product_carrier', 'id_shop', 'shop', 'id_shop'), - array('product_carrier', 'id_carrier_reference', 'carrier', 'id_reference'), - array('product_country_tax', 'id_product', 'product', 'id_product'), - array('product_country_tax', 'id_country', 'country', 'id_country'), - array('product_country_tax', 'id_tax', 'tax', 'id_tax'), - array('product_download', 'id_product', 'product', 'id_product'), - array('product_group_reduction_cache', 'id_product', 'product', 'id_product'), - array('product_group_reduction_cache', 'id_group', 'group', 'id_group'), - array('product_sale', 'id_product', 'product', 'id_product'), - array('product_supplier', 'id_product', 'product', 'id_product'), - array('product_supplier', 'id_supplier', 'supplier', 'id_supplier'), - array('product_tag', 'id_product', 'product', 'id_product'), - array('product_tag', 'id_tag', 'tag', 'id_tag'), - array('range_price', 'id_carrier', 'carrier', 'id_carrier'), - array('range_weight', 'id_carrier', 'carrier', 'id_carrier'), - array('referrer_cache', 'id_referrer', 'referrer', 'id_referrer'), - array('referrer_cache', 'id_connections_source', 'connections_source', 'id_connections_source'), - array('scene_category', 'id_scene', 'scene', 'id_scene'), - array('scene_category', 'id_category', 'category', 'id_category'), - array('scene_products', 'id_scene', 'scene', 'id_scene'), - array('scene_products', 'id_product', 'product', 'id_product'), - array('search_index', 'id_product', 'product', 'id_product'), - array('search_word', 'id_lang', 'lang', 'id_lang'), - array('search_word', 'id_shop', 'shop', 'id_shop'), - array('shop_url', 'id_shop', 'shop', 'id_shop'), - array('specific_price_priority', 'id_product', 'product', 'id_product'), - array('stock', 'id_warehouse', 'warehouse', 'id_warehouse'), - array('stock', 'id_product', 'product', 'id_product'), - array('stock_available', 'id_product', 'product', 'id_product'), - array('stock_mvt', 'id_stock', 'stock', 'id_stock'), - array('tab_module_preference', 'id_employee', 'employee', 'id_employee'), - array('tab_module_preference', 'id_tab', 'tab', 'id_tab'), - array('tax_rule', 'id_country', 'country', 'id_country'), - array('theme_specific', 'id_theme', 'theme', 'id_theme'), - array('theme_specific', 'id_shop', 'shop', 'id_shop'), - array('warehouse_carrier', 'id_warehouse', 'warehouse', 'id_warehouse'), - array('warehouse_carrier', 'id_carrier', 'carrier', 'id_carrier'), - array('warehouse_product_location', 'id_product', 'product', 'id_product'), - array('warehouse_product_location', 'id_warehouse', 'warehouse', 'id_warehouse'), - ); - - $queries = self::bulle($queries); - foreach ($queries as $query_array) - { - // If this is a module and the module is not installed, we continue - if (isset($query_array[4]) && !Module::isInstalled($query_array[4])) - continue; - - $query = 'DELETE FROM `'._DB_PREFIX_.$query_array[0].'` WHERE `'.$query_array[1].'` NOT IN (SELECT `'.$query_array[3].'` FROM `'._DB_PREFIX_.$query_array[2].'`)'; - if ($db->Execute($query)) - if ($affected_rows = $db->Affected_Rows()) - $logs[$query] = $affected_rows; - } - - // _lang table cleaning - $tables = Db::getInstance()->executeS('SHOW TABLES LIKE "'.preg_replace('/([%_])/', '\\$1', _DB_PREFIX_).'%_\\_lang"'); - foreach ($tables as $table) - { - $table_lang = current($table); - $table = str_replace('_lang', '', $table_lang); - $id_table = 'id_'.preg_replace('/^'._DB_PREFIX_.'/', '', $table); - - $query = 'DELETE FROM `'.bqSQL($table_lang).'` WHERE `'.bqSQL($id_table).'` NOT IN (SELECT `'.bqSQL($id_table).'` FROM `'.bqSQL($table).'`)'; - if ($db->Execute($query)) - if ($affected_rows = $db->Affected_Rows()) - $logs[$query] = $affected_rows; - - $query = 'DELETE FROM `'.bqSQL($table_lang).'` WHERE `id_lang` NOT IN (SELECT `id_lang` FROM `'._DB_PREFIX_.'lang`)'; - if ($db->Execute($query)) - if ($affected_rows = $db->Affected_Rows()) - $logs[$query] = $affected_rows; - } - - // _shop table cleaning - $tables = Db::getInstance()->executeS('SHOW TABLES LIKE "'.preg_replace('/([%_])/', '\\$1', _DB_PREFIX_).'%_\\_shop"'); - foreach ($tables as $table) - { - $table_shop = current($table); - $table = str_replace('_shop', '', $table_shop); - $id_table = 'id_'.preg_replace('/^'._DB_PREFIX_.'/', '', $table); - - if (in_array($table_shop, array(_DB_PREFIX_.'carrier_tax_rules_group_shop'))) - continue; - - $query = 'DELETE FROM `'.bqSQL($table_shop).'` WHERE `'.bqSQL($id_table).'` NOT IN (SELECT `'.bqSQL($id_table).'` FROM `'.bqSQL($table).'`)'; - if ($db->Execute($query)) - if ($affected_rows = $db->Affected_Rows()) - $logs[$query] = $affected_rows; - - $query = 'DELETE FROM `'.bqSQL($table_shop).'` WHERE `id_shop` NOT IN (SELECT `id_shop` FROM `'._DB_PREFIX_.'shop`)'; - if ($db->Execute($query)) - if ($affected_rows = $db->Affected_Rows()) - $logs[$query] = $affected_rows; - } - - // stock_available - $query = 'DELETE FROM `'._DB_PREFIX_.'stock_available` WHERE `id_shop` NOT IN (SELECT `id_shop` FROM `'._DB_PREFIX_.'shop`) AND `id_shop_group` NOT IN (SELECT `id_shop_group` FROM `'._DB_PREFIX_.'shop_group`)'; - if ($db->Execute($query)) - if ($affected_rows = $db->Affected_Rows()) - $logs[$query] = $affected_rows; - - Category::regenerateEntireNtree(); - - // @Todo: Remove attachment files, images... - Image::clearTmpDir(); - self::clearAllCaches(); - - return $logs; - } - - public function truncate($case) - { - $db = Db::getInstance(); - - switch ($case) - { - case 'catalog': - $id_home = Configuration::get('PS_HOME_CATEGORY'); - $id_root = Configuration::get('PS_ROOT_CATEGORY'); - $db->execute('DELETE FROM `'._DB_PREFIX_.'category` WHERE id_category NOT IN ('.(int)$id_home.', '.(int)$id_root.')'); - $db->execute('DELETE FROM `'._DB_PREFIX_.'category_lang` WHERE id_category NOT IN ('.(int)$id_home.', '.(int)$id_root.')'); - $db->execute('DELETE FROM `'._DB_PREFIX_.'category_shop` WHERE id_category NOT IN ('.(int)$id_home.', '.(int)$id_root.')'); - foreach (scandir(_PS_CAT_IMG_DIR_) as $dir) - if (preg_match('/^[0-9]+(\-(.*))?\.jpg$/', $dir)) - unlink(_PS_CAT_IMG_DIR_.$dir); - $tables = array( - 'product', - 'product_shop', - 'feature_product', - 'product_lang', - 'category_product', - 'product_tag', - 'image', - 'image_lang', - 'image_shop', - 'specific_price', - 'specific_price_priority', - 'product_carrier', - 'cart_product', - 'compare_product', - 'product_attachment', - 'product_country_tax', - 'product_download', - 'product_group_reduction_cache', - 'product_sale', - 'product_supplier', - 'scene_products', - 'warehouse_product_location', - 'stock', - 'stock_available', - 'stock_mvt', - 'customization', - 'customization_field', - 'supply_order_detail', - 'attribute_impact', - 'product_attribute', - 'product_attribute_shop', - 'product_attribute_combination', - 'product_attribute_image', - 'attribute', - 'attribute_impact', - 'attribute_lang', - 'attribute_group', - 'attribute_group_lang', - 'attribute_group_shop', - 'attribute_shop', - 'product_attribute', - 'product_attribute_shop', - 'product_attribute_combination', - 'product_attribute_image', - 'stock_available', - 'manufacturer', - 'manufacturer_lang', - 'manufacturer_shop', - 'supplier', - 'supplier_lang', - 'supplier_shop', - 'customization', - 'customization_field', - 'customization_field_lang', - 'customized_data', - 'feature', - 'feature_lang', - 'feature_product', - 'feature_shop', - 'feature_value', - 'feature_value_lang', - 'pack', - 'scene', - 'scene_category', - 'scene_lang', - 'scene_products', - 'scene_shop', - 'search_index', - 'search_word', - 'specific_price', - 'specific_price_priority', - 'specific_price_rule', - 'specific_price_rule_condition', - 'specific_price_rule_condition_group', - 'stock', - 'stock_available', - 'stock_mvt', - ); - foreach ($tables as $table) - $db->execute('TRUNCATE TABLE `'._DB_PREFIX_.bqSQL($table).'`'); - $db->execute('DELETE FROM `'._DB_PREFIX_.'address` WHERE id_manufacturer > 0 OR id_supplier > 0 OR id_warehouse > 0'); - - Image::deleteAllImages(_PS_PROD_IMG_DIR_); - if (!file_exists(_PS_PROD_IMG_DIR_)) - mkdir(_PS_PROD_IMG_DIR_); - foreach (scandir(_PS_MANU_IMG_DIR_) as $dir) - if (preg_match('/^[0-9]+(\-(.*))?\.jpg$/', $dir)) - unlink(_PS_MANU_IMG_DIR_.$dir); - foreach (scandir(_PS_SUPP_IMG_DIR_) as $dir) - if (preg_match('/^[0-9]+(\-(.*))?\.jpg$/', $dir)) - unlink(_PS_SUPP_IMG_DIR_.$dir); - break; - - case 'sales': - $tables = array( - 'customer', - 'cart', - 'cart_product', - 'connections', - 'connections_page', - 'connections_source', - 'customer_group', - 'customer_message', - 'customer_message_sync_imap', - 'customer_thread', - 'guest', - 'message', - 'message_readed', - 'orders', - 'order_carrier', - 'order_cart_rule', - 'order_detail', - 'order_detail_tax', - 'order_history', - 'order_invoice', - 'order_invoice_payment', - 'order_invoice_tax', - 'order_payment', - 'order_return', - 'order_return_detail', - 'order_slip', - 'order_slip_detail', - 'page', - 'pagenotfound', - 'page_type', - 'page_viewed', - 'referrer_cache', - 'sekeyword', - ); - foreach ($tables as $table) - $db->execute('TRUNCATE TABLE `'._DB_PREFIX_.bqSQL($table).'`'); - $db->execute('DELETE FROM `'._DB_PREFIX_.'address` WHERE id_customer > 0'); - $db->execute('UPDATE `'._DB_PREFIX_.'employee` SET `id_last_order` = 0,`id_last_customer_message` = 0,`id_last_customer` = 0'); - - break; - } - self::clearAllCaches(); - } - - // Not called yet - public static function cleanAndOptimize() - { - Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'cart` WHERE id_cart NOT IN (SELECT id_cart FROM `'._DB_PREFIX_.'cart`) AND date_add < "'.pSQL(date('Y-m-d', strtotime('-1 month'))).'"'); - } - - protected static function bulle($array) - { - $sorted = false; - $size = count($array); - while (!$sorted) - { - $sorted = true; - for ($i = 0; $i < $size - 1; ++$i) - for ($j = $i + 1; $j < $size; ++$j) - if ($array[$i][2] == $array[$j][0]) - { - $tmp = $array[$i]; - $array[$i] = $array[$j]; - $array[$j] = $tmp; - $sorted = false; - } - } - return $array; - } - - protected static function clearAllCaches() - { - $index = file_exists(_PS_TMP_IMG_DIR_.'index.php') ? file_get_contents(_PS_TMP_IMG_DIR_.'index.php') : ''; - Tools::deleteDirectory(_PS_TMP_IMG_DIR_, false); - file_put_contents(_PS_TMP_IMG_DIR_.'index.php', $index); - Context::getContext()->smarty->clearAllCache(); - } - - public function renderForm() - { - $fields_form_1 = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Catalog'), - 'icon' => 'icon-cogs' - ), - 'description' => $this->l('I understand that all the catalog data will be removed without possible rollback: products, features, categories, tags, images, prices, attachments, scenes, stocks, attribute groups and values, manufacturers, suppliers…'), - 'submit' => array( - 'title' => $this->l('Delete catalog'), - 'class' => 'btn btn-default', - 'name' => 'submitTruncateCatalog', - 'id' => 'submitTruncateCatalog', - ) - ), - ); - - $fields_form_2 = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Orders and customers'), - 'icon' => 'icon-cogs' - ), - 'description' => $this->l('I understand that all the orders and customers will be removed without possible rollback: customers, carts, orders, connections, guests, messages, stats...'), - 'submit' => array( - 'title' => $this->l('Delete orders & customers'), - 'class' => 'btn btn-default', - 'name' => 'submitTruncateSales', - 'id' => 'submitTruncateSales', - ) - ), - ); - - $fields_form_3 = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Functional integrity constraints'), - 'icon' => 'icon-cogs' - ), - 'submit' => array( - 'title' => $this->l('Check & fix'), - 'class' => 'btn btn-default', - 'name' => 'submitCheckAndFix', - ) - ), - ); - - $helper = new HelperForm(); - $helper->show_toolbar = false; - $helper->table = $this->table; - $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); - $helper->default_form_language = $lang->id; - $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; - $this->fields_form = array(); - $helper->id = (int)Tools::getValue('id_carrier'); - $helper->identifier = $this->identifier; - $helper->submit_action = 'btnSubmit'; - $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->tpl_vars = array( - 'fields_value' => $this->getConfigFieldsValues(), - 'languages' => $this->context->controller->getLanguages(), - 'id_language' => $this->context->language->id - ); - - return $helper->generateForm(array($fields_form_1, $fields_form_2, $fields_form_3)); - } - - public function getConfigFieldsValues() - { - return array('value' => ''); - } -} diff --git a/modules/pscleaner/translations/index.php b/modules/pscleaner/translations/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/pscleaner/translations/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/referralprogram/ReferralProgramModule.php b/modules/referralprogram/ReferralProgramModule.php deleted file mode 100644 index 47ad866e8..000000000 --- a/modules/referralprogram/ReferralProgramModule.php +++ /dev/null @@ -1,192 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class ReferralProgramModule extends ObjectModel -{ - public $id_sponsor; - public $email; - public $lastname; - public $firstname; - public $id_customer; - public $id_cart_rule; - public $id_cart_rule_sponsor; - public $date_add; - public $date_upd; - - /** - * @see ObjectModel::$definition - */ - public static $definition = array( - 'table' => 'referralprogram', - 'primary' => 'id_referralprogram', - 'fields' => array( - 'id_sponsor' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), - 'email' => array('type' => self::TYPE_STRING, 'validate' => 'isEmail', 'required' => true, 'size' => 255), - 'lastname' => array('type' => self::TYPE_STRING, 'validate' => 'isName', 'required' => true, 'size' => 128), - 'firstname' => array('type' => self::TYPE_STRING, 'validate' => 'isName', 'required' => true, 'size' => 128), - 'id_customer' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), - 'id_cart_rule' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), - 'id_cart_rule_sponsor' =>array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), - 'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), - 'date_upd' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), - ), - ); - - public static function getDiscountPrefix() - { - return 'SP'; - } - - public function registerDiscountForSponsor($id_currency) - { - if ((int)$this->id_cart_rule_sponsor > 0) - return false; - return $this->registerDiscount((int)$this->id_sponsor, 'sponsor', (int)$id_currency); - } - - public function registerDiscountForSponsored($id_currency) - { - if (!(int)$this->id_customer OR (int)$this->id_cart_rule > 0) - return false; - return $this->registerDiscount((int)$this->id_customer, 'sponsored', (int)$id_currency); - } - - public function registerDiscount($id_customer, $register = false, $id_currency = 0) - { - $configurations = Configuration::getMultiple(array('REFERRAL_DISCOUNT_TYPE', 'REFERRAL_PERCENTAGE', 'REFERRAL_DISCOUNT_VALUE_'.(int)$id_currency)); - - $cartRule = new CartRule(); - if ($configurations['REFERRAL_DISCOUNT_TYPE'] == Discount::PERCENT) - $cartRule->reduction_percent = (float)$configurations['REFERRAL_PERCENTAGE']; - elseif ($configurations['REFERRAL_DISCOUNT_TYPE'] == Discount::AMOUNT AND isset($configurations['REFERRAL_DISCOUNT_VALUE_'.(int)$id_currency])) - $cartRule->reduction_amount = (float)$configurations['REFERRAL_DISCOUNT_VALUE_'.(int)$id_currency]; - - $cartRule->quantity = 1; - $cartRule->quantity_per_user = 1; - $cartRule->date_from = date('Y-m-d H:i:s', time()); - $cartRule->date_to = date('Y-m-d H:i:s', time() + 31536000); // + 1 year - $cartRule->code = $this->getDiscountPrefix().Tools::passwdGen(6); - $cartRule->name = Configuration::getInt('REFERRAL_DISCOUNT_DESCRIPTION'); - if (empty($cartRule->name)) - $cartRule->name = 'Referral reward'; - $cartRule->id_customer = (int)$id_customer; - $cartRule->reduction_currency = (int)$id_currency; - - if ($cartRule->add()) - { - if ($register != false) - { - if ($register == 'sponsor') - $this->id_cart_rule_sponsor = (int)$cartRule->id; - elseif ($register == 'sponsored') - $this->id_cart_rule = (int)$cartRule->id; - return $this->save(); - } - return true; - } - return false; - } - - /** - * Return sponsored friends - * - * @return array Sponsor - */ - public static function getSponsorFriend($id_customer, $restriction = false) - { - if (!(int)($id_customer)) - return array(); - - $query = ' - SELECT s.* - FROM `'._DB_PREFIX_.'referralprogram` s - WHERE s.`id_sponsor` = '.(int)$id_customer; - if ($restriction) - { - if ($restriction == 'pending') - $query.= ' AND s.`id_customer` = 0'; - elseif ($restriction == 'subscribed') - $query.= ' AND s.`id_customer` != 0'; - } - - return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($query); - } - - /** - * Return if a customer is sponsorised - * - * @return boolean - */ - public static function isSponsorised($id_customer, $getId=false) - { - $result = Db::getInstance()->getRow(' - SELECT s.`id_referralprogram` - FROM `'._DB_PREFIX_.'referralprogram` s - WHERE s.`id_customer` = '.(int)$id_customer); - - if (isset($result['id_referralprogram']) AND $getId === true) - return (int)$result['id_referralprogram']; - - return isset($result['id_referralprogram']); - } - - public static function isSponsorFriend($id_sponsor, $id_friend) - { - if (!(int)($id_sponsor) OR !(int)($id_friend)) - return false; - - $result = Db::getInstance()->getRow(' - SELECT s.`id_referralprogram` - FROM `'._DB_PREFIX_.'referralprogram` s - WHERE s.`id_sponsor` = '.(int)($id_sponsor).' AND s.`id_referralprogram` = '.(int)($id_friend)); - - return isset($result['id_referralprogram']); - } - - /** - * Return if an email is already register - * - * @return boolean OR int idReferralProgram - */ - public static function isEmailExists($email, $getId = false, $checkCustomer = true) - { - if (empty($email) OR !Validate::isEmail($email)) - die (Tools::displayError('The email address is invalid.')); - - if ($checkCustomer === true AND Customer::customerExists($email)) - return false; - $result = Db::getInstance()->getRow(' - SELECT s.`id_referralprogram` - FROM `'._DB_PREFIX_.'referralprogram` s - WHERE s.`email` = \''.pSQL($email).'\''); - if ($getId) - return (int)$result['id_referralprogram']; - return isset($result['id_referralprogram']); - } -} diff --git a/modules/referralprogram/config.xml b/modules/referralprogram/config.xml deleted file mode 100755 index 82fa274d4..000000000 --- a/modules/referralprogram/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - referralprogram - - - - - - All sponsors and friends will be deleted. Are you sure you want to uninstall this module? - 1 - 1 - - \ No newline at end of file diff --git a/modules/referralprogram/controllers/front/email.php b/modules/referralprogram/controllers/front/email.php deleted file mode 100755 index 0a9a3b45c..000000000 --- a/modules/referralprogram/controllers/front/email.php +++ /dev/null @@ -1,72 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/** - * @since 1.5.0 - */ -class ReferralprogramEmailModuleFrontController extends ModuleFrontController -{ - public $content_only = true; - - public $display_header = false; - - public $display_footer = false; - - /** - * @see FrontController::initContent() - */ - public function initContent() - { - parent::initContent(); - $shop_name = htmlentities(Configuration::get('PS_SHOP_NAME'), NULL, 'utf-8'); - $shop_url = Tools::getHttpHost(true, true); - $customer = Context::getContext()->customer; - - if (!preg_match("#.*\.html$#Ui", Tools::getValue('mail')) OR !preg_match("#.*\.html$#Ui", Tools::getValue('mail'))) - die(Tools::redirect()); - - $file = file_get_contents(dirname(__FILE__).'/../../mails/'.strval(preg_replace('#\.{2,}#', '.', Tools::getValue('mail')))); - - $file = str_replace('{shop_name}', $shop_name, $file); - $file = str_replace('{shop_url}', $shop_url.__PS_BASE_URI__, $file); - $file = str_replace('{shop_logo}', $shop_url._PS_IMG_.'logo.jpg', $file); - $file = str_replace('{firstname}', $customer->firstname, $file); - $file = str_replace('{lastname}', $customer->lastname, $file); - $file = str_replace('{email}', $customer->email, $file); - $file = str_replace('{firstname_friend}', 'XXXXX', $file); - $file = str_replace('{lastname_friend}', 'xxxxxx', $file); - $file = str_replace('{link}', 'authentication.php?create_account=1', $file); - $discount_type = (int)(Configuration::get('REFERRAL_DISCOUNT_TYPE')); - if ($discount_type == 1) - $file = str_replace('{discount}', Discount::display((float)(Configuration::get('REFERRAL_PERCENTAGE')), $discount_type, new Currency($this->context->currency->id)), $file); - else - $file = str_replace('{discount}', Discount::display((float)(Configuration::get('REFERRAL_DISCOUNT_VALUE_' . $this->context->currency->id)), $discount_type, new Currency($this->context->currency->id)), $file); - - $this->context->smarty->assign(array('content' => $file)); - - $this->setTemplate('email.tpl'); - } -} \ No newline at end of file diff --git a/modules/referralprogram/controllers/front/index.php b/modules/referralprogram/controllers/front/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/referralprogram/controllers/front/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/referralprogram/controllers/front/program.php b/modules/referralprogram/controllers/front/program.php deleted file mode 100755 index 68cf153b1..000000000 --- a/modules/referralprogram/controllers/front/program.php +++ /dev/null @@ -1,208 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/** - * @since 1.5.0 - */ -include_once(dirname(__FILE__).'../../../ReferralProgramModule.php'); -include_once(dirname(__FILE__).'../../../referralprogram.php'); - -class ReferralprogramProgramModuleFrontController extends ModuleFrontController -{ - - public function init() - { - if (!$this->context->customer->isLogged()) - Tools::redirect('index.php?controller=authentication&back=modules/referralprogram/referralprogram-program.php'); - parent::init(); - } - - public function setMedia() - { - parent::setMedia(); - $this->addJqueryPlugin(array('thickbox', 'idTabs')); - } - - - /** - * @see FrontController::initContent() - */ - public function initContent() - { - parent::initContent(); - - // get discount value (ready to display) - $discount_type = (int)(Configuration::get('REFERRAL_DISCOUNT_TYPE')); - if ($discount_type == 1) - $discount = Discount::display((float)(Configuration::get('REFERRAL_PERCENTAGE')), $discount_type, new Currency($this->context->currency->id)); - else - $discount = Discount::display((float)(Configuration::get('REFERRAL_DISCOUNT_VALUE_'.(int)($this->context->currency->id))), $discount_type, new Currency($this->context->currency->id)); - - $activeTab = 'sponsor'; - $error = false; - - // Mailing invitation to friend sponsor - $invitation_sent = false; - $nbInvitation = 0; - if (Tools::isSubmit('submitSponsorFriends') AND Tools::getValue('friendsEmail') AND sizeof($friendsEmail = Tools::getValue('friendsEmail')) >= 1) - { - $activeTab = 'sponsor'; - if (!Tools::getValue('conditionsValided')) - $error = 'conditions not valided'; - else - { - $friendsLastName = Tools::getValue('friendsLastName'); - $friendsFirstName = Tools::getValue('friendsFirstName'); - $mails_exists = array(); - foreach ($friendsEmail AS $key => $friendEmail) - { - $friendEmail = strval($friendEmail); - $friendLastName = strval($friendsLastName[$key]); - $friendFirstName = strval($friendsFirstName[$key]); - - if (empty($friendEmail) AND empty($friendLastName) AND empty($friendFirstName)) - continue; - elseif (empty($friendEmail) OR !Validate::isEmail($friendEmail)) - $error = 'email invalid'; - elseif (empty($friendFirstName) OR empty($friendLastName) OR !Validate::isName($friendLastName) OR !Validate::isName($friendFirstName)) - $error = 'name invalid'; - elseif (ReferralProgramModule::isEmailExists($friendEmail) OR Customer::customerExists($friendEmail)) - $mails_exists[] = $friendEmail; - else - { - $referralprogram = new ReferralProgramModule(); - $referralprogram->id_sponsor = (int)($this->context->customer->id); - $referralprogram->firstname = $friendFirstName; - $referralprogram->lastname = $friendLastName; - $referralprogram->email = $friendEmail; - if (!$referralprogram->validateFields(false)) - $error = 'name invalid'; - else - { - if ($referralprogram->save()) - { - if (Configuration::get('PS_CIPHER_ALGORITHM')) - $cipherTool = new Rijndael(_RIJNDAEL_KEY_, _RIJNDAEL_IV_); - else - $cipherTool = new Blowfish(_COOKIE_KEY_, _COOKIE_IV_); - $vars = array( - '{email}' => strval($this->context->customer->email), - '{lastname}' => strval($this->context->customer->lastname), - '{firstname}' => strval($this->context->customer->firstname), - '{email_friend}' => $friendEmail, - '{lastname_friend}' => $friendLastName, - '{firstname_friend}' => $friendFirstName, - '{link}' => Context::getContext()->link->getPageLink('authentication', true, Context::getContext()->language->id, 'create_account=1&sponsor='.urlencode($cipherTool->encrypt($referralprogram->id.'|'.$referralprogram->email.'|')), false), - '{discount}' => $discount); - Mail::Send((int)$this->context->language->id, 'referralprogram-invitation', Mail::l('Referral Program', (int)$this->context->language->id), $vars, $friendEmail, $friendFirstName.' '.$friendLastName, strval(Configuration::get('PS_SHOP_EMAIL')), strval(Configuration::get('PS_SHOP_NAME')), NULL, NULL, dirname(__FILE__).'/../../mails/'); - $invitation_sent = true; - $nbInvitation++; - $activeTab = 'pending'; - } - else - $error = 'cannot add friends'; - } - } - if ($error) - break; - } - if ($nbInvitation > 0) - unset($_POST); - //Not to stop the sending of e-mails in case of doubloon - if(sizeof($mails_exists)) - $error = 'email exists'; - } - } - - // Mailing revive - $revive_sent = false; - $nbRevive = 0; - if (Tools::isSubmit('revive')) - { - $activeTab = 'pending'; - if (Tools::getValue('friendChecked') AND sizeof($friendsChecked = Tools::getValue('friendChecked')) >= 1) - { - foreach ($friendsChecked as $key => $friendChecked) - { - if (ReferralProgramModule::isSponsorFriend((int)($this->context->customer->id), (int)($friendChecked))) - { - if (Configuration::get('PS_CIPHER_ALGORITHM')) - $cipherTool = new Rijndael(_RIJNDAEL_KEY_, _RIJNDAEL_IV_); - else - $cipherTool = new Blowfish(_COOKIE_KEY_, _COOKIE_IV_); - $referralprogram = new ReferralProgramModule((int)($key)); - $vars = array( - '{email}' => $this->context->customer->email, - '{lastname}' => $this->context->customer->lastname, - '{firstname}' => $this->context->customer->firstname, - '{email_friend}' => $referralprogram->email, - '{lastname_friend}' => $referralprogram->lastname, - '{firstname_friend}' => $referralprogram->firstname, - '{link}' => Context::getContext()->link->getPageLink('authentication', true, Context::getContext()->language->id, 'create_account=1&sponsor='.urlencode($cipherTool->encrypt($referralprogram->id.'|'.$referralprogram->email.'|')), false), - '{discount}' => $discount - ); - $referralprogram->save(); - Mail::Send((int)$this->context->language->id, 'referralprogram-invitation', Mail::l('Referral Program', (int)$this->context->language->id), $vars, $referralprogram->email, $referralprogram->firstname.' '.$referralprogram->lastname, strval(Configuration::get('PS_SHOP_EMAIL')), strval(Configuration::get('PS_SHOP_NAME')), NULL, NULL, dirname(__FILE__).'/../../mails/'); - $revive_sent = true; - $nbRevive++; - } - } - } - else - $error = 'no revive checked'; - } - - $customer = new Customer((int)($this->context->customer->id)); - $stats = $customer->getStats(); - - $orderQuantity = (int)(Configuration::get('REFERRAL_ORDER_QUANTITY')); - $canSendInvitations = false; - - if ((int)($stats['nb_orders']) >= $orderQuantity) - $canSendInvitations = true; - - $discountInPercent = Tools::getValue('discount_type', Configuration::get('REFERRAL_DISCOUNT_TYPE')) == 1; - - // Smarty display - $this->context->smarty->assign(array( - 'activeTab' => $activeTab, - 'discount' => $discount, - 'orderQuantity' => $orderQuantity, - 'canSendInvitations' => $canSendInvitations, - 'nbFriends' => (int)(Configuration::get('REFERRAL_NB_FRIENDS')), - 'error' => $error, - 'invitation_sent' => $invitation_sent, - 'nbInvitation' => $nbInvitation, - 'pendingFriends' => ReferralProgramModule::getSponsorFriend((int)($this->context->customer->id), 'pending'), - 'revive_sent' => $revive_sent, - 'nbRevive' => $nbRevive, - 'subscribeFriends' => ReferralProgramModule::getSponsorFriend((int)($this->context->customer->id), 'subscribed'), - 'mails_exists' => (isset($mails_exists) ? $mails_exists : array()), - 'currencySign' => ($discountInPercent ? '%' : $this->context->currency->sign) - )); - $this->setTemplate('program.tpl'); - } -} diff --git a/modules/referralprogram/controllers/front/rules.php b/modules/referralprogram/controllers/front/rules.php deleted file mode 100755 index fe121f18f..000000000 --- a/modules/referralprogram/controllers/front/rules.php +++ /dev/null @@ -1,57 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -/** - * @since 1.5.0 - */ -class ReferralprogramRulesModuleFrontController extends ModuleFrontController -{ - public $content_only = true; - - public $display_header = false; - - public $display_footer = false; - - /** - * @see FrontController::initContent() - */ - public function initContent() - { - parent::initContent(); - $xmlFile = _PS_MODULE_DIR_.'referralprogram/referralprogram.xml'; - if (file_exists($xmlFile)) - { - if ($xml = @simplexml_load_file($xmlFile)) - { - $this->context->smarty->assign(array( - 'xml' => $xml, - 'paragraph' => 'paragraph_'.$this->context->language->id - )); - } - } - $this->setTemplate('rules.tpl'); - } -} \ No newline at end of file diff --git a/modules/referralprogram/controllers/index.php b/modules/referralprogram/controllers/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/referralprogram/controllers/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/referralprogram/index.php b/modules/referralprogram/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/referralprogram/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/referralprogram/logo.gif b/modules/referralprogram/logo.gif deleted file mode 100644 index 85de792287d846f3e7502afdac0fd02f40ecdce4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1051 zcmZ?wbhEHb6krfwcs`54-rn932%KFVTs+*|+`PQJyuH1Be0+hxGcYDaSkadDHEa{gVP(6QZrLiQzykbPKtHb zty3>fiJcoSnx3AXkeO?ee{x!a^VCGAsfjLGSvlF+*;(0nX*mUsMcYF2x6DX)nVGFz zSXekKGa#t=Y;ke%{CuU7va-aw#E9AnUiB+0Dk>@~E0-3BM%JB}RGvMlJZExcTwQJX ztm=s6RgPtC#Z663wQV(xEp7Gf)h!*(iPIA5drH?eB=2uF?CI)Q(^}Zu+uPMYgu3dX=Sst3W zJzZz=Y_0W~HIpk(W_2Get3I98e7fNI+TxD0MUOW&cAhQmJ6rgCQ*Hmbif21gr=Kg| zyLa#W3pEE19z1mD(Cz)pj~qGj{J^A*SC_25G56!qX`hcx`*x!D+_`hFPA`9Qe%q$& zf6raM{QSa>PZ!txzOeAxjjLa;Z1{V9-QBx)U%Ytne-w}y0*e0xor_WvOHxx5$}>wc z6x=<10~i#4vM_Qn{AbW%00K}(Vc>Yo@Sju0Lcn{bfiZ`ch{drUXJb7vJ{G~}{K}S@ zn><7`949Gxb<64A)Cf4c#CsZFWJE+0Gbg*vhZip|FKu)ZmMBW<2y*ojaw)LkS;FAl zDJ?4-#ldt$-G7m;0E?f-7sC_*`|5W$7B(L_?O@t>!r(^b diff --git a/modules/referralprogram/logo.png b/modules/referralprogram/logo.png deleted file mode 100755 index be8cf761eaa64fb6080055bbf7be8da13ef458e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2514 zcmV;@2`%=CP)^Isl{3{2B0y)*y3`~Lsjd$#X<=Ufiw=MwL~Dtoga2siQ& z0G@Un8@6q|^Gws|GWutp>p|{3D3{mN=I9>3i1Km;vaBGPvN04GU6kicaTg9IMx$`!>M%MjmZ_IxazuD_-s!* z2Kq-%so^IQ0q%~up#@C&xTO~HWEW_N%5uw{pnVEw>A+2IHp`pi|9X*LTBd?4jkyl z+wU|WnNHx=l}qre$M1yX7hoAC9K(%j{IS>eukY?2AOg~0n1*|nNT_Ju+m44f?)f9h zjGc=O&t$^zn%cacV7{c()YZYX9oNQ-tE=GiDo7BpOf!w{j($A*)ElTQ^B{I*_|e?3 z@6p?2;Y@=HgMtzi?8VbBnFf)-mP{te0G;xihOVb!7zV!n zY7oa-+OTldZ4k=5XgKgPDoYl@&*y*_Mfd|*$jPrj;rB1a$AcS@mtBs_FTa_H%3fYN zHFbP<(@@JPBhE|#W2=&NKc4pCPgg9PIw?DcB0wcYiW$I88ek$iGLB>Y15j?Bir&FC zYJ3D&LB`ta8$lwpEU3DQzwBKC+e*{9gUQ*IsIIsUZ@%^vo_?s+M|#w=fsl2qv5yXp zuI_4UgKcQ8LL+Usp0n_qx{la*1f@T!!?9i_Bf>Fd=&FX-o7X^MVI=x}|L}v9!6;12 zax121_z1@15m+aK?>iR;*m2_1!;!WfU3^QZOq&^$by$``N^BUU{PQoqgg9j;ikwl{ z%w3Lm{cxxk9PZhM-8q{Gye9e&iO5dg4c04+U>9P!TM1j_=Atwp2%ZU*b#y z--kd{%Gs=~84#!!Xo)dAvg#)&FDOQDY%V@Kel;Y%2L-V*RF~DGy!1kh9Lk~Lqy*l8 z7tvUhfE*|FqoutNIZUVbr5}*R^j&zk02cX2hp{I8Ptp}zW73F zNM3xtZ?EfJef_m=3G+OMFIo>Wr{-nmgE*@K?^TcQORc}93L`|Z`vwV#1e$=t;r<_Z zU=V^Cstp35WwL5evH4gCDdIJWw=p{`Aj>Ob<%1)*6>Ry{boA`4r;wg_;9T3QLsLg$Eyxy57< zfsZNYEe)GH6^x`DDlMuG)4^A99;pNGpkSm4Q>I*ii!Q1}M@JXh+mB$|)`kZ=I*v5> z1Ho%)V8sO$Q>a0uP<`oTch%G`to~$s<7SouA*mV|PM8!XlN!uPa$qd{<$!@VTTR?p zMYAro)-4@8x+4~OZn<&}N!kLB~5Z7Jau0^t6ewq)B!AtpV(^sMmbZZlWY0)4hYnqc&vGhQ)o; zx?u4{&5nhk!9jXnha^hw9N_l{2uV23#MnI<0g)!FK1z$v>vJPbm&Y}rXCR6()rLw2 zaIRn9k^+$&p5JMlEEzhW$e(sj(ln9@g){NjS2rTRs1!A|HK?qt#Ngo2>nrZM`&uS9 zX;SEQwx@U$G&OCqLU45eab`y-dsg4l_BK*1>V#(w4bhTkJ0;G+)=k%uA)?($@oa@wL%n1Ijo)Xzs)h^IA}I`7D%IOhuX$ zh4aI1B&JWFj+~qvmy&~lNi<~%%(%I`cQrrBSeHdW8-MSYPx$7qIq}Kpz#@1;)s8c< zj{+7EM~k+k2M@h3_!4syiHe2$_V1@KH(>@TuCK3m<+g0ug6^Y7QCnM!WIWDBHZ~!# zyqaRBEA^$C|L`LHzLjYd!UR7|7?P6g9WU(1-*w3A6_0oNpI>o0=by`#EpvsK za@t!;p8rkP^|n`DdhxzfLn?RLXeKjMvdQ?r_-1r69h8k*ep-bYTv@l>ap$wdh6|XG zrl~t$-T2Bq8ONCHiBn@5hx2!d8G7Y1_eHewGG`+hrDn!x_0)`bJ`FgVF`mqS?R2H5 cU;h?h0MnUDRdaaI^Z)<=07*qoM6N<$f(2a53IG5A diff --git a/modules/referralprogram/mails/en/index.php b/modules/referralprogram/mails/en/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/referralprogram/mails/en/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/referralprogram/mails/en/referralprogram-congratulations.html b/modules/referralprogram/mails/en/referralprogram-congratulations.html deleted file mode 100644 index b231066a4..000000000 --- a/modules/referralprogram/mails/en/referralprogram-congratulations.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - Message from {shop_name} - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Congratulations! -
    - - Your referred friend {sponsored_firstname} {sponsored_lastname} has placed his or her first order on {shop_name}!

    - We are pleased to offer you a voucher worth {discount_display} (voucher # {discount_name}) that you can use on your next order.
    -
    - Best regards, -
    -
     
    - - \ No newline at end of file diff --git a/modules/referralprogram/mails/en/referralprogram-congratulations.txt b/modules/referralprogram/mails/en/referralprogram-congratulations.txt deleted file mode 100644 index 539cbc2f3..000000000 --- a/modules/referralprogram/mails/en/referralprogram-congratulations.txt +++ /dev/null @@ -1,17 +0,0 @@ - -[{shop_url}] - -Congratulations! - -Your referred friend {sponsored_firstname} {sponsored_lastname} has -placed his or her first order on {shop_name} -[{shop_url}]! - -We are pleased to offer you a voucher worth {discount_display} -(VOUCHER # {discount_name}) that you can use on your next order. - -Best regards, - -{shop_name} [{shop_url}] powered by -PrestaShop(tm) [http://www.prestashop.com/] - diff --git a/modules/referralprogram/mails/en/referralprogram-invitation.html b/modules/referralprogram/mails/en/referralprogram-invitation.html deleted file mode 100644 index 86e212059..000000000 --- a/modules/referralprogram/mails/en/referralprogram-invitation.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - Message from {shop_name} - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - {firstname_friend} {lastname_friend}, join us! -
    - - Your friend {firstname} {lastname} wants to refer you on {shop_name}!

    - We are pleased to offer you a voucher worth {discount_display} (voucher # {discount_name}) that you can use on your next order. - Get referred and earn a discount voucher of {discount}! It's very easy to sign up. Just click here! -
    -
    - When signing up, don't forget to provide the e-mail address of your referring friend: {email}.

    - Best regards,
    -
     
    - - \ No newline at end of file diff --git a/modules/referralprogram/mails/en/referralprogram-invitation.txt b/modules/referralprogram/mails/en/referralprogram-invitation.txt deleted file mode 100644 index 85bd61f42..000000000 --- a/modules/referralprogram/mails/en/referralprogram-invitation.txt +++ /dev/null @@ -1,21 +0,0 @@ - -[{shop_url}] - -{firstname_friend} {lastname_friend}, join us! - -Your friend {firstname} {lastname} wants to refer you on {shop_name} -[{shop_url}]! - -We are pleased to offer you a voucher worth {discount_display} -(VOUCHER # {discount_name}) that you can use on your next order. Get -referred and earn a discount voucher of {discount}! It's very easy to -sign up. Just click here! [{link}] - -When signing up, don't forget to provide the e-mail address of your -referring friend: {email}. - -Best regards, - -{shop_name} [{shop_url}] powered by -PrestaShop(tm) [http://www.prestashop.com/] - diff --git a/modules/referralprogram/mails/en/referralprogram-voucher.html b/modules/referralprogram/mails/en/referralprogram-voucher.html deleted file mode 100644 index 0004d802d..000000000 --- a/modules/referralprogram/mails/en/referralprogram-voucher.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - Message from {shop_name} - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - - - -
    - Hi {firstname} {lastname}, -
    -

    - Referral Program

    - - We have created a voucher in your name for referring a friend.
    - Here is the code of your voucher: {voucher_num}, with an amount of {voucher_amount}.

    - Simply copy/paste this code during the payment process for your next order.
    -
    -
     
    - - \ No newline at end of file diff --git a/modules/referralprogram/mails/en/referralprogram-voucher.txt b/modules/referralprogram/mails/en/referralprogram-voucher.txt deleted file mode 100644 index de85dc5fe..000000000 --- a/modules/referralprogram/mails/en/referralprogram-voucher.txt +++ /dev/null @@ -1,18 +0,0 @@ - -[{shop_url}] - -Hi {firstname} {lastname}, - -Referral Program - -We have created a voucher in your name for referring a friend. - -Here is the code of your voucher: {voucher_num}, with an amount of -{voucher_amount}. - -Simply copy/paste this code during the payment process for your next -order. - -{shop_name} [{shop_url}] powered by -PrestaShop(tm) [http://www.prestashop.com/] - diff --git a/modules/referralprogram/mails/index.php b/modules/referralprogram/mails/index.php deleted file mode 100644 index 6f5ff3bab..000000000 --- a/modules/referralprogram/mails/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/referralprogram/referralprogram.gif b/modules/referralprogram/referralprogram.gif deleted file mode 100644 index 52029c51c55ee653e7b2459016e78fbdcb6659e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7413 zcmV4Tx09XmFd1Y8s-S_rB(=ZI(-3tll>V2P#=|q51OQ|K zE4X`vlLBG<0RAMALc$^dK+3{${^*F1ee3{Z`Y?EaFy8Nn-un+u+Q;sHaKUdK8!H`H z=LP^c3L-Jg8vy(RSk4_q@`l^N_XB{T4f5~}0)S=~#_A*=q6YxX!my5bU|{e*wt=y* z`+wT;{tqS+-4EI%61@-bpSi$q!X4}ShKB?YV}5`6|M>_Eh=kYccj1Je6yg5X#&C^; z*X%fnsAv5b`*<4d+w8YIBtqNjFZPWv+MnBRxlg2_?Oz<}Z>#ke`v)5z=m)u*ng5lO z!gb)a|MPCFkB$9b?BS`a_ZNo+TOH_!M_C`pV|{eY{_6MtZ;D@^}D$20uj`9}EI82)W1BFyGM$IDmW=&#%-%T?00Qui3jnQ@q{y(S zKkcFRD>NVnRDd3^08YRMgnspCXf~62)RMtP!JRe#Y3r37L*5Fg36$q&^@RTYJobTKIkJf0nI@_pe+OvL4lx0 za3BN`hY*SgErc<`2H}G6MuZ|_5ow6Ch$2Ke;x?iI(Smq`7(k38<`HX1fW#vikvvEV zq#{xWX^wP4dLhG*Cy<%QLS#9z2HAw{K)y$gBNvdHC=7}Y#f_3csh|u|wkQ%R6mHbOg~z0uL=baWxQ5?zmOM-QN<(d!rth7lu# zQNS2t95H^FI7~L?GNu;OjOoKnVb-u%EDKf)tA;hl60s53bnHd!ZR~UGJM1)e1Bb_P z;bd_7I44{XE(KSJtHwRUy~EAmw#lf;1jv-h%*i~+V#spHu8}p7^^i@IZIjcG3z4gl z+mQQ_CzBVE*O0f9kC3n6@pxXm65bN;i%-HA;qT&K;V1B$6tong6gm{n6p<8XDXJ)% zDLzuH5C{Z8f+oR<5J5OgxJhUuj1e{{=_n;BjVL`R6Df-+8z|pVey1X%5}?wea;1u; zDx|8T>Y-YoCZiUl)}ba+pP(+LZloTfUZbI-k)|=H38cxUsix_qnWe?j3exJ)deElP zR?xQ5PSGLh_~>-#NOY-m*XY{mrs*;CLi9%Te)L)Ncj&w6ml$XnWEt!jjx!W9JY^VX zL^2988Zibi<}lu89Aw;L;$YHZ@?^?js$qJ^^ply5S(Dk5Ig`1Td4PF~g_}i>#h)dY zz0-PZc9Eu|f%U9bI9M_DI9 zr&$-NYoME{+pR~dXRCKfZ%m(8-&_Bd{*r;5L7YLeA==Q`FxPO%h{K3vbkk_*h{BPC zBQK08jIE6?8BdysnuM7&nIcS&nC6>~mu zBPXnrol~XL+EKlu=Z{W1%Q>ez54s4s9Czt-Wpxd3eR_=Q81Y!08`{m@t=eseXih9A zuDKhzm$)yHbVwIS^B$TW1s-#rYMyzXGhS+5d0w;LYTo(Yb3PhAg+2?uI=+{Dm;DU= zuK4}*H}|jd-wUu0s13vgx&<}{(FXYky$I$EJ|5f`A{LS!G9IcNdOmb1%s8wv913>{ ze-uFv2P<8X!jUHv-W4MnlMyo$s~>wk4i!g=YmMiLPmZ5R z&`Kyf0iAF^(VEDYn3g!5WRP?tnLOD)`E80+N?yups(orx8b?}E+SEydlef|-)5Fq- zPN|%_avF8o_jGs0;f#wJzcM{CUuQ{W6=v;Zld@l*kv>y&X78-m+3p|uMedJSeHBtIuqJ8e$rj9{M~Sf8_Y6uklD@Ym-V-{bR|;RZn=H6hCEn zn)8hOS=zI`=dsV%nnRiwTD)7PT9363w>h-+zp#AK-EQ3e>ZSh6whpb1=daXWJ?T{L zY<#Ww`r#Y-Hw|5KUG;C}-qv@^cQ^DX^gQZS>TT*%?R)l4<6X;p-S;p1jr!jVm<{v| z+75mgavmE0;PGMhW5CDdPf?$?hm%IoBblSrqlIJaW96SkKG%-Rk3XHzo#>jho*bSc zP0fD^|FSck_LcCpaE5E<=B&)@lR5pl-fu_0P0xqSZ!e_(L-S9`cj5037Bv^UmK>I* zm&2C#eq^t(tW>SauC}gOtc|S)u5bU$++f+bv8lM(v1PwCvmL#I-6`4?*=_n|{A*+{ zaBnY!7)JaZ3n1Yq!pjSQA60Oi;0OR+F976}e`4I<8gK{<2j&PE+d-1hJmNAk5M_ks z!w|3t9DQL#j=<(}|8^{_e8EG8RH8wCgVrpt;X>MoXW*KOeV13S}+_uiH&A!iJ z%yHi7r!&HZ;L3bVz)hB@>+V1b_BiQT>~+`sh0h1yZ+_bW6oDK;Qo;Hm$3hdsu7$se zSczhb);{hPlM#C>?oIss32Y)yl3cP*igBu0n)yldbc<8wr!6upGA*+#vn|h9owd%f zKj)h3pO=uIS8((E^TNRk^B2J-x?;f+rOPIzu2({@rk9nJ*Hv^~`*MA^it&czP5o+@ zTj94e?v&Qtt8Km8dvE0a*ShZyR_nJPLXWVGludMxS)On{<$EUl{7|z}i$SYHTfmEy z_M(?}I@(?hc7A)k+eP!1uUoc9tM^Es$veaMn*DME!h@_s6hps0EPnj_sdu<}OA5y>^gjG)NP8m;QrGChBQX9vBdGJosctVQ6(& zOZdl#A5r*d{^P1K*0H{EC*pGx%1_iKHYar@_os}cPNvPAoKIgmwR-wz#&+hfZ0HR7 zEO`#qIi_6RJgI!m0?YHH!iWnei_TxHywp(KUNUg`OX=!WOc`6bbcNA1_v>+$1y#4< zTWzFz^pt{S;oqr1-cg6=2Q zj_rQl9ABE4oa~)y`cg5S^)-CPX;ynqUDxq+wZuBEe5jF*vNR~jJjL)Vh zCDc*Aqxy%2kyew=i$0&Bm2sJwi^ZHZk*%8jBPWVWlG~Igh&Pk(D*ru!r-Cnp+J)Oi z+C-bhn#Au*+?K37bVaI2xR= zh!#7p7^4?!9_JYEp5S*PG%+eEDmgqQFx4~d=t+xo{ZlHZ4`uLYvSd+aqp~;8ES~+E zGk$I?cOq{#f4N|*5OsmFi0LBtCE?;jB?_0-OZBgqUv(_=EDx_pxt4pqtnzNv^Bdjp zF8Fq9^A4tlu9oYr_&tUD+I6N6?CXgQehu0IfgOT0045&+s89kxKnC_7aPDbA z0Ki5GK;P*B)KLSV8u|nO0Ra@u2vGqhzzsx!9MA%0z!~_1I5?}k3~E6u7y=7$&d3Z& zK}HY>N`Njx4NyO{ieNw}Ae<11h)P5cViPHdv_+mmK1Qy<8Ji!f8nu9yLPw#WU{Dwn zOd)0pD~(OY_TxlwNw`mB@?-^MYvlIiO?WPR8h(z#f})YYPspQ0P)1UIqasobQ`=Jy z(Ad%p(%RF0pmU-dp?9O7VF+Q^X3S(_WxB(x&HRZaoRy087Mmg4SN1dxUXC_SPcCw< z``kx)usjXC-h8ZlJ^X0`$^wgmX7~w{dAW;F)F|lHCCkZx*ad>ZsNU2FvNzcf< zJbYWWNba%X;a*YmrIRJ*rR-N0%33NeUXQ46)jaZHIDie4H?ZDS~}ViIw86`dM)~11|q`><0&}jY+$xz zUS!E(m0|tBmIUXIgB+=xQkFyCO)R|X8Go~EjlcxtuZ#jwx)Iw_QejZj&nz;ofTb(u4j%l zxqWlzAX#~2c(!>1A5GsBzgGb?fv!QdA&5}Nu=^2|k%3X&$7N!Q;t=tH3B!p-NewAH zsTpaD>9(gHXYgg7&DuE=cy|1pU2adlalz|CvkM3ge41qoHf|;e$pcvGEHt+#_ zhcFN)%n@0^yigX*1-*ji5O{oG94MjUafly7!O<4rnKZlx%I+uo# zrj%Bgww_LxuAknEeuE*Ck&CgO$&_i9Ih{oij$VS;7};9bgE%-i-g2JclH~f#eU3+$ zXOs6HUjV-d|E$0*!4M$@VMzF`$R$y4FsFiZcAWO+4ylffPK(ZhE-tR;kG&=0+;vH*9xuFb-ex`*d?)>-0+Is6E@soHbN7XCJlcGeEI zPOdkCZ>4)Q`Yhjj4kQc}eQX#W8r>NeoV59p{`JZ1`n>Ev5sQsKpjFfL%NtAE2D@eZ z_7C?u4EqSUKor_A{W!L_w;~7tHV=T^+`YZ+^1Z#?3OLyq0iZeH4}ZR|jDi1EC>h;H z9rfRN_Ur$a{{yFvXzIb%l$!tm1`l6brB;gOBTXya_xml_ z2lJd0UFzNq+i#!!SnI#m`meROE@O=Rjh366YgVmVB`%jsJ2ID+mZYVn#q}%suD<~w zKR@5BU%y_WqoXAtAVB8k=45<)Tt0vPEdKuf($v)C6NKNd(EZL@PEL+lvu2I#-o0D4 zZrv)IH*c0LTeiriO`F8e&rjy(=Or&M&!?OJ7yuTc7!YgMuGJnG7^q+7zJC3xYrc%} z_qD)0$cZVjU0hsLi&n-JD*-_$`J!}oc2*`PCiD#R?D5rn0yuc^puwGCVPPs5S58e$ zX0g2>27B^B1&Sn~b$?VF5@ zj7UL2fw^<%j_b#dA8M&{M!~@aLIJ4Q*jTxF^QNx`DPFK~ z#?9D`OpKX}h=|ZVzW#UsKqvx0J~lR{%7%u9WbfX+a`NO!2@MUED_5?lJmODt;_PZ{ zY&07-Y*65U#~V+dK9w6cZuqpGvmOAj4gs*3l%wt0vq#;Hn*n$9=ux?Q_pW=rva-^o zq@>8;;Gm3-j;iHYkGE=SYRu&1q?DJJdj;YFfcVi59Xh1$#1eiZ47Xx6Wq0S!of?*B z&z_mHXV1!`M~?*Z0??9=v&F^5^5Vq{xpwWExp3iv2MDis0qiag(%W zy}i9^EedVNdH@kqr%cPcckgr$RuU$7K^D;-KYpxpoWU4KJv}|`4v%hf{&@8Oi=jPuL#1}x+4{8UTuqpgY02LJ#CO$r1$%d7rBdo@9 zYJFm2qI7q6s|*CA1mXec-o1OO3{Raob4K^n)zzsi!bPesZ$E{=iH&J!XfVf)9aHuq z5N1;ugMxx|jKaf*56giA2h>_iI$|Cd7bnTd$!aOyeMMspW)$QjS~X)@87Ru6k8r(XN5?K}#!}j)ez2zVd9a51U)CQ~}JMa*K zNy{BOc4+MfASAYmoUdU&o?%Z}S(!d`SXT~EIBccELOKAj05=kMEI}~JSO+kjG1i_x zf1WpjrW)t0a$L>$?c2AigLlKZbLZUYs2;$@qzJ;S2RMku6p`TIU>#!>Uu0nVG5azIgGX zsj8~dSToMZ$WUTFeE3j{5+0^009*+&tOLkOCH8Vb+46=(5RlT$c{l-JYCkc*diAQl zm;gmuvQAxbZb-Kv&4TRgY<-4t?NZ+nYLzZmxO@y4z*3l~jxjMYl9raHb%1$N(#l{j zVaD|oFdnPb)zu0@J#hd2eOF;&q2a=y|C>hU@Q(%D>f}7n3=C`m`g?P)UuGG1?h3$C^`bbj)wM*Y|)M-5(52oH$`9W;Dpnv(1~h n{|taPW!~nr5P4hpzvlh{j`m-!%;J4S00000NkvXXu0mjfq8@m- diff --git a/modules/referralprogram/referralprogram.php b/modules/referralprogram/referralprogram.php deleted file mode 100644 index 641e54340..000000000 --- a/modules/referralprogram/referralprogram.php +++ /dev/null @@ -1,678 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class ReferralProgram extends Module -{ - public function __construct() - { - $this->name = 'referralprogram'; - $this->tab = 'advertising_marketing'; - $this->version = '1.5.2'; - $this->author = 'PrestaShop'; - - $this->bootstrap = true; - parent::__construct(); - - $this->confirmUninstall = $this->l('All sponsors and friends will be deleted. Are you sure you want to uninstall this module?'); - $this->displayName = $this->l('Customer referral program'); - $this->description = $this->l('Integrate a referral program system into your shop.'); - if (Configuration::get('REFERRAL_DISCOUNT_TYPE') == 1 AND !Configuration::get('REFERRAL_PERCENTAGE')) - $this->warning = $this->l('Please specify an amount for referral program vouchers.'); - - if ($this->id) - { - $this->_configuration = Configuration::getMultiple(array('REFERRAL_NB_FRIENDS', 'REFERRAL_ORDER_QUANTITY', 'REFERRAL_DISCOUNT_TYPE', 'REFERRAL_DISCOUNT_VALUE')); - $this->_configuration['REFERRAL_DISCOUNT_DESCRIPTION'] = Configuration::getInt('REFERRAL_DISCOUNT_DESCRIPTION'); - $this->_xmlFile = dirname(__FILE__).'/referralprogram.xml'; - } - } - - public function install() - { - $defaultTranslations = array('en' => 'Referral reward', 'fr' => 'Récompense parrainage'); - $desc = array((int)Configuration::get('PS_LANG_DEFAULT') => $this->l('Referral reward')); - foreach (Language::getLanguages() AS $language) - if (isset($defaultTranslations[$language['iso_code']])) - $desc[(int)$language['id_lang']] = $defaultTranslations[$language['iso_code']]; - - if (!parent::install() OR !$this->installDB() OR !Configuration::updateValue('REFERRAL_DISCOUNT_DESCRIPTION', $desc) - OR !Configuration::updateValue('REFERRAL_ORDER_QUANTITY', 1) OR !Configuration::updateValue('REFERRAL_DISCOUNT_TYPE', 2) - OR !Configuration::updateValue('REFERRAL_NB_FRIENDS', 5) OR !$this->registerHook('shoppingCart') - OR !$this->registerHook('orderConfirmation') OR !$this->registerHook('updateOrderStatus') - OR !$this->registerHook('adminCustomers') OR !$this->registerHook('createAccount') - OR !$this->registerHook('createAccountForm') OR !$this->registerHook('customerAccount')) - return false; - - /* Define a default value for fixed amount vouchers, for each currency */ - foreach (Currency::getCurrencies() AS $currency) - Configuration::updateValue('REFERRAL_DISCOUNT_VALUE_'.(int)($currency['id_currency']), 5); - - /* Define a default value for the percentage vouchers */ - Configuration::updateValue('REFERRAL_PERCENTAGE', 5); - - /* This hook is optional */ - $this->registerHook('displayMyAccountBlock'); - - return true; - } - - public function installDB() - { - return Db::getInstance()->execute(' - CREATE TABLE `'._DB_PREFIX_.'referralprogram` ( - `id_referralprogram` INT UNSIGNED NOT NULL AUTO_INCREMENT, - `id_sponsor` INT UNSIGNED NOT NULL, - `email` VARCHAR(255) NOT NULL, - `lastname` VARCHAR(128) NOT NULL, - `firstname` VARCHAR(128) NOT NULL, - `id_customer` INT UNSIGNED DEFAULT NULL, - `id_cart_rule` INT UNSIGNED DEFAULT NULL, - `id_cart_rule_sponsor` INT UNSIGNED DEFAULT NULL, - `date_add` DATETIME NOT NULL, - `date_upd` DATETIME NOT NULL, - PRIMARY KEY (`id_referralprogram`), - UNIQUE KEY `index_unique_referralprogram_email` (`email`) - ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'); - } - - public function uninstall() - { - $result = true; - foreach (Currency::getCurrencies() AS $currency) - $result = $result AND Configuration::deleteByName('REFERRAL_DISCOUNT_VALUE_'.(int)($currency['id_currency'])); - if (!parent::uninstall() OR !$this->uninstallDB() OR !$this->removeMail() OR !$result - OR !Configuration::deleteByName('REFERRAL_PERCENTAGE') OR !Configuration::deleteByName('REFERRAL_ORDER_QUANTITY') - OR !Configuration::deleteByName('REFERRAL_DISCOUNT_TYPE') OR !Configuration::deleteByName('REFERRAL_NB_FRIENDS') - OR !Configuration::deleteByName('REFERRAL_DISCOUNT_DESCRIPTION')) - return false; - return true; - } - - public function uninstallDB() - { - return Db::getInstance()->execute('DROP TABLE `'._DB_PREFIX_.'referralprogram`;'); - } - - public function removeMail() - { - $langs = Language::getLanguages(false); - foreach ($langs AS $lang) - foreach (array('referralprogram-congratulations', 'referralprogram-invitation', 'referralprogram-voucher') AS $name) - foreach (array('txt', 'html') AS $ext) - { - $file = _PS_MAIL_DIR_.$lang['iso_code'].'/'.$name.'.'.$ext; - if (file_exists($file) AND !@unlink($file)) - $this->_errors[] = $this->l('Cannot delete this file:').' '.$file; - } - return true; - } - - public static function displayDiscount($discountValue, $discountType, $currency = false) - { - if ((float)$discountValue AND (int)$discountType) - { - if ($discountType == 1) - return $discountValue.chr(37); // ASCII #37 --> % (percent) - elseif ($discountType == 2) - return Tools::displayPrice($discountValue, $currency); - } - return ''; // return a string because it's a display method - } - - private function _postProcess() - { - Configuration::updateValue('REFERRAL_ORDER_QUANTITY', (int)(Tools::getValue('order_quantity'))); - foreach (Tools::getValue('discount_value') AS $id_currency => $discount_value) - Configuration::updateValue('REFERRAL_DISCOUNT_VALUE_'.(int)($id_currency), (float)($discount_value)); - Configuration::updateValue('REFERRAL_DISCOUNT_TYPE', (int)(Tools::getValue('discount_type'))); - Configuration::updateValue('REFERRAL_NB_FRIENDS', (int)(Tools::getValue('nb_friends'))); - Configuration::updateValue('REFERRAL_PERCENTAGE', (int)(Tools::getValue('discount_value_percentage'))); - foreach (Language::getLanguages(false) as $lang) - Configuration::updateValue('REFERRAL_DISCOUNT_DESCRIPTION', array($lang['id_lang'] => Tools::getValue('discount_description_'.(int)$lang['id_lang']))); - - $this->_html .= $this->displayConfirmation($this->l('Configuration updated.')); - } - - private function _postValidation() - { - $this->_errors = array(); - if (!(int)(Tools::getValue('order_quantity')) OR Tools::getValue('order_quantity') < 0) - $this->_errors[] = $this->displayError($this->l('Order quantity is required/invalid.')); - if (!is_array(Tools::getValue('discount_value'))) - $this->_errors[] = $this->displayError($this->l('Discount value is invalid.')); - foreach (Tools::getValue('discount_value') AS $id_currency => $discount_value) - if ($discount_value == '') - $this->_errors[] = $this->displayError(sprintf($this->l('Discount value for the currency #%d is empty.'), $id_currency)); - elseif (!Validate::isUnsignedFloat($discount_value)) - $this->_errors[] = $this->displayError(sprintf($this->l('Discount value for the currency #%d is invalid.'), $id_currency)); - if (!(int)(Tools::getValue('discount_type')) OR Tools::getValue('discount_type') < 1 OR Tools::getValue('discount_type') > 2) - $this->_errors[] = $this->displayError($this->l('Discount type is required/invalid.')); - if (!(int)(Tools::getValue('nb_friends')) OR Tools::getValue('nb_friends') < 0) - $this->_errors[] = $this->displayError($this->l('Number of friends is required/invalid.')); - if (!(int)(Tools::getValue('discount_value_percentage')) OR (int)(Tools::getValue('discount_value_percentage')) < 0 OR (int)(Tools::getValue('discount_value_percentage')) > 100) - $this->_errors[] = $this->displayError($this->l('Discount percentage is required/invalid.')); - } - - private function _writeXml() - { - $forbiddenKey = array('submitUpdate'); // Forbidden key - - // Generate new XML data - $newXml = '<'.'?xml version=\'1.0\' encoding=\'utf-8\' ?>'."\n"; - $newXml .= ''."\n"; - $newXml .= "\t".''; - // Making body data - foreach (Language::getLanguages(false) as $lang) - { - if ($line = $this->putContent($newXml, 'body_paragraph_'.(int)$lang['id_lang'], Tools::getValue('body_paragraph_'.(int)$lang['id_lang']), $forbiddenKey, 'body')) - $newXml .= $line; - } - - $newXml .= "\n\t".''."\n"; - $newXml .= ''."\n"; - - /* write it into the editorial xml file */ - if ($fd = @fopen($this->_xmlFile, 'w')) - { - if (!@fwrite($fd, $newXml)) - $this->_html .= $this->displayError($this->l('Unable to write to the xml file.')); - if (!@fclose($fd)) - $this->_html .= $this->displayError($this->l('Cannot close the xml file.')); - } - else - $this->_html .= $this->displayError($this->l('Unable to update the xml file. Please check the xml file\'s writing permissions.')); - } - - public function putContent($xml_data, $key, $field, $forbidden, $section) - { - foreach ($forbidden AS $line) - if ($key == $line) - return 0; - if (!preg_match('/^'.$section.'_/i', $key)) - return 0; - $key = preg_replace('/^'.$section.'_/i', '', $key); - $field = Tools::htmlentitiesDecodeUTF8(htmlspecialchars($field)); - if (!$field) - return 0; - return ("\n\t\t".'<'.$key.'>'); - } - - public function getContent() - { - if (Tools::isSubmit('submitReferralProgram')) - { - $this->_postValidation(); - if (!sizeof($this->_errors)) - $this->_postProcess(); - else - foreach ($this->_errors AS $err) - $this->_html .= $err; - } - elseif (Tools::isSubmit('submitText')) - $this->_writeXml(); - - $this->_html .= $this->renderForm(); - - return $this->_html; - } - - /** - * Hook call when cart created and updated - * Display the discount name if the sponsor friend have one - */ - public function hookShoppingCart($params) - { - include_once(dirname(__FILE__).'/ReferralProgramModule.php'); - - if (!isset($params['cart']->id_customer)) - return false; - if (!($id_referralprogram = ReferralProgramModule::isSponsorised((int)($params['cart']->id_customer), true))) - return false; - $referralprogram = new ReferralProgramModule($id_referralprogram); - if (!Validate::isLoadedObject($referralprogram)) - return false; - $cartRule = new CartRule($referralprogram->id_cart_rule); - if (!Validate::isLoadedObject($cartRule)) - return false; - - //if ($cartRule->checkValidity($this->context) === false) - //{ - $this->smarty->assign(array('discount_display' => ReferralProgram::displayDiscount($cartRule->reduction_percent ? $cartRule->reduction_percent : $cartRule->reduction_amount, $cartRule->reduction_percent ? 1 : 2, new Currency($params['cookie']->id_currency)), 'discount' => $cartRule)); - return $this->display(__FILE__, 'shopping-cart.tpl'); - // } - return false; - } - - /** - * Hook display on customer account page - * Display an additional link on my-account and block my-account - */ - public function hookCustomerAccount($params) - { - return $this->display(__FILE__, 'my-account.tpl'); - } - - public function hookDisplayMyAccountBlock($params) - { - return $this->hookCustomerAccount($params); - } - - /** - * Hook display on form create account - * Add an additional input on bottom for fill the sponsor's e-mail address - */ - public function hookCreateAccountForm($params) - { - include_once(dirname(__FILE__).'/ReferralProgramModule.php'); - - if (Configuration::get('PS_CIPHER_ALGORITHM')) - $cipherTool = new Rijndael(_RIJNDAEL_KEY_, _RIJNDAEL_IV_); - else - $cipherTool = new Blowfish(_COOKIE_KEY_, _COOKIE_IV_); - $explodeResult = explode('|', $cipherTool->decrypt(urldecode(Tools::getValue('sponsor')))); - if ($explodeResult AND count($explodeResult) > 1 AND list($id_referralprogram, $email) = $explodeResult AND (int)($id_referralprogram) AND !empty($email) AND Validate::isEmail($email) AND $id_referralprogram == ReferralProgramModule::isEmailExists($email)) - { - $referralprogram = new ReferralProgramModule($id_referralprogram); - if (Validate::isLoadedObject($referralprogram)) - { - /* hack for display referralprogram information in form */ - $_POST['customer_firstname'] = $referralprogram->firstname; - $_POST['firstname'] = $referralprogram->firstname; - $_POST['customer_lastname'] = $referralprogram->lastname; - $_POST['lastname'] = $referralprogram->lastname; - $_POST['email'] = $referralprogram->email; - $_POST['email_create'] = $referralprogram->email; - $sponsor = new Customer((int)$referralprogram->id_sponsor); - $_POST['referralprogram'] = $sponsor->email; - } - } - return $this->display(__FILE__, 'authentication.tpl'); - } - - /** - * Hook called on creation customer account - * Create a discount for the customer if sponsorised - */ - public function hookCreateAccount($params) - { - $newCustomer = $params['newCustomer']; - if (!Validate::isLoadedObject($newCustomer)) - return false; - $postVars = $params['_POST']; - if (empty($postVars) OR !isset($postVars['referralprogram']) OR empty($postVars['referralprogram'])) - return false; - $sponsorEmail = $postVars['referralprogram']; - if (!Validate::isEmail($sponsorEmail) OR $sponsorEmail == $newCustomer->email) - return false; - - $sponsor = new Customer(); - if ($sponsor = $sponsor->getByEmail($sponsorEmail, NULL, $this->context)) - { - include_once(dirname(__FILE__).'/ReferralProgramModule.php'); - - /* If the customer was not invited by the sponsor, we create the invitation dynamically */ - if (!$id_referralprogram = ReferralProgramModule::isEmailExists($newCustomer->email, true, false)) - { - $referralprogram = new ReferralProgramModule(); - $referralprogram->id_sponsor = (int)$sponsor->id; - $referralprogram->firstname = $newCustomer->firstname; - $referralprogram->lastname = $newCustomer->lastname; - $referralprogram->email = $newCustomer->email; - if (!$referralprogram->validateFields(false)) - return false; - else - $referralprogram->save(); - } - else - $referralprogram = new ReferralProgramModule((int)$id_referralprogram); - - if ($referralprogram->id_sponsor == $sponsor->id) - { - $referralprogram->id_customer = (int)$newCustomer->id; - $referralprogram->save(); - if ($referralprogram->registerDiscountForSponsored((int)$params['cookie']->id_currency)) - { - $cartRule = new CartRule((int)$referralprogram->id_cart_rule); - if (Validate::isLoadedObject($cartRule)) - { - $data = array( - '{firstname}' => $newCustomer->firstname, - '{lastname}' => $newCustomer->lastname, - '{voucher_num}' => $cartRule->code, - '{voucher_amount}' => (Configuration::get('REFERRAL_DISCOUNT_TYPE') == 2 ? Tools::displayPrice((float)Configuration::get('REFERRAL_DISCOUNT_VALUE_'.(int)$this->context->currency->id), (int)Configuration::get('PS_CURRENCY_DEFAULT')) : (float)Configuration::get('REFERRAL_PERCENTAGE').'%')); - - $cookie = $this->context->cookie; - - Mail::Send( - (int)$cookie->id_lang, - 'referralprogram-voucher', - Mail::l('Congratulations!', (int)$cookie->id_lang), - $data, - $newCustomer->email, - $newCustomer->firstname.' '.$newCustomer->lastname, - strval(Configuration::get('PS_SHOP_EMAIL')), - strval(Configuration::get('PS_SHOP_NAME')), - null, - null, - dirname(__FILE__).'/mails/' - ); - } - } - return true; - } - } - return false; - } - - /** - * Hook display in tab AdminCustomers on BO - * Data table with all sponsors informations for a customer - */ - public function hookAdminCustomers($params) - { - include_once(dirname(__FILE__).'/ReferralProgramModule.php'); - - $customer = new Customer((int)$params['id_customer']); - if (!Validate::isLoadedObject($customer)) - die ($this->l('Incorrect Customer object.')); - - $friends = ReferralProgramModule::getSponsorFriend((int)$customer->id); - if ($id_referralprogram = ReferralProgramModule::isSponsorised((int)$customer->id, true)) - { - $referralprogram = new ReferralProgramModule((int)$id_referralprogram); - $sponsor = new Customer((int)$referralprogram->id_sponsor); - } - - $html = ' -
     
    -

    '.$this->l('Referral program').' ('.count($friends).')

    -

    '.(isset($sponsor) ? $this->l('Customer\'s sponsor:').' '.$sponsor->firstname.' '.$sponsor->lastname.'' : $this->l('No one has sponsored this customer.')).'

    '; - - if ($friends AND sizeof($friends)) - { - $html.= '

    '.sizeof($friends).' '.(sizeof($friends) > 1 ? $this->l('Sponsored customers:') : $this->l('Sponsored customer:')).'

    '; - $html.= ' - - - - - - - - - - '; - foreach ($friends AS $key => $friend) - { - $orders = Order::getCustomerOrders($friend['id_customer']); - $html.= ' - - - - - - - - - '; - } - $html.= ' -
    '.$this->l('ID').''.$this->l('Name').''.$this->l('Email').''.$this->l('Registration date').''.$this->l('Customers sponsored by this friend').''.$this->l('Placed orders').''.$this->l('Customer account created').'
    '.((int)($friend['id_customer']) ? $friend['id_customer'] : '--').''.$friend['firstname'].' '.$friend['lastname'].''.$friend['email'].''.Tools::displayDate($friend['date_add'],null , true).''.sizeof(ReferralProgramModule::getSponsorFriend($friend['id_customer'])).''.($orders ? sizeof($orders) : 0).''.((int)$friend['id_customer'] ? '' : '').'
    '; - } - else - $html.= sprintf($this->l('%1$s %2$s has not sponsored any friends yet.'), $customer->firstname, $customer->lastname); - return $html.'

    '; - } - - /** - * Hook called when a order is confimed - * display a message to customer about sponsor discount - */ - public function hookOrderConfirmation($params) - { - if ($params['objOrder'] AND !Validate::isLoadedObject($params['objOrder'])) - return die($this->l('Incorrect Order object.')); - - include_once(dirname(__FILE__).'/ReferralProgramModule.php'); - - $customer = new Customer((int)$params['objOrder']->id_customer); - $stats = $customer->getStats(); - $nbOrdersCustomer = (int)$stats['nb_orders'] + 1; // hack to count current order - $referralprogram = new ReferralProgramModule(ReferralProgramModule::isSponsorised((int)$customer->id, true)); - if (!Validate::isLoadedObject($referralprogram)) - return false; - $sponsor = new Customer((int)$referralprogram->id_sponsor); - if ((int)$nbOrdersCustomer == (int)$this->_configuration['REFERRAL_ORDER_QUANTITY']) - { - $cartRule = new CartRule((int)$referralprogram->id_cart_rule_sponsor); - if (!Validate::isLoadedObject($cartRule)) - return false; - $this->smarty->assign(array('discount' => ReferralProgram::displayDiscount($cartRule->reduction_percent ? $cartRule->reduction_percent : $cartRule->reduction_amount, $cartRule->reduction_percent ? 1 : 2, new Currency((int)$params['objOrder']->id_currency)), 'sponsor_firstname' => $sponsor->firstname, 'sponsor_lastname' => $sponsor->lastname)); - return $this->display(__FILE__, 'order-confirmation.tpl'); - } - return false; - } - - /** - * Hook called when order status changed - * register a discount for sponsor and send him an e-mail - */ - public function hookUpdateOrderStatus($params) - { - if (!Validate::isLoadedObject($params['newOrderStatus'])) - die ($this->l('Missing parameters')); - $orderState = $params['newOrderStatus']; - $order = new Order((int)($params['id_order'])); - if ($order AND !Validate::isLoadedObject($order)) - die($this->l('Incorrect Order object.')); - - include_once(dirname(__FILE__).'/ReferralProgramModule.php'); - - $customer = new Customer((int)$order->id_customer); - $stats = $customer->getStats(); - $nbOrdersCustomer = (int)$stats['nb_orders'] + 1; // hack to count current order - $referralprogram = new ReferralProgramModule(ReferralProgramModule::isSponsorised((int)($customer->id), true)); - if (!Validate::isLoadedObject($referralprogram)) - return false; - $sponsor = new Customer((int)$referralprogram->id_sponsor); - if ((int)$orderState->logable AND $nbOrdersCustomer >= (int)$this->_configuration['REFERRAL_ORDER_QUANTITY'] AND $referralprogram->registerDiscountForSponsor((int)$order->id_currency)) - { - $cartRule = new CartRule((int)$referralprogram->id_cart_rule_sponsor); - $currency = new Currency((int)$order->id_currency); - $discount_display = ReferralProgram::displayDiscount( (float) $cartRule->reduction_percent ? (float) $cartRule->reduction_percent : (int) $cartRule->reduction_amount, (float) $cartRule->reduction_percent ? 1 : 2, $currency); $data = array('{sponsored_firstname}' => $customer->firstname, '{sponsored_lastname}' => $customer->lastname, '{discount_display}' => $discount_display, '{discount_name}' => $cartRule->code); - Mail::Send((int)$order->id_lang, 'referralprogram-congratulations', Mail::l('Congratulations!', (int)$order->id_lang), $data, $sponsor->email, $sponsor->firstname.' '.$sponsor->lastname, strval(Configuration::get('PS_SHOP_EMAIL')), strval(Configuration::get('PS_SHOP_NAME')), NULL, NULL, dirname(__FILE__).'/mails/'); - return true; - } - return false; - } - - public function renderForm() - { - - $fields_form_1 = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Settings'), - 'icon' => 'icon-cogs' - ), - 'input' => array( - array( - 'type' => 'text', - 'label' => $this->l('Minimum number of orders a sponsored friend must place to get their voucher'), - 'name' => 'order_quantity', - ), - array( - 'type' => 'text', - 'label' => $this->l('Number of friends in the referral program invitation form (customer account, referral program section):'), - 'name' => 'nb_friends', - ), - array( - 'type' => 'radio', - 'label' => $this->l('Voucher type :'), - 'name' => 'discount_type', - 'class' => 't', - 'values' => array( - array( - 'id' => 'discount_type1', - 'value' => 1, - 'label' => $this->l('Voucher offering a percentage')), - array( - 'id' => 'discount_type2', - 'value' => 2, - 'label' => $this->l('Voucher offering a fixed amount (by currency)')), - ), - ), - array( - 'type' => 'text', - 'label' => $this->l('Percentage'), - 'name' => 'discount_value_percentage', - 'suffix' => '%' - ), - array( - 'type' => 'discount_value', - 'label' => $this->l('Voucher amount'), - 'name' => 'discount_value', - ), - array( - 'type' => 'text', - 'label' => $this->l('Voucher description'), - 'name' => 'discount_description', - 'lang' => true, - ) - ), - 'submit' => array( - 'title' => $this->l('Save'), - 'class' => 'btn btn-default', - 'name' => 'submitReferralProgram', - ) - ), - ); - - $fields_form_2 = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Conditions of the referral program'), - 'icon' => 'icon-cogs' - ), - 'input' => array( - array( - 'type' => 'textarea', - 'autoload_rte' => true, - 'label' => $this->l('Text'), - 'name' => 'body_paragraph', - 'lang' => true, - ) - ), - 'submit' => array( - 'title' => $this->l('Save'), - 'class' => 'btn btn-default', - 'name' => 'submitText', - ) - ), - ); - - $helper = new HelperForm(); - $helper->show_toolbar = false; - $helper->table = $this->table; - $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); - $helper->default_form_language = $lang->id; - $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; - $helper->identifier = $this->identifier; - $helper->submit_action = 'submitModule'; - $helper->module = $this; - $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->tpl_vars = array( - 'currencies' => Currency::getCurrencies(), - 'fields_value' => $this->getConfigFieldsValues(), - 'languages' => $this->context->controller->getLanguages(), - 'id_language' => $this->context->language->id - ); - - $helper->override_folder = '/'; - - return $this->renderJs().$helper->generateForm(array($fields_form_1, $fields_form_2)); - } - - public function getConfigFieldsValues() - { - $fields_values = array( - 'order_quantity' => Tools::getValue('order_quantity', Configuration::get('REFERRAL_ORDER_QUANTITY')), - 'discount_type' => Tools::getValue('discount_type', Configuration::get('REFERRAL_DISCOUNT_TYPE')), - 'nb_friends' => Tools::getValue('nb_friends', Configuration::get('REFERRAL_NB_FRIENDS')), - 'discount_value_percentage' => Tools::getValue('discount_value_percentage', Configuration::get('REFERRAL_PERCENTAGE')), - ); - - $languages = Language::getLanguages(false); - foreach ($languages as $lang) - $fields_values['discount_description'][$lang['id_lang']] = Tools::getValue('discount_description_'.(int)$lang['id_lang'], Configuration::get('REFERRAL_DISCOUNT_DESCRIPTION', (int)$lang['id_lang'])); - - $currencies = Currency::getCurrencies(); - foreach ($currencies as $currency) - $fields_values['discount_value'][$currency['id_currency']] = Tools::getValue('discount_value['.(int)$currency['id_currency'].']', Configuration::get('REFERRAL_DISCOUNT_VALUE_'.(int)$currency['id_currency'])); - - // xml loading - $xml = false; - if (file_exists($this->_xmlFile)) - if ($xml = @simplexml_load_file($this->_xmlFile)) - foreach ($languages as $lang) - { - $key = 'paragraph_'.$lang['id_lang']; - $fields_values['body_paragraph'][$lang['id_lang']] = Tools::getValue('body_paragraph_'.(int)$lang['id_lang'] ,(string)$xml->body->$key); - } - - return $fields_values; - } - - public function renderJs() - { - return " - - "; - } -} diff --git a/modules/referralprogram/translations/index.php b/modules/referralprogram/translations/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/referralprogram/translations/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/referralprogram/views/index.php b/modules/referralprogram/views/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/referralprogram/views/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/referralprogram/views/templates/admin/_configure/helpers/form/form.tpl b/modules/referralprogram/views/templates/admin/_configure/helpers/form/form.tpl deleted file mode 100644 index d78eb9777..000000000 --- a/modules/referralprogram/views/templates/admin/_configure/helpers/form/form.tpl +++ /dev/null @@ -1,54 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -{extends file="helpers/form/form.tpl"} -{block name="field"} - {if $input.type == 'discount_value'} -
    - - - - - - - - {foreach from=$currencies item=currency} - - - - - {/foreach} -
    {l s="Currency"}{l s="Voucher amount"}
    {$currency.name} -
    - - - {$currency.sign} - -
    -
    -
    - {/if} - {$smarty.block.parent} -{/block} \ No newline at end of file diff --git a/modules/referralprogram/views/templates/front/email.tpl b/modules/referralprogram/views/templates/front/email.tpl deleted file mode 100755 index 61357ce85..000000000 --- a/modules/referralprogram/views/templates/front/email.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -{$content} diff --git a/modules/referralprogram/views/templates/front/index.php b/modules/referralprogram/views/templates/front/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/referralprogram/views/templates/front/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/referralprogram/views/templates/front/program.tpl b/modules/referralprogram/views/templates/front/program.tpl deleted file mode 100644 index aee1f9ac8..000000000 --- a/modules/referralprogram/views/templates/front/program.tpl +++ /dev/null @@ -1,225 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - - -{capture name=path}{l s='My account' mod='referralprogram'}{$navigationPipe}{l s='Referral Program' mod='referralprogram'}{/capture} -{include file="$tpl_dir./breadcrumb.tpl"} - -

    {l s='Referral program' mod='referralprogram'}

    - -{if $error} -

    - {if $error == 'conditions not valided'} - {l s='You need to agree to the conditions of the referral program!' mod='referralprogram'} - {elseif $error == 'email invalid'} - {l s='At least one e-mail address is invalid!' mod='referralprogram'} - {elseif $error == 'name invalid'} - {l s='At least one first name or last name is invalid!' mod='referralprogram'} - {elseif $error == 'email exists'} - {l s='Someone with this e-mail address has already been sponsored!' mod='referralprogram'}: {foreach from=$mails_exists item=mail}{$mail} {/foreach} - {elseif $error == 'no revive checked'} - {l s='Please mark at least one checkbox' mod='referralprogram'} - {elseif $error == 'cannot add friends'} - {l s='Cannot add friends to database' mod='referralprogram'} - {/if} -

    -{/if} - -{if $invitation_sent} -

    - {if $nbInvitation > 1} - {l s='E-mails have been sent to your friends!' mod='referralprogram'} - {else} - {l s='An e-mail has been sent to your friend!' mod='referralprogram'} - {/if} -

    -{/if} - -{if $revive_sent} -

    - {if $nbRevive > 1} - {l s='Reminder e-mails have been sent to your friends!' mod='referralprogram'} - {else} - {l s='A reminder e-mail has been sent to your friend!' mod='referralprogram'} - {/if} -

    -{/if} - - -
    - -
    -

    - {l s='Get a discount of %1$d %2$s for you and your friends by recommending this Website.' sprintf=[$discount,$currencySign] mod='referralprogram'} -

    - {if $canSendInvitations} -

    - {l s='It\'s quick and it\'s easy. Just fill in the first name, last name, and e-mail address(es) of your friend(s) in the fields below.' mod='referralprogram'} - {if $orderQuantity > 1} - {l s='When one of them makes at least %d orders' sprintf=$orderQuantity mod='referralprogram'} - {else} - {l s='When one of them makes at least %d order' sprintf=$orderQuantity mod='referralprogram'} - {/if}, - {l s='he or she will receive a %1$d %2$s voucher and you will receive your own voucher worth %3$d %4$s.' sprintf=[$discount,$currencySign,$discount,$currencySign] mod='referralprogram'} -

    -
    - - - - - - - - - - - {section name=friends start=0 loop=$nbFriends step=1} - - - - - - - {/section} - -
     {l s='Last name' mod='referralprogram'}{l s='First name' mod='referralprogram'}{l s='E-mail' mod='referralprogram'}
    {$smarty.section.friends.iteration}
    -

    - {l s='Important: Your friends\' e-mail addresses will only be used in the referral program. They will never be used for other purposes.' mod='referralprogram'} -

    -

    - - - {l s='Read conditions.' mod='referralprogram'} -

    -

    - {l s='Preview' mod='referralprogram'} - {assign var="file" value="{$lang_iso}/referralprogram-invitation.html"} - {l s='the default e-mail' mod='referralprogram'} {l s='that will be sent to your friend(s).' mod='referralprogram'} -

    -

    - -

    -
    - {else} -

    - {l s='To become a sponsor, you need to have completed at least' mod='referralprogram'} {$orderQuantity} {if $orderQuantity > 1}{l s='orders' mod='referralprogram'}{else}{l s='order' mod='referralprogram'}{/if}. -

    - {/if} -
    - -
    - {if $pendingFriends AND $pendingFriends|@count > 0} -

    - {l s='These friends have not yet placed an order on this Website since you sponsored them, but you can try again! To do so, mark the checkboxes of the friend(s) you want to remind, then click on the button "Remind my friend(s)"' mod='referralprogram'} -

    -
    - - - - - - - - - - - - {foreach from=$pendingFriends item=pendingFriend name=myLoop} - - - - - - - - {/foreach} - -
     {l s='Last name' mod='referralprogram'}{l s='First name' mod='referralprogram'}{l s='E-mail' mod='referralprogram'}{l s='Last invitation' mod='referralprogram'}
    - - - - {$pendingFriend.firstname|substr:0:22}{$pendingFriend.email}{dateFormat date=$pendingFriend.date_upd full=1}
    -

    - -

    -
    - {else} -

    {l s='You have not sponsored any friends.' mod='referralprogram'}

    - {/if} -
    - -
    - {if $subscribeFriends AND $subscribeFriends|@count > 0} -

    - {l s='Here are sponsored friends who have accepted your invitation:' mod='referralprogram'} -

    - - - - - - - - - - - - {foreach from=$subscribeFriends item=subscribeFriend name=myLoop} - - - - - - - - {/foreach} - -
     {l s='Last name' mod='referralprogram'}{l s='First name' mod='referralprogram'}{l s='E-mail' mod='referralprogram'}{l s='Inscription date' mod='referralprogram'}
    {$smarty.foreach.myLoop.iteration}.{$subscribeFriend.lastname|substr:0:22}{$subscribeFriend.firstname|substr:0:22}{$subscribeFriend.email}{dateFormat date=$subscribeFriend.date_upd full=1}
    - {else} -

    - {l s='No sponsored friends have accepted your invitation yet.' mod='referralprogram'} -

    - {/if} -
    -
    - - diff --git a/modules/referralprogram/views/templates/front/rules.tpl b/modules/referralprogram/views/templates/front/rules.tpl deleted file mode 100755 index 7ebc9659f..000000000 --- a/modules/referralprogram/views/templates/front/rules.tpl +++ /dev/null @@ -1,32 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -

    {l s='Referral program rules' mod='referralprogram'}

    - -{if isset($xml)} -
    - {if isset($xml->body->$paragraph)}
    {$xml->body->$paragraph|replace:"\'":"'"|replace:'\"':'"'}
    {/if} -
    -{/if} diff --git a/modules/referralprogram/views/templates/hook/authentication.tpl b/modules/referralprogram/views/templates/hook/authentication.tpl deleted file mode 100755 index 9774a9981..000000000 --- a/modules/referralprogram/views/templates/hook/authentication.tpl +++ /dev/null @@ -1,34 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - - - \ No newline at end of file diff --git a/modules/referralprogram/views/templates/hook/index.php b/modules/referralprogram/views/templates/hook/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/referralprogram/views/templates/hook/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/referralprogram/views/templates/hook/my-account.tpl b/modules/referralprogram/views/templates/hook/my-account.tpl deleted file mode 100755 index f5cea67c1..000000000 --- a/modules/referralprogram/views/templates/hook/my-account.tpl +++ /dev/null @@ -1,33 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - -
  • - - {l s='Referral program' mod='referralprogram'} - {l s='Referral program' mod='referralprogram'} - -
  • - \ No newline at end of file diff --git a/modules/referralprogram/views/templates/hook/order-confirmation.tpl b/modules/referralprogram/views/templates/hook/order-confirmation.tpl deleted file mode 100755 index 34dfa778d..000000000 --- a/modules/referralprogram/views/templates/hook/order-confirmation.tpl +++ /dev/null @@ -1,29 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -

    - {l s='Thanks to your order, your sponsor %1$s %2$s will earn a voucher worth %3$d off when this order is confirmed.' sprintf=[$sponsor_firstname,$sponsor_lastname,$discount] mod='referralprogram'} -

    -
    \ No newline at end of file diff --git a/modules/referralprogram/views/templates/hook/shopping-cart.tpl b/modules/referralprogram/views/templates/hook/shopping-cart.tpl deleted file mode 100755 index eaa522cb8..000000000 --- a/modules/referralprogram/views/templates/hook/shopping-cart.tpl +++ /dev/null @@ -1,34 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - - -

    - {l s='Referral program' mod='referralprogram'} - {l s='You have earned a voucher worth %s thanks to your sponsor!' sprintf=$discount_display mod='referralprogram'} - {l s='Enter voucher name %s to receive the reduction on this order.' sprintf=$discount->name mod='referralprogram'} - {l s='View your referral program.' mod='referralprogram'} -

    -
    - \ No newline at end of file diff --git a/modules/referralprogram/views/templates/index.php b/modules/referralprogram/views/templates/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/referralprogram/views/templates/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/sendtoafriend/config.xml b/modules/sendtoafriend/config.xml deleted file mode 100755 index 93f65bf17..000000000 --- a/modules/sendtoafriend/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - sendtoafriend - - - - - - 0 - 0 - - \ No newline at end of file diff --git a/modules/sendtoafriend/index.php b/modules/sendtoafriend/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/sendtoafriend/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/sendtoafriend/logo.gif b/modules/sendtoafriend/logo.gif deleted file mode 100644 index 8c31836bf745a58f7780ac75639d67a2afcf36e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 633 zcmV-<0*3uZNk%w1VGsZi0OkMyKte=WdC${?HDHxrxwgCe`udMrK*XSW*4WijW`K!~ zleNO!w~lLle0F-vX>xLMPhDu8ot@jhrihb#=f9EPqaucQR)?O-Gj7R>xpk`8oOsD; zbcw*?n^D8V!}sdlg@uJxulVDzfIxAzlX-2-%*>K_UG>zj#*#{JuWU<8Ov$;YosMqh ztutk7Z^Nc`xulMya#Wc9taAI%pz6z}o|KQ9vfQ!P z{c^77`1tsmX-j^KbgP7L#jAqV%f(1gTGgB|=;-L*mP%lKU{`#PW@cuDzJaKHVfM(3 zTXeROTtei}wW^VQp3r-Bg>u%Vd*!7Vi;0KUqjJNSYkRGCrg=c-w`9z#lDxdU-QC^I zzNm`Cb$o?;|NsA!latQV(`ssLg3E7EP*9kSg7L(am0?6_kZ0V(tmmJEyJSv$eO58DRCG8v8Ywq|3=*NET+?U{ z4g*Q2SvxRT5e*q)V-X-q<75{kCS^!q9%EGq_+@HjJp#~pU?z?VCS~d{Q31k3odr;Q zECFFAgq$xWJj_u6!~+NcUVhAQVI~0p0BO>kZ1|wV5F0fhD3CFy%!3DI=G0{J!3_rt TBaFm3bB4!?n`h#H2?PK;l<+sI diff --git a/modules/sendtoafriend/logo.png b/modules/sendtoafriend/logo.png deleted file mode 100755 index f71e37a3210138ddef055c9813bd07c331c7359f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1364 zcmV-a1*`grP)d-dgO?K{?d-h&yoqhIsj519Vck@wV`t~n= zY&D?Q8KwbOk6I)GcX&zwHKjpAxc$Hjk31uv!u+m_1xUWPu?m;vlW2&Nt3@K`Tey)U zY`dC&sw1b^HCI4dL|AV|fabn2>|9@ru3=m8VhCVHpDYDF7VMX5ia{=NdIczYM#NSv zFGADNG3ym0Hy9M8_`jlcDrUNEKFiY%&0>YPIDWE2n(brtST$S{@!8Kl!!W! zr~3fE&weLkQD2EA2C;}qY{Qr>__hGiBymXhYbYj!a9==*t+!5`$R8w6M)N1hCJiY~#m*djbe8 z&BKSC19&L!_H@i?;zM7?FqRma2RGi16C*(P2w=AEyEhZ11wnk&HGqm7M?|9ZOCNpc z%NWKghk%&+zX~9+&rTIhIRO=Ac>9S0EAIJhmFHIsX#cvUmW!Z#o+S%qe_R)vFjA3jHmcx;_2ubd90-cnW6S!;8 znxKuyAuD$K6Xh7Wj_COkZ#UCpP92=(hiQ7qHh#3B*LN7|c2aQ~kZ_^f9bJ8DaD;fCF><`Td{ z;hY9jfR>}O{#O)Yd0_@3M(mdC3Yoe6#`uU;-JgrX>|E5op%5y{#p?~1;MZr(y62Y! z2UCHACx=lji-Jkm#@zj;1hNp(2&s>NglhzW-^cb(uQw$ z?Z;o!?a|ZSE7LS1;+u;zfFcrRn;{zQ~aaNjzr`n*&;LcoZ!KQ~_gwOwZz5gAwcD{;w3b@tOSiN4}+4H!C z`5%899aE8UX(bTqxzJF|?-O66dSwNE`0eylyqZw}C*`cz=sa#+*<1lrI1d(gBK4*- zuUs95eiJ7LPUF^9^l|_cFfBGY-+LcV!fD?)QkTRLz&%4OJni_(su>!Qy7?Y`eeYo> zxfgox%-^sF2mMR1Hr{oMtBKol<8yZV+&Q4DpKR_ diff --git a/modules/sendtoafriend/mails/en/index.php b/modules/sendtoafriend/mails/en/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/sendtoafriend/mails/en/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/sendtoafriend/mails/en/send_to_a_friend.html b/modules/sendtoafriend/mails/en/send_to_a_friend.html deleted file mode 100644 index 0becbad17..000000000 --- a/modules/sendtoafriend/mails/en/send_to_a_friend.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - Message from {shop_name} - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - - - -
    - Hi {name},
    - Thank you for creating a customer account at {shop_name}. -
    -

    - {customer} has sent you a link to a product that (s)he thinks may interest you.

    - - Click here to view this item: {product} - -
    -
     
    - - \ No newline at end of file diff --git a/modules/sendtoafriend/mails/en/send_to_a_friend.txt b/modules/sendtoafriend/mails/en/send_to_a_friend.txt deleted file mode 100644 index 3593630ca..000000000 --- a/modules/sendtoafriend/mails/en/send_to_a_friend.txt +++ /dev/null @@ -1,16 +0,0 @@ - -[{shop_url}] - -Hi {name}, - -Thank you for creating a customer account at {shop_name}. - -{customer} has sent you a link to a product that (s)he thinks may -interest you. - -Click here to view this item: {product} -[{product_link}] - -{shop_name} [{shop_url}] powered by -PrestaShop(tm) [http://www.prestashop.com/] - diff --git a/modules/sendtoafriend/mails/index.php b/modules/sendtoafriend/mails/index.php deleted file mode 100644 index 6f5ff3bab..000000000 --- a/modules/sendtoafriend/mails/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/sendtoafriend/product_page.tpl b/modules/sendtoafriend/product_page.tpl deleted file mode 100755 index 29c77dae5..000000000 --- a/modules/sendtoafriend/product_page.tpl +++ /dev/null @@ -1,27 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @version Release: $Revision$ -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -
  • {l s='Send to a friend' mod='sendtoafriend'}
  • diff --git a/modules/sendtoafriend/sendtoafriend-extra.tpl b/modules/sendtoafriend/sendtoafriend-extra.tpl deleted file mode 100755 index 4b3c9e597..000000000 --- a/modules/sendtoafriend/sendtoafriend-extra.tpl +++ /dev/null @@ -1,97 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @version Release: $Revision$ -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -
  • - {l s='Send to a friend' mod='sendtoafriend'} -
  • - -
    -
    -

    {l s='Send to a friend' mod='sendtoafriend'}

    -
    - {$stf_product->name|escape:html:'UTF-8'} -
    -

    {$stf_product->name}

    - {$stf_product->description_short} -
    -
    - -
    -
    -
    -
    -

    {l s='Recipient' mod='sendtoafriend'} :

    -

    - - -

    -

    - - -

    -

    * {l s='Required fields' mod='sendtoafriend'}

    -
    -

    - - {l s='Cancel' mod='sendtoafriend'} {l s='or' mod='sendtoafriend'}  - -

    -
    -
    -
    diff --git a/modules/sendtoafriend/sendtoafriend.css b/modules/sendtoafriend/sendtoafriend.css deleted file mode 100644 index 19cef6bec..000000000 --- a/modules/sendtoafriend/sendtoafriend.css +++ /dev/null @@ -1,46 +0,0 @@ -/* ************************************************************************************************ - PAGE SEND TO FRIEND -************************************************************************************************ */ -#sendfriendpage form.std fieldset { - margin:0 0 20px 0; - padding: 10px 15px; - background: none repeat scroll 0 0 #eee -} - -#sendfriendpage .product {} -#sendfriendpage .product .img_link {float:left} -#sendfriendpage .product .img_link img { - margin:0 10px 0 0; - border:1px solid #ccc; -} -#sendfriendpage .product .product_desc { - float:left; - width:200px; - font-weight:bold; - font-size:12px; - color:#000; -} - -#sendfriendpage #send_friend_form_content {margin-top:40px} -#sendfriendpage #send_friend_form_content .text { - padding-bottom: 10px -} -#sendfriendpage #send_friend_form_content .text label { - display: inline-block; - padding: 6px 15px; - width: 180px; - font-size: 12px; - text-align: right -} -#sendfriendpage #send_friend_form_content .text input { - padding: 0 5px; - height: 22px; - width: 260px; - border: 1px solid #ccc; - font-size: 12px -} -#sendfriendpage #send_friend_form_content .submit { - margin:0 20px 0 0; - padding:5px 0; - text-align:right -} \ No newline at end of file diff --git a/modules/sendtoafriend/sendtoafriend.php b/modules/sendtoafriend/sendtoafriend.php deleted file mode 100644 index 8e06282ba..000000000 --- a/modules/sendtoafriend/sendtoafriend.php +++ /dev/null @@ -1,84 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class sendToAFriend extends Module -{ - private $_html = ''; - private $_postErrors = array(); - public $context; - - function __construct($dontTranslate = false) - { - $this->name = 'sendtoafriend'; - $this->version = '1.2'; - $this->author = 'PrestaShop'; - $this->tab = 'front_office_features'; - $this->need_instance = 0; - $this->secure_key = Tools::encrypt($this->name); - - parent::__construct(); - - if (!$dontTranslate) - { - $this->displayName = $this->l('Send to a Friend module'); - $this->description = $this->l('Allows customers to send a product link to a friend.'); - } - } - - public function install() - { - return (parent::install() && $this->registerHook('extraLeft') && $this->registerHook('header')); - } - - public function uninstall() - { - return (parent::uninstall() && $this->unregisterHook('header') && $this->unregisterHook('extraLeft')); - } - - public function hookExtraLeft($params) - { - /* Product informations */ - $product = new Product((int)Tools::getValue('id_product'), false, $this->context->language->id); - $image = Product::getCover((int)$product->id); - - - $this->context->smarty->assign(array( - 'stf_product' => $product, - 'stf_product_cover' => (int)$product->id.'-'.(int)$image['id_image'], - 'stf_secure_key' => $this->secure_key - )); - - return $this->display(__FILE__, 'sendtoafriend-extra.tpl'); - } - - public function hookHeader($params) - { - $this->context->controller->addCSS($this->_path.'sendtoafriend.css', 'all'); - } -} \ No newline at end of file diff --git a/modules/sendtoafriend/sendtoafriend.png b/modules/sendtoafriend/sendtoafriend.png deleted file mode 100644 index 4a6c5d396ad024567a769d1f2285c525bef8c88b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 754 zcmV~0d>kmp9&fG9>#5EaEn(MD9Xvl47<{Rb2T3D!0$wpy4@P!Tnn zB0fxQ2!aPL_fZ@!=Wv9zmj8jnf5JO`<=MmZs@#@p z5O*{}9L5B6J+L7ORza<+9h)-B~<&cwIhUkd?cp4is-ziNrfY^u-7xdbFt=#%1534Oi8ajBBo}VZvCxd1 zTu*VtX+~P45)Om?dG5aS`PPW(%?lDPBwaz$6C^$8$_Q#plJTjpbgj;_rYi*?oK~m+ zDD`C->dkZKh0j6|Q^-0bJxIFHnHJOo$@r8{VNIUWU>31rp3@BVvYIZG2D0>Yuj2Y- zg?b?AObc>pK`oG+zkPsr3x_BTWXX8H*w}0@e;@>?SdsP&!-HMidhRn*4VkHi+<58} zTg6ae0~aSoNqRq(^;(g}0#Yiz)&q*YIg-f)mmeJA&3%nD3aJ$X-6L%1+fEQRIeTL* zS5K6|3cOaNtTtBowSZzzj!ZfM7L<|f+jtyp4ccf7mf6J$n}&ALkZlfLEYRoNvtG0Q zzJh|U~_Rdjkv}0kGt_?V}5$?sXN`N zTt|nOa)sx)IIf_-7XW**;!X9`USPjuUUsJrREk)6q*M9ZHEb zl2A!T3LBjrrTx74{FsUNcVA1zw%IWoiGNMw=s9P8>+qh!B*saR2}S diff --git a/modules/sendtoafriend/sendtoafriend.tpl b/modules/sendtoafriend/sendtoafriend.tpl deleted file mode 100644 index 4b45a73df..000000000 --- a/modules/sendtoafriend/sendtoafriend.tpl +++ /dev/null @@ -1,66 +0,0 @@ -{* -* 2007-2013 PrestaShop -* -* NOTICE OF LICENSE -* -* This source file is subject to the Academic Free License (AFL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/afl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2013 PrestaShop SA -* @version Release: $Revision$ -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*} - -{capture name=path}{l s='Send to a friend' mod='sendtoafriend'}{/capture} -{include file="$tpl_dir./breadcrumb.tpl"} -
    -

    {l s='Send to a friend' mod='sendtoafriend'}

    - -

    {l s='Send this page to a friend who might be interested in the item below.' mod='sendtoafriend'}.

    - {include file="$tpl_dir/errors.tpl"} - - {if isset($smarty.get.submited)} -

    {l s='Your email has been sent successfully' mod='sendtoafriend'}

    - {else} -
    -
    - - -
    -

    - - -

    -

    - - -

    - -

    - -

    -
    -
    -
    - {/if} - - -
    diff --git a/modules/sendtoafriend/sendtoafriend_ajax.php b/modules/sendtoafriend/sendtoafriend_ajax.php deleted file mode 100644 index a08e2ef77..000000000 --- a/modules/sendtoafriend/sendtoafriend_ajax.php +++ /dev/null @@ -1,68 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -require_once(dirname(__FILE__).'/../../config/config.inc.php'); -require_once(dirname(__FILE__).'/../../init.php'); -include_once(dirname(__FILE__).'/sendtoafriend.php'); -include_once(dirname(__FILE__).'/../../classes/Product.php'); - -$module = new SendToAFriend(); - -if (Tools::getValue('action') == 'sendToMyFriend' && Tools::getValue('secure_key') == $module->secure_key) -{ - $friendName = Tools::getValue('name'); - $friendMail = Tools::getValue('email'); - $id_product = Tools::getValue('id_product'); - if (!$friendName || !$friendMail || !$id_product) - die('0'); - - /* Email generation */ - $product = new Product((int)$id_product, false, $module->context->language->id); - $productLink = $module->context->link->getProductLink($product); - $customer = $module->context->cookie->customer_firstname ? $module->context->cookie->customer_firstname.' '.$module->context->cookie->customer_lastname : $module->l('A friend', 'sendtoafriend_ajax'); - - $templateVars = array( - '{product}' => $product->name, - '{product_link}' => $productLink, - '{customer}' => $customer, - '{name}' => Tools::safeOutput($friendName) - ); - - /* Email sending */ - if (!Mail::Send((int)$module->context->cookie->id_lang, - 'send_to_a_friend', - sprintf(Mail::l('%1$s sent you a link to %2$s', (int)$module->context->cookie->id_lang), $customer, $product->name), - $templateVars, $friendMail, - null, - ($module->context->cookie->email ? $module->context->cookie->email : null), - ($module->context->cookie->customer_firstname ? $module->context->cookie->customer_firstname.' '.$module->context->cookie->customer_lastname : null), - null, - null, - dirname(__FILE__).'/mails/')) - die('0'); - die('1'); -} -die('0'); diff --git a/modules/sendtoafriend/translations/index.php b/modules/sendtoafriend/translations/index.php deleted file mode 100644 index 3f6561f72..000000000 --- a/modules/sendtoafriend/translations/index.php +++ /dev/null @@ -1,35 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/watermark/config.xml b/modules/watermark/config.xml deleted file mode 100755 index 9aca6ed0d..000000000 --- a/modules/watermark/config.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - watermark - - - - - - Are you sure you want to delete these details? - 1 - 1 - - \ No newline at end of file diff --git a/modules/watermark/index.php b/modules/watermark/index.php deleted file mode 100644 index e582afcc2..000000000 --- a/modules/watermark/index.php +++ /dev/null @@ -1,36 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @version Release: $Revision$ -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/watermark/logo.gif b/modules/watermark/logo.gif deleted file mode 100644 index e4b4d25fdaf50ca357de68e687e10aaa4a323861..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 988 zcmZ?wbhEHb6krfw_|5X2@3lV z5%Do9;X`clv&_tQ$r+EzDqa*8eoRRFo|gGLE9+B!;irOvuVoeAYwLa$6#gzL`CC(c zwV~loL&KB){&!7HZ(3U3_V&J+KI>ac%jd4H4?P{@ph9dg@{mJ4yL$%b00%^W&iwZc(8l RlXe=5>##Ws^KdX&0{|s|7Cry~ diff --git a/modules/watermark/logo.png b/modules/watermark/logo.png deleted file mode 100755 index 5fc148d52dfa6f2fd5d4d85fb06a7b1194906e3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1486 zcmV;<1u^=GP)D8xi#qCf6UFeD^z1glz032%96fay^gwjK0mM%MGmn7DZv(Sr7#J_B_!tI+&W1jIKY2B72z)IU&?H9D`K|oH{mJ%{M;Z z3I7_oA*sK$EUk~HTsmP4(9^Vw)%dNXR@R)X0HA`3Da5=WOzEf9oISGwL5y5L9|x2! zvTVDZzks_vxm7}0zZoxr7Y~tjKJn4ZbRG7h+LJs+0U38G=LKx)Zk8PH!o$IIcmq_( zikussqhsp;5UlbY$KPr69b4R2GQH!tpVhG z83f#>6t=Ojong*%>!?_qRDm>a`D&csu?BW{Tb3*k*Za4RHuT(7Px|-KkAa2fVBcPj zRU1yKx&0qLhVpys@#xvZI5^&Es3;6{6Pd5bLwn##1YJLENA+T&{=!z%RnlU|`>3pM zM7?_wO^?s4N_QF`31$<7mg#2l7W)48eNDKd@g?BjuL;pra;L9EjuH6^bDmg>r)tZ0 z%W9tiz~(%IlF7*BmVI#PxGcGiDpB+V6@X$yqX{K)jA$#0%X(39*P?rlzFzxkdQVfa za?7C(&u2xlZx?xV-9mNEwz_Zj-o`^O)9(M-sW&M17&cwNusq*Y&H`2I(emkb)V+0_ zYAA*z0O~qXLsBxyeSV z8|S|N?%{$fd&Xzf<#2ZSM!iHv4BW1fymZmH+cRQv^&q`5Gkt5-5V o6#!&?Elf|XTz?y-`~MSQ0P(&GTW&i*H07*qoM6N<$g5!$9 -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -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; \ No newline at end of file diff --git a/modules/watermark/watermark.gif b/modules/watermark/watermark.gif deleted file mode 100644 index 05fb5562b7bf189eece7a15e711b46d7841dab98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2055 zcmWm9iCY$=|m8236R5I-#X{^Rl)TZo|S}nEfA!OP|4aaJ- z!?3cnnGz4uPsj97Gp8)s4#Q&$yJkCe$8xl(54-#Q555Z)DkbwWlt2j{1F-Tk^Y!c3 zSGegHhxceSn!38W{a2R^4Gr}zE&J?ru5S&{>-Ak-T{ngrCcaK)wt9DjXC)4h#*_9P zSvOss-zMHVhcDbIOl{-d3f)zRMGqe|e{qiXd~C99tGX@D9~~Y2)Yo5pTW$Y(Wy8&Y zcJJ(ro3ompmXH52aO?h=A1%D$$p=oSv;Wm~Te!jc{Dk)u3`oEU#NdDae*#1&Qlm`} zbCP;|vP)M-tx~0RBwYHTapl=gYjf^dMw%ok_{9Fo?!}qLZ(*)?3zl3^ZY3_v8ozcb zYFAdCKBY+E>hYb7O(~~@d&p$`?S`W(T%~k6d$G`094!lv^i%&_A6HAy5&OoArS9(Z z#)dXOX%IcSqT;~ylULgEQd3=b&AYrLsk~ZxmCfe|MdI-cVb}T|zBEnc>c?*J;Diy~ z-ne;va0~AoQZ8KcGEz1xa@HSjs8l8s0GnKO8_yA`YlLYfX|+>!~SYh40{l0@taaSIRM>!;YIr0wwz@>At&+-gXg!5 zyj|n}MAgsd^+)AhTQQr8-&?*zWUqinIzV3TIh`WDt|jJ&-3V?~<61sb6j*|;>M6c= zYJ~G^PeJSkPj;~Oazf~wCl^V1t@&Hz6L$t1RyaHD4hsdpkx*qW>3H_~MC7(-DIrB| z218NKps?0;R{4n>O7gyY3P^5c28$5f7wh}`VQJ%%TK$ciHmXQw)W#M=fH&PwzexEn z)w9H5OSpm=>JZ{lAMK<5je!l0#0|3cwqy;_Vs;jRnYm-uqzHRRt$aBPb~uiEbqeI!bG&e?nlln$MYr!0Jha6qt>Iio5Ygvr_$Mqt)=Nmx>6!E;RwP>lbp6Q1yj^z_!&CL z1J?_Z3IP10s){nA(t*I?1|2z+Y=p?uPZoAoMlpUBcZFeN6ofdF>`>5H*^VOe z?CY$~#^7G9jTE+ehqIq9rAC2YqzN`1dCsH*g6AW^>M~!5VlJBQDIL{s41?Ct^H|l4 z08I0i%0K3)W9FaNG~F8cli#TatC2zLDqkCf3M$R==EUZUqqoE@i*OA3ClH$%eyZ4d zjOZ{csDs_cjypl=Vt=mK7W43kSA78H~uC4N*wthFUPf;oni{&351&s&# z_s8)b_70HA4*X+rEP@;OUOa+uHj_N`JgrM**Hd2!7G&q8mSNv1`My0obwm}o!FnW> zaId_+7fYBk=Axy3Oh8VKhVM#M?cwg9+?oqK zwPp-@5^V+~LB3W>d)Lwjm?W0Q3B@cz(5d%Jg$9zRP~ozDyDoPXLfoGSph}ZFVQ~iD zN2Q}~MQ#%Eg)oez1F{N*SVA-;+Y9ffm5zHj0L}Cij#-Ja1PJZ@HBTnTSMSboF`6UD)1Pu$lPfKifh=wa$<_S?S{-iu886bUH& zi=@*nwepsYeup`tz={6{I9&A_1q>@-Wc zqbRm|8_c%j=%Rc*Gvo{$U__u9Xi<;|f%0O|seGW92B?n;+S9*`mE7`Xh0(m%0?){T z5NsGw=GIyt^gu;?k%?n{DaR)mb-3LQQsS@|DUF9_f1C|^xf$NhzvAAr!;T2*pT zvY~1JHnXJyjIgo`{}wgj-B27i;ws7_&orcOKFtCf4Cf!@)TF#b$iKQl3|1qa8luAs zO24NrX(srVV8I^fimt~k$1_9$%r7N<6Q^uDX_AbE>Nkl&2S<+6w&>s&Ce)+Zftw|g zL$*11%5H2<)vz^`p-QPe7`CtAr95I_Ct5go2v0DdcN^uY4lQ95r%fTXoX?AS^_V(_ zhp4xPv=Q@Zl=$iamihPiP}QixE*ME}YFoa%!n#vvw+7EOmd~x};BFuC!935~B5zPF io9*GT{tb?wFHd#AXKwg2KW)N2*I_tUjgkdG^nU^9mQCgW diff --git a/modules/watermark/watermark.php b/modules/watermark/watermark.php deleted file mode 100644 index 3ae514b39..000000000 --- a/modules/watermark/watermark.php +++ /dev/null @@ -1,430 +0,0 @@ - -* @copyright 2007-2013 PrestaShop SA -* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -if (!defined('_PS_VERSION_')) - exit; - -class Watermark extends Module -{ - private $_html = ''; - private $_postErrors = array(); - private $xaligns = array('left', 'middle', 'right'); - private $yaligns = array('top', 'middle', 'bottom'); - private $yAlign; - private $xAlign; - private $transparency; - private $imageTypes = array(); - private $watermarkTypes; - - public function __construct() - { - $this->name = 'watermark'; - $this->tab = 'administration'; - $this->version = '0.4'; - $this->author = 'PrestaShop'; - - $this->bootstrap = true; - parent::__construct(); - - $config = Configuration::getMultiple(array('WATERMARK_TYPES', 'WATERMARK_Y_ALIGN', 'WATERMARK_X_ALIGN', 'WATERMARK_TRANSPARENCY')); - if (!isset($config['WATERMARK_TYPES'])) - $config['WATERMARK_TYPES'] = ''; - $tmp = explode(',', $config['WATERMARK_TYPES']); - foreach (ImageType::getImagesTypes('products') as $type) - if (in_array($type['id_image_type'], $tmp)) - $this->imageTypes[] = $type; - - $this->yAlign = isset($config['WATERMARK_Y_ALIGN']) ? $config['WATERMARK_Y_ALIGN'] : ''; - $this->xAlign = isset($config['WATERMARK_X_ALIGN']) ? $config['WATERMARK_X_ALIGN'] : ''; - $this->transparency = isset($config['WATERMARK_TRANSPARENCY']) ? $config['WATERMARK_TRANSPARENCY'] : 60; - - $this->displayName = $this->l('Watermark'); - $this->description = $this->l('Protect image by watermark.'); - $this->confirmUninstall = $this->l('Are you sure you want to delete your details ?'); - if (!isset($this->transparency) || !isset($this->xAlign) || !isset($this->yAlign)) - $this->warning = $this->l('Watermark image must be uploaded in order for this module to work correctly.'); - } - - public function install() - { - $this->writeHtaccessSection(); - if (!parent::install() || !$this->registerHook('watermark')) - return false; - Configuration::updateValue('WATERMARK_TRANSPARENCY', 60); - Configuration::updateValue('WATERMARK_Y_ALIGN', 'bottom'); - Configuration::updateValue('WATERMARK_X_ALIGN', 'right'); - return true; - } - - public function uninstall() - { - $this->removeHtaccessSection(); - return (parent::uninstall() - && Configuration::deleteByName('WATERMARK_TYPES') - && Configuration::deleteByName('WATERMARK_TRANSPARENCY') - && Configuration::deleteByName('WATERMARK_Y_ALIGN') - && Configuration::deleteByName('WATERMARK_X_ALIGN')); - } - - private function _postValidation() - { - $yalign = Tools::getValue('yalign'); - $xalign = Tools::getValue('xalign'); - $transparency = (int)(Tools::getValue('transparency')); - - $types = ImageType::getImagesTypes('products'); - $id_image_type = array(); - foreach ($types as $type) - if (!is_null(Tools::getValue('WATERMARK_TYPES_'.(int)$type['id_image_type']))) - $id_image_type['WATERMARK_TYPES_'.(int)$type['id_image_type']] = true; - - if (empty($transparency)) - $this->_postErrors[] = $this->l('Transparency required.'); - elseif ($transparency < 1 || $transparency > 100) - $this->_postErrors[] = $this->l('Transparency is not in allowed range.'); - - if (empty($yalign)) - $this->_postErrors[] = $this->l('Y-Align is required.'); - elseif (!in_array($yalign, $this->yaligns)) - $this->_postErrors[] = $this->l('Y-Align is not in allowed range.'); - - if (empty($xalign)) - $this->_postErrors[] = $this->l('X-Align is required.'); - elseif (!in_array($xalign, $this->xaligns)) - $this->_postErrors[] = $this->l('X-Align is not in allowed range.'); - if (!count($id_image_type)) - $this->_postErrors[] = $this->l('At least one image type is required.'); - - if (isset($_FILES['PS_WATERMARK']['tmp_name']) && !empty($_FILES['PS_WATERMARK']['tmp_name'])) - { - if (!ImageManager::isRealImage($_FILES['PS_WATERMARK']['tmp_name'], $_FILES['PS_WATERMARK']['type'], array('image/gif'))) - $this->_postErrors[] = $this->l('Image must be in GIF format.'); - } - - return !count($this->_postErrors) ? true : false; - } - - private function _postProcess() - { - $types = ImageType::getImagesTypes('products'); - $id_image_type = array(); - foreach ($types as $type) - if (Tools::getValue('WATERMARK_TYPES_'.(int)$type['id_image_type'])) - $id_image_type[] = $type['id_image_type']; - - Configuration::updateValue('WATERMARK_TYPES', implode(',', $id_image_type)); - Configuration::updateValue('WATERMARK_Y_ALIGN', Tools::getValue('yalign')); - Configuration::updateValue('WATERMARK_X_ALIGN', Tools::getValue('xalign')); - Configuration::updateValue('WATERMARK_TRANSPARENCY', Tools::getValue('transparency')); - - if (Shop::getContext() == Shop::CONTEXT_SHOP) - $str_shop = '-'.(int)$this->context->shop->id; - else - $str_shop = ''; - //submited watermark - if (isset($_FILES['PS_WATERMARK']) && !empty($_FILES['PS_WATERMARK']['tmp_name'])) - { - /* Check watermark validity */ - if ($error = ImageManager::validateUpload($_FILES['PS_WATERMARK'])) - $this->_errors[] = $error; - /* Copy new watermark */ - elseif (!copy($_FILES['PS_WATERMARK']['tmp_name'], dirname(__FILE__).'/watermark'.$str_shop.'.gif')) - $this->_errors[] = sprintf($this->l('An error occurred while uploading watermark: %1$s to %2$s'), $_FILES['PS_WATERMARK']['tmp_name'], dirname(__FILE__).'/watermark'.$str_shop.'.gif'); - } - - if ($this->_errors) - foreach ($this->_errors as $error) - $this->_html .= $this->displayError($this->l($error)); - else - $this->_html .= $this->displayConfirmation($this->l('Settings updated')); - } - - public function getAdminDir() - { - $admin_dir = str_replace('\\', '/', _PS_ADMIN_DIR_); - $admin_dir = explode('/', $admin_dir); - $len = count($admin_dir); - return $len > 1 ? $admin_dir[$len - 1] : _PS_ADMIN_DIR_; - } - - public function removeHtaccessSection() - { - $key1 = "\n# start ~ module watermark section"; - $key2 = "# end ~ module watermark section\n"; - $path = _PS_ROOT_DIR_ . '/.htaccess'; - if (file_exists($path) && is_writable($path)) { - $s = file_get_contents($path); - $p1 = strpos($s, $key1); - $p2 = strpos($s, $key2, $p1); - if ($p1 === false || $p2 === false) return false; - $s = substr($s, 0, $p1) . substr($s, $p2 + strlen($key2)); - file_put_contents($path, $s); - } - return true; - } - - public function writeHtaccessSection() - { - $admin_dir = $this->getAdminDir(); - $source = "\n# start ~ module watermark section -Options +FollowSymLinks -RewriteEngine On -RewriteCond expr \"! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}*/$admin_dir/*'\" -RewriteRule [0-9/]+/[0-9]+\\.jpg$ - [F] -# end ~ module watermark section\n"; - - $path = _PS_ROOT_DIR_ . '/.htaccess'; - file_put_contents($path, $source, FILE_APPEND); - } - - public function getContent() - { - //Modify htaccess to prevent downlaod of original pictures - $this->removeHtaccessSection(); - $this->writeHtaccessSection(); - - $this->_html = ''; - - if (Tools::isSubmit('btnSubmit')) - { - $this->_postValidation(); - if (!count($this->_postErrors)) - $this->_postProcess(); - else - foreach ($this->_postErrors as $err) - $this->_html .= $this->displayError($err); - } - - $this->_html .= $this->renderForm(); - - return $this->_html; - } - - // Retrocompatibility - public function hookwatermark($params) - { - $this->hookActionWatermark($params); - } - - public function hookActionWatermark($params) - { - $image = new Image($params['id_image']); - $image->id_product = $params['id_product']; - $file = _PS_PROD_IMG_DIR_.$image->getExistingImgPath().'-watermark.jpg'; - - $str_shop = '-'.(int)$this->context->shop->id; - if (Shop::getContext() != Shop::CONTEXT_SHOP || !Tools::file_exists_cache(dirname(__FILE__).'/watermark'.$str_shop.'.gif')) - $str_shop = ''; - - //first make a watermark image - $return = $this->watermarkByImage(_PS_PROD_IMG_DIR_.$image->getExistingImgPath().'.jpg', dirname(__FILE__).'/watermark'.$str_shop.'.gif', $file, 23, 0, 0, 'right'); - - //go through file formats defined for watermark and resize them - foreach ($this->imageTypes as $imageType) - { - $newFile = _PS_PROD_IMG_DIR_.$image->getExistingImgPath().'-'.stripslashes($imageType['name']).'.jpg'; - if (!ImageManager::resize($file, $newFile, (int)$imageType['width'], (int)$imageType['height'])) - $return = false; - } - return $return; - } - - private function watermarkByImage($imagepath, $watermarkpath, $outputpath) - { - $Xoffset = $Yoffset = $xpos = $ypos = 0; - if (!$image = imagecreatefromjpeg($imagepath)) - return false; - if (!$imagew = imagecreatefromgif($watermarkpath)) - die ($this->l('The watermark image is not a real gif, please CONVERT the image.')); - list($watermarkWidth, $watermarkHeight) = getimagesize($watermarkpath); - list($imageWidth, $imageHeight) = getimagesize($imagepath); - if ($this->xAlign == 'middle') - $xpos = $imageWidth / 2 - $watermarkWidth / 2 + $Xoffset; - if ($this->xAlign == 'left') - $xpos = 0 + $Xoffset; - if ($this->xAlign == 'right') - $xpos = $imageWidth - $watermarkWidth - $Xoffset; - if ($this->yAlign == 'middle') - $ypos = $imageHeight / 2 - $watermarkHeight / 2 + $Yoffset; - if ($this->yAlign == 'top') - $ypos = 0 + $Yoffset; - if ($this->yAlign == 'bottom') - $ypos = $imageHeight - $watermarkHeight - $Yoffset; - if (!imagecopymerge($image, $imagew, $xpos, $ypos, 0, 0, $watermarkWidth, $watermarkHeight, $this->transparency)) - return false; - return imagejpeg($image, $outputpath, 100); - } - - public function renderForm() - { - $types = ImageType::getImagesTypes('products'); - foreach ($types as $key => $type) - $types[$key]['label'] = $type['name'].' ('.$type['width'].' x '.$type['height'].')'; - - $fields_form = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Settings'), - 'icon' => 'icon-cogs' - ), - 'description' => $this->l('Once you have set up the module, regenerate the images using the "Images" tool in Preferences. However, the watermark will be added automatically to new images.'), - 'input' => array( - array( - 'type' => 'file', - 'label' => $this->l('Watermark file:'), - 'name' => 'PS_WATERMARK', - 'desc' => $this->l('Must be in GIF format'), - 'thumb' => '../modules/'.$this->name.'/'.$this->name.'.gif?t='.rand(0, time()), - ), - array( - 'type' => 'text', - 'label' => $this->l('Watermark transparency (1-100)'), - 'name' => 'transparency', - 'class' => 'fixed-width-md', - ), - array( - 'type' => 'select', - 'label' => $this->l('Watermark X align:'), - 'name' => 'xalign', - 'class' => 'fixed-width-md', - 'options' => array( - 'query' => array( - array( - 'id' => 'left', - 'name' => $this->l('left') - ), - array( - 'id' => 'middle', - 'name' => $this->l('middle') - ), - array( - 'id' => 'right', - 'name' => $this->l('right') - ) - ), - 'id' => 'id', - 'name' => 'name', - ) - ), - array( - 'type' => 'select', - 'label' => $this->l('Watermark X align:'), - 'name' => 'yalign', - 'class' => 'fixed-width-md', - 'options' => array( - 'query' => array( - array( - 'id' => 'top', - 'name' => $this->l('top') - ), - array( - 'id' => 'middle', - 'name' => $this->l('middle') - ), - array( - 'id' => 'bottom', - 'name' => $this->l('bottom') - ) - ), - 'id' => 'id', - 'name' => 'name', - ) - ), - array( - 'type' => 'checkbox', - 'name' => 'WATERMARK_TYPES', - 'label' => $this->l('Choose image types for watermark protection:'), - 'values' => array( - 'query' => $types, - 'id' => 'id_image_type', - 'name' => 'label' - ) - ), - ), - 'submit' => array( - 'title' => $this->l('Save'), - 'class' => 'btn btn-default') - ), - ); - - $helper = new HelperForm(); - $helper->show_toolbar = false; - $helper->table = $this->table; - $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); - $helper->default_form_language = $lang->id; - $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; - $helper->identifier = $this->identifier; - $helper->submit_action = 'btnSubmit'; - $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->tpl_vars = array( - 'fields_value' => $this->getConfigFieldsValues(), - 'languages' => $this->context->controller->getLanguages(), - 'id_language' => $this->context->language->id - ); - - return $helper->generateForm(array($fields_form)); - } - - public function getConfigFieldsValues() - { - $config_fields = array( - 'PS_WATERMARK' => Tools::getValue('PS_WATERMARK', Configuration::get('PS_WATERMARK')), - 'transparency' => Tools::getValue('transparency', Configuration::get('WATERMARK_TRANSPARENCY')), - 'xalign' => Tools::getValue('xalign', Configuration::get('WATERMARK_X_ALIGN')), - 'yalign' => Tools::getValue('yalign', Configuration::get('WATERMARK_Y_ALIGN')), - ); - //get all images type available - $types = ImageType::getImagesTypes('products'); - $id_image_type = array(); - foreach ($types as $type) - $id_image_type[] = $type['id_image_type']; - - //get images type from $_POST - $id_image_type_post = array(); - foreach ($id_image_type as $id) - if (Tools::getValue('WATERMARK_TYPES_'.(int)$id)) - $id_image_type_post['WATERMARK_TYPES_'.(int)$id] = true; - - //get images type from Configuration - $id_image_type_config = array(); - if ($confs = Configuration::get('WATERMARK_TYPES')) - $confs = explode(',', Configuration::get('WATERMARK_TYPES')); - else - $confs = array(); - - foreach ($confs as $conf) - $id_image_type_config['WATERMARK_TYPES_'.(int)$conf] = true; - - //return only common values and value from post - if (Tools::isSubmit('btnSubmit')) - $config_fields = array_merge($config_fields, array_intersect($id_image_type_post, $id_image_type_config)); - else - $config_fields = array_merge($config_fields, $id_image_type_config); - - return $config_fields; - } -}