532 Commits

Author SHA1 Message Date
gRoussac
7f02c8ca58 [-] WS: Fix bug #PSCFV-10970 use configuration for uploaded images quality 2013-11-15 18:50:28 +01:00
gRoussac
bfed3532bf [*] BO : AdminPerformances Hide warnings message when not necessary 2013-11-15 16:12:07 +01:00
gRoussac
2962141d51 [-] BO : Fix warning when no memcached servers 2013-11-15 15:39:00 +01:00
gRoussac
73bf2a7db1 [-] BO : Fix #PSCFV-11016 typo 2013-11-15 15:16:02 +01:00
gRoussac
9aa656c9d7 // typo 2013-11-15 15:10:12 +01:00
gRoussac
1140b5e8b5 [*] FO : Fix #PSCFV-8715 add product.attributes in carrier tpl 2013-11-15 15:06:30 +01:00
gRoussac
6a690b255b [-] BO : Model return html error messagae instead of json while image uploading 2013-11-15 12:20:10 +01:00
gRoussac
152960639f [-] BO : Product final price can not be hidden on loading tab, report of 6c6c3b240e 2013-11-15 11:36:07 +01:00
Gregory Roussac
448a4c9994 Merge pull request #980 from djfm/development
// no line breaks in $this->l()
2013-11-15 02:23:39 -08:00
gRoussac
7526fe4766 // missing trailing semi-column 2013-11-15 11:16:48 +01:00
Jerome Nadaud
50eee795ed // Add truncate category description preserving html tags 2013-11-15 11:03:06 +01:00
gRoussac
97be96ede8 [-] MO : Missinag closing href 2013-11-15 10:54:50 +01:00
gRoussac
0b47ef1b3b [-] BO : test on xml string follow up https://github.com/PrestaShop/PrestaShop/pull/690#issuecomment-28542506 2013-11-15 10:51:46 +01:00
fram
ba15d975bc // no line breaks in $this->l() 2013-11-15 10:44:01 +01:00
gRoussac
47d58ff930 [*] FO : set at least a class to body 2013-11-14 19:03:12 +01:00
gRoussac
d06bf10bbb [-] FO : Fix bug #PSCFV-10911, doubles in cart rules highlight 2013-11-14 16:35:11 +01:00
gRoussac
d0d234f555 // typo, sorry about this 2013-11-14 15:58:42 +01:00
gRoussac
19d975a0b4 // typo 2013-11-14 14:48:14 +01:00
gRoussac
6393746f04 [-] BO : 406 when mod_security follow up 034e6a7e7f 2013-11-14 11:43:05 +01:00
gRoussac
db99f188a2 [-] BO : AdminImport, execption when creating groups 2013-11-13 18:23:41 +01:00
Gregory Roussac
fe8e349931 Merge pull request #975 from ldecoker/patch-10
[-] FO : _PS_THEME_MOBILE_OVERRIDE_DIR_ not defined
2013-11-13 09:14:49 -08:00
ldecoker
3f8b76f78c [-][FO] _PS_THEME_MOBILE_OVERRIDE_DIR_ not defined
When there is no mobile theme provided with the current theme, the variable _PS_THEME_MOBILE_OVERRIDE_DIR_ is not defined. We so get the following error in apache logs:

"PHP Notice:  Use of undefined constant _PS_THEME_MOBILE_OVERRIDE_DIR_ - assumed '_PS_THEME_MOBILE_OVERRIDE_DIR_' in FrontController.php"
2013-11-13 18:12:59 +01:00
gRoussac
947f9bb21c // small isset in productcomments 2013-11-13 16:39:33 +01:00
Rémi Gaillard
83400c691c Merge pull request #973 from djfm/development
//translations
2013-11-13 06:34:38 -08:00
Rémi Gaillard
f4601d9680 // default form language 2013-11-13 15:37:58 +01:00
fram
28e1a94bb6 // instead instead of insted 2013-11-13 15:10:06 +01:00
fram
ad6367f2bf // updated native translations 2013-11-13 15:06:47 +01:00
gRoussac
5a8c335d78 [-] FO : Bad value for back when controller name is sent 2013-11-13 12:30:39 +01:00
gRoussac
4479db88a0 [-) PDF : nowrap on several product prices 2013-11-13 11:52:10 +01:00
Francois Gaillard
339c954cb3 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-11-13 11:24:51 +01:00
Jerome Nadaud
c4837e65ec [-] FO : FixBug #PSCFV-9291 - Ecotax increment display price in product combination 2013-11-13 11:24:25 +01:00
Jerome Nadaud
2117c89352 [-] FO : FixBug #PSCFV-9291 - Ecotax increment display price in product combination 2013-11-13 11:04:13 +01:00
Jerome Nadaud
9f10a851e5 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-11-13 10:58:01 +01:00
Gregory Roussac
66a9ee03fc Merge pull request #971 from studiokiwik/sk-ps15x-008
[-] FO : fix contact-form id_order input when customer is not logged
2013-11-13 01:42:00 -08:00
gRoussac
c69688cc11 [-] BO : Fix bug #PSCFV-10990 bad version comparison for ps_versions_compliancy 2013-11-13 10:14:21 +01:00
Mikael Blotin
26d1ad0668 [-] FO : fix contact-form id_order input when customer is not logged 2013-11-13 10:12:31 +01:00
Jerome Nadaud
6a99b84452 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-11-13 10:02:28 +01:00
gRoussac
6ddf220aee [-] Fo : Call Gmaps on https if required 2013-11-12 21:16:09 +01:00
gRoussac
9328a3c473 // forgot to commit 036e2362c9 2013-11-12 19:17:54 +01:00
gRoussac
c8dfe1c174 [-] FO : Wordwrap on prices in history 2013-11-12 19:17:12 +01:00
Rémi Gaillard
75df12dd94 [-] Core: Group::getCurrent() return the default customer group of the shop if default customer group is not associated to shop 2013-11-12 18:49:52 +01:00
Gregory Roussac
6d7e2055ce Merge pull request #968 from ccauw/patch-12
[*] BO : add class on TD in standard List
2013-11-12 09:38:03 -08:00
gRoussac
4d327a537f [*] FO : addTextFieldToProduct without Line feed, follow up https://github.com/PrestaShop/PrestaShop/pull/962#issuecomment-28294571 2013-11-12 18:28:42 +01:00
ccauw
747926039a [*] BO : add class on TD in standard List
Back office :
Add a class on TD in list created by getList()
In fields_list array of AdminController, we can add a new parameter('class')

example :
		'name' => array(
			'title' => $this->l('Name'),
			'width' => 150,
			'class' => 'ma_classe',
			'filter_key' => 'b!name'
		),
This parameter can be used for javascript effect, ...

Thanks.
2013-11-12 18:01:27 +01:00
gRoussac
5e4382eb08 [-] BO : Fix bug #PSCFV-10982 reduction group truncated 2013-11-12 17:55:07 +01:00
gRoussac
036e2362c9 [+] CORE : Fixed cache_id 2013-11-12 17:09:38 +01:00
Fabio Chelly
fc193d5c8b Merge remote-tracking branch 'origin/development' into development 2013-11-12 16:36:19 +01:00
Rémi Gaillard
75e6a03591 // small fix 2013-11-12 16:38:34 +01:00
Fabio Chelly
dd05692400 [-] FO : Fixed errors when calculating most selled products from footer link 2013-11-12 16:36:07 +01:00
Rémi Gaillard
b5eb7c5c28 // typo 2013-11-12 16:25:13 +01:00
gRoussac
f0f3679cbd [*] FO : https on TOS in fancybox, follow up https://github.com/PrestaShop/PrestaShop/pull/956 2013-11-12 15:56:04 +01:00
Rémi Gaillard
175da3ecf6 Merge pull request #965 from djfm/IETF
[*] LO : Fix PSCFV-10876: use IETF code to set language of shop, not 'is...
2013-11-12 06:05:10 -08:00
fram
743c4f4607 [*] LO : Fix PSCFV-10876: use IETF code to set language of shop, not 'iso' code, allows to distinguish between chinese variants etc. 2013-11-12 14:59:36 +01:00
gRoussac
40abef8aac Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-11-12 12:32:37 +01:00
Rémi Gaillard
8be339463d // small fix 2013-11-12 12:36:51 +01:00
gRoussac
f0f630fb50 [-] FO : #PSCFV-10978 firstname displayed instead of lastname in invoice address 2013-11-12 12:32:21 +01:00
gRoussac
3f42a381a4 [*] FO : Redirect to address.tpl when !Address::isCountryActiveById 2013-11-12 12:12:19 +01:00
Gregory Roussac
0e1898be09 Merge pull request #963 from djfm/sprintf
// do not use sprintf in installer when it is useless
2013-11-12 01:45:39 -08:00
gRoussac
c1969028f2 [-] FO : Customized meesage with carriage return follow up #962 2013-11-12 10:41:19 +01:00
Gregory Roussac
cd83ec93c7 Merge pull request #961 from joseantgv/patch-4
[-] MO : Whishlist, innerhtml in html jquery
2013-11-12 00:42:04 -08:00
fram
ab730dc3da // do not use sprintf when it is useless 2013-11-12 09:21:05 +01:00
joseantgv
7523828a7a Update ajax-wishlist.js
innerHtml can not execute javascript from "data". If someone modify php files returned from jquery function and includes a script, it's not executed.
2013-11-11 16:58:52 +01:00
gRoussac
e2d8a33a81 [*] FO : Cache on getDiscountsCustomer, follow up https://github.com/PrestaShop/PrestaShop/pull/960 2013-11-11 14:02:11 +01:00
gRoussac
a7869a1f06 [*] CORE : Remove duplicate SQL queries 2013-11-11 13:41:23 +01:00
gRoussac
de404706d9 [*] CORE : Profiling hide non doubles 2013-11-11 02:09:50 +01:00
gRoussac
3f9338e13d [*] CORE : Cache store for isAssociatedToShop::isAssociatedToShop 2013-11-11 01:59:10 +01:00
gRoussac
38da826671 [-] FO : getTaxCalculator bad cache key again // sorry about that 2013-11-11 01:37:20 +01:00
gRoussac
fee461fdf1 [*] FO : Set cache for StockAvailable::getQuantityAvailableByProduct 2013-11-11 01:00:55 +01:00
gRoussac
8dd951c2df [*] MO : Remove calls to isRegisteredInHook in crossselling and productscategory 2013-11-11 00:36:17 +01:00
gRoussac
7e93b2cffd [-] FO : getTaxCalculator bad cache key 2013-11-11 00:13:35 +01:00
gRoussac
19da345531 [-] BO : Could not check all modules after ajax call 2013-11-10 21:51:14 +01:00
Fabio Chelly
bd8eebdc33 Merge remote-tracking branch 'origin/development' into development 2013-11-08 18:12:23 +01:00
Fabio Chelly
4312d241f3 [-] MO :Fixed #PNM-1654 (Loyalty module) by using most expensive attribute instead of default one 2013-11-08 18:12:11 +01:00
gRoussac
7eb70486e0 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-11-08 15:54:28 +01:00
gRoussac
ebc3dfee62 [-] BO : Fix css bug #PSCFV-10899, fixed fix-toolbar z-index 2013-11-08 15:54:13 +01:00
Gregory Roussac
ee487fde59 Merge pull request #953 from Shagshag/patch-4
[*] BO: kb was not translatable
2013-11-08 06:37:26 -08:00
Shagshag
c7f1fcb49a kb was not translatable 2013-11-08 15:33:49 +01:00
gRoussac
530b6dc501 // Productscomments remove warnings 2013-11-08 15:00:56 +01:00
gRoussac
5364be686e // More simple names for csv import files 2013-11-08 14:59:43 +01:00
Jérôme Nadaud
aaaf8588c1 Merge pull request #931 from PhpMadman/patch-2
[-] MO : Mailalert was not using order reference
2013-11-08 04:01:39 -08:00
PhpMadman
6ee2852fa5 [-] MO : Mailalert was not using order reference 2013-11-08 12:48:49 +01:00
Jérôme Nadaud
02acd47c9e Merge pull request #950 from pelTek/patch-2
Added states to Greek localization pack
2013-11-08 02:46:55 -08:00
Chris
32e92762f5 Added states to Greek localization pack
Added states to Greek localization pack
2013-11-08 12:44:42 +02:00
Francois Gaillard
3b7387ffe8 [-] Classes : Hook - Installer & context shop id 2013-11-08 11:00:14 +01:00
gRoussac
472dc8c27d [-] MO : Blocklayered follow up a6e67b078e (commitcomment-4538556) 2013-11-07 17:59:04 +01:00
Fabio Chelly
92cf31e5c3 [-] MO : Fixed #PNM-1600 by modifying getPageLink() 2013-11-07 16:46:30 +01:00
Fabio Chelly
fa7d44d67f Merge remote-tracking branch 'origin/development' into development 2013-11-07 16:39:26 +01:00
Fabio Chelly
b9c4b5d2a7 [-] FO : Prevents warning in safePostVars when $_POST has been unset 2013-11-07 16:38:53 +01:00
Gregory Roussac
fbd28f3e49 Merge pull request #942 from Jacky75/20131107_payment_and_groups
[-] FO : in multistore payment module restrictions by customer group was...
2013-11-07 06:39:57 -08:00
Daniele Giachino
8c8340db4e [-] FO : in multistore payment module restrictions by customer group was not applied to specific shop 2013-11-07 15:18:59 +01:00
gRoussac
7cc351e83d [-] BO : Fix bug #PSCFV-10932, ranges input disabled on load 2013-11-07 15:11:30 +01:00
gRoussac
91cde1ab3a [-] BO : getCMSPages to associated shop in cmscontroller 2013-11-07 12:09:58 +01:00
gRoussac
e6f9f806bf [-] FO : Fix bug #PSCFV-10892, getCMSPages by id_shop thnaks @jd440 2013-11-07 12:03:35 +01:00
gRoussac
fc4a660f76 [-] BO : Fix bug #PSCFV-10666 product_supllier currency set to 0 2013-11-07 11:24:32 +01:00
Jerome Nadaud
f3147b4e57 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-11-07 09:47:47 +01:00
gRoussac
514c087962 [*] BO : New import csv files 2013-11-06 18:38:32 +01:00
gRoussac
00887942d3 // preg_last_error not available on every stacks 2013-11-06 18:32:39 +01:00
gRoussac
afe6c9bc6f // missing dir sep on is_dir (open_basedir) 2013-11-06 18:23:01 +01:00
gRoussac
fc6041fa33 [-] IN : bad path in create multistore 2013-11-06 18:06:19 +01:00
gRoussac
76b03856e2 // missing trailing dir sep 2013-11-06 17:33:18 +01:00
Rémi Gaillard
ef5779f63f // d321b9a5bc 2013-11-06 17:11:31 +01:00
Jérôme Nadaud
d0522417eb Merge pull request #937 from PhpMadman/DiscountPrice
[*] FO : Added possibility to display new price instead of quantity discount
2013-11-06 08:06:16 -08:00
Rémi Gaillard
50c95f568c Merge pull request #935 from jeckyl/patch-4
Update cart-summary.js
2013-11-06 07:01:02 -08:00
jeckyl
d321b9a5bc Update cart-summary.js
Just add this space to separate this classes. It's to display or not carrier option when we select one or another carrier during order finalisation.
2013-11-06 14:42:00 +01:00
PhpMadman
d95885caae [*] FO : Added posibilty to display new price instead of quantity discount 2013-11-06 14:41:42 +01:00
fchellypresta
71139df65f Merge pull request #796 from PhpMadman/patch-1
[*] BO: #PNM-1472 Changed label and transparency range check to 1
2013-11-06 03:06:47 -08:00
gRoussac
1fb8ef823d [-] BO : Fix bug #PSCFV-10937, bad escaping for var product_prices in prices.tpl 2013-11-06 11:50:52 +01:00
Jérôme Nadaud
29001b3392 Merge pull request #930 from PhpMadman/patch-3
[-] BO : Cart was not using order reference
2013-11-06 02:30:57 -08:00
PhpMadman
eac7fbb694 [-] BO : Cart was not using order reference, corrected syntax 2013-11-06 11:06:46 +01:00
Jérôme Nadaud
fa4b5e0b7d Merge pull request #927 from djfm/loc
[*] LO : Added states to Spanish localization pack
2013-11-06 00:31:46 -08:00
Jérôme Nadaud
d30830f6fe Merge pull request #932 from prestalab/patch-1
// FIX: tags with UTF-8 chars
2013-11-05 23:49:43 -08:00
PrestaLab
b2e5c6090d Fixed tags with UTF-8 chars
Fixed error Tag->Name is not valid if tag in non latin chars
2013-11-05 23:33:44 -08:00
PhpMadman
2556a7bb68 [-] MO : Mailalert was not using order reference 2013-11-05 20:46:10 +01:00
PhpMadman
7226f33f90 [-] BO : Cart was not using order reference 2013-11-05 20:42:57 +01:00
Jerome Nadaud
3f3dc0feb9 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-11-05 16:39:12 +01:00
Rémi Gaillard
d4253b9849 // small fix 2013-11-05 15:33:21 +01:00
fram
2b8d069cf9 [*] LO : Added states to Spanish localization pack 2013-11-05 12:06:31 +01:00
Rémi Gaillard
9817ef6840 // small fix on profiling 2013-11-05 11:54:22 +01:00
gRoussac
581645ce6d [-) BO : Action is mandatory for a cart rule 2013-11-05 11:26:10 +01:00
gRoussac
87be153e42 [-] MO : Blockcategories last_visited_category must not be cached 2013-11-05 11:16:52 +01:00
Gregory Roussac
f85c6b59c8 Merge pull request #921 from Jacky75/20131105-layered-feature-sorted
[*] MO : Blocklayered filter feature blocks sorted
2013-11-05 01:50:48 -08:00
Daniele Giachino
99e98a5164 In multistore, layered filters about categories are not loading the category name from the proper shop 2013-11-05 10:45:23 +01:00
Damien Metzger
4c1ad83b18 // "Fixed" strict standard 2013-11-05 10:22:39 +01:00
gRoussac
26a43260c5 [-] CORE : invalid method name in displayAjax method of Controller action 2013-11-05 10:18:53 +01:00
Gregory Roussac
c69429c126 Merge pull request #922 from Jacky75/20131105-layered-categories-shop
[-] MO : Missing context shop for categories
2013-11-05 01:10:39 -08:00
Daniele Giachino
02c04a9884 In multistore, layered filters about categories are not loading the category name from the proper shop 2013-11-05 09:40:53 +01:00
Daniele Giachino
cf65877f3f layered filters involving features are now natural sorted 2013-11-05 09:32:36 +01:00
Daniele Giachino
f0abdca08f layered filters involving features are now natural sorted 2013-11-05 09:30:13 +01:00
gRoussac
0e54bf0f76 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-11-04 18:27:39 +01:00
Jerome Nadaud
12276f41fb // Update image when updated 2013-11-04 18:26:24 +01:00
gRoussac
be13f82b30 [*] FO: Follow up e86c56172d 2013-11-04 18:20:01 +01:00
Rémi Gaillard
f5cc6862cb // don't die on autoload 2013-11-04 18:08:24 +01:00
Rémi Gaillard
0a65de5e5f Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-11-04 17:22:21 +01:00
Rémi Gaillard
f4740088c1 // small fix 2013-11-04 17:22:08 +01:00
gRoussac
c44b1d617c [-] BO : Could not change image position 2013-11-04 16:59:03 +01:00
gRoussac
c452444620 [-] IN : Could not install when session_start() does not fail on ajax requests 2013-11-04 15:47:29 +01:00
gRoussac
3f817e8729 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-11-04 14:31:29 +01:00
gRoussac
66f314bbb2 // missing trailing bracket in modules/productcomments/config.xml 2013-11-04 14:31:15 +01:00
Rémi Gaillard
bf8cd29868 // validator on message field 2013-11-04 14:21:42 +01:00
gRoussac
b8b7fbaf71 [*] MO : New modules version since 1.5.6.0 2013-11-04 11:57:31 +01:00
gRoussac
9ea79f8cb5 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-11-04 11:48:25 +01:00
Rémi Gaillard
b3c54a59dd // typo 2013-11-04 11:48:30 +01:00
Rémi Gaillard
06d73554be // preg instead strpos 2013-11-04 11:39:48 +01:00
gRoussac
ad555f1d30 [-] IN : Follow up #PSCFV-10671 update messages in base and b16e4b5a8e 2013-11-04 11:10:40 +01:00
Gregory Roussac
4b6ee72072 Merge pull request #894 from codeurWeb/patch-6
[-] MO : Fix NetworkError 404 Not Found on admin in blocklayered.php
2013-11-04 02:02:10 -08:00
Rémi Gaillard
e000f8c627 // something is missing in the last commit 2013-11-04 11:00:21 +01:00
Rémi Gaillard
6ef7f258ea // small fix 2013-11-04 10:34:58 +01:00
Jerome Nadaud
2be72f50d1 [-] FO : FixBug Categories description 2013-11-04 10:29:44 +01:00
Rémi Gaillard
d49c4cf62e [-] BO: Fix from name when replying to customer threads 2013-11-04 09:38:12 +01:00
gRoussac
c7323c2bfe [-] CORE : Fix bug #PSCFV-10901 warnings on htmlentities 2013-11-03 22:59:04 +01:00
gRoussac
2a3192d98c [-] IN : Refacto for update_customer_default_group bad logical 2013-11-03 14:55:25 +01:00
gRoussac
b16e4b5a8e [-] IN : Lower memory usage in migrate_orders, fix update_order_messages loop 2013-11-03 01:49:16 +01:00
gRoussac
8f72282594 [-] IN : update_customer_default_group returning false 2013-11-02 21:51:13 +01:00
gRoussac
a5bb4f0323 [-] IN: Fix [insert order detail 1] error while upgrading 2013-11-02 20:39:53 +01:00
gRoussac
062fb90c2e [-] IN : Fix Unknown column 'module_name' in 'ps_webservice_account' during upgrade 2013-10-31 19:24:41 +01:00
Jerome Nadaud
9193a29a44 [+] MO : Blockcart - Add error handler on ajax function 2013-10-31 19:02:43 +01:00
Jerome Nadaud
671062af07 // Add Disable overrides to debug mode 2013-10-31 18:41:56 +01:00
gRoussac
80c60be952 [-] BO : Do not enable rewrite url for index 2013-10-31 16:20:55 +01:00
Rémi Gaillard
1b019dffc5 // Fix lang detection on dispatcher 2013-10-31 15:28:19 +01:00
gRoussac
f9dc0b0252 [-] MO : Could not translate in transit mail, revert from 3213b5dffb 2013-10-31 14:20:21 +01:00
Rémi Gaillard
9611ea1f70 [-] BO: Fix empty group list on changing opt or newsletter on customers listing 2013-10-31 11:22:40 +01:00
Rémi Gaillard
d17515a728 // don't format currency on input 2013-10-31 10:22:38 +01:00
gRoussac
036fa7cba6 [-] FO : Fix bug #PSCFV-10889 wrong color when oos product 2013-10-31 10:18:28 +01:00
Damien Metzger
9c57c71deb Merge pull request #913 from djfm/development
// Installer Translations
2013-10-31 01:48:56 -07:00
djfm
7812731095 // removed hard-coded space before ellipsis (...) in English installer steps 2013-10-31 08:29:05 +00:00
djfm
a8a204edf3 // small correction in English installer text 2013-10-31 08:25:57 +00:00
djfm
11f60492be // removed unnecessary punctuation in English installer strings, both in source code and translations 2013-10-31 08:09:14 +00:00
gRoussac
f919cc899d [-] IN : Set conversion rate to 1 if equal 0 in base 2013-10-30 20:06:47 +01:00
gRoussac
fbdddba753 [-] IN : Set default conversion rate to 1 not 0 2013-10-30 19:03:36 +01:00
gRoussac
cbfa8dfc30 // forgot to commit in f78cde96d6 2013-10-30 19:02:24 +01:00
gRoussac
8547f663d1 [-] BO : AdminImport withdraw separator changed in js 2013-10-30 18:46:02 +01:00
gRoussac
372130f7d7 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-10-30 18:37:46 +01:00
gRoussac
f78cde96d6 [-] BO : AdminImport wrong group by default 2013-10-30 18:37:26 +01:00
Jerome Nadaud
48f00b2367 [-] BO : FixBug #PSCFV-10882 - Add json encode and decode smarty modifier via tools class 2013-10-30 18:28:17 +01:00
djfm
c958436a76 // Dutch installer translations 2013-10-30 17:26:22 +00:00
djfm
a56fb7c639 // Polish installer translations 2013-10-30 17:06:52 +00:00
djfm
16efe89bed // improved installer translations: no colons in translations and filled some missing fields 2013-10-30 16:57:30 +00:00
gRoussac
56799f53c8 [-] Bo : AdminImport customer group default 2013-10-30 17:12:20 +01:00
Jerome Nadaud
da43700361 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-10-30 16:48:26 +01:00
Jerome Nadaud
d7b46e80af [+] BO : Add debug mode system 2013-10-30 16:48:16 +01:00
gRoussac
b311a0c719 [-] BO : Fix bug #PSCFV-10872 AdminImport could not import supllier orders 2013-10-30 16:06:38 +01:00
Rémi Gaillard
a0f4eab4c1 // typo 2013-10-30 15:40:40 +01:00
gRoussac
9ef10ee806 [-] IN : Handle RC PHP_VERSION 2013-10-30 15:03:07 +01:00
Rémi Gaillard
f9b1545037 // missing file 2013-10-30 14:59:08 +01:00
Rémi Gaillard
c56e8471c2 [-] BO: fix the checkbox of shop activation on modules configuration 2013-10-30 14:57:15 +01:00
gRoussac
8953c55b7f [-] BO : Adminimport default customers group 2013-10-30 12:30:22 +01:00
Jérôme Nadaud
653c38e01a Merge pull request #911 from madef/development
[-] BO : tagify call twice if field is not translatable
2013-10-30 00:55:53 -07:00
Madef
78af47e2d3 [-] BO : tagify call twice if field is not translatable 2013-10-29 23:18:34 +01:00
gRoussac
26b4fbf883 [*] BO : Manual merge of https://github.com/PrestaShop/PrestaShop/pull/891 1/2 2013-10-29 19:07:31 +01:00
gRoussac
c98b5e0c78 [*] CORE : Manual merge of https://github.com/PrestaShop/PrestaShop/ thanks @kpodemski 2013-10-29 19:05:21 +01:00
Rémi Gaillard
6d5ca9969e // js error 2013-10-29 17:56:29 +01:00
Gregory Roussac
90bef56c84 Merge pull request #907 from djfm/development
// Frenglish
2013-10-29 08:24:45 -07:00
gRoussac
75cde08776 // update conf message in AdminImport 2013-10-29 16:16:55 +01:00
gRoussac
c6319a754e [-] BO : Stats are empty when no conversion rate 2013-10-29 16:04:15 +01:00
djfm
9d18ef8186 // Frenglish 2013-10-29 14:44:51 +00:00
Gregory Roussac
f58526c701 Merge pull request #905 from PhpMadman/RMARef
[-] BO : Order-follow displayed order id instead of order reference
2013-10-29 07:44:26 -07:00
Damien Metzger
d5eedd5eaa Merge pull request #906 from djfm/development
// Small fix
2013-10-29 07:42:07 -07:00
gRoussac
a43851469e [-] CORE : Currency conversion rate can not be 0 2013-10-29 15:39:17 +01:00
djfm
0288696c90 // English 2013-10-29 14:37:55 +00:00
Rémi Gaillard
64706075d5 // Fix default language on BO forms 2013-10-29 15:32:31 +01:00
PhpMadman
7c1623c7fa [-] BO : Order-follow displayed order id instead of order reference 2013-10-29 14:53:50 +01:00
Jérôme Nadaud
ed2fbba996 Merge pull request #903 from PhpMadman/patch-2
[-] BO : hide stmp options when selecting never send emails
2013-10-29 05:31:02 -07:00
PhpMadman
87bb957431 fixed missing comma 2013-10-29 13:28:00 +01:00
PhpMadman
7b029457e4 [-] BO : hide stmp options when selecting never send emails 2013-10-29 12:41:24 +01:00
Jerome Nadaud
b605f33359 [-] BO : FixBug #PSCFV-10866 - Tagify system not working 2013-10-29 12:07:30 +01:00
Jerome Nadaud
580e201c48 [-] BO : FixBug #PSCFV-9319 - display only valid order id 2013-10-29 11:38:48 +01:00
gRoussac
d409614222 [-] FO : CustomerMessage ip_address to string 2013-10-29 11:18:53 +01:00
djfm
e1c7541a38 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-10-29 10:01:00 +00:00
gRoussac
1bee84d26c [-] BO : Do not delete other default jpg when _deleteOldImages and type defined 2013-10-29 10:57:33 +01:00
gRoussac
af61191a7e // rename field Action when out of stock 2013-10-29 10:55:46 +01:00
Rémi Gaillard
07222be5dd // demo mode on ajaxfilemanager 2013-10-29 10:53:00 +01:00
Jerome Nadaud
9f2580f3bd Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-10-29 10:31:12 +01:00
Jerome Nadaud
d2e475dd3a // Removed line from merge 2013-10-29 10:30:59 +01:00
Rémi Gaillard
2b67d7072c // type of logger field 2013-10-29 10:18:29 +01:00
Gregory Roussac
b885c63564 Merge pull request #900 from kpodemski/patch-10
[*] MO: productcomments optimization
2013-10-29 02:06:56 -07:00
Gregory Roussac
d74291e5b5 Merge pull request #901 from kpodemski/patch-11
[*] MO: blocksharefb optimization
2013-10-29 02:06:25 -07:00
Jerome Nadaud
1d90218e0d // Update mailalert module version 2013-10-29 10:00:57 +01:00
Jerome Nadaud
9660cef0aa [-] MO : mailalert - Fix deprecated warning on displayDate 2013-10-29 09:58:42 +01:00
Jérôme Nadaud
4b1f198cc4 Merge pull request #899 from cedricfontaine/patch-3
Update stores.js
2013-10-29 01:43:03 -07:00
gRoussac
0aca1d4a67 [*] BO : AdminProducts find smallest images 2013-10-29 08:47:41 +01:00
Krystian Podemski
526f32b6a0 [*] MO: blocksharefb optimization 2013-10-28 23:24:32 +01:00
Krystian Podemski
faa4a18a82 [*] MO: productcomments optimization 2013-10-28 23:21:35 +01:00
gRoussac
79cba4b655 [-] FO : Fix bug #PSCFV-10851, no shop restriction in vouchers display in cart 2013-10-28 19:00:00 +01:00
cedricfontaine
0ba8fbc39a Update stores.js
Phone number is already in the address field
2013-10-28 13:46:42 -04:00
Rémi Gaillard
edf54eb2ca // re-generate class_index on the first step of install 2013-10-28 18:43:02 +01:00
gRoussac
e86c56172d [*] FO: Can not establish purchase total when tax incl. 2013-10-28 17:42:23 +01:00
Jerome Nadaud
48b7a49b1a // Product image upload failed with bad content-type header 2013-10-28 14:58:19 +01:00
Gregory Roussac
12a257db7a Merge pull request #898 from Jacky75/blulab20131028-slider-virtualuri
[-] MO : homeslider stores slider about multistore with virtual uri
2013-10-28 06:53:41 -07:00
Sarah Lorenzini
63141a9c4d [-] FO: fixed bug #PSCFV-10654 - TinyMCE editor: List of products by manufacturer, products by supplier - Long description is not hidden. 2013-10-28 14:48:48 +01:00
Daniele Giachino
c84689ec71 homeslider stores slider about multistore with virtual uri 2013-10-28 14:09:35 +01:00
gRoussac
4103339f53 [-] BO : AdminImport, fix bug from 84454bbc1c (commitcomment-4418502) 2013-10-28 11:21:25 +01:00
Gregory Roussac
9a879bc133 Merge pull request #897 from freedayko/development
[*] BO : improved unicode characters replacement in URLs
2013-10-28 03:09:16 -07:00
gRoussac
e1d1479f22 [*] FO : Fix bug #PSCFV-10689 handle image legend 2013-10-27 23:31:36 +01:00
gRoussac
2dbaa5f73b [-] BO : Fix bug #10689, could not set image legend in back office 2013-10-27 22:49:25 +01:00
gRoussac
9a3cfece69 //missing line feed after disable_modsec 2013-10-27 16:05:55 +01:00
Aleksander Palyan
ee06d3114d [*] BO : improved unicode characters replacement in URLs (Russian and Ukrainian characters added) 2013-10-27 15:05:49 +02:00
gRoussac
c5c861b59e [-] MO : Blockwishlist no product image when id_product_attribute is defined, thanks @Broceliande 2013-10-27 13:28:34 +01:00
Julien
0bc1d21432 [-] MO : Fix NetworkError 404 Not Found on admin in blocklayered.php
These files not exists :
 - /js/jquery/jquery-ui-1.8.10.custom.min.js
 - /css/jquery-ui-1.8.10.custom.css
2013-10-26 15:08:07 +02:00
gRoussac
4c484afda1 [-] MO : Fix bug #PSCFV-10841, blockcart hides on product page when last product is removed from cart 2013-10-25 17:37:32 +02:00
gRoussac
025b62f995 // norms 2013-10-25 17:33:44 +02:00
Fabio Chelly
8f6a5bb3a1 Merge remote-tracking branch 'origin/development' into development 2013-10-25 17:01:51 +02:00
Fabio Chelly
a7d0794c43 [-] BO : Fixed bug PSCFV-9910 using basic queries to prevent locking errors 2013-10-25 17:01:28 +02:00
Gregory Roussac
6359c1ca33 Merge pull request #893 from neemzy/development
[*] FO : Turned "true" and "false" strings to proper booleans in address.tpl
2013-10-25 07:42:59 -07:00
Tom Panier
9a26cf02a8 Turned "true" and "false" strings to proper booleans
It's cleaner this way, and matches how it is done on similar templates.
2013-10-25 16:36:39 +02:00
gRoussac
eb8ea1cba5 [-] CORE : SetEnv in if statement 2013-10-25 15:29:15 +02:00
gRoussac
4e6585a1b8 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-10-25 15:21:55 +02:00
gRoussac
a03efe152c [-] CORE : SetEnv not available on all config // @todo curl request on dummy .htacces 2013-10-25 15:21:40 +02:00
gRoussac
942d3c7151 [-] MO : Fixbug #PSCFV-10679 dateofdelivery PDF invoice array and array 2013-10-25 00:01:25 +02:00
gRoussac
1e094f4016 [-] FO: Fix bug #PSCFV-10623 blocknewproducts shows products when PS_NB_DAYS_NEW_PRODUCT == 0 2013-10-24 23:29:23 +02:00
gRoussac
a9643c80c3 // bad commit sorry 2013-10-24 22:45:43 +02:00
gRoussac
438a3dda2b [-] BO : Fix bug #PSCFV-10718 AdminAttachments old file not deleted on update 2013-10-24 22:42:13 +02:00
gRoussac
4cd3e1b830 [-] FO: Fix bug #PSCFV-10230, Blockspecials still caching when files cache limit is 0 2013-10-24 21:59:32 +02:00
gRoussac
97ef888345 [-] FO: Fix bug #PSCFV-10625 Js error on carriers step if AjaxCart disabled 2013-10-24 21:28:22 +02:00
Gregory Roussac
4207bdff32 Merge pull request #890 from indesign47/patch-14
[-] BO : AdminImport change width height depth
2013-10-24 09:43:54 -07:00
Jerome Nadaud
6f57093f50 [-] BO : FixBug #PSCFV-10600 - Unmatched Boundary with mod_security 2013-10-24 18:36:36 +02:00
indesign47
8cb1806e49 // small fixes for Width Height Depth
change
0,1;0,2;0,3
to
1,2,3
2013-10-24 18:13:05 +02:00
gRoussac
759fe2f671 // norms 2013-10-24 18:09:21 +02:00
Gregory Roussac
0416aca547 Merge pull request #889 from PhpMadman/PSCFV-10728
[-] BO : fix #PSCFV-10728, prices incorrectly formatted when creating new order from BO
2013-10-24 09:06:43 -07:00
Rémi Gaillard
cc3363011e // rewrited urls for feeder module 2013-10-24 17:54:44 +02:00
PhpMadman
c516035e0e [-] BO : fix #PSCFV-10728, prices incorrectly formatted when creating new order from BO 2013-10-24 17:19:28 +02:00
gRoussac
c5324a653b [-] IN: Fix bug #PSCFV-10644 no carrier available after upgrade from 1.4.x 2013-10-24 16:31:50 +02:00
Rémi Gaillard
3cd702da42 [-] WS: Fix stockavailables list when stock is shared between shops #PSCFV-10793 2013-10-24 16:30:02 +02:00
Gregory Roussac
65401efcb6 Merge pull request #887 from indesign47/patch-13
[*] BO : AdminImport add img manufacturers-suppliers
2013-10-24 07:22:57 -07:00
indesign47
84454bbc1c [*] BO : AdminImport add img manufacturers-suppliers 2013-10-24 16:16:29 +02:00
indesign47
f0ed5a303c [*] BO : AdminImport add img suppliers 2013-10-24 15:49:56 +02:00
indesign47
4803530eed [*] BO : AdminImport add img manufacturers 2013-10-24 15:47:31 +02:00
indesign47
ea8a5277f2 [*] BO : AdminImport add img manufacturers-suppliers 2013-10-24 15:44:11 +02:00
gRoussac
2ffc296279 FO : https://github.com/PrestaShop/PrestaShop/pull/878 2013-10-24 12:03:33 +02:00
Rémi Gaillard
971722a13f // note updated by ajax in admincustomers should be url encoded 2013-10-24 11:56:50 +02:00
gRoussac
fc9b39968b // remove notice 2013-10-24 11:46:09 +02:00
gRoussac
81945cef71 [-] FO : Follow up https://github.com/PrestaShop/PrestaShop/pull/879 2013-10-24 10:00:19 +02:00
Gregory Roussac
1cc0134ec3 Merge pull request #879 from neemzy/development
[-] FO : OPC hide VAT fields fail if there are no company fields
2013-10-24 00:55:55 -07:00
Fabio Chelly
b9de912dd3 [-] MO : Fixed bug PNM-1431 - referralprogram Lack the % sign 2013-10-24 09:53:16 +02:00
Tom Panier
6d3640e895 Conditions to hide VAT fields fail if there are no company fields
"Company" fields may or may not be rendered on this form, whereas "VAT" fields are always rendered and depend on the former ones to be shown (or hidden) with CSS.

This fixes an edge case where there are no "Company" fields rendered and "VAT" fields still wrongly appear, which was caused by the fact that `$('#field').val() != ''` is truthy when `$('#field').length` is zero (since `'' != undefined`).
2013-10-24 09:43:50 +02:00
gRoussac
56693da6e0 // remove warning Notice: Undefined variable: connections in AdminCustomersController.php on line 702 2013-10-23 19:02:13 +02:00
gRoussac
3e33a259ef [-] BO : FIx bug #PSCFV-10736 again, fixing query when product is not in base 2013-10-23 18:33:37 +02:00
gRoussac
8e506ddff2 [-] BO : FIx bug #PSCFV-10736, could not load a product given from getBoughtProducts 2013-10-23 18:16:45 +02:00
gRoussac
03ad842697 [-] BO : Fix bug #PSCFV-10790, Customer group names not exploded 2013-10-23 16:07:28 +02:00
Rémi Gaillard
554ab9414f [-] BO: product listing should call Product::getPriceStatic() with the product default shop in the context when it is not a shop context 2013-10-23 15:08:02 +02:00
Rémi Gaillard
747ec9a2c4 // notice on carrierwizard when step back 2013-10-23 14:50:30 +02:00
Gregory Roussac
2f5e15e2b1 Merge pull request #874 from PhpMadman/patch-5
[-] FO: Mobile theme removed width on message product select
2013-10-23 03:04:25 -07:00
PhpMadman
373604fc97 [-] FO: removed width on message product select
Limiting select could make the user think the select is not working if they click to much to the left on bigger screens
2013-10-23 11:52:35 +02:00
gRoussac
101b37b40a Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-10-23 11:45:26 +02:00
gRoussac
ad4ecefcf9 [-] FO : Prevent fatal error on getUniqReference when order not loaded 2013-10-23 11:44:12 +02:00
Fabio Chelly
3e999ab591 [-] MO blockcart
#PNM-1685 - [CODE] incorrect spelled variable in ajax-cart.js
2013-10-23 10:56:48 +02:00
Fabio Chelly
010ad76e6f Merge remote-tracking branch 'origin/development' into development 2013-10-23 10:55:35 +02:00
Fabio Chelly
5fd3ad5adf [*] FO ProductSale: improves calculation of most selled products when there are a lot of products in shop 2013-10-23 10:55:23 +02:00
Rémi Gaillard
6cddb57ce3 [-] BO: Synchronize stock available after receipt supply order items #PSCFV-10724 2013-10-23 10:34:00 +02:00
gRoussac
ae63336a37 [-] BO : Fix bug #PSCFV-10638, Admin Import by reference moves products to home category 2013-10-23 01:41:05 +02:00
gRoussac
feca06417f // definition on addFeatureValueImport 2013-10-23 01:23:35 +02:00
gRoussac
5d28d38a22 [-] BO : Fix bug #PSCFV-7907 AdminImport, add custom field to features 2013-10-23 01:18:09 +02:00
Gregory Roussac
398548fecf Merge pull request #864 from samy-r/features-duplication-escaping
[-] CORE : pSQL for feature values
2013-10-22 10:20:44 -07:00
Gregory Roussac
83d4d0d258 Merge pull request #872 from ldecoker/patch-11
[-] PDF : {else if} instead of {elseif} (B2B invoice template)
2013-10-22 10:19:31 -07:00
Gregory Roussac
c401e61b81 Merge pull request #871 from ldecoker/patch-10
[-] PDF  : {else if} instead of {elseif}
2013-10-22 10:18:57 -07:00
Gregory Roussac
5bb4d48ddd Merge pull request #870 from djfm/development
[*] LO : Fixed a few bugs with currency formats in Back-Office orders
2013-10-22 10:17:11 -07:00
Gregory Roussac
e557db6429 Merge pull request #866 from studiokiwik/sk-ps15x-007
[-] MO : Loyalty if customer is logged do not recreate it
2013-10-22 10:15:55 -07:00
ldecoker
ce4170574c [PDF] [-] {else if} instead of {elseif} (B2B invoice template) 2013-10-22 18:57:12 +02:00
ldecoker
e6e2db8400 [PDF] [-] {else if} instead of {elseif} 2013-10-22 18:55:32 +02:00
Gregory Roussac
70d2e6e10b Merge pull request #868 from ldecoker/patch-8
[-] BO : Notices onBO translation page
2013-10-22 08:03:06 -07:00
ldecoker
7cbaada844 [BO][-] Notice messages when accessing the BO translation page
When accessing the translation part with "core translation" , you got 2 errors:
Notice: Use of undefined constant _PS_THEME_SELECTED_DIR_ - assumed '_PS_THEME_SELECTED_DIR_' in controllers\admin\AdminTranslationsController.php on line 1018

Notice: Use of undefined constant _PS_THEME_SELECTED_DIR_ - assumed '_PS_THEME_SELECTED_DIR_' in \controllers\admin\AdminTranslationsController.php on line 1026

It's because the variable $this->theme_selected is not set for that case.
2013-10-22 17:00:56 +02:00
Gregory Roussac
bc7e8eb355 Merge pull request #867 from PhpMadman/patch-4
[-] FO: Removed missplaced </li> on mobile theme
2013-10-22 07:50:21 -07:00
Fabio Chelly
bc38b542fe Merge remote-tracking branch 'origin/development' into development 2013-10-22 15:53:43 +02:00
Fabio Chelly
2989538ce1 [*] BO Module mailalerts: send e-mail to merchand when product is out of stock 2013-10-22 15:53:20 +02:00
PhpMadman
e857fb5978 [*] FO: Removed missplaced </li> on mobile theme 2013-10-22 13:34:52 +02:00
gRoussac
1ae587475b [-] MO : Fix bug #PSCFV-10787, cms associated to all shops 2013-10-22 12:19:58 +02:00
gRoussac
d20aea0563 [-] BO : Fix bug #PSCFV-10767, could not retrieve feature value when product IDs not forced 2013-10-22 11:27:45 +02:00
Gaelle ITZKOVITZ
ce8d01ad4c [-] MO : if customer is logged we do not recreate it 2013-10-22 11:09:53 +02:00
gRoussac
2aa52356ad [-] BO : Fix bug #PSCFV-10607 one upload name 2013-10-22 09:39:59 +02:00
gRoussac
c1ecf43be8 [-] MO : Fix bug #PSCFV-10775, could not upload .jpeg in TinyMCE 2013-10-21 17:39:20 +02:00
gRoussac
16ffbd8ee5 // norms 2013-10-21 16:46:22 +02:00
gRoussac
61884ec223 // norms 2013-10-21 16:31:56 +02:00
gRoussac
a05c748e81 // addJqueryPlugin receives array in first argument 2013-10-21 15:05:03 +02:00
gRoussac
a9e45fccf3 [-] MO : ScrollTo not loaded 2013-10-21 14:35:23 +02:00
gRoussac
d25b41ef97 [-] BO : wrong csv files name 2013-10-21 14:34:59 +02:00
Samy Rabih
5d8c0a0fc2 duplicateFeatures doesn't protect feature values
The features values are not protected using pSQL during the features
duplication
2013-10-21 14:08:30 +02:00
gRoussac
15cd0b9fbc [-] BO : Report of fd86a29c5c 2013-10-21 12:21:49 +02:00
Gregory Roussac
3dea171047 Merge pull request #862 from PhpMadman/patch-3
[-] PDF : Removed unused code in FrontOffice PDF Invoice
2013-10-21 01:15:39 -07:00
PhpMadman
35df3f463c Removed unsed code
I looked through the code. And I can't see that that code is used. everything is handled in PDF class.
2013-10-21 10:10:28 +02:00
Rémi Gaillard
198e75245d [-] FO: Don't auto detect language if it not associated to the shop #PSCFV-10273 2013-10-21 09:41:00 +02:00
Gregory Roussac
8ef22c3548 Merge pull request #823 from kpodemski/patch-8
[*] IN: Add phone_mobile to address format
2013-10-20 16:40:16 -07:00
gRoussac
9b8a7edad8 // small refacto 2013-10-21 01:05:18 +02:00
gRoussac
332c8ff49f [-] CORE : Fix bug #PSCFV-10687 again, #PSCFV-10752 replaceAccentedChars() // sorry for that 2013-10-21 00:28:41 +02:00
gRoussac
c9d20f35b3 // norms 2013-10-21 00:00:17 +02:00
gRoussac
f2d70076bd [-] : Fix bug #PSCFV-4859, could not register invoice address or invoice country in OPC as guest, and phone not required in standard registration 2013-10-20 23:52:48 +02:00
Gregory Roussac
c36625a136 Merge pull request #851 from PrestanceDesign/patch-1
[*] BO : Adding a title tag to display the module name on hover like PS ...
2013-10-18 09:42:57 -07:00
gRoussac
5daa79c1e1 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-10-18 18:36:51 +02:00
gRoussac
8ef1e043af [*] BO : chmod 664 to config.xml file 2013-10-18 18:36:30 +02:00
PrestanceDesign
6965bb29c1 [*] BO : Adding a title tag to display the module name on hover like PS 1.4 2013-10-18 18:20:15 +02:00
Fabio Chelly
72ccc90cc9 Merge remote-tracking branch 'origin/development' into development 2013-10-18 17:49:14 +02:00
Fabio Chelly
7133e74c17 [-] MO mailalerts: module mailalerts shows all messages regarding the order
PNM-1632 - MailAlert does not show Paypal error message if order has comments
2013-10-18 17:49:00 +02:00
gRoussac
2e2151a1bb [-] CORE : error_get_last > PHP 5.1 2013-10-18 15:29:12 +02:00
Rémi Gaillard
8a682081de // typo 2013-10-18 12:17:51 +02:00
Rémi Gaillard
6747d3bbac [-] BO: Default country should be overriden in the context in multishop 2013-10-18 10:23:06 +02:00
Rémi Gaillard
b8273a13e6 // 2013-10-17 18:30:22 +02:00
gRoussac
3a38af9982 [-] FO : Could not redirect back to url in adress.php 2013-10-17 14:16:54 +02:00
gRoussac
6b1d69dd7d [-] FO : $back value twice escaped 2013-10-17 12:18:23 +02:00
Rémi Gaillard
eb14e25e2a // small fix for some order by on listing 2013-10-17 11:33:05 +02:00
gRoussac
f1ea9ba5b4 [-] BO : Fix bug #PSCFV-10709 rename root category with slashes in it 2013-10-17 10:53:20 +02:00
Rémi Gaillard
e4faa2bb75 [-] Core: Out of stock status should be setted after the first order history 2013-10-17 10:28:14 +02:00
gRoussac
3ba5905042 [-] BO : Could not order by reserved words like 'key' 2013-10-16 16:25:40 +02:00
Rémi Gaillard
22fd1b84c4 Merge pull request #847 from MustangZhong/patch-1
[-] WS: Missing field on Cart::getWsCartRows()
2013-10-16 00:58:16 -07:00
MustangZhong
ad27dbe8d1 Update Cart.php
The field "id_address_delivery" is missing in getWsCartRows.
Since id_address_delivery is required in the web service field definition.
2013-10-16 10:14:14 +08:00
Rémi Gaillard
6ee538c710 // fix on ps_cleaner 2013-10-15 19:53:59 +02:00
gRoussac
237b950eb6 [-] FO : #PSCFV-10640 again, bad assignement 2013-10-15 16:35:58 +02:00
gRoussac
7ae9832992 // small cast 2013-10-15 14:56:25 +02:00
gRoussac
81497be5ab [-] Fo : Fix bug #PSCFV-10640, redirect loop when country address is not among active countries in OPC 2013-10-15 14:53:44 +02:00
Rémi Gaillard
837ca34e7e [-] Core: Product::getPriceStatic called with 1 quantity return the specific price for 1 qty if called with id_cart = 0 2013-10-15 10:30:48 +02:00
gRoussac
9c861642a5 [-] BO : AdminImport, wrong default separators 2013-10-15 10:09:16 +02:00
Gregory Roussac
dec9ef40a8 Merge pull request #841 from indesign47/patch-10
[+] BO : AdminImport add entity Alias
2013-10-15 01:03:33 -07:00
djfm
b4e18954f9 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-10-15 07:22:03 +00:00
Francois Gaillard
fd2dc4ff64 [-] Classes : Modules listing and case insensitive 2013-10-15 09:14:49 +02:00
indesign47
f25a418785 Update Alias.php 2013-10-14 19:20:38 +02:00
Rémi Gaillard
6f4b85430c // Fix listings and sort 2013-10-14 18:52:48 +02:00
Gregory Roussac
2a28e47650 Merge pull request #799 from Lupul/development
[-] BO : Fixed Bug what displayed Dashboard sales statistics in wrong currency
2013-10-14 08:37:28 -07:00
Gregory Roussac
f3755e2d0a Merge pull request #843 from ldecoker/patch-10
[-] BO : AdminMeta - make sure module and controller name are in lowercase
2013-10-14 07:46:56 -07:00
Gregory Roussac
bce6e8f09f Merge pull request #837 from axometeam/patch-21
[-] BO : bad query when filtering on status + sorting by quantity in the AdminProducts getList
2013-10-14 07:45:52 -07:00
gRoussac
cc8ec4fd45 [-] CORE : Fix bug #PSCFV-10687 bad conversion for accentuated Y and W, thanks @mike15 2013-10-14 16:03:50 +02:00
gRoussac
80f6f4e223 [-] FO : Fix bug #PSCFV-10688, bad priceDisplay in order-carrier 2013-10-14 15:34:47 +02:00
gRoussac
50002ec714 [-] FO : Fix #PSCFV-10690 again, change just on directories 2013-10-14 14:23:26 +02:00
gRoussac
c6e3e28894 [-] FO : Fix bug #PSCFV-10690 could not index a category beacause of robot.txt 2013-10-14 14:20:11 +02:00
gRoussac
f8edca8ac8 [-] IN : Fix bug #PSCFV-10539 duplicate "address" url rewrite in meta.xml for Russian 2013-10-14 13:59:19 +02:00
gRoussac
2a54296b96 [-] BO : Fix bug #PSCFV-10692, AdminImport bad utf8 cars for subst 2013-10-14 12:11:47 +02:00
gRoussac
1adfa1584c Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-10-14 11:37:51 +02:00
gRoussac
1358c696cd [-] BO : Fix #PSCFV-10678 warning in chrome 2013-10-14 11:37:15 +02:00
djfm
5e407db21e [*] LO : Fixed a few bugs with currency formats in Back-Office orders 2013-10-14 09:30:45 +00:00
Jerome Nadaud
3282bd19e4 // Small fix 2013-10-14 10:59:20 +02:00
Rémi Gaillard
3bc02bbe10 // fields are already correctly formated when they are in a object coming from the database 2013-10-14 10:56:38 +02:00
gRoussac
af9182dad5 [-] CORE , follow up b87e934a66 and a10dcab6e7 2013-10-14 10:51:17 +02:00
Gregory Roussac
3539eb3697 Merge pull request #842 from kiropowered/patch-1
[-] CORE : StockMvt Fix bug if product have attribute
2013-10-14 01:30:30 -07:00
ldecoker
a377ecd571 Update Meta.php
Use strtolower from Tools class.
2013-10-14 09:53:50 +02:00
ldecoker
8d7e96176c SEO - make sure module and controller name are in lowercase
For module controller, make sure that the name of the controller and the module are saved in lowercase. Otherwise the route will not be found in getModuleLink.
2013-10-14 09:38:04 +02:00
gRoussac
f9cfde9a05 [-] MO : Trackingfront, could not load employee stats date 2013-10-12 23:24:32 +02:00
gRoussac
ee29f4365e [-] FO : Copuld not load datepicker in trackingfront stats.php 2013-10-12 17:54:26 +02:00
kiropowered
a10dcab6e7 Update StockMvt.php
Fix bug if product have attribute
2013-10-12 14:28:27 +02:00
indesign47
0a441b9a4b Update Alias.php 2013-10-12 11:49:27 +02:00
indesign47
4f9191fe0c Update form.tpl 2013-10-12 11:45:07 +02:00
indesign47
2afbe8fd04 Create alias_import.csv 2013-10-12 11:39:29 +02:00
indesign47
85c6e799c3 [+] BO : AdminImport add entity Alias 2013-10-12 11:33:36 +02:00
Gregory Roussac
418155cf2b Merge pull request #838 from pelTek/patch-1
BO: added UPC and EAN search
2013-10-11 11:52:22 -07:00
Chris
3f6139be42 BO: added UPC and EAN search 2013-10-11 21:02:01 +03:00
Axome
9d5a9225e5 Correct some "bad query" in the admin products getList
Here the wrong Sql generated :

SELECT SQL_CALC_FOUND_ROWS a.`id_product`,b.name as name,`reference`,a.price as price,a.active as active , MAX(i.id_image) id_image,cl.name `name_category` , a.`price`, 0 AS price_final, sav.`quantity` as sav_quantity, a.`active` FROM `ps_product` a LEFT JOIN `ps_product_lang` b ON (b.`id_product` = a.`id_product` AND b.`id_lang` = 2 AND b.`id_shop` = 1) LEFT JOIN `ps_image` i ON (i.`id_product` = a.`id_product` AND i.cover=1)LEFT JOIN `ps_category_lang` cl ON (a.`id_category_default` = cl.`id_category` AND b.`id_lang` = cl.`id_lang` AND cl.id_shop = 1) LEFT JOIN `ps_stock_available` sav ON (sav.`id_product` = a.`id_product` AND sav.`id_product_attribute` = 0 AND sav.id_shop = 1 ) WHERE 1 AND a.`active` = 0 GROUP BY a.id_product ORDER BY quantity desc LIMIT 0,50 

'quantity' is ambigus (for the ORDER BY)
2013-10-11 18:17:55 +02:00
Gregory Roussac
0dbaa59985 Merge pull request #836 from mkdgs/patch-1
[*] MO : blocktopmenu adding clear cache of AddAfter hook for Cms, Supplier, Manufaturer and Product
2013-10-11 09:05:15 -07:00
Rémi Gaillard
06c62c1684 [-] WS: Fix #PSCFV-10672 order by ID for non multishop entities 2013-10-11 17:53:15 +02:00
Jerome Nadaud
0f9c81a683 [-] BO : FixBug #PSCFV-10671 - remove htmlentities on customer message 2013-10-11 17:29:44 +02:00
gRoussac
a07733fcec [-] BO : Could not insert referrer id_connections_source can not be null 2013-10-11 16:52:53 +02:00
Mickael Desgranges
1786f8e907 Update blocktopmenu.php
Fix: block top menu is not updated when content is added in CMS

adding support of AddAfter hook for Cms, Supplier, Manufaturer and Product
2013-10-11 16:42:21 +02:00
Fabio Chelly
9fc9df6ba4 Merge remote-tracking branch 'origin/development' into development 2013-10-11 16:38:09 +02:00
Fabio Chelly
9e3b82e8ed [*] BO Module productcomments: JS variables are correctly escaped. Padding in error message has also been pushed to theme tpl 2013-10-11 16:37:26 +02:00
gRoussac
8cfe9a2065 [-] Bo : Could not update mailalert 2.5 with id_lang missing 2013-10-11 16:19:54 +02:00
gRoussac
45e9040606 [-] Bo : Could not update mailarler 2.5 with id_mlang 2013-10-11 15:51:02 +02:00
Jerome Nadaud
1a1f3de775 [-] BO: Fixbug #PSCFV-10671 - Double htmlentities. 2013-10-11 13:33:31 +02:00
Gregory Roussac
6c739ee2b3 Merge pull request #833 from djfm/development
[*] LO : set correct currency format for CHF
2013-10-11 01:58:10 -07:00
Fabio Chelly
5c66ed4791 Merge remote-tracking branch 'origin/development' into development 2013-10-11 10:51:50 +02:00
Fabio Chelly
d1a7ff50d5 [*] BO Module watermark: minimum transparency level is 1 and not 0. 2013-10-11 10:51:28 +02:00
gRoussac
7b02da5fdf // bad commit sorry 2013-10-11 10:32:30 +02:00
gRoussac
36ca7bc508 [-] BO : AdminImport, fix Group searchByName 2013-10-11 10:23:17 +02:00
fchellypresta
075a911cee Merge pull request #830 from indesign47/patch-5
[-] MO : productcomments errors translated in multi-language
2013-10-11 00:40:32 -07:00
fchellypresta
6f878353a6 Merge pull request #831 from indesign47/patch-7
[-] MO : productcomments round average up not down
2013-10-11 00:29:37 -07:00
djfm
bb96c8754f [*] LO : set correct currency format for CHF 2013-10-11 07:14:30 +00:00
gRoussac
dc1632a8b0 [-] BO : Adminimport, id_specific key_price not defined 2013-10-10 22:04:42 +02:00
Gregory Roussac
a87bbf84b4 Merge pull request #825 from indesign47/patch-4
[-] BO : AdminImport add available fields to Products
2013-10-10 10:22:43 -07:00
Damien Metzger
4505387046 // Try to fix regexp issues with some PHP configurations 2013-10-10 18:41:50 +02:00
gRoussac
286084c42d Merge branch 'master' of https://github.com/DarkHack/PrestaShop into contrib/master
Conflicts:
	controllers/admin/AdminImportController.php
2013-10-10 17:06:13 +02:00
Jerome Nadaud
789911184b [-] BO : FixBug - Remove second email in recipient 2013-10-10 15:04:32 +02:00
gRoussac
39a543188a [-] BO : Fix bug #PSCFV-10660, could not delete csv file on NT 2013-10-10 14:54:12 +02:00
Damien Metzger
9bae53a4d9 Merge pull request #828 from djfm/development
// fixed name of gender 2 in English
2013-10-10 03:08:40 -07:00
djfm
819dac6622 // fixed name of gender 2 in English 2013-10-10 09:36:05 +00:00
François Gaillard
8d1bca5542 Merge pull request #768 from enumag/patch-4
[-] Classes : Hook - Display payment method & custommer currency bug fix
2013-10-09 13:52:09 -07:00
Fabio Chelly
246340b78c [*] BO Module search: Enter key is now disabled in quick search field (field is correctly aligned) 2013-10-09 18:33:41 +02:00
Fabio Chelly
75ffa8c4f8 [*] BO Module search: Enter key is now disabled in quick search field 2013-10-09 18:30:09 +02:00
Jerome Nadaud
f6bbb6e241 // Fix duplicate invoice delivery number 2013-10-09 17:43:43 +02:00
Jerome Nadaud
68d84892c7 // remove self:: 2013-10-09 16:40:09 +02:00
Jerome Nadaud
2feb5dd8d2 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-10-09 16:31:09 +02:00
Jerome Nadaud
d0a4636966 [-] BO : FixBug #PSCFV-9957 - Duplicate order invoice number 2013-10-09 16:29:15 +02:00
Vincent Augagneur
d796d0012e [-] BO : fixed bug #PSCFV-10637 PS_CARRIER_DEFAULT is not updated after edit default carrier 2013-10-09 15:25:02 +02:00
Gregory Roussac
df4ae671a2 Merge pull request #826 from gouz/patch-4
[-] BO : Export DeliverySlip, the dates range using delivery_date but date_add
2013-10-09 06:02:52 -07:00
gRoussac
df97566018 [-] BO : AdminImport no default value for separators 2013-10-09 13:57:36 +02:00
gRoussac
338efcad7f [-] CORE : $smarty->compile_check is not set to false, thanks @prestamodule 2013-10-09 12:14:49 +02:00
Sylvain Gougouzian
7a6dea4964 [~] BO : Export DeliverySlip
The dates range wasn't using the correct sql fields.
2013-10-09 10:39:24 +02:00
gRoussac
008c6ce759 [-] FO : Fix bug #PSCFV-10497 cart_block hooked on column disappearing 2013-10-08 18:37:50 +02:00
gRoussac
85946bacbe // small cast 2013-10-08 18:35:56 +02:00
Gregory Roussac
cd8af9ae67 Merge pull request #824 from Prestaworks/patch-14
[-] BO : Fixes issue where path is not printed when error with email template saves occur.
2013-10-08 05:57:21 -07:00
Daniel
fa88a0bd93 Update AdminTranslationsController.php
Fixes issue where path is not printed when error with email template saves occur.
2013-10-08 20:54:52 +08:00
Rémi Gaillard
2899dfba5e // Fix AdminTranslationsController::addNewTabs() 2013-10-08 14:53:02 +02:00
Krystian Podemski
ae7d33effe [*] CORE: Add phone_mobile to address format
I honestly do not know why you decided by default to show only the first field of the phone :)

Users often ask me why they don't see their mobile phone on orders in BO.
2013-10-08 11:11:24 +02:00
gRoussac
e4a642128a [-] FO : Fix bug #PSCFV-10606 could not have correct taxCalculationMethod when vat number in customer address 2013-10-08 11:09:52 +02:00
Zollner Robert
30adb0932d [-] BO : pass correct typed parameter to setCurrency 2013-10-07 23:42:26 +03:00
Rémi Gaillard
7d0e9a5f06 // Fix double entities on AdminLog listing #PSCFV-10472 2013-10-07 19:37:58 +02:00
Gregory Roussac
4daaa206d2 Merge pull request #818 from cedricfontaine/patch-2
[-] MO : Price should apply tax as in configuration.
2013-10-07 09:55:35 -07:00
Gregory Roussac
644e38c05f Merge pull request #817 from cedricfontaine/patch-1
[-] MO :Loyalty voucher should be without taxes, otherwise points would be negative.
2013-10-07 09:54:22 -07:00
Francois Gaillard
77b2b4b6ca // Manual merge PS 1.5.6.0 2013-10-07 18:22:55 +02:00
cedricfontaine
d63288affd Update loyalty.php
Price should apply tax as in configuration.
2013-10-07 12:14:13 -04:00
cedricfontaine
717e195f57 Update LoyaltyModule.php
Voucher should be without taxes, otherwise points would be negative.
2013-10-07 12:07:03 -04:00
Gregory Roussac
f78a093a1c Merge pull request #815 from PrestanceDesign/development
[*] TR : Italian translation of the country instead of English
2013-10-07 08:39:39 -07:00
PrestanceDesign
f9f5a4b090 Italian translation of the country instead of English 2013-10-07 16:45:22 +02:00
Francois Gaillard
68cba08303 [-] BO : Bug fix - Modules confirmation messages 2013-10-07 12:18:44 +02:00
gRoussac
adb1779764 [-] FO : isVirtualCart was forced to false 2013-10-07 12:02:47 +02:00
Fabio Chelly
a652590885 Merge remote-tracking branch 'origin/development' into development 2013-10-07 11:34:56 +02:00
Fabio Chelly
2515d81bdd [*] BO Module search: Quick search can now search modules by name and not only display name 2013-10-07 11:34:16 +02:00
Gregory Roussac
bf65404413 Merge pull request #810 from studiokiwik/sk-ps15x-001
[-] MO : button tag on line 56 weren't closed
2013-10-07 02:29:19 -07:00
Gregory Roussac
68131dc28b Merge pull request #811 from studiokiwik/sk-ps15x-002
[-] TR : typo fixed in polish installer translation (line 85)
2013-10-07 01:59:10 -07:00
Tomasz Slominski
4254ae6edc typo fixed in polish installer translation (line 85) 2013-10-07 10:05:43 +02:00
Vincent Augagneur
3f4f298ad4 [-] CORE fixed bug #PSCFV-10595 - small fix in function addJqueryPlugin() 2013-10-07 10:01:26 +02:00
Gregory Roussac
2a475d066f Merge pull request #803 from ldecoker/patch-8
[-] BO : Missing $php_self variable in OrderDetailController.php
2013-10-07 01:00:42 -07:00
Tomasz Slominski
b941ac007b bugfix: button tag on line 56 weren't closed 2013-10-07 09:57:55 +02:00
Rémi Gaillard
3477cac1e0 Merge pull request #800 from Ha99y/20131004_retro-compat.js.php
__DIR__ is available since PHP 5.3
2013-10-07 00:35:02 -07:00
indesign47
d3d0897012 [-] MO : productcomments round average up not down
200 comments with 5 stars and only 1 with 4 stars give only 4 stars
Thanks to manit4c
2013-10-07 04:02:42 +02:00
indesign47
e0978a0b84 [-] MO : productcomments errors translated in multi-language 2013-10-07 03:18:56 +02:00
ldecoker
148348855e Update OrderDetailController.php
Missing $php_self variable
2013-10-06 16:31:54 +02:00
indesign47
b61e3e68b9 Update AdminImportController.php 2013-10-05 10:50:19 +02:00
ha99y
98aea24fc3 __DIR__ was never defined
The JS files would not lode, when in dev mode because __DIR__ was not
defined
2013-10-04 17:18:23 -07:00
Zollner Robert
1787923c4c [-] BO : Fixed Bug what displayed Dashboard sales statistics in wrong currency (changed NULL to lowercase) 2013-10-05 00:42:29 +03:00
Zollner Robert
481cb5c28a [-] BO : Fixed Bug what displayed Dashboard sales statistics in wrong currency 2013-10-04 23:30:24 +03:00
Fabio Chelly
48f20a4393 Merge remote-tracking branch 'origin/development' into development 2013-10-04 18:15:32 +02:00
Fabio Chelly
139a74e4cd [*] BO Module search: the PHP search has been replace by a quick search in JS to display results instantly 2013-10-04 18:15:12 +02:00
indesign47
805989da39 [-] BO : AdminImport add products available fields 2013-10-04 13:04:52 +02:00
Jerome Nadaud
093bf9e065 [-] MO : Blocklayered - Fix expand/collapse tree problem 2013-10-04 11:51:12 +02:00
indesign47
75cb92c329 Update AdminImportController.php 2013-10-04 11:44:52 +02:00
indesign47
96646b5c7a [-] BO : AdminImport add products available fields 2013-10-04 10:56:41 +02:00
PhpMadman
18ab409eeb [*] BO: #PNM-1472 Changed label and transparency range check to 1
Changed label to 1-100 since, there is no need to set transparency to 0, since it will pretty much will be invisible already at 1
2013-10-04 10:38:03 +02:00
Jerome Nadaud
6a0c376a18 [-] MO : Blocklayered - Fix empty fancy box after template edit 2013-10-03 18:58:09 +02:00
Gregory Roussac
cfd70bf660 Merge pull request #789 from PhpMadman/patch-2
[*] BO: wrong description on getIdOrderCarrier
2013-10-03 07:30:14 -07:00
PhpMadman
e38d808a85 [*] BO: wrong description on getIdOrderCarrier 2013-10-03 15:51:27 +02:00
Gregory Roussac
86631202df Merge pull request #788 from PhpMadman/patch-1
[*] BO: missing align on order for product warehouse
2013-10-03 06:37:58 -07:00
Fabio Chelly
d601844e82 Merge remote-tracking branch 'origin/development' into development 2013-10-03 15:32:27 +02:00
Fabio Chelly
ea57b3fdd1 [-] MO watermark: original pictures are now protected through htaccess
#PNM-109
2013-10-03 15:32:10 +02:00
PhpMadman
f979cbef57 [*] BO: missing align on order for product warehouse 2013-10-03 15:26:09 +02:00
Gregory Roussac
8762c310b9 Merge pull request #787 from tucoinfo/development
[*] FO : add variable $nofollow to mobile theme header.tpl
2013-10-03 05:02:01 -07:00
tucoinfo
8f09d49ffc [*] FO : add variable $nofollow to mobile theme header.tpl
Copied from normal theme which already manages the NoFollow variable
2013-10-03 12:19:10 +02:00
gRoussac
6610bd2067 [-] BO : Could noty save ImportMatchs 2013-10-03 11:15:03 +02:00
Jerome Nadaud
43a60f1b57 [-] BO : FixBug #PSCFV-9044 - Missing state in new order, and now you can edit customer addresses 2013-10-03 11:06:08 +02:00
Gregory Roussac
4bb4199f5a Merge pull request #783 from ellisium/upper
[-] CORE : CART::BOTH should be Cart::Both
2013-10-02 07:34:00 -07:00
Eric Le Lay
3e0c5e71f4 classname uppercase issue 2013-10-02 16:28:45 +02:00
Damien Metzger
6974a88b59 Merge pull request #782 from 202-ecommerce/development
[*] FO : Added new Maintenance Hook
2013-10-02 06:07:42 -07:00
Rémi Gaillard
f4cadbdfd6 Merge pull request #770 from urecheatu007/development
[-] LO: updated localization pack for Romania / romanian - added states
2013-10-02 05:47:17 -07:00
thoma202
1ccc25f56c Merge branch 'development' of github.com:202-ecommerce/PrestaShop into development 2013-10-02 14:38:44 +02:00
thoma202
eb7655e318 [+] Added hook in maintenance page 2013-10-02 11:58:35 +02:00
Rémi Gaillard
99f325dc3c // validation of carrierwizard 2013-10-02 11:24:08 +02:00
gRoussac
f4c2bacea3 [-] CORE : Cart rules not ordered by priority for PaymentModule 2013-10-01 16:17:23 +02:00
gRoussac
626ccf0985 [-] CORE : Partial fix bug #PSCFV-10534 bad total_products_wt calculated without other cart rules 2013-10-01 14:46:40 +02:00
Gregory Roussac
a76a7273ea Merge pull request #776 from kpodemski/patch-5
[*] FO: We let style selected category in CSS on blockcategories
2013-10-01 03:04:54 -07:00
Krystian Podemski
9e4b6c020f [*] FO: We let style selected category in CSS on blockcategories
It's good to have this by default.
2013-10-01 12:02:19 +02:00
gRoussac
f30bc80485 [-] BO : Remove duplicate sql insert in setProductOutOfStock in monoshop 2013-10-01 10:48:17 +02:00
Jerome Nadaud
340f6cebe4 [-] FO : FixBug #PSCFV-10542 - Category description view problem 2013-10-01 10:20:33 +02:00
Jerome Nadaud
452e07ab0b [-] BO : FixBug #PSCFV-10477 - Error message not shown on delete module without permissions 2013-09-30 19:26:49 +02:00
Jerome Nadaud
1b9472cc37 [-] BO : FixBug #PSCFV-10291 - Remove temporary image on install 2013-09-30 19:01:11 +02:00
Jerome Nadaud
b7ff8d634a [-] BO : FixBug #PSCFV-10317 - Attributes value not shown on features sorted by position. 2013-09-30 17:23:12 +02:00
Jerome Nadaud
f983e0eaf1 [-] BO : FixBug #PSCFV-10380 - Missing lang file existence verification. 2013-09-30 16:25:58 +02:00
Jerome Nadaud
6bb1fa6a4d // Missing '?' on regex 2013-09-30 14:59:27 +02:00
Jerome Nadaud
05eafdb14f Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-09-30 14:57:46 +02:00
Jerome Nadaud
cfc41ec4ef [+] BO : Add remove module override on constant - PSCFV-10430 2013-09-30 14:57:30 +02:00
Gregory Roussac
6822373378 Merge pull request #772 from codeurWeb/patch-5
[*] FO : add GET pre-selection of id_contact in contact-form.tpl
2013-09-30 05:56:09 -07:00
Julien
dd5cd33bb4 [-] BO : fix pre-selection of id_contact in contact-form.tpl 2013-09-30 14:38:06 +02:00
Cosmin Hutanu
7eddca6d15 update localization pack for romania - added states 2013-09-30 13:06:19 +03:00
Cosmin Hutanu
f9ad0d1b79 Merge pull request #3 from PrestaShop/development
update from prestashop/development
2013-09-30 02:47:52 -07:00
Jerome Nadaud
e040c096d1 [-] BO : Remove customers group view list link 2013-09-30 10:34:54 +02:00
Gregory Roussac
3e85622972 Merge pull request #767 from enumag/patch-3
[-] BO : Fix #PSCFV-10520 id_attribute_group can not be null
2013-09-30 00:47:12 -07:00
Jáchym Toušek
6e191fe054 [-] Classes : Hook - Display payment method & custommer currency bug fix 2013-09-29 16:24:33 +02:00
Jáchym Toušek
5ebc2e5e91 [-] BO : Fix #PSCFV-10520 2013-09-29 14:43:14 +02:00
Jerome Nadaud
c2b9ff40ef [-] BO : FixBig #PSCFV-10442 - Members Cutomer Group list 2013-09-27 19:20:46 +02:00
Gregory Roussac
40617c0a81 Merge pull request #761 from nuzelac/patch-1
[-] BO : fix multilingual field validity in AdminProductsController
2013-09-27 09:50:03 -07:00
Nino Uzelac
ca01b58262 fix multilingual field validity in AdminProductsController 2013-09-27 18:22:07 +02:00
Fabio Chelly
9d94337c9b [-] MO sendtoafriend: The method used to check all required input fields could lead to errors 2013-09-27 16:08:00 +02:00
Jerome Nadaud
6449ecfb32 [-] BO : Force invoice footer text to 1 ligne 2013-09-27 14:41:50 +02:00
Fabio Chelly
345d4cdbcf [-] MO productcomments: prevents guests to add comments when guest comment is disabled in backoffice 2013-09-27 11:27:58 +02:00
Gregory Roussac
19fb32545d Merge pull request #749 from enumag/patch-1
[-] FO : Fixed products without images
2013-09-27 00:56:46 -07:00
Jáchym Toušek
30367e6427 [-] FO : Fixed products without images 2013-09-26 22:21:18 +02:00
Cosmin Hutanu
81ec2822ec Merge pull request #2 from PrestaShop/development
update from prestashop/development
2013-09-26 05:52:17 -07:00
Rémi Gaillard
252ab56d75 // error message in double 2013-09-26 13:47:42 +02:00
Gregory Roussac
37f928ade9 Merge pull request #746 from Mainmich/patch-1
[-] MO : Blocklayered Fix pagination incompatibility
2013-09-25 09:45:51 -07:00
Mainmich
a6e67b078e Fix pagination incompatibility
Javascript function paginateButton does not work with "p" GET parameter in first position, regex only takes &p and not ?p.
2013-09-25 18:33:58 +02:00
Gregory Roussac
5245038ea1 Merge pull request #745 from djfm/localization_packs
[*] TR : Localization packs
2013-09-25 06:58:59 -07:00
djfm
91d495a4a8 [*] LO : Added states to Japanese localization pack 2013-09-25 13:31:45 +00:00
djfm
81e66233d8 [*] LO : Updated many localization packs 2013-09-25 13:11:52 +00:00
Fabio Chelly
1800c6589c Merge remote-tracking branch 'origin/development' into development 2013-09-25 14:43:42 +02:00
Fabio Chelly
bdd84771b7 [-] MO productcomments and loyalty: loyalty doesn't disconnect current user anymore 2013-09-25 14:43:30 +02:00
Gregory Roussac
931d240ca1 Merge pull request #743 from dlage/modules_update
[*] BO : Show modules update button even if module is not installed but not notices
2013-09-24 11:33:48 -07:00
81ca3ac1f9 BO: Modules - show update button even if module is not installed but don't
warn for modules with updates available but not installed.
2013-09-24 17:42:43 +01:00
Rémi Gaillard
5e7dbea970 // 2013-09-24 17:22:50 +02:00
Rémi Gaillard
beb0a74135 // use ObjectModel::validateField on validaterules 2013-09-24 17:12:28 +02:00
gRoussac
3d477c62eb // remove notice 2013-09-24 16:03:39 +02:00
Gregory Roussac
4c399875d9 Merge pull request #737 from codeurWeb/patch-3
[-] BO : fix postProcess override on AdminImportController
2013-09-24 01:54:18 -07:00
Gregory Roussac
92b987c0f8 Merge pull request #736 from codeurWeb/patch-2
[-] BO : fix ovverride of constructor when PS_ADVANCED_STOCK_MANAGEMENT is off
2013-09-24 01:40:16 -07:00
Julien
6acebca8fa [-] BO : fix postProcess override on AdminImportController
When we override the constucteur of AdminImport to add an import type and PS_ADVANCED_STOCK_MANAGEMENT is off, switch index is undefined for "Supply Orders" and "Supply Order Details".
Default case of switch is never used.
2013-09-23 21:04:55 +02:00
Julien
6850db0612 [-] BO : fix contructor override on AdminImportController
When we overload the constucteur of AdminImport to add an import type and PS_ADVANCED_STOCK_MANAGEMENT is off, switch index is undefined for "Supply Orders" and "Supply Order Details".
2013-09-23 20:23:45 +02:00
Damien Metzger
6796b64e18 Merge pull request #691 from djfm/development
// fixed translation of modules descriptions containing quotes
2013-09-23 07:51:57 -07:00
djfm
0a9f425281 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-09-18 16:08:44 +00:00
djfm
65559c5cf4 // small improvement to Brazilian translations 2013-09-18 16:08:23 +00:00
djfm
641cf225f2 // fix small translation bug PSCFV-10329 2013-09-09 09:47:44 +00:00
djfm
6ea3783013 Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development 2013-09-09 09:46:49 +00:00
Cosmin Hutanu
7491f46322 Merge pull request #1 from PrestaShop/development
update from prestashop/development
2013-09-06 12:42:22 -07:00
djfm
87567ed1a0 // fixed translation of modules descriptions containing quotes 2013-09-04 07:44:52 +00:00
308 changed files with 5169 additions and 2892 deletions

View File

@@ -22,26 +22,18 @@
$upload->setInvalidFileExt(explode(",", CONFIG_UPLOAD_INVALID_EXTS));
if(CONFIG_SYS_VIEW_ONLY || !CONFIG_OPTIONS_UPLOAD)
{
$error = SYS_DISABLED;
}
elseif(empty($_GET['folder']) || !isUnderRoot($_GET['folder']))
{
$error = ERR_FOLDER_PATH_NOT_ALLOWED;
}else if(!$upload->isFileUploaded('file'))
{
elseif (!$upload->isFileUploaded('file'))
$error = ERR_FILE_NOT_UPLOADED;
}else if(!$upload->moveUploadedFile($_GET['folder']))
{
$error = ERR_FILE_MOVE_FAILED;
}
elseif(!$upload->isPermittedFileExt(explode(",", CONFIG_UPLOAD_VALID_EXTS)))
{
elseif (!$upload->isPermittedFileExt(explode(",", CONFIG_UPLOAD_VALID_EXTS)))
$error = ERR_FILE_TYPE_NOT_ALLOWED;
}elseif(defined('CONFIG_UPLOAD_MAXSIZE') && CONFIG_UPLOAD_MAXSIZE && $upload->isSizeTooBig(CONFIG_UPLOAD_MAXSIZE))
{
elseif (defined('CONFIG_UPLOAD_MAXSIZE') && CONFIG_UPLOAD_MAXSIZE && $upload->isSizeTooBig(CONFIG_UPLOAD_MAXSIZE))
$error = sprintf(ERROR_FILE_TOO_BID, transformFileSize(CONFIG_UPLOAD_MAXSIZE));
}else
elseif (!$upload->moveUploadedFile($_GET['folder']))
$error = ERR_FILE_MOVE_FAILED;
else
{
include_once(CLASS_FILE);
$path = $upload->getFilePath();

View File

@@ -24,7 +24,8 @@
if(!empty($_GET['search']))
{
include_once(CLASS_SEARCH);
if (!preg_match('/^'.Tools::pRegexp(realpath(dirname(__FILE__).'/'.$_GET['search_folder']), '/').'/i', _PS_ROOT_DIR_.'/img/cms'))
exit;
$search = new Search($_GET['search_folder']);
$search->addSearchKeyword('recursive', @$_GET['search_recursively']);
$search->addSearchKeyword('mtime_from', @$_GET['search_mtime_from']);

View File

@@ -78,9 +78,9 @@
define('CONFIG_EDITABLE_VALID_EXTS', 'txt,htm,html,xml,js,css'); //make you include all these extension in CONFIG_UPLOAD_VALID_EXTS if you want all valid
define('CONFIG_OVERWRITTEN', false); //overwirte when processing paste
define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png');// //
define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,jpeg,png');// //
//define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png,bmp,tif,zip,sit,rar,gz,tar,htm,html,mov,mpg,avi,asf,mpeg,wmv,aif,aiff,wav,mp3,swf,ppt,rtf,doc,pdf,xls,txt,xml,xsl,dtd');//
define("CONFIG_VIEWABLE_VALID_EXTS", 'gif,jpg,png');
define("CONFIG_VIEWABLE_VALID_EXTS", 'gif,jpg,jpeg,jpeg,png');
//define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png,txt'); //
define('CONFIG_UPLOAD_INVALID_EXTS', '');

View File

@@ -10,6 +10,9 @@
//FILESYSTEM CONFIG <br>
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "class.auth.php");
if (_PS_MODE_DEMO_)
die('This functionality has been disabled.');
define('CONFIG_QUERY_STRING_ENABLE', true); //Enable passed query string to setting the system configuration
if(!isset($_SESSION))
{

View File

@@ -73,9 +73,9 @@
define('CONFIG_EDITABLE_VALID_EXTS', 'txt,htm,html,xml,js,css'); //make you include all these extension in CONFIG_UPLOAD_VALID_EXTS if you want all valid
define('CONFIG_OVERWRITTEN', false); //overwirte when processing paste
define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png,txt'); //
define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,jpeg,png,txt'); //
//define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png,bmp,tif,zip,sit,rar,gz,tar,htm,html,mov,mpg,avi,asf,mpeg,wmv,aif,aiff,wav,mp3,swf,ppt,rtf,doc,pdf,xls,txt,xml,xsl,dtd');//
define("CONFIG_VIEWABLE_VALID_EXTS", 'gif,bmp,txt,jpg,png,tif,html,htm,js,css,xml,xsl,dtd,mp3,wav,wmv,wma,rm,rmvb,mov,swf');
define("CONFIG_VIEWABLE_VALID_EXTS", 'gif,bmp,txt,jpg,jpeg,png,tif,html,htm,js,css,xml,xsl,dtd,mp3,wav,wmv,wma,rm,rmvb,mov,swf');
//define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png,txt'); //
define('CONFIG_UPLOAD_INVALID_EXTS', '');

View File

@@ -34,7 +34,7 @@
.toolbarBox .process-icon-new-module { background-image: url('../img/process-icon-new-module.png')}
.toolbarBox .process-icon-new-module-addon { background-image: url('../img/process-icon-new-module-addon.png')}
div.fix-toolbar {border-bottom: 1px solid #E0E0E0;position:fixed;top:0;opacity:0.9;z-index:1}
div.fix-toolbar {border-bottom: 1px solid #E0E0E0;position:fixed;top:0;opacity:0.9;z-index:11}
/*FILTER MODULE*/

View File

@@ -40,7 +40,7 @@
</td>
{foreach from=$ranges key=r item=range}
<td class="center">
<input name="fees[{$zone.id_zone|intval}][{$range.id_range|intval}]" type="text"
<input name="fees[{$zone.id_zone|intval}][{$range.id_range|intval}]" type="text"
{if !isset($fields_value['zones'][$zone.id_zone]) || (isset($fields_value['zones'][$zone.id_zone]) && !$fields_value['zones'][$zone.id_zone])} disabled="disabled"{/if} {if isset($price_by_range[$range.id_range][$zone.id_zone]) && $price_by_range[$range.id_range][$zone.id_zone] && isset($fields_value['zones'][$zone.id_zone]) && $fields_value['zones'][$zone.id_zone]} value="{$price_by_range[$range.id_range][$zone.id_zone]|string_format:'%.6f'}" {else} value="" {/if} /> &nbsp; {$currency_sign}
</td>
{/foreach}
@@ -53,7 +53,7 @@
{if $smarty.foreach.ranges.first}
<td class="center">&nbsp;</td>
{else}
<td class="center"><button class="button">{l s='Delete'}</button</td>
<td class="center"><button class="button">{l s='Delete'}</button></td>
{/if}
{/foreach}
</tr>

View File

@@ -50,7 +50,7 @@
<h2><img src="../img/admin/cart.gif" /> {l s='Order information'}</h2>
<span>
{if $order->id}
<a href="{$link->getAdminLink('AdminOrders')|escape:'htmlall':'UTF-8'}&id_order={$order->id}&vieworder"> {l s='Order #%d' sprintf=$order->id|string_format:"%06d"}</a></span>
<a href="{$link->getAdminLink('AdminOrders')|escape:'htmlall':'UTF-8'}&id_order={$order->id}&vieworder"> {l s='Order #%s' sprintf=$order->reference}</a></span>
<br /><br />
{l s='Made on:'} {dateFormat date=$order->date_add}<br /><br /><br /><br />
{else}
@@ -187,4 +187,4 @@
<div class="clear" style="height:20px;">&nbsp;</div>
{/block}
</div>
</div>

View File

@@ -57,14 +57,14 @@
<dl>
<dt>{l s='Sent on:'}</dt>
<dd>{$message.date_add}</dd>
<dd>{$message.date_add}&nbsp;</dd>
</dl>
{if empty($message.id_employee)}
<dl>
<dt>{l s='Browser:'}</dt>
<dd>{$message.user_agent}</dd>
<dd>{$message.user_agent}&nbsp;</dd>
</dl>
{/if}
@@ -79,34 +79,35 @@
</dl>
{/if}
{if !empty($message.id_order) && empty($message.id_employee)}
{if !empty($message.id_order) && $is_valid_order_id && empty($message.id_employee)}
<dl>
<dt>{l s='Order #'}</dt>
<dd><a href="index.php?tab=AdminOrders&id_order={$message.id_order}&vieworder&token={getAdminToken tab='AdminOrders'}" title="{l s='View order'}">
{$message.id_order} <img src="../img/admin/search.gif" alt="{l s='View'}" />
</a></dd>
<dd><a href="index.php?tab=AdminOrders&id_order={$message.id_order}&vieworder&token={getAdminToken tab='AdminOrders'}" title="{l s='View order'}">{$message.id_order} <img src="../img/admin/search.gif" alt="{l s='View'}" /></a>
</dd>
</dl>
{/if}
{if !empty($message.id_product) && empty($message.id_employee)}
<dl>
<dt>{l s='Product #'}</dt>
<dd><a href="index.php?tab=AdminProducts&id_product={$message.id_product}&updateproduct&token={getAdminToken tab='AdminProducts'}" title="{l s='View order'}">
{$message.id_product} <img src="../img/admin/search.gif" alt="{l s='View'}" />
</a></dd>
<dd><a href="index.php?tab=AdminProducts&id_product={$message.id_product}&updateproduct&token={getAdminToken tab='AdminProducts'}" title="{l s='View order'}">{$message.id_product} <img src="../img/admin/search.gif" alt="{l s='View'}" /></a></dd>
</dl>
{/if}
<form action="{$current}&token={$token}&id_customer_thread={$message.id_customer_thread}&viewcustomer_thread" method="post">
<b>{l s='Subject:'}</b>
<input type="hidden" name="id_customer_message" value="{$message.id_customer_message}" />
<select name="id_contact" onchange="this.form.submit();">
{foreach $contacts as $contact}
<option value="{$contact.id_contact}" {if $contact.id_contact == $message.id_contact}selected="selected"{/if}>
{$contact.name}
</option>
{/foreach}
</select>
<dl>
<dt>{l s='Subject:'}</dt>
<dd>
<select name="id_contact" onchange="this.form.submit();">
{foreach $contacts as $contact}
<option value="{$contact.id_contact}" {if $contact.id_contact == $message.id_contact}selected="selected"{/if}>
{$contact.name}
</option>
{/foreach}
</select>
</dd>
</dl>
</form>

View File

@@ -35,7 +35,7 @@
$.ajax({
type: "POST",
url: "index.php",
data: "token={getAdminToken tab='AdminCustomers'}&tab=AdminCustomers&ajax=1&action=updateCustomerNote&id_customer={$customer->id}&note="+noteContent,
data: "token={getAdminToken tab='AdminCustomers'}&tab=AdminCustomers&ajax=1&action=updateCustomerNote&id_customer={$customer->id}&note="+encodeURIComponent(noteContent),
async : true,
success: function(r) {
$('#note_feedback').html('').hide();

View File

@@ -138,7 +138,7 @@
}
else
{
$('#group_discount_category_table').append('<tr class="alt_row" id="'+jsonData.id_category+'"><td>'+jsonData.catPath+'</td><td>{l s='Discount:'}'+jsonData.discount+'{l s='%'}</td><td><a href="#" onclick="deleteCategoryReduction('+jsonData.id_category+');"><img src="../img/admin/delete.gif"></a></td></tr>');
$('#group_discount_category_table').append('<tr class="alt_row" id="'+jsonData.id_category+'"><td>'+jsonData.catPath+'</td><td>{l s='Discount:'}' + ' ' + jsonData.discount+'{l s='%'}</td><td><a href="#" onclick="deleteCategoryReduction('+jsonData.id_category+');"><img src="../img/admin/delete.gif"></a></td></tr>');
var input_hidden = document.createElement("input");
input_hidden.setAttribute('type', 'hidden');
@@ -168,7 +168,7 @@
{foreach $input['values'] key=key item=category }
<tr class="alt_row" id="{$category.id_category}">
<td>{$category.path}</td>
<td>{l s='Discount: %d%%' sprintf=$category.reduction}</td>
<td>{l s='Discount: %.2f%%' sprintf=$category.reduction}</td>
<td>
<a href="#" onclick="deleteCategoryReduction({$category.id_category});"><img src="../img/admin/delete.gif"></a>
<input type="hidden" class="category_reduction" name="category_reduction[{$category.id_category}]" value="{$category.reduction}">

View File

@@ -30,7 +30,7 @@
<fieldset>
<ul>
<li><span style="font-weight: bold; font-size: 13px; color:#000;">{l s='Name:'}</span> {$group->name[$language->id]}</li>
<li><span style="font-weight: bold; font-size: 13px; color:#000;">{l s='Discount: %d%%' sprintf=$group->reduction}</span></li>
<li><span style="font-weight: bold; font-size: 13px; color:#000;">{l s='Discount: %.2f%%' sprintf=$group->reduction}</span></li>
<li><span style="font-weight: bold; font-size: 13px; color:#000;">{l s='Current category discount:'}</span>
{if !$categorieReductions}
{l s='None'}
@@ -39,7 +39,7 @@
{foreach $categorieReductions key=key item=category }
<tr class="alt_row">
<td>{$category.path}</td>
<td>{l s='Discount: %d%%' sprintf=$category.reduction}</td>
<td>{l s='Discount: %.2f%%' sprintf=$category.reduction}</td>
</tr>
{/foreach}
</table>

View File

@@ -26,7 +26,7 @@
<div class="leadin">{block name="leadin"}{/block}</div>
{if $module_confirmation}
<div class="module_confirmation conf confirm">
{l s='Your .CSV file has been sucessfully imported into your shop.'}
{l s='Your .CSV file has been sucessfully imported into your shop. Don\'t forget to Re-build the products search index.'}
</div>
{/if}
<div style="display: none">
@@ -77,6 +77,7 @@
<li><a class="_blank" href="../docs/csv_import/addresses_import.csv">{l s='Sample Addresses file'}</a></li>
<li><a class="_blank" href="../docs/csv_import/manufacturers_import.csv">{l s='Sample Manufacturers file'}</a></li>
<li><a class="_blank" href="../docs/csv_import/suppliers_import.csv">{l s='Sample Suppliers file'}</a></li>
<li><a class="_blank" href="../docs/csv_import/alias_import.csv">{l s='Sample Alias file'}</a></li>
{if $PS_ADVANCED_STOCK_MANAGEMENT}
<li><a class="_blank" href="../docs/csv_import/supply_orders_import.csv">{l s='Supply Orders sample file'}</a></li>
<li><a class="_blank" href="../docs/csv_import/supply_orders_details_import.csv">{l s='Supply Orders Details sample file'}</a></li>
@@ -203,30 +204,35 @@
});
$("select#entity").change(function(){
if ($("#entity > option:selected").val() == 7 || $("#entity > option:selected").val() == 8)
if ($("#entity > option:selected").val() == 8 || $("#entity > option:selected").val() == 9)
$("label[for=truncate],#truncate").hide();
else
$("label[for=truncate],#truncate").show();
if ($("#entity > option:selected").val() == 8)
{
if ($("#entity > option:selected").val() == 9)
$(".import_supply_orders_details").show();
$('input[name=multiple_value_separator]').val('|');
}
else
{
$(".import_supply_orders_details").hide();
$('input[name=multiple_value_separator]').val('{if isset($multiple_value_separator_selected)}{$multiple_value_separator_selected}{else},{/if}');
}
if ($("#entity > option:selected").val() == 1)
$("label[for=match_ref], #match_ref, label[for=regenerate], #regenerate").show();
$("label[for=match_ref], #match_ref").show();
else
$("label[for=match_ref], #match_ref, label[for=regenerate], #regenerate").hide();
$("label[for=match_ref], #match_ref").hide();
if ($("#entity > option:selected").val() == 1 || $("#entity > option:selected").val() == 0)
$(".import_products_categories, label[for=regenerate], #regenerate").show();
$(".import_products_categories").show();
else
$(".import_products_categories, label[for=regenerate], #regenerate").hide();
if ($("#entity > option:selected").val() == 0 || $("#entity > option:selected").val() == 1 || $("#entity > option:selected").val() == 3 || $("#entity > option:selected").val() == 5 || $("#entity > option:selected").val() == 6)
$(".import_products_categories").hide();
if ($("#entity > option:selected").val() == 0 || $("#entity > option:selected").val() == 1 ||
$("#entity > option:selected").val() == 5 || $("#entity > option:selected").val() == 6)
$("label[for=regenerate], #regenerate").show()
else
$("label[for=regenerate], #regenerate").hide();
if ($("#entity > option:selected").val() == 0 || $("#entity > option:selected").val() == 1 || $("#entity > option:selected").val() == 3 || $("#entity > option:selected").val() == 5 || $("#entity > option:selected").val() == 6 || $("#entity > option:selected").val() == 7)
$("label[for=forceIDs], #forceIDs").show();
else
$("label[for=forceIDs], #forceIDs").hide();
@@ -260,4 +266,4 @@
});
};
});
</script>
</script>

View File

@@ -59,14 +59,14 @@
<td>{$module->categoryName}</td>
<td>
<select name="i_{$module->name}" class="moduleFavorite" style="width:50px">
<option value="" selected="selected">---</option>
<option value="" selected="selected">-</option>
<option value="1" {if isset($module->preferences.interest) && $module->preferences.interest eq '1'}selected="selected"{/if}>{l s='Yes'}</option>
<option value="0" {if isset($module->preferences.interest) && $module->preferences.interest eq '0'}selected="selected"{/if}>{l s='No'}</option>
</select>
</td>
<td>
<select name="f_{$module->name}" class="moduleFavorite" style="width:50px">
<option value="" selected="selected">---</option>
<option value="" selected="selected">-</option>
<option value="1" {if isset($module->preferences.favorite) && $module->preferences.favorite eq '1'}selected="selected"{/if}>{l s='Yes'}</option>
<option value="0" {if isset($module->preferences.favorite) && $module->preferences.favorite eq '0'}selected="selected"{/if}>{l s='No'}</option>
</select>

View File

@@ -22,7 +22,7 @@
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
<script type="text/javascript" src="../js/jquery/plugins/jquery.uitablefilter.js"></script>
{if $add_permission eq '1'}
{if isset($logged_on_addons)}
<!--start addons login-->
@@ -62,10 +62,7 @@
<!--start filter module-->
<style>.ac_results { border:1px solid #C2C4D9; }</style>
<div class="filter-module">
<form id="filternameForm" method="post">
<input type="text" value="" name="filtername" autocomplete="off" class="ac_input">
<input type="submit" class="button" value="{l s='Search'}">
</form>
<input style="float: left; margin-right: 15px" placeholder="{l s='Search'}" type="text" value="" name="quicksearch" autocomplete="off" onkeyup="$.uiTableFilter($('#moduleContainer').find('table'), this.value);">
<form method="post">
<div class="select-filter">
<label class="search-filter">{l s='Sort by'}:</label>

View File

@@ -87,7 +87,7 @@
});
// Method to check / uncheck all modules checkbox
$('#checkme').click(function()
$('#moduleContainer').on("click", "#checkme", function()
{
if ($(this).attr("rel") == 'false')
{
@@ -321,8 +321,8 @@
catch(e){}
return false;
});
$('.toggle_favorite').live('click', function(event)
$('#moduleContainer').on("click", ".toggle_favorite", function()
{
var el = $(this);
var value_pref = el.data('value');

View File

@@ -46,8 +46,8 @@
</td>
<td><img class="imgm" alt="" src="{if isset($module->image)}{$module->image}{else}../modules/{$module->name}/{$module->logo}{/if}"></td>
<td>
<div class="moduleDesc" id="anchor{$module->name|ucfirst}">
<h3>{$module->displayName}
<div class="moduleDesc" id="anchor{$module->name|ucfirst}" title="{$module->name}">
<h3>{$module->displayName}<span style="display:none">{$module->name}</span>
{if isset($module->type) && $module->type == 'addonsMustHave'}
<span class="setup must-have">{l s='Must Have'}</span>
{else}

View File

@@ -34,6 +34,7 @@
<td valign="top">
<div class="moduleDesc" id="anchor{$module->name|ucfirst}">
<h3>
<span style="display:none">{$module->name}</span>
{$module->displayName|truncate:36:'…'} {$module->version}
{if isset($module->id) && $module->id gt 0 }
{if $module->active}

View File

@@ -37,7 +37,7 @@
{l s='Show'} :
<select id="show_modules" onChange="autoUrl('show_modules', '{$url_show_modules}')">
<option value="all">{l s='All modules'}&nbsp;</option>
<option>---------------</option>
<option>-</option>
{foreach $modules as $module}
<option value="{$module->id|intval}" {if $display_key == $module->id}selected="selected"{/if}>{$module->displayName}</option>

View File

@@ -26,7 +26,7 @@
{* Generate HTML code for printing Invoice Icon with link *}
<span style="width:20px; margin-right:5px;">
{if ($order_state->invoice || $order->invoice_number)}
<a target="_blank" href="{$link->getAdminLink('AdminPdf')|escape:'htmlall':'UTF-8'}&submitAction=generateInvoicePDF&id_order={$order->id}"><img src="../img/admin/tab-invoice.gif" alt="invoice" /></a>
<a href="{$link->getAdminLink('AdminPdf')|escape:'htmlall':'UTF-8'}&submitAction=generateInvoicePDF&id_order={$order->id}"><img src="../img/admin/tab-invoice.gif" alt="invoice" /></a>
{else}
-
{/if}
@@ -35,7 +35,7 @@
{* Generate HTML code for printing Delivery Icon with link *}
<span style="width:20px;">
{if ($order_state->delivery || $order->delivery_number)}
<a target="_blank" href="{$link->getAdminLink('AdminPdf')|escape:'htmlall':'UTF-8'}&submitAction=generateDeliverySlipPDF&id_order={$order->id}"><img src="../img/admin/delivery.gif" alt="delivery" /></a>
<a href="{$link->getAdminLink('AdminPdf')|escape:'htmlall':'UTF-8'}&submitAction=generateDeliverySlipPDF&id_order={$order->id}"><img src="../img/admin/delivery.gif" alt="delivery" /></a>
{else}
-
{/if}

View File

@@ -56,7 +56,7 @@
</span>
{/if}
</td>
{if $display_warehouse}<td>{$product.warehouse_name|escape:'htmlall':'UTF-8'}</td>{/if}
{if $display_warehouse}<td align="center">{$product.warehouse_name|escape:'htmlall':'UTF-8'}</td>{/if}
{if ($order->hasBeenPaid())}
<td align="center" class="productQuantity">
{$product['product_quantity_refunded']}

View File

@@ -656,11 +656,11 @@
var id_product = Number(this.id_product);
var id_product_attribute = Number(this.id_product_attribute);
cart_quantity[Number(this.id_product)+'_'+Number(this.id_product_attribute)+'_'+Number(this.id_customization)] = this.cart_quantity;
cart_content += '<tr><td><img src="'+this.image_link+'" title="'+this.name+'" /></td><td>'+this.name+'<br />'+this.attributes_small+'</td><td>'+this.reference+'</td><td><input type="text" size="7" rel="'+this.id_product+'_'+this.id_product_attribute+'" class="product_unit_price" value="' + formatCurrency(parseFloat(this.price.replace(',', '.')), currency_format, currency_sign, currency_blank) + '" /></td><td>';
cart_content += '<tr><td><img src="'+this.image_link+'" title="'+this.name+'" /></td><td>'+this.name+'<br />'+this.attributes_small+'</td><td>'+this.reference+'</td><td><input type="text" size="7" rel="'+this.id_product+'_'+this.id_product_attribute+'" class="product_unit_price" value="'+this.numeric_price+'" /></td><td>';
cart_content += (!this.id_customization ? '<div style="float:left;"><a href="#" class="increaseqty_product" rel="'+this.id_product+'_'+this.id_product_attribute+'_'+(this.id_customization ? this.id_customization : 0)+'" ><img src="../img/admin/up.gif" /></a><br /><a href="#" class="decreaseqty_product" rel="'+this.id_product+'_'+this.id_product_attribute+'_'+(this.id_customization ? this.id_customization : 0)+'"><img src="../img/admin/down.gif" /></a></div>' : '');
cart_content += (!this.id_customization ? '<div style="float:left;"><input type="text" rel="'+this.id_product+'_'+this.id_product_attribute+'_'+(this.id_customization ? this.id_customization : 0)+'" class="cart_quantity" size="2" value="'+this.cart_quantity+'" />' : '');
cart_content += (!this.id_customization ? '<a href="#" class="delete_product" rel="delete_'+this.id_product+'_'+this.id_product_attribute+'_'+(this.id_customization ? this.id_customization : 0)+'" ><img src="../img/admin/delete.gif" /></a></div>' : '');
cart_content += '</td><td>' + formatCurrency(parseFloat(this.total.replace(',', '.')), currency_format, currency_sign, currency_blank) + '</td></tr>';
cart_content += '</td><td>' + formatCurrency(this.numeric_total, currency_format, currency_sign, currency_blank) + '</td></tr>';
if (this.id_customization && this.id_customization != 0)
{
@@ -715,6 +715,16 @@
$('#payment_list').html(payment_list);
}
function fixPriceFormat(price)
{
if(price.indexOf(',') > 0 && price.indexOf('.') > 0) // if contains , and .
if(price.indexOf(',') < price.indexOf('.')) // if , is before .
price = price.replace(',',''); // remove ,
price = price.replace(' ',''); // remove any spaces
price = price.replace(',','.'); // remove , if price did not cotain both , and .
return price;
}
function displaySummary(jsonSummary)
{
currency_format = jsonSummary.currency.format;
@@ -750,13 +760,13 @@
if (!changed_shipping_price)
$('#shipping_price').html('<b>' + formatCurrency(parseFloat(jsonSummary.summary.total_shipping), currency_format, currency_sign, currency_blank) + '</b>');
shipping_price_selected_carrier = jsonSummary.summary.total_shipping;
$('#total_vouchers').html(formatCurrency(parseFloat(jsonSummary.summary.total_discounts_tax_exc.replace(',', '.')), currency_format, currency_sign, currency_blank));
$('#total_shipping').html(formatCurrency(parseFloat(jsonSummary.summary.total_shipping_tax_exc.replace(',', '.')), currency_format, currency_sign, currency_blank));
$('#total_taxes').html(formatCurrency(parseFloat(jsonSummary.summary.total_tax.replace(',', '.')), currency_format, currency_sign, currency_blank));
$('#total_without_taxes').html(formatCurrency(parseFloat(jsonSummary.summary.total_price_without_tax.replace(',', '.')), currency_format, currency_sign, currency_blank));
$('#total_with_taxes').html(formatCurrency(parseFloat(jsonSummary.summary.total_price.replace(',', '.')), currency_format, currency_sign, currency_blank));
$('#total_products').html(formatCurrency(parseFloat(jsonSummary.summary.total_products.replace(',', '.')), currency_format, currency_sign, currency_blank));
$('#total_vouchers').html(formatCurrency(parseFloat(fixPriceFormat(jsonSummary.summary.total_discounts_tax_exc)), currency_format, currency_sign, currency_blank));
$('#total_shipping').html(formatCurrency(parseFloat(fixPriceFormat(jsonSummary.summary.total_shipping_tax_exc)), currency_format, currency_sign, currency_blank));
$('#total_taxes').html(formatCurrency(parseFloat(fixPriceFormat(jsonSummary.summary.total_tax)), currency_format, currency_sign, currency_blank));
$('#total_without_taxes').html(formatCurrency(parseFloat(fixPriceFormat(jsonSummary.summary.total_price_without_tax)), currency_format, currency_sign, currency_blank));
$('#total_with_taxes').html(formatCurrency(parseFloat(fixPriceFormat(jsonSummary.summary.total_price)), currency_format, currency_sign, currency_blank));
$('#total_products').html(formatCurrency(parseFloat(fixPriceFormat(jsonSummary.summary.total_products)), currency_format, currency_sign, currency_blank));
id_currency = jsonSummary.cart.id_currency;
$('#id_currency option').removeAttr('selected');
$('#id_currency option[value="'+id_currency+'"]').attr('selected', true);
@@ -929,11 +939,33 @@
var addresses_invoice_options = '';
var address_invoice_detail = '';
var address_delivery_detail = '';
var delivery_address_edit_link = '';
var invoice_address_edit_link = '';
$.each(addresses, function() {
if (this.id_address == id_address_invoice)
address_invoice_detail = this.company+' '+this.firstname+' '+this.lastname+'<br />'+this.address1+'<br />'+this.address2+'<br />'+this.postcode+' '+this.city+' '+this.country;
{
address_invoice_detail = this.company+' '+this.firstname+' '+this.lastname+'<br />'+this.address1+'<br />'+this.address2+'<br />'+this.postcode+' '+this.city;
if (this.state != null)
address_invoice_detail += ' '+this.state;
address_invoice_detail += '</br>'+this.country;
invoice_address_edit_link = "{$link->getAdminLink('AdminAddresses')}&id_address="+this.id_address+"&updateaddress&realedit=1&liteDisplaying=1&submitFormAjax=1#";
}
if(this.id_address == id_address_delivery)
address_delivery_detail = this.company+' '+this.firstname+' '+this.lastname+'<br />'+this.address1+'<br />'+this.address2+'<br />'+this.postcode+' '+this.city+' '+this.country;
{
address_delivery_detail = this.company+' '+this.firstname+' '+this.lastname+'<br />'+this.address1+'<br />'+this.address2+'<br />'+this.postcode+' '+this.city;
if (this.state != null)
address_delivery_detail += ' '+this.state;
address_delivery_detail += '</br>'+this.country;
delivery_address_edit_link = "{$link->getAdminLink('AdminAddresses')}&id_address="+this.id_address+"&updateaddress&realedit=1&liteDisplaying=1&submitFormAjax=1#";
}
addresses_delivery_options += '<option value="'+this.id_address+'" '+(this.id_address == id_address_delivery ? 'selected="selected"' : '')+'>'+this.alias+'</option>';
addresses_invoice_options += '<option value="'+this.id_address+'" '+(this.id_address == id_address_invoice ? 'selected="selected"' : '')+'>'+this.alias+'</option>';
@@ -953,6 +985,8 @@
$('#id_address_invoice').html(addresses_invoice_options);
$('#address_delivery_detail').html(address_delivery_detail);
$('#address_invoice_detail').html(address_invoice_detail);
$('#edit_delivery_address').attr('href', delivery_address_edit_link);
$('#edit_invoice_address').attr('href', invoice_address_edit_link);
}
function updateAddresses()
@@ -1163,14 +1197,14 @@
<div id="address_delivery">
<h3>{l s='Delivery'}</h3>
<select id="id_address_delivery" name="id_address_delivery">
</select>
</select>&nbsp;<a class="fancybox" id="edit_delivery_address" href="#"><img src="../img/admin/edit.gif" /></a>
<div id="address_delivery_detail">
</div>
</div>
<div id="address_invoice">
<h3>{l s='Invoice'}</h3>
<select id="id_address_invoice" name="id_address_invoice">
</select>
</select>&nbsp;<a class="fancybox" id="edit_invoice_address" href="#"><img src="../img/admin/edit.gif" /></a>
<div id="address_invoice_detail">
</div>
</div>

View File

@@ -65,7 +65,7 @@
<div class="bloc-command">
<div class="button-command">
{if (count($invoices_collection))}
<a class="button" href="{$link->getAdminLink('AdminPdf')|escape:'htmlall':'UTF-8'}&submitAction=generateInvoicePDF&id_order={$order->id}" target="_blank">
<a class="button" href="{$link->getAdminLink('AdminPdf')|escape:'htmlall':'UTF-8'}&submitAction=generateInvoicePDF&id_order={$order->id}">
<img src="../img/admin/charged_ok.gif" alt="{l s='View invoice'}" /> {l s='View invoice'}
</a>
{else}
@@ -73,7 +73,7 @@
{/if}
|
{if (($currentState && $currentState->delivery) || $order->delivery_number)}
<a class="button" href="{$link->getAdminLink('AdminPdf')|escape:'htmlall':'UTF-8'}&submitAction=generateDeliverySlipPDF&id_order={$order->id}" target="_blank">
<a class="button" href="{$link->getAdminLink('AdminPdf')|escape:'htmlall':'UTF-8'}&submitAction=generateDeliverySlipPDF&id_order={$order->id}">
<img src="../img/admin/delivery.gif" alt="{l s='View delivery slip'}" /> {l s='View delivery slip'}
</a>
{else}
@@ -124,10 +124,10 @@
<!-- History of status -->
<table cellspacing="0" cellpadding="0" class="table history-status" style="width: 100%;">
<colgroup>
<col width="1%">
<col width="">
<col width="20%">
<col width="20%">
<col width="1%"/>
<col width=""/>
<col width="20%"/>
<col width="20%"/>
</colgroup>
{foreach from=$history item=row key=key}
{if ($key == 0)}
@@ -299,12 +299,12 @@
<form id="formAddPayment" method="post" action="{$current_index}&vieworder&id_order={$order->id}&token={$smarty.get.token|escape:'htmlall':'UTF-8'}">
<table class="table" width="100%" cellspacing="0" cellpadding="0">
<colgroup>
<col width="15%">
<col width="">
<col width="20%">
<col width="10%">
<col width="10%">
<col width="1%">
<col width="15%"/>
<col width=""/>
<col width="20%"/>
<col width="10%"/>
<col width="10%"/>
<col width="1%"/>
</colgroup>
<thead>
<tr>
@@ -751,7 +751,7 @@
<a href="{$link->getAdminLink('AdminCustomerThreads')|escape:'htmlall':'UTF-8'}"><b>{l s='Click here'}</b> {l s='to see all messages.'}</a><br>
<div id="message" style="display: {if Tools::getValue('message')}block{else}none{/if}">
<select name="order_message" id="order_message" onchange="orderOverwriteMessage(this, '{l s='Do you want to overwrite your existing message?'}')">
<option value="0" selected="selected">-- {l s='Choose a standard message'} --</option>
<option value="0" selected="selected">- {l s='Choose a standard message'} -</option>
{foreach from=$orderMessages item=orderMessage}
<option value="{$orderMessage['message']|escape:'htmlall':'UTF-8'}">{$orderMessage['name']}</option>
{/foreach}
@@ -787,8 +787,6 @@
</fieldset>
{/if}
</div>
<div class="clear">&nbsp;</div>
<br /><br /><a href="{$current_index}&token={$smarty.get.token}"><img src="../img/admin/arrow2.gif" /> {l s='Back to list'}</a><br />
{/block}
{/block}

View File

@@ -103,11 +103,11 @@
<td class="col-left"><label>{l s='Manufacturer:'}</label></td>
<td style="padding-bottom:5px;">
<select name="id_manufacturer" id="id_manufacturer">
<option value="0">-- {l s='Choose (optional)'} --</option>
<option value="0">- {l s='Choose (optional)'} -</option>
{if $product->id_manufacturer}
<option value="{$product->id_manufacturer}" selected="selected">{$product->manufacturer_name}</option>
{/if}
<option disabled="disabled">----------</option>
<option disabled="disabled">-</option>
</select>&nbsp;&nbsp;&nbsp;
<a class="button bt-icon confirm_leave" style="margin-bottom:0" href="{$link->getAdminLink('AdminManufacturers')|escape:'htmlall':'UTF-8'}&addmanufacturer">
<img src="../img/admin/add.gif" alt="{l s='Create new manufacturer'}" title="{l s='Create new manufacturer'}" />

View File

@@ -85,7 +85,7 @@
</td>
<td style="padding-bottom:5px;">
<select name="attribute" id="attribute" style="width: 200px;">
<option value="0">---</option>
<option value="0">-</option>
</select>
<script type="text/javascript">
$(document).ready(function(){
@@ -252,7 +252,7 @@
<li style="float: left; width: {$imageWidth}px;">
<input type="checkbox" name="id_image_attr[]" value="{$image.id_image}" id="id_image_attr_{$image.id_image}" />
<label for="id_image_attr_{$image.id_image}" style="float: none;">
<img src="{$smarty.const._THEME_PROD_DIR_}{$image.obj->getExistingImgPath()}-small_default.jpg" alt="{$image.legend|escape:'htmlall':'UTF-8'}" title="{$image.legend|escape:'htmlall':'UTF-8'}" />
<img src="{$smarty.const._THEME_PROD_DIR_}{$image.obj->getExistingImgPath()}-{$imageType}.jpg" alt="{$image.legend|escape:'htmlall':'UTF-8'}" title="{$image.legend|escape:'htmlall':'UTF-8'}" />
</label>
</li>
{/foreach}

View File

@@ -29,6 +29,19 @@
<h4>{if isset($id_image)}{l s='Edit this product image'}{else}{l s='Add a new image to this product'}{/if}</h4> <div class="separation"></div><br />
<table cellpadding="5" style="width:100%">
<tr>
<td class="col-left">
<label>{l s='Legend:'}</label>
</td>
<td style="padding-bottom:5px;" class="translatable">
{foreach from=$languages item=language}
<div class="lang_{$language.id_lang}" style="{if !$language.is_default}display: none;{/if} float: left;">
<input class="updateCurrentText" size="43" type="text" {if !$product->id}disabled="disabled"{/if} id="legend_{$language.id_lang}" name="legend_{$language.id_lang}" value="{$product->name[$language.id_lang]|escape:'htmlall':'UTF-8'}"/>
<span class="hint" name="help_box">{l s='Invalid characters:'} <>;=#{}<span class="hint-pointer">&nbsp;</span></span>
</div>
{/foreach}
</td>
</tr>
<tr>
<td class="col-left"><label class="file_upload_label">{l s='File:'}</label></td>
<td style="padding-bottom:5px;">
@@ -57,6 +70,7 @@
<thead>
<tr class="nodrag nodrop">
<th style="width: 100px;">{l s='Image'}</th>
<th>{l s='Legend'}</th>
<th>{l s='Position'}</th>
{if $shops}
{foreach from=$shops item=shop}
@@ -78,9 +92,10 @@
<tr id="image_id">
<td style="padding: 4px;">
<a href="{$smarty.const._THEME_PROD_DIR_}image_path.jpg" class="fancybox">
<img src="{$smarty.const._THEME_PROD_DIR_}{$iso_lang}-default-small_default.jpg" alt="image_id" title="image_id" />
<img src="{$smarty.const._THEME_PROD_DIR_}{$iso_lang}-default-{$imageType}.jpg" alt="legend" title="legend" />
</a>
</td>
<td>legend</td>
<td id="td_image_id" class="pointer dragHandle center positionImage">
image_position
</td>
@@ -101,7 +116,6 @@
</td>
</tr>
</table>
<script type="text/javascript">
var upbutton = '{l s='Upload an image'}';
var token = '{$token}';
@@ -128,7 +142,7 @@
}
else
assoc = false;
imageLine({$image->id}, "{$image->getExistingImgPath()}", {$image->position}, "{if $image->cover}enabled{else}forbbiden{/if}", assoc);
imageLine({$image->id}, "{$image->getExistingImgPath()}", {$image->position}, "{if $image->cover}enabled{else}forbbiden{/if}", assoc, "{$image->legend[$default_language]|@addcslashes:'\"'}");
{/foreach}
{literal}
$("#imageTable").tableDnD(
@@ -147,20 +161,20 @@
updateImagePosition(image_up);
}
});
var filecheck = 1;
var uploader = new qq.FileUploader(
var params = new Array;
params['id_product'] = {/literal}{$id_product|intval}{literal};
params['id_category'] = {/literal}{$id_category_default|intval}{literal};
params['token'] = "{/literal}{$token}{literal}";
params['tab'] = "AdminProducts";
params['action'] = "addImage";
params['ajax'] = 1;
uploader = new qq.FileUploader(
{
element: document.getElementById("file-uploader"),
action: "ajax-tab.php",
debug: false,
params: {
id_product : {/literal}{$id_product}{literal},
id_category : {/literal}{$id_category_default}{literal},
token : "{/literal}{$token}{literal}",
tab : "AdminProducts",
action : 'addImage',
ajax: 1
},
onComplete: function(id, fileName, responseJSON)
{
var percent = ((filecheck * 100) / nbfile);
@@ -185,7 +199,7 @@
cover = "forbbiden";
if (responseJSON.cover == "1")
cover = "enabled";
imageLine(responseJSON.id, responseJSON.path, responseJSON.position, cover, responseJSON.shops)
imageLine(responseJSON.id, responseJSON.path, responseJSON.position, cover, responseJSON.shops, responseJSON.legend[{/literal}{$default_language|intval}{literal}])
$("#imageTable tr:last").after(responseJSON.html);
$("#countImage").html(parseInt($("#countImage").html()) + 1);
$("#img" + id).remove();
@@ -198,6 +212,12 @@
},
onSubmit: function(id, filename)
{
$('input[id^="legend_"]').each(function()
{
id = $(this).prop("id").replace("legend_", "legend[") + "]";
params[id] = $(this).val();
});
uploader.setParams(params);
$("#imageTable").show();
$("#listImage").append("<li id='img"+id+"'><div class=\"float\" >" + filename + "</div></div><a style=\"margin-left:10px\"href=\"javascript:delQueue(" + id +");\"><img src=\"../img/admin/disabled.gif\" alt=\"\" border=\"0\"></a><p class=\"errorImg\"></p></li>");
}
@@ -309,13 +329,14 @@
$("#img" + id).remove();
}
function imageLine(id, path, position, cover, shops)
function imageLine(id, path, position, cover, shops, legend)
{
line = $("#lineType").html();
line = line.replace(/image_id/g, id);
line = line.replace(/[a-z]{2}-default/g, path);
line = line.replace(/[a-z]{0,2}-default/g, path);
line = line.replace(/image_path/g, path);
line = line.replace(/image_position/g, position);
line = line.replace(/legend/g, legend);
line = line.replace(/blank/g, cover);
line = line.replace(/<tbody>/gi, "");
line = line.replace(/<\/tbody>/gi, "");
@@ -330,7 +351,6 @@
$("#imageList").append(line);
}
$('.fancybox').fancybox();
});
{/literal}

View File

@@ -375,8 +375,19 @@
<td style="padding-bottom:5px;" class="translatable">
{foreach from=$languages item=language}
<div class="lang_{$language.id_lang}" style="{if !$language.is_default}display: none;{/if}float: left;">
{literal}
<script type="text/javascript">
$().ready(function () {
var input_id = '{/literal}tags_{$language.id_lang}{literal}';
$('#'+input_id).tagify({delimiters: [13,44], addTagPrompt: '{/literal}{l s='Add tag' js=1}{literal}'});
$({/literal}'#{$table}{literal}_form').submit( function() {
$(this).find('#'+input_id).val($('#'+input_id).tagify('serialize'));
});
});
</script>
{/literal}
<input size="55" type="text" id="tags_{$language.id_lang}" name="tags_{$language.id_lang}"
value="{$product->getTags($language.id_lang, true)|htmlentitiesUTF8}" />
value="{$product->getTags($language.id_lang, true)|htmlentitiesUTF8}" class="tagify" />
<span class="hint" name="help_box">{l s='Forbidden characters:'} !&lt;;&gt;;?=+#&quot;&deg;{}_$%<span class="hint-pointer">&nbsp;</span></span>
</div>
{/foreach}

View File

@@ -223,7 +223,7 @@ $(document).ready(function () {
<tr>
<td class="col-left"><label><b>{l s='Final retail price:'}</b></label></td>
<td>
<span {if !$country_display_tax_label}style="display:none"{/if} >
<span>
{$currency->prefix}<span id="finalPrice" style="font-weight: bold;">0.00</span>{$currency->suffix}<span {if $ps_tax}style="display:none;"{/if}> ({l s='tax incl.'})</span>
</span>
<span {if $ps_tax}style="display:none;"{/if} >
@@ -249,7 +249,7 @@ $(document).ready(function () {
<script type="text/javascript">
var product_prices = new Array();
{foreach from=$combinations item='combination'}
product_prices['{$combination.id_product_attribute}'] = '{$combination.price}';
product_prices['{$combination.id_product_attribute}'] = '{$combination.price|@addcslashes:'\''}';
{/foreach}
</script>
<div id="add_specific_price" style="display: none;">
@@ -375,7 +375,7 @@ $(document).ready(function () {
<div class="margin-form">
<input type="text" name="sp_reduction" value="0.00" size="11" />
<select name="sp_reduction_type">
<option selected="selected">---</option>
<option selected="selected">-</option>
<option value="amount">{l s='Amount'}</option>
<option value="percentage">{l s='Percentage'}</option>
</select>

View File

@@ -58,6 +58,7 @@
$('#file_missing').hide();
$('#virtual_product_name').attr('value', fileName);
$("#upload-confirmation .error").remove();
$('#upload-confirmation div').find('span').remove();
$('#upload-confirmation div').prepend('<span>{l s='The file'}&nbsp;"<a class="link" href="get-file-admin.php?file='+msg+'&filename='+fileName+'">'+fileName+'</a>"&nbsp;{l s='has successfully been uploaded'}' +
'<input type="hidden" id="virtual_product_filename" name="virtual_product_filename" value="' + msg + '" /></span>');
$("#upload-confirmation").show();

View File

@@ -45,7 +45,7 @@
{l s='The field `request_uri` is the URL from which the customers come to your website.'}<br />
{l s='For example, if the visitor accesses a product page, the URL will be'} "{$uri}music-ipods/1-ipod-nano.html".<br />
{l s='This is helpful because you can add tags or tokens in the links pointing to your website.'}
{l s='For example, you can post a link "%dindex.php?prestashop" in the forum and get statistics by entering "%prestashop" in the field `request_uri`. '}
{l s='For example, you can post a link "%1$sindex.php?prestashop" in the forum and get statistics by entering "%%prestashop" in the field `request_uri`. ' sprintf=[$uri]}
{l s='This method is more reliable than the `http_referer`, but there is one disadvantage. If a search engine references a page with your link, then it will be displayed in the search results and you will not only have visitors from the forum, but also those from the search engine.'}
</li>
<br />

View File

@@ -112,7 +112,7 @@
<label>{l s='Filter by product:'}</label>
<div class="margin-left">
<select id="selectProduct" name="selectProduct" style="width: 200px;" onfocus="fillProducts();" onchange="updateConversionRate(this.value);">
<option value="0" selected="selected">-- {l s='All'} --</option>
<option value="0" selected="selected">- {l s='All'} -</option>
</select>
</div>
<br class="clear" />

View File

@@ -34,54 +34,51 @@
<title>{$meta_title} - PrestaShop&trade;</title>
{if $display_header}
<script type="text/javascript">
var help_class_name = '{$controller_name}';
var iso_user = '{$iso_user}';
var country_iso_code = '{$country_iso_code}';
var _PS_VERSION_ = '{$smarty.const._PS_VERSION_}';
var helpboxes = {$help_box};
var roundMode = {$round_mode};
{if isset($shop_context)}
{if $shop_context == Shop::CONTEXT_ALL}
var youEditFieldFor = "{l s='A modification of this field will be applied for all shops' slashes=1 }";
{elseif $shop_context == Shop::CONTEXT_GROUP}
var youEditFieldFor = "{l s='A modification of this field will be applied for all shops of group ' slashes=1 }<b>{$shop_name}</b>";
{else}
var youEditFieldFor = "{l s='A modification of this field will be applied for the shop ' slashes=1 }<b>{$shop_name}</b>";
{/if}
{else}
var youEditFieldFor = '';
{/if}
{* Notifications vars *}
var autorefresh_notifications = '{$autorefresh_notifications}';
var new_order_msg = '{l s='A new order has been placed on your shop.' slashes=1}';
var order_number_msg = '{l s='Order number: ' slashes=1}';
var total_msg = '{l s='Total: ' slashes=1}';
var from_msg = '{l s='From: ' slashes=1}';
var see_order_msg = '{l s='View this order' slashes=1}';
var new_customer_msg = '{l s='A new customer registered on your shop.' slashes=1}';
var customer_name_msg = '{l s='Customer name: ' slashes=1}';
var see_customer_msg = '{l s='View this customer' slashes=1}';
var new_msg = '{l s='A new message posted on your shop.' slashes=1}';
var excerpt_msg = '{l s='Excerpt: ' slashes=1}';
var see_msg = '{l s='Read this message' slashes=1}';
var token_admin_orders = '{getAdminToken tab='AdminOrders' slashes=1}';
var token_admin_customers = '{getAdminToken tab='AdminCustomers' slashes=1}';
var token_admin_customer_threads = '{getAdminToken tab='AdminCustomerThreads' slashes=1}';
var currentIndex = '{$currentIndex}';
var choose_language_translate = "{l s='Choose language' slashes=1 }";
var help_class_name = '{$controller_name|@addcslashes:'\''}';
var iso_user = '{$iso_user|@addcslashes:'\''}';
var country_iso_code = '{$country_iso_code|@addcslashes:'\''}';
var _PS_VERSION_ = '{$smarty.const._PS_VERSION_|@addcslashes:'\''}';
var helpboxes = {$help_box|intval};
var roundMode = {$round_mode|intval};
{if isset($shop_context)}
{if $shop_context == Shop::CONTEXT_ALL}
var youEditFieldFor = '{l s='A modification of this field will be applied for all shops' js=1}';
{elseif $shop_context == Shop::CONTEXT_GROUP}
var youEditFieldFor = '{l s='A modification of this field will be applied for all shops of group' js=1} <b>{$shop_name|@addcslashes:'\''}</b>';
{else}
var youEditFieldFor = '{l s='A modification of this field will be applied for the shop' js=1} <b>{$shop_name|@addcslashes:'\''}</b>';
{/if}
{else}
var youEditFieldFor = '';
{/if}
var autorefresh_notifications = '{$autorefresh_notifications|@addcslashes:'\''}';
var new_order_msg = '{l s='A new order has been placed on your shop.' js=1}';
var order_number_msg = '{l s='Order number: ' js=1}';
var total_msg = '{l s='Total: ' js=1}';
var from_msg = '{l s='From: ' js=1}';
var see_order_msg = '{l s='View this order' js=1}';
var new_customer_msg = '{l s='A new customer registered on your shop.' js=1}';
var customer_name_msg = '{l s='Customer name: ' js=1}';
var see_customer_msg = '{l s='View this customer' js=1}';
var new_msg = '{l s='A new message posted on your shop.' js=1}';
var excerpt_msg = '{l s='Excerpt: ' js=1}';
var see_msg = '{l s='Read this message' js=1}';
var token_admin_orders = '{getAdminToken tab='AdminOrders'}';
var token_admin_customers = '{getAdminToken tab='AdminCustomers'}';
var token_admin_customer_threads = '{getAdminToken tab='AdminCustomerThreads'}';
var currentIndex = '{$currentIndex|@addcslashes:'\''}';
var choose_language_translate = '{l s='Choose language' js=1}';
</script>
{/if}
{if isset($css_files)}
{foreach from=$css_files key=css_uri item=media}
<link href="{$css_uri}" rel="stylesheet" type="text/css" media="{$media}" />
{/foreach}
{foreach from=$css_files key=css_uri item=media}
<link href="{$css_uri}" rel="stylesheet" type="text/css" media="{$media}" />
{/foreach}
{/if}
{if isset($js_files)}
{foreach from=$js_files item=js_uri}
<script type="text/javascript" src="{$js_uri}"></script>
{/foreach}
{foreach from=$js_files item=js_uri}
<script type="text/javascript" src="{$js_uri}"></script>
{/foreach}
{/if}
<link rel="icon" type="image/vnd.microsoft.icon" href="{$img_dir}favicon.ico" />
<link rel="shortcut icon" type="image/x-icon" href="{$img_dir}favicon.ico" />

View File

@@ -68,7 +68,7 @@
<script type="text/javascript">
$().ready(function () {
var input_id = '{/literal}{if isset($input.id)}{$input.id}_{$language.id_lang}{else}{$input.name}_{$language.id_lang}{/if}{literal}';
$('#'+input_id).tagify({addTagPrompt: '{/literal}{l s='Add tag' js=1}{literal}'});
$('#'+input_id).tagify({delimiters: [13,44], addTagPrompt: '{/literal}{l s='Add tag' js=1}{literal}'});
$({/literal}'#{$table}{literal}_form').submit( function() {
$(this).find('#'+input_id).val($('#'+input_id).tagify('serialize'));
});
@@ -97,8 +97,7 @@
<script type="text/javascript">
$().ready(function () {
var input_id = '{/literal}{if isset($input.id)}{$input.id}{else}{$input.name}{/if}{literal}';
$('#'+input_id).tagify();
$('#'+input_id).tagify({addTagPrompt: '{/literal}{l s='Add tag'}{literal}'});
$('#'+input_id).tagify({delimiters: [13,44], addTagPrompt: '{/literal}{l s='Add tag'}{literal}'});
$({/literal}'#{$table}{literal}_form').submit( function() {
$(this).find('#'+input_id).val($('#'+input_id).tagify('serialize'));
});
@@ -168,7 +167,7 @@
{/if}
>{$option->$input.options.name}</option>
{elseif $option == "-"}
<option value="">--</option>
<option value="">-</option>
{else}
<option value="{$option[$input.options.id]}"
{if isset($input.multiple)}
@@ -237,7 +236,7 @@
{if isset($fields_value[$input.name].image) && $fields_value[$input.name].image}
<div id="image">
{$fields_value[$input.name].image}
<p align="center">{l s='File size'} {$fields_value[$input.name].size}kb</p>
<p align="center">{l s='File size'} {$fields_value[$input.name].size}{l s='kb'}</p>
<a href="{$current}&{$identifier}={$form_id}&token={$token}&deleteImage=1">
<img src="../img/admin/delete.gif" alt="{l s='Delete'}" /> {l s='Delete'}
</a>

View File

@@ -24,11 +24,11 @@
*}
{if count($categories) && isset($categories)}
<script type="text/javascript">
var inputName = '{$categories.input_name}';
var inputName = '{$categories.input_name|@addcslashes:'\''}';
var use_radio = {if $categories.use_radio}1{else}0{/if};
var selectedCat = '{implode value=$categories.selected_cat}';
var selectedLabel = '{$categories.trads.selected}';
var home = '{$categories.trads.Root.name}';
var selectedCat = {$categories.selected_cat|@implode|intval};
var selectedLabel = '{$categories.trads.selected|@addcslashes:'\''}';
var home = '{$categories.trads.Root.name|@addcslashes:'\''}';
var use_radio = {if $categories.use_radio}1{else}0{/if};
var use_context = {if isset($categories.use_context)}1{else}0{/if};
$(document).ready(function(){

View File

@@ -49,6 +49,7 @@
{/if}
class="{if !$no_link}pointer{/if}
{if isset($params.position) && $order_by == 'position' && $order_way != 'DESC'} dragHandle{/if}
{if isset($params.class)} {$params.class}{/if}
{if isset($params.align)} {$params.align}{/if}"
{if (!isset($params.position) && !$no_link && !isset($params.remove_onclick))}
onclick="document.location = '{$current_index}&{$identifier}={$tr.$identifier}{if $view}&view{else}&update{/if}{$table}&token={$token}'">

View File

@@ -187,7 +187,7 @@
{else}
{if $params.type == 'bool'}
<select onchange="$('#submitFilterButton{$list_id}').focus();$('#submitFilterButton{$list_id}').click();" name="{$list_id}Filter_{$key}">
<option value="">--</option>
<option value="">-</option>
<option value="1" {if $params.value == 1} selected="selected" {/if}>{l s='Yes'}</option>
<option value="0" {if $params.value == 0 && $params.value != ''} selected="selected" {/if}>{l s='No'}</option>
</select>
@@ -197,7 +197,7 @@
{elseif $params.type == 'select'}
{if isset($params.filter_key)}
<select onchange="$('#submitFilterButton{$list_id}').focus();$('#submitFilterButton{$list_id}').click();" name="{$list_id}Filter_{$params.filter_key}" {if isset($params.width)} style="width:{$params.width}px"{/if}>
<option value="" {if $params.value == ''} selected="selected" {/if}>--</option>
<option value="" {if $params.value == ''} selected="selected" {/if}>-</option>
{if isset($params.list) && is_array($params.list)}
{foreach $params.list AS $option_value => $option_display}
<option value="{$option_value}" {if $option_display == $params.value || $option_value == $params.value} selected="selected"{/if}>{$option_display}</option>

View File

@@ -87,7 +87,7 @@
btn_submit.hide();
//bind enter key press to validate form
$('#{$table}_form').keypress(function (e) {
if (e.which == 13 && e.target.localName != 'textarea')
if (e.which == 13 && e.target.localName != 'textarea' && !e.target.hasClass('tagify'))
$('#desc-{$table}-save').click();
});
//submit the form

View File

@@ -264,13 +264,17 @@ class AddressCore extends ObjectModel
if(!isset($id_address) || empty($id_address))
return false;
if (!$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
SELECT c.`active`
FROM `'._DB_PREFIX_.'address` a
LEFT JOIN `'._DB_PREFIX_.'country` c ON c.`id_country` = a.`id_country`
WHERE a.`id_address` = '.(int)$id_address))
return false;
return ($result['active']);
$cache_id = 'Address::isCountryActiveById_'.(int)$id_address;
if (!Cache::isStored($cache_id))
{
$result = (bool)Db::getInstance(_PS_USE_SQL_SLAVE_)->getvalue('
SELECT c.`active`
FROM `'._DB_PREFIX_.'address` a
LEFT JOIN `'._DB_PREFIX_.'country` c ON c.`id_country` = a.`id_country`
WHERE a.`id_address` = '.(int)$id_address);
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**
@@ -324,12 +328,17 @@ class AddressCore extends ObjectModel
{
if (!$id_customer)
return false;
return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
SELECT `id_address`
FROM `'._DB_PREFIX_.'address`
WHERE `id_customer` = '.(int)$id_customer.' AND `deleted` = 0'.($active ? ' AND `active` = 1' : '')
);
$cache_id = 'Address::getFirstCustomerAddressId_'.(int)$id_customer.'-'.(bool)$active;
if (!Cache::isStored($cache_id))
{
$result = (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
SELECT `id_address`
FROM `'._DB_PREFIX_.'address`
WHERE `id_customer` = '.(int)$id_customer.' AND `deleted` = 0'.($active ? ' AND `active` = 1' : '')
);
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**
@@ -379,5 +388,4 @@ class AddressCore extends ObjectModel
$query->where('id_warehouse = 0');
return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query);
}
}
}

View File

@@ -1500,7 +1500,7 @@ abstract class AdminTabCore
case 'bool':
echo '
<select name="'.$this->table.'Filter_'.$key.'">
<option value="">--</option>
<option value="">-</option>
<option value="1"'.($value == 1 ? ' selected="selected"' : '').'>'.$this->l('Yes').'</option>
<option value="0"'.(($value == 0 && $value != '') ? ' selected="selected"' : '').'>'.$this->l('No').'</option>
</select>';
@@ -1524,7 +1524,7 @@ abstract class AdminTabCore
if (isset($params['filter_key']))
{
echo '<select onchange="$(\'#submitFilter'.$this->table.'\').focus();$(\'#submitFilter'.$this->table.'\').click();" name="'.$this->table.'Filter_'.$params['filter_key'].'" '.(isset($params['width']) ? 'style="width: '.$params['width'].'px"' : '').'>
<option value=""'.(($value == 0 && $value != '') ? ' selected="selected"' : '').'>--</option>';
<option value=""'.(($value == 0 && $value != '') ? ' selected="selected"' : '').'>-</option>';
if (isset($params['select']) && is_array($params['select']))
foreach ($params['select'] as $optionValue => $optionDisplay)
{

View File

@@ -124,5 +124,21 @@ class AliasCore extends ObjectModel
{
return Configuration::get('PS_ALIAS_FEATURE_ACTIVE');
}
/**
* This method is allow to know if a alias exist for AdminImportController
* @since 1.5.6.0
* @return bool
*/
public static function aliasExists($id_alias)
{
$row = Db::getInstance()->getRow('
SELECT `id_alias`
FROM '._DB_PREFIX_.'alias a
WHERE a.`id_alias` = '.(int)$id_alias
);
return isset($row['id_alias']);
}
}

View File

@@ -139,7 +139,7 @@ class AttributeCore extends ObjectModel
ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)$id_lang.')
'.Shop::addSqlAssociation('attribute_group', 'ag').'
'.Shop::addSqlAssociation('attribute', 'a').'
'.($not_null ? 'WHERE a.`id_attribute` IS NOT NULL AND al.`name` IS NOT NULL' : '').'
'.($not_null ? 'WHERE a.`id_attribute` IS NOT NULL AND al.`name` IS NOT NULL AND agl.`id_attribute_group` IS NOT NULL' : '').'
ORDER BY agl.`name` ASC, a.`position` ASC
');
}
@@ -343,4 +343,4 @@ class AttributeCore extends ObjectModel
return (is_numeric($position)) ? $position : -1;
}
}
}

View File

@@ -49,6 +49,8 @@ class Autoload
*/
public $index = array();
public $_include_override_path = true;
protected function __construct()
{
$this->root_dir = dirname(dirname(__FILE__)).'/';
@@ -120,33 +122,33 @@ class Autoload
{
$classes = array_merge(
$this->getClassesFromDir('classes/'),
$this->getClassesFromDir('override/classes/'),
$this->getClassesFromDir('controllers/'),
$this->getClassesFromDir('override/controllers/')
$this->getClassesFromDir('controllers/')
);
if ($this->_include_override_path)
$classes = array_merge(
$classes,
$this->getClassesFromDir('override/classes/'),
$this->getClassesFromDir('override/controllers/')
);
ksort($classes);
$content = '<?php return '.var_export($classes, true).'; ?>';
// Write classes index on disc to cache it
$filename = $this->root_dir.Autoload::INDEX_FILE;
if ((file_exists($filename) && !is_writable($filename)) || !is_writable(dirname($filename)))
$filename_tmp = tempnam(dirname($filename), basename($filename.'.'));
if ($filename_tmp !== false && file_put_contents($filename_tmp, $content, LOCK_EX) !== false)
{
header('HTTP/1.1 503 temporarily overloaded');
// Cannot use PrestaShopException in this context
die('/cache/class_index.php is not writable, please give write permissions (chmod 666) on this file.');
}
else
{
$filename_tmp = tempnam(dirname($filename), basename($filename.'.'));
if($filename_tmp !== FALSE and file_put_contents($filename_tmp, $content, LOCK_EX) !== FALSE)
{
@rename($filename_tmp, $filename);
@chmod($filename, 0666);
}
if (!rename($filename_tmp, $filename))
unlink($filename_tmp);
else
// $filename_tmp couldn't be written. $filename should be there anyway (even if outdated), no need to die.
error_log('Cannot write temporary file '.$filename_tmp);
@chmod($filename, 0666);
}
// $filename_tmp couldn't be written. $filename should be there anyway (even if outdated), no need to die.
else
error_log('Cannot write temporary file '.$filename_tmp);
$this->index = $classes;
}

View File

@@ -34,6 +34,7 @@ class CMSCore extends ObjectModel
public $link_rewrite;
public $id_cms_category;
public $position;
public $indexation;
public $active;
/**
@@ -46,6 +47,7 @@ class CMSCore extends ObjectModel
'fields' => array(
'id_cms_category' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
'position' => array('type' => self::TYPE_INT),
'indexation' => array('type' => self::TYPE_BOOL),
'active' => array('type' => self::TYPE_BOOL),
// Lang fields
@@ -188,7 +190,7 @@ class CMSCore extends ObjectModel
return (Db::getInstance()->getValue($sql));
}
public static function getCMSPages($id_lang = null, $id_cms_category = null, $active = true)
public static function getCMSPages($id_lang = null, $id_cms_category = null, $active = true, $id_shop = null)
{
$sql = new DbQuery();
$sql->select('*');
@@ -196,6 +198,9 @@ class CMSCore extends ObjectModel
if ($id_lang)
$sql->innerJoin('cms_lang', 'l', 'c.id_cms = l.id_cms AND l.id_lang = '.(int)$id_lang);
if ($id_shop)
$sql->innerJoin('cms_shop', 'cs', 'c.id_cms = cs.id_cms AND cs.id_shop = '.(int)$id_shop);
if ($active)
$sql->where('c.active = 1');

View File

@@ -277,17 +277,20 @@ class CarrierCore extends ObjectModel
public function getMaxDeliveryPriceByWeight($id_zone)
{
$sql = 'SELECT d.`price`
FROM `'._DB_PREFIX_.'delivery` d
INNER JOIN `'._DB_PREFIX_.'range_weight` w ON d.`id_range_weight` = w.`id_range_weight`
WHERE d.`id_zone` = '.(int)$id_zone.'
AND d.`id_carrier` = '.(int)$this->id.'
'.Carrier::sqlDeliveryRangeShop('range_weight').'
ORDER BY w.`delimiter2` DESC LIMIT 1';
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
if (!isset($result[0]['price']))
return false;
return $result[0]['price'];
$cache_id = 'Carrier::getMaxDeliveryPriceByWeight_'.(int)$this->id.'-'.(int)$id_zone;
if (!Cache::isStored($cache_id))
{
$sql = 'SELECT d.`price`
FROM `'._DB_PREFIX_.'delivery` d
INNER JOIN `'._DB_PREFIX_.'range_weight` w ON d.`id_range_weight` = w.`id_range_weight`
WHERE d.`id_zone` = '.(int)$id_zone.'
AND d.`id_carrier` = '.(int)$this->id.'
'.Carrier::sqlDeliveryRangeShop('range_weight').'
ORDER BY w.`delimiter2` DESC';
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**
@@ -357,17 +360,20 @@ class CarrierCore extends ObjectModel
public function getMaxDeliveryPriceByPrice($id_zone)
{
$sql = 'SELECT d.`price`
FROM `'._DB_PREFIX_.'delivery` d
INNER JOIN `'._DB_PREFIX_.'range_price` r ON d.`id_range_price` = r.`id_range_price`
WHERE d.`id_zone` = '.(int)$id_zone.'
AND d.`id_carrier` = '.(int)$this->id.'
'.Carrier::sqlDeliveryRangeShop('range_price').'
ORDER BY r.`delimiter2` DESC LIMIT 1';
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
if (!isset($result[0]['price']))
return false;
return $result[0]['price'];
$cache_id = 'Carrier::getMaxDeliveryPriceByPrice_'.(int)$this->id.'-'.(int)$id_zone;
if (!Cache::isStored($cache_id))
{
$sql = 'SELECT d.`price`
FROM `'._DB_PREFIX_.'delivery` d
INNER JOIN `'._DB_PREFIX_.'range_price` r ON d.`id_range_price` = r.`id_range_price`
WHERE d.`id_zone` = '.(int)$id_zone.'
AND d.`id_carrier` = '.(int)$this->id.'
'.Carrier::sqlDeliveryRangeShop('range_price').'
ORDER BY r.`delimiter2` DESC';
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**
@@ -449,7 +455,13 @@ class CarrierCore extends ObjectModel
GROUP BY c.`id_carrier`
ORDER BY c.`position` ASC';
$carriers = Db::getInstance()->executeS($sql);
$cache_id = 'Carrier::getCarriers_'.md5($sql);
if (!Cache::isStored($cache_id))
{
$carriers = Db::getInstance()->executeS($sql);
Cache::store($cache_id, $carriers);
}
$carriers = Cache::retrieve($cache_id);
if (is_array($carriers) && count($carriers))
{
@@ -1199,7 +1211,14 @@ class CarrierCore extends ObjectModel
$query->where('pc.id_product = '.(int)$product->id);
$query->where('pc.id_shop = '.(int)$id_shop);
$carriers_for_product = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($query);
$cache_id = 'Carrier::getAvailableCarrierList_'.(int)$product->id.'-'.(int)$id_shop;
if (!Cache::isStored($cache_id))
{
$carriers_for_product = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($query);
Cache::store($cache_id, $carriers_for_product);
}
$carriers_for_product = Cache::retrieve($cache_id);
$carrier_list = array();
if (!empty($carriers_for_product))
{

View File

@@ -325,7 +325,7 @@ class CartCore extends ObjectModel
if (!CartRule::isFeatureActive() || !$this->id)
return array();
$cache_key = 'Cart::getCartRules'.$this->id.'-'.$filter;
$cache_key = 'Cart::getCartRules_'.$this->id.'-'.$filter;
if (!Cache::isStored($cache_key))
{
$result = Db::getInstance()->executeS('
@@ -368,12 +368,16 @@ class CartCore extends ObjectModel
{
if (!CartRule::isFeatureActive())
return 0;
return Db::getInstance()->getValue('
SELECT COUNT(*)
FROM `'._DB_PREFIX_.'cart_cart_rule`
WHERE `id_cart_rule` = '.(int)$id_cart_rule.' AND `id_cart` = '.(int)$this->id
);
$cache_id = 'Cart::getDiscountsCustomer_'.(int)$this->id.'-'.(int)$id_cart_rule;
if (!Cache::isStored($cache_id))
{
$result = (int)Db::getInstance()->getValue('
SELECT COUNT(*)
FROM `'._DB_PREFIX_.'cart_cart_rule`
WHERE `id_cart_rule` = '.(int)$id_cart_rule.' AND `id_cart` = '.(int)$this->id);
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
public function getLastProduct()
@@ -632,14 +636,19 @@ class CartCore extends ObjectModel
if (!isset($row['pai_id_image']) || $row['pai_id_image'] == 0)
{
$row2 = Db::getInstance()->getRow('
SELECT image_shop.`id_image` id_image, il.`legend`
FROM `'._DB_PREFIX_.'image` i
JOIN `'._DB_PREFIX_.'image_shop` image_shop ON (i.id_image = image_shop.id_image AND image_shop.cover=1 AND image_shop.id_shop='.(int)$row['id_shop'].')
LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$this->id_lang.')
WHERE i.`id_product` = '.(int)$row['id_product'].' AND image_shop.`cover` = 1'
);
$cache_id = 'Cart::getProducts_'.'-pai_id_image-'.(int)$row['id_product'].'-'.(int)$this->id_lang.'-'.(int)$row['id_shop'];
if (!Cache::isStored($cache_id))
{
$row2 = Db::getInstance()->getRow('
SELECT image_shop.`id_image` id_image, il.`legend`
FROM `'._DB_PREFIX_.'image` i
JOIN `'._DB_PREFIX_.'image_shop` image_shop ON (i.id_image = image_shop.id_image AND image_shop.cover=1 AND image_shop.id_shop='.(int)$row['id_shop'].')
LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$this->id_lang.')
WHERE i.`id_product` = '.(int)$row['id_product'].' AND image_shop.`cover` = 1'
);
Cache::store($cache_id, $row2);
}
$row2 = Cache::retrieve($cache_id);
if (!$row2)
$row2 = array('id_image' => false, 'legend' => false);
else
@@ -727,7 +736,7 @@ class CartCore extends ObjectModel
*
* @result integer Products quantity
*/
public function nbProducts()
public function nbProducts()
{
if (!$this->id)
return 0;
@@ -1078,9 +1087,9 @@ class CartCore extends ObjectModel
);
$id_customization = Db::getInstance()->Insert_ID();
}
$query = 'INSERT INTO `'._DB_PREFIX_.'customized_data` (`id_customization`, `type`, `index`, `value`)
VALUES ('.(int)$id_customization.', '.(int)$type.', '.(int)$index.', \''.pSql($field).'\')';
VALUES ('.(int)$id_customization.', '.(int)$type.', '.(int)$index.', \''.pSQL($field).'\')';
if (!Db::getInstance()->execute($query))
return false;
@@ -1094,7 +1103,13 @@ class CartCore extends ObjectModel
*/
public function orderExists()
{
return (bool)Db::getInstance()->getValue('SELECT count(*) FROM `'._DB_PREFIX_.'orders` WHERE `id_cart` = '.(int)$this->id);
$cache_id = 'Cart::orderExists_'.(int)$this->id;
if (!Cache::isStored($cache_id))
{
$result = (bool)Db::getInstance()->getValue('SELECT count(*) FROM `'._DB_PREFIX_.'orders` WHERE `id_cart` = '.(int)$this->id);
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**
@@ -2277,18 +2292,23 @@ class CartCore extends ObjectModel
public function getAddressCollection()
{
$collection = array();
$result = Db::getInstance()->executeS(
'SELECT DISTINCT `id_address_delivery`
FROM `'._DB_PREFIX_.'cart_product`
WHERE id_cart = '.(int)$this->id
);
$cache_id = 'Cart::getAddressCollection'.(int)$this->id;
if (!Cache::isStored($cache_id))
{
$result = Db::getInstance()->executeS(
'SELECT DISTINCT `id_address_delivery`
FROM `'._DB_PREFIX_.'cart_product`
WHERE id_cart = '.(int)$this->id
);
Cache::store($cache_id, $result);
}
$result = Cache::retrieve($cache_id);
$result[] = array('id_address_delivery' => (int)$this->id_address_delivery);
foreach ($result as $row)
if ((int)$row['id_address_delivery'] != 0)
$collection[(int)$row['id_address_delivery']] = new Address((int)$row['id_address_delivery']);
return $collection;
}
@@ -3038,7 +3058,6 @@ class CartCore extends ObjectModel
*/
public function addTextFieldToProduct($id_product, $index, $type, $text_value)
{
$text_value = str_replace(array("\n", "\r"), '', nl2br($text_value));
if (!_PS_MAGIC_QUOTES_GPC_){
$text_value = str_replace('\\', '\\\\', $text_value);
$text_value = str_replace('\'', '\\\'', $text_value);
@@ -3219,7 +3238,7 @@ class CartCore extends ObjectModel
public function getWsCartRows()
{
return Db::getInstance()->executeS('
SELECT id_product, id_product_attribute, quantity
SELECT id_product, id_product_attribute, quantity, id_address_delivery
FROM `'._DB_PREFIX_.'cart_product`
WHERE id_cart = '.(int)$this->id.' AND id_shop = '.(int)Context::getContext()->shop->id
);
@@ -3466,10 +3485,14 @@ class CartCore extends ObjectModel
)
WHERE `id_cart` = '.(int)$this->id.'
'.(Configuration::get('PS_ALLOW_MULTISHIPPING') ? ' AND `id_shop` = '.(int)$this->id_shop : '');
$result = Db::getInstance()->execute($sql);
if ($result)
$emptyCache = true;
$cache_id = 'Cart::setNoMultishipping'.(int)$this->id.'-'.(int)$this->id_shop;
if (!Cache::isStored($cache_id))
{
if ($result = (bool)Db::getInstance()->execute($sql))
$emptyCache = true;
Cache::store($cache_id, $result);
}
if (Customization::isFeatureActive())
Db::getInstance()->execute('
@@ -3670,4 +3693,4 @@ class CartCore extends ObjectModel
return $addresses_instance_without_carriers;
}
}
}
}

View File

@@ -254,6 +254,17 @@ class CartRuleCore extends ObjectModel
}
else
$cart_rule['quantity_for_user'] = 0;
unset($cart_rule);
foreach ($result as $cart_rule)
if ($cart_rule['shop_restriction'])
{
$cartRuleShops = Db::getInstance()->executeS('SELECT id_shop FROM '._DB_PREFIX_.'cart_rule_shop WHERE id_cart_rule = '.(int)$cart_rule['id_cart_rule']);
foreach ($cartRuleShops as $cartRuleShop)
if (Shop::isFeatureActive() && ($cartRuleShop['id_shop'] == Context::getContext()->shop->id))
continue 2;
unset($result[$key]);
}
// Retrocompatibility with 1.4 discounts
foreach ($result as &$cart_rule)

View File

@@ -666,9 +666,9 @@ class CategoryCore extends ObjectModel
* @param boolean $active return only active categories
* @return array categories
*/
public static function getHomeCategories($id_lang, $active = true)
public static function getHomeCategories($id_lang, $active = true, $id_shop = false)
{
return self::getChildren(Configuration::get('PS_HOME_CATEGORY'), $id_lang, $active);
return self::getChildren(Configuration::get('PS_HOME_CATEGORY'), $id_lang, $active, $id_shop);
}
public static function getRootCategory($id_lang = null, Shop $shop = null)
@@ -704,16 +704,22 @@ class CategoryCore extends ObjectModel
if (!Validate::isBool($active))
die(Tools::displayError());
$query = 'SELECT c.`id_category`, cl.`name`, cl.`link_rewrite`, category_shop.`id_shop`
FROM `'._DB_PREFIX_.'category` c
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category`'.Shop::addSqlRestrictionOnLang('cl').')
'.Shop::addSqlAssociation('category', 'c').'
WHERE `id_lang` = '.(int)$id_lang.'
AND c.`id_parent` = '.(int)$id_parent.'
'.($active ? 'AND `active` = 1' : '').'
GROUP BY c.`id_category`
ORDER BY category_shop.`position` ASC';
return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($query);
$cache_id = 'Category::getChildren_'.(int)$id_parent.'-'.(int)$id_lang.'-'.(bool)$active.'-'.(int)$id_shop;
if (!Cache::isStored($cache_id))
{
$query = 'SELECT c.`id_category`, cl.`name`, cl.`link_rewrite`, category_shop.`id_shop`
FROM `'._DB_PREFIX_.'category` c
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category`'.Shop::addSqlRestrictionOnLang('cl').')
'.Shop::addSqlAssociation('category', 'c').'
WHERE `id_lang` = '.(int)$id_lang.'
AND c.`id_parent` = '.(int)$id_parent.'
'.($active ? 'AND `active` = 1' : '').'
GROUP BY c.`id_category`
ORDER BY category_shop.`position` ASC';
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($query);
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**
@@ -1008,14 +1014,20 @@ class CategoryCore extends ObjectModel
public function getGroups()
{
$groups = array();
$result = Db::getInstance()->executeS('
SELECT cg.`id_group`
FROM '._DB_PREFIX_.'category_group cg
WHERE cg.`id_category` = '.(int)$this->id
);
foreach ($result as $group)
$groups[] = $group['id_group'];
return $groups;
$cache_id = 'Category::getGroups_'.(int)$this->id;
if (!Cache::isStored($cache_id))
{
$result = Db::getInstance()->executeS('
SELECT cg.`id_group`
FROM '._DB_PREFIX_.'category_group cg
WHERE cg.`id_category` = '.(int)$this->id
);
$groups = array();
foreach ($result as $group)
$groups[] = $group['id_group'];
Cache::store($cache_id, $groups);
}
return Cache::retrieve($cache_id);
}
public function addGroupsIfNoExist($id_group)
@@ -1036,24 +1048,23 @@ class CategoryCore extends ObjectModel
*/
public function checkAccess($id_customer)
{
if (!$id_customer)
$cache_id = 'Category::checkAccess_'.(int)$this->id.'-'.$id_customer.(!$id_customer ? '-'.(int)Group::getCurrent()->id : '');
if (!Cache::isStored($cache_id))
{
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
if (!$id_customer)
$result = (bool)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
SELECT ctg.`id_group`
FROM '._DB_PREFIX_.'category_group ctg
WHERE ctg.`id_category` = '.(int)$this->id.' AND ctg.`id_group` = '.(int)Group::getCurrent()->id.'
');
} else {
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
WHERE ctg.`id_category` = '.(int)$this->id.' AND ctg.`id_group` = '.(int)Group::getCurrent()->id);
else
$result = (bool)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
SELECT ctg.`id_group`
FROM '._DB_PREFIX_.'category_group ctg
INNER JOIN '._DB_PREFIX_.'customer_group cg on (cg.`id_group` = ctg.`id_group` AND cg.`id_customer` = '.(int)$id_customer.')
WHERE ctg.`id_category` = '.(int)$this->id
);
WHERE ctg.`id_category` = '.(int)$this->id);
Cache::store($cache_id, $result);
}
if ($result && isset($result['id_group']) && $result['id_group'])
return true;
return false;
return Cache::retrieve($cache_id);
}
/**
@@ -1199,12 +1210,16 @@ class CategoryCore extends ObjectModel
*/
public static function getInterval($id)
{
$sql = 'SELECT nleft, nright, level_depth
FROM '._DB_PREFIX_.'category
WHERE id_category = '.(int)$id;
if (!$result = Db::getInstance()->getRow($sql))
return false;
return $result;
$cache_id = 'Category::getInterval_'.(int)$id;
if (!Cache::isStored($cache_id))
{
$sql = 'SELECT nleft, nright, level_depth
FROM '._DB_PREFIX_.'category
WHERE id_category = '.(int)$id;
$result = Db::getInstance()->getRow($sql);
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**
@@ -1386,11 +1401,17 @@ class CategoryCore extends ObjectModel
public static function getCategoriesWithoutParent()
{
return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT DISTINCT c.*
FROM `'._DB_PREFIX_.'category` c
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND cl.`id_lang` = '.(int)Context::getContext()->language->id.')
WHERE `level_depth` = 1');
$cache_id = 'Category::getCategoriesWithoutParent_'.(int)Context::getContext()->language->id;
if (!Cache::isStored($cache_id))
{
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT DISTINCT c.*
FROM `'._DB_PREFIX_.'category` c
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND cl.`id_lang` = '.(int)Context::getContext()->language->id.')
WHERE `level_depth` = 1');
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
public function isRootCategoryForAShop()
@@ -1409,12 +1430,17 @@ class CategoryCore extends ObjectModel
public static function getTopCategory($id_lang = null)
{
if (is_null($id_lang))
$id_lang = Context::getContext()->language->id;
$id_category = Db::getInstance()->getValue('
SELECT `id_category`
FROM `'._DB_PREFIX_.'category`
WHERE `id_parent` = 0');
return new Category($id_category, $id_lang);
$id_lang = (int)Context::getContext()->language->id;
$cache_id = 'Category::getTopCategory_'.(int)$id_lang;
if (!Cache::isStored($cache_id))
{
$id_category = (int)Db::getInstance()->getValue('
SELECT `id_category`
FROM `'._DB_PREFIX_.'category`
WHERE `id_parent` = 0');
Cache::store($cache_id, new Category($id_category, $id_lang));
}
return Cache::retrieve($cache_id);
}
public function addPosition($position, $id_shop = null)

View File

@@ -73,7 +73,7 @@ class CurrencyCore extends ObjectModel
'sign' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'required' => true, 'size' => 8),
'format' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'decimals' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool', 'required' => true),
'conversion_rate' =>array('type' => self::TYPE_FLOAT, 'validate' => 'isFloat', 'required' => true, 'shop' => true),
'conversion_rate' =>array('type' => self::TYPE_FLOAT, 'validate' => 'isUnsignedFloat', 'required' => true, 'shop' => true),
'deleted' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'active' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
),
@@ -107,14 +107,23 @@ class CurrencyCore extends ObjectModel
$this->suffix = $this->format % 2 == 0 ? ' '.$this->sign : '';
}
/**
* Overriding check if currency with the same iso code already exists.
* If it's true, currency is doesn't added.
* Overriding check if currency rate is not empty and if currency with the same iso code already exists.
* If it's true, currency is not added.
*
* @see ObjectModelCore::add()
*/
public function add($autodate = true, $nullValues = false)
{
return Currency::exists($this->iso_code, $this->iso_code_num) ? false : parent::add();
if ((float)$this->conversion_rate <= 0)
return false;
return Currency::exists($this->iso_code, $this->iso_code_num) ? false : parent::add($autodate, $nullValues);
}
public function update($autodate = true, $nullValues = false)
{
if ((float)$this->conversion_rate <= 0)
return false;
return parent::update($autodate, $nullValues);
}
/**
@@ -287,10 +296,16 @@ class CurrencyCore extends ObjectModel
*/
public static function getIdByIsoCode($iso_code, $id_shop = 0)
{
$query = Currency::getIdByQuery($id_shop);
$query->where('iso_code = \''.pSQL($iso_code).'\'');
return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query->build());
$cache_id = 'Currency::getIdByIsoCode_'.pSQL($iso_code).'-'.(int)$id_shop;
if (!Cache::isStored($cache_id))
{
$query = Currency::getIdByQuery($id_shop);
$query->where('iso_code = \''.pSQL($iso_code).'\'');
$result = (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query->build());
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**

View File

@@ -362,15 +362,18 @@ class CustomerCore extends ObjectModel
{
if (!Validate::isUnsignedId($id_customer))
return true;
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
SELECT `id_customer`
FROM `'._DB_PREFIX_.'customer`
WHERE `id_customer` = \''.(int)$id_customer.'\'
AND active = 1
AND `deleted` = 0');
if (isset($result['id_customer']))
return false;
return true;
$cache_id = 'Customer::isBanned_'.(int)$id_customer;
if (!Cache::isStored($cache_id))
{
$result = (bool)!Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
SELECT `id_customer`
FROM `'._DB_PREFIX_.'customer`
WHERE `id_customer` = \''.(int)$id_customer.'\'
AND active = 1
AND `deleted` = 0');
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**
@@ -413,7 +416,7 @@ class CustomerCore extends ObjectModel
public static function customerHasAddress($id_customer, $id_address)
{
$key = (int)$id_customer.'-'.(int)$id_address;
if (!array_key_exists($id_address, self::$_customerHasAddress))
if (!array_key_exists($key, self::$_customerHasAddress))
{
self::$_customerHasAddress[$key] = (bool)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
SELECT `id_address`
@@ -439,15 +442,22 @@ class CustomerCore extends ObjectModel
*/
public function getAddresses($id_lang)
{
$sql = 'SELECT DISTINCT a.*, cl.`name` AS country, s.name AS state, s.iso_code AS state_iso
FROM `'._DB_PREFIX_.'address` a
LEFT JOIN `'._DB_PREFIX_.'country` c ON (a.`id_country` = c.`id_country`)
LEFT JOIN `'._DB_PREFIX_.'country_lang` cl ON (c.`id_country` = cl.`id_country`)
LEFT JOIN `'._DB_PREFIX_.'state` s ON (s.`id_state` = a.`id_state`)
'.(Context::getContext()->shop->getGroup()->share_order ? '' : Shop::addSqlAssociation('country', 'c')).'
WHERE `id_lang` = '.(int)$id_lang.' AND `id_customer` = '.(int)$this->id.' AND a.`deleted` = 0';
$share_order = (bool)Context::getContext()->shop->getGroup()->share_order;
$cache_id = 'Customer::getAddresses'.(int)$this->id.'-'.(int)$id_lang.'-'.$share_order;
if (!Cache::isStored($cache_id))
{
$sql = 'SELECT DISTINCT a.*, cl.`name` AS country, s.name AS state, s.iso_code AS state_iso
FROM `'._DB_PREFIX_.'address` a
LEFT JOIN `'._DB_PREFIX_.'country` c ON (a.`id_country` = c.`id_country`)
LEFT JOIN `'._DB_PREFIX_.'country_lang` cl ON (c.`id_country` = cl.`id_country`)
LEFT JOIN `'._DB_PREFIX_.'state` s ON (s.`id_state` = a.`id_state`)
'.($share_order ? '' : Shop::addSqlAssociation('country', 'c')).'
WHERE `id_lang` = '.(int)$id_lang.' AND `id_customer` = '.(int)$this->id.' AND a.`deleted` = 0';
return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**
@@ -476,12 +486,17 @@ class CustomerCore extends ObjectModel
{
if (!Validate::isUnsignedId($id_customer) || !Validate::isMd5($passwd))
die (Tools::displayError());
$sql = 'SELECT `id_customer`
FROM `'._DB_PREFIX_.'customer`
WHERE `id_customer` = '.$id_customer.'
$cache_id = 'Customer::checkPassword'.(int)$id_customer.'-'.$passwd;
if (!Cache::isStored($cache_id))
{
$sql = 'SELECT `id_customer`
FROM `'._DB_PREFIX_.'customer`
WHERE `id_customer` = '.$id_customer.'
AND `passwd` = \''.$passwd.'\'';
return (bool)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
$result = (bool)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**
@@ -574,12 +589,16 @@ class CustomerCore extends ObjectModel
public static function customerIdExistsStatic($id_customer)
{
$row = Db::getInstance()->getRow('
SELECT `id_customer`
FROM '._DB_PREFIX_.'customer c
WHERE c.`id_customer` = '.(int)$id_customer);
return isset($row['id_customer']);
$cache_id = 'Customer::customerIdExistsStatic'.(int)$id_customer;
if (!Cache::isStored($cache_id))
{
$result = (int)Db::getInstance()->getValue('
SELECT `id_customer`
FROM '._DB_PREFIX_.'customer c
WHERE c.`id_customer` = '.(int)$id_customer);
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**
@@ -589,9 +608,11 @@ class CustomerCore extends ObjectModel
*/
public function updateGroup($list)
{
$this->cleanGroups();
if ($list && !empty($list))
{
$this->cleanGroups();
$this->addGroups($list);
}
else
$this->addGroups(array($this->id_default_group));
}
@@ -606,7 +627,7 @@ class CustomerCore extends ObjectModel
foreach ($groups as $group)
{
$row = array('id_customer' => (int)$this->id, 'id_group' => (int)$group);
Db::getInstance()->insert('customer_group', $row);
Db::getInstance()->insert('customer_group', $row, false, true, Db::INSERT_IGNORE);
}
}

View File

@@ -46,7 +46,7 @@ class CustomerMessageCore extends ObjectModel
'fields' => array(
'id_employee' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
'id_customer_thread' => array('type' => self::TYPE_INT),
'ip_address' => array('type' => self::TYPE_INT, 'validate' => 'isIp2Long'),
'ip_address' => array('type' => self::TYPE_STRING, 'validate' => 'isIp2Long', 'size' => 15),
'message' => array('type' => self::TYPE_STRING, 'validate' => 'isCleanHtml', 'required' => true, 'size' => 65000),
'file_name' => array('type' => self::TYPE_STRING),
'user_agent' => array('type' => self::TYPE_STRING),

View File

@@ -369,7 +369,7 @@ class DispatcherCore
// If there are several languages, get language from uri
if ($this->use_routes && Language::isMultiLanguageActivated())
if (preg_match('#^/([a-z]{2})/?#', $this->request_uri, $m))
if (preg_match('#^/([a-z]{2})(?:/.*)?$#', $this->request_uri, $m))
{
$_GET['isolang'] = $m[1];
$this->request_uri = substr($this->request_uri, 3);

View File

@@ -312,16 +312,37 @@ class FeatureCore extends ObjectModel
*/
public static function cleanPositions()
{
return Db::getInstance()->execute('
UPDATE `'._DB_PREFIX_.'feature` f
LEFT JOIN (
SELECT @i := @i +1 AS rank, id_feature, position
FROM `'._DB_PREFIX_.'feature`
JOIN (SELECT @i :=1) dummy
ORDER by position
) AS f2
USING (id_feature)
SET f.position = f2.rank - 1');
//Reordering positions to remove "holes" in them (after delete for instance)
$sql = "SELECT id_feature, position FROM "._DB_PREFIX_."feature ORDER BY id_feature";
$db = Db::getInstance();
$r = $db->executeS($sql, false);
$shiftTable = array(); //List of update queries (one query is necessary for each "hole" in the table)
$currentDelta = 0;
$minId = 0;
$maxId = 0;
$futurePosition = 1;
while ($line = $db->nextRow($r)) {
$delta = $futurePosition - $line['position']; //Difference between current position and future position
if ($delta != $currentDelta) {
$shiftTable[] = array('minId' => $minId, 'maxId' => $maxId, 'delta' => $currentDelta);
$currentDelta = $delta;
$minId = $line['id_feature'];
}
$maxId = $line['id_feature'];
$futurePosition++;
}
$shiftTable[] = array('minId' => $minId, 'maxId' => $maxId, 'delta' => $currentDelta);
//Executing generated queries
foreach ($shiftTable as $line) {
$delta = $line['delta'];
if ($delta == 0) continue;
$delta = $delta > 0 ? '+' . (int)$delta : (int)$delta;
$minId = (int)$line['minId'];
$maxId = (int)$line['maxId'];
$sql = "UPDATE "._DB_PREFIX_."feature SET position = position $delta WHERE id_feature >= $minId AND id_feature <= $maxId";
Db::getInstance()->execute($sql);
}
}
/**

View File

@@ -128,30 +128,36 @@ class FeatureValueCore extends ObjectModel
return $tab['value'];
}
public static function addFeatureValueImport($id_feature, $value, $id_product = null, $id_lang = null)
public static function addFeatureValueImport($id_feature, $value, $id_product = null, $id_lang = null, $custom = false)
{
$id_feature_value = false;
if (!is_null($id_product) && $id_product)
{
$id_feature_value = Db::getInstance()->getValue('
SELECT `id_feature_value`
FROM '._DB_PREFIX_.'feature_product
WHERE `id_feature` = '.(int)$id_feature.'
AND `id_product` = '.(int)$id_product);
SELECT fp.`id_feature_value`
FROM '._DB_PREFIX_.'feature_product fp
INNER JOIN '._DB_PREFIX_.'feature_value fv USING (`id_feature_value`)
WHERE fp.`id_feature` = '.(int)$id_feature.'
AND fv.`custom` = '.(int)$custom.'
AND fp.`id_product` = '.(int)$id_product);
if ($id_feature_value && !is_null($id_lang) && $id_lang)
if ($custom && $id_feature_value && !is_null($id_lang) && $id_lang)
Db::getInstance()->execute('
UPDATE '._DB_PREFIX_.'feature_value_lang
SET `value` = \''.pSQL($value).'\'
WHERE `id_feature_value` = '.(int)$id_feature_value.'
AND `value` != \''.pSQL($value).'\'
AND `id_lang` = '.(int)$id_lang);
}
else
if (!$custom)
$id_feature_value = Db::getInstance()->getValue('
SELECT fv.`id_feature_value`
FROM '._DB_PREFIX_.'feature_value fv
LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.`id_feature_value` = fv.`id_feature_value`)
LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.`id_feature_value` = fv.`id_feature_value` AND fvl.`id_lang` = '.(int)$id_lang.')
WHERE `value` = \''.pSQL($value).'\'
AND fv.`id_feature` = '.(int)$id_feature.'
AND fv.`custom` = 0
GROUP BY fv.`id_feature_value`');
if ($id_feature_value)
@@ -160,7 +166,7 @@ class FeatureValueCore extends ObjectModel
// Feature doesn't exist, create it
$feature_value = new FeatureValue();
$feature_value->id_feature = (int)$id_feature;
$feature_value->custom = 0;
$feature_value->custom = (bool)$custom;
foreach (Language::getLanguages() as $language)
$feature_value->value[$language['id_lang']] = $value;
$feature_value->add();

View File

@@ -102,6 +102,13 @@ class QqUploadedFileForm
$image = new Image();
$image->id_product = (int)$product->id;
$image->position = Image::getHighestPosition($product->id) + 1;
$legends = Tools::getValue('legend');
if (is_array($legends))
foreach ($legends as $key => $legend)
if (!empty($legend) && Validate::isGenericName($legend))
$image->legend[(int)$key] = $legend;
else
return array('error' => sprintf(Tools::displayError('Error on image legend "%1s." is not a valid legend.'), Tools::safeOutput($legend)));
if (!Image::getCover($image->id_product))
$image->cover = 1;
else
@@ -136,7 +143,7 @@ class QqUploadedFileForm
if (!$image->update())
return array('error' => Tools::displayError('Error while updating status'));
$img = array('id_image' => $image->id, 'position' => $image->position, 'cover' => $image->cover, 'name' => $this->getName());
$img = array('id_image' => $image->id, 'position' => $image->position, 'cover' => $image->cover, 'name' => $this->getName(), 'legend' => $image->legend);
return array('success' => $img);
}
@@ -184,6 +191,13 @@ class QqUploadedFileXhr
$image = new Image();
$image->id_product = (int)($product->id);
$image->position = Image::getHighestPosition($product->id) + 1;
$legends = Tools::getValue('legend');
if (is_array($legends))
foreach ($legends as $key => $legend)
if (!empty($legend) && Validate::isGenericName($legend))
$image->legend[(int)$key] = $legend;
else
return array('error' => sprintf(Tools::displayError('Error on image legend "%1s." is not a valid legend.'), Tools::safeOutput($legend)));
if (!Image::getCover($image->id_product))
$image->cover = 1;
else
@@ -223,7 +237,7 @@ class QqUploadedFileXhr
if (!$image->update())
return array('error' => Tools::displayError('Error while updating status'));
$img = array('id_image' => $image->id, 'position' => $image->position, 'cover' => $image->cover, 'name' => $this->getName());
$img = array('id_image' => $image->id, 'position' => $image->position, 'cover' => $image->cover, 'name' => $this->getName(), 'legend' => $image->legend);
return array('success' => $img);
}

View File

@@ -305,17 +305,43 @@ class GroupCore extends ObjectModel
public static function getCurrent()
{
static $groups = array();
$customer = Context::getContext()->customer;
if (Validate::isLoadedObject($customer))
{
$id_group = (int)$customer->id_default_group;
$group = new Group((int)$id_group);
if (!$group->isAssociatedToShop(Context::getContext()->shop->id))
$group = new Group((int)Configuration::get('PS_CUSTOMER_GROUP'));
}
else
$id_group = (int)Configuration::get('PS_UNIDENTIFIED_GROUP');
if (!isset($groups[$id_group]) && isset($group))
$groups[$id_group] = $group;
if (!isset($groups[$id_group]))
$groups[$id_group] = new Group($id_group);
return $groups[$id_group];
}
}
/**
* Light back office search for Group
*
* @param integer $id_lang Language ID
* @param string $query Searched string
* @param boolean $unrestricted allows search without lang and includes first group and exact match
* @return array Corresponding groupes
*/
public static function searchByName($query)
{
return Db::getInstance()->getRow('
SELECT g.*, gl.*
FROM `'._DB_PREFIX_.'group` g
LEFT JOIN `'._DB_PREFIX_.'group_lang` gl
ON (g.`id_group` = gl.`id_group`)
WHERE `name` LIKE \''.pSQL($query).'\'
');
}
}

View File

@@ -56,6 +56,8 @@ class HookCore extends ObjectModel
*/
public static $executed_hooks = array();
public static $native_module;
/**
* @see ObjectModel::$definition
*/
@@ -316,7 +318,7 @@ class HookCore extends ObjectModel
if (Validate::isLoadedObject($context->country))
$sql->where('(h.name = "displayPayment" AND (SELECT id_country FROM '._DB_PREFIX_.'module_country mc WHERE mc.id_module = m.id_module AND id_country = '.(int)$context->country->id.' AND id_shop = '.(int)$context->shop->id.' LIMIT 1) = '.(int)$context->country->id.')');
if (Validate::isLoadedObject($context->currency))
$sql->where('(h.name = "displayPayment" AND (SELECT id_currency FROM '._DB_PREFIX_.'module_currency mcr WHERE mcr.id_module = m.id_module AND id_currency IN ('.(int)$context->currency->id.', -2) LIMIT 1) IN ('.(int)$context->currency->id.', -2))');
$sql->where('(h.name = "displayPayment" AND (SELECT id_currency FROM '._DB_PREFIX_.'module_currency mcr WHERE mcr.id_module = m.id_module AND id_currency IN ('.(int)$context->currency->id.', -1, -2) LIMIT 1) IN ('.(int)$context->currency->id.', -1, -2))');
}
if (Validate::isLoadedObject($context->shop))
$sql->where('hm.id_shop = '.(int)$context->shop->id);
@@ -324,7 +326,10 @@ class HookCore extends ObjectModel
if ($frontend)
{
$sql->leftJoin('module_group', 'mg', 'mg.`id_module` = m.`id_module`');
$sql->where('mg.`id_group` IN ('.implode(', ', $groups).')');
if (Validate::isLoadedObject($context->shop))
$sql->where('mg.id_shop = '.((int)$context->shop->id).' AND mg.`id_group` IN ('.implode(', ', $groups).')');
else
$sql->where('mg.`id_group` IN ('.implode(', ', $groups).')');
$sql->groupBy('hm.id_hook, hm.id_module');
}
@@ -388,6 +393,10 @@ class HookCore extends ObjectModel
*/
public static function exec($hook_name, $hook_args = array(), $id_module = null, $array_return = false, $check_exceptions = true)
{
static $disable_non_native_modules = null;
if ($disable_non_native_modules === null)
$disable_non_native_modules = (bool)Configuration::get('PS_DISABLE_NON_NATIVE_MODULE');
// Check arguments validity
if (($id_module && !is_numeric($id_module)) || !Validate::isHookName($hook_name))
throw new PrestaShopException('Invalid id_module or hook_name');
@@ -416,12 +425,19 @@ class HookCore extends ObjectModel
// Look on modules list
$altern = 0;
$output = '';
if ($disable_non_native_modules && !isset(Hook::$native_module))
Hook::$native_module = Module::getNativeModuleList();
foreach ($module_list as $array)
{
// Check errors
if ($id_module && $id_module != $array['id_module'])
continue;
if ((bool)$disable_non_native_modules && Hook::$native_module && count(Hook::$native_module) && !in_array($array['module'], self::$native_module))
continue;
if (!($moduleInstance = Module::getInstanceByName($array['module'])))
continue;

View File

@@ -40,6 +40,9 @@ class ImageCore extends ObjectModel
/** @var boolean Image is cover */
public $cover;
/** @var string Legend */
public $legend;
/** @var string image extension */
public $image_format = 'jpg';
@@ -66,6 +69,7 @@ class ImageCore extends ObjectModel
'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'position' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
'cover' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool', 'shop' => true),
'legend' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 128),
),
);

View File

@@ -127,16 +127,20 @@ class ImageTypeCore extends ObjectModel
* @param string $name
* @param string $type
*/
public static function getByNameNType($name, $type = null)
public static function getByNameNType($name, $type = null, $order = null)
{
if (!isset(self::$images_types_name_cache[$name.'_'.$type]))
if (!isset(self::$images_types_name_cache[$name.'_'.$type.'_'.$order]))
{
self::$images_types_name_cache[$name.'_'.$type] = Db::getInstance()->getRow('
self::$images_types_name_cache[$name.'_'.$type.'_'.$order] = Db::getInstance()->getRow('
SELECT `id_image_type`, `name`, `width`, `height`, `products`, `categories`, `manufacturers`, `suppliers`, `scenes`
FROM `'._DB_PREFIX_.'image_type`
WHERE `name` = \''.pSQL($name).'\' '.(!is_null($type) ? 'AND `'.pSQL($type).'` = 1' : ''));
WHERE
`name` LIKE \''.pSQL($name).'\''
.(!is_null($type) ? ' AND `'.pSQL($type).'` = 1' : '')
.(!is_null($order) ? ' ORDER BY `'.bqSQL($order).'` ASC' : '')
);
}
return self::$images_types_name_cache[$name.'_'.$type];
return self::$images_types_name_cache[$name.'_'.$type.'_'.$order];
}
public static function getFormatedName($name)

View File

@@ -619,6 +619,35 @@ class LanguageCore extends ObjectModel
return Db::getInstance()->getValue('SELECT `language_code` FROM `'._DB_PREFIX_.'lang` WHERE `iso_code` = \''.pSQL(strtolower($iso_code)).'\'');
}
public static function getLanguageByIETFCode($code)
{
if (!Validate::isLanguageCode($code))
die(sprintf(Tools::displayError('Fatal error: IETF code %s is not correct'), $code));
// $code is in the form of 'xx-YY' where xx is the language code
// and 'YY' a country code identifying a variant of the language.
$lang_country = explode('-', $code);
// Get the language component of the code
$lang = $lang_country[0];
// Find the id_lang of the language.
// We look for anything with the correct language code
// and sort on equality with the exact IETF code wanted.
// That way using only one query we get either the exact wanted language
// or a close match.
$id_lang = Db::getInstance()->getValue(
'SELECT `id_lang` FROM '
.'`'._DB_PREFIX_.'lang` WHERE LEFT(`language_code`,2) = \''.pSQL($lang).'\' '
.'ORDER BY language_code = \''.pSQL($code).'\' DESC'
);
// Instantiate the Language object if we found it.
if ($id_lang)
return new Language($id_lang);
else
return false;
}
/**
* Return array (id_lang, iso_code)
*

View File

@@ -423,6 +423,15 @@ class LinkCore
*/
public function getPageLink($controller, $ssl = null, $id_lang = null, $request = null, $request_url_encode = false, $id_shop = null)
{
//If $controller contains '&' char, it means that $controller contains request data and must be parsed first
$p = strpos($controller, '&');
if ($p !== false) {
$request = substr($controller, $p + 1);
$request_url_encode = false;
$controller = substr($controller, 0, $p);
}
$controller = Tools::strReplaceFirst('.php', '', $controller);
if (!$id_lang)
$id_lang = (int)Context::getContext()->language->id;

View File

@@ -63,6 +63,7 @@ class LocalizationPackCore
if ($install_mode && $res && isset($this->iso_currency))
{
Cache::clean('Currency::getIdByIsoCode_*');
$res &= Configuration::updateValue('PS_CURRENCY_DEFAULT', (int)Currency::getIdByIsoCode($this->iso_currency));
Currency::refreshCurrencies();
}

View File

@@ -62,7 +62,7 @@ class LoggerCore extends ObjectModel
'fields' => array(
'severity' => array('type' => self::TYPE_INT, 'validate' => 'isInt', 'required' => true),
'error_code' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
'message' => array('type' => self::TYPE_STRING, 'validate' => 'isMessage', 'required' => true),
'message' => array('type' => self::TYPE_STRING, 'validate' => 'isString', 'required' => true),
'object_id' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
'id_employee' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
'object_type' => array('type' => self::TYPE_STRING, 'validate' => 'isName'),

View File

@@ -133,36 +133,46 @@ class MailCore
{
foreach ($to as $key => $addr)
{
$to_name = null;
$addr = trim($addr);
if (!Validate::isEmail($addr))
{
Tools::dieOrLog(Tools::displayError('Error: invalid e-mail address'), $die);
return false;
}
if (is_array($to_name))
{
if ($to_name && is_array($to_name) && Validate::isGenericName($to_name[$key]))
$to_name = $to_name[$key];
}
if ($to_name == null)
$to_name = $addr;
/* Encode accentuated chars */
if (function_exists('mb_encode_mimeheader'))
$to_list->addTo($addr, mb_encode_mimeheader($to_name, 'utf-8'));
if ($to_name == null || $to_name == $addr)
$to_name = '';
else
$to_list->addTo($addr, self::mimeEncode($to_name));
{
if (function_exists('mb_encode_mimeheader'))
$to_name = mb_encode_mimeheader($to_name, 'utf-8');
else
$to_name = self::mimeEncode($to_name);
}
$to_list->addTo($addr, $to_name);
}
$to_plugin = $to[0];
} else {
/* Simple recipient, one address */
$to_plugin = $to;
if ($to_name == null)
$to_name = $to;
if (function_exists('mb_encode_mimeheader'))
$to_list->addTo($to, mb_encode_mimeheader($to_name, 'utf-8'));
if ($to_name == null || $to_name == $to)
$to_name = '';
else
$to_list->addTo($to, self::mimeEncode($to_name));
{
if (function_exists('mb_encode_mimeheader'))
$to_name = mb_encode_mimeheader($to_name, 'utf-8');
else
$to_name = self::mimeEncode($to_name);
}
$to_list->addTo($to, $to_name);
}
if(isset($bcc)) {
$to_list->addBcc($bcc);
@@ -235,8 +245,13 @@ class MailCore
include_once($template_path.$iso.'/lang.php');
else if ($module_name && file_exists($theme_path.'mails/'.$iso.'/lang.php'))
include_once($theme_path.'mails/'.$iso.'/lang.php');
else
else if (file_exists(_PS_MAIL_DIR_.$iso.'/lang.php'))
include_once(_PS_MAIL_DIR_.$iso.'/lang.php');
else
{
Tools::dieOrLog(Tools::displayError('Error - The lang file is missing for :').' '.$iso, $die);
return false;
}
/* Create mail and attach differents parts */
$message = new Swift_Message('['.Configuration::get('PS_SHOP_NAME', null, null, $id_shop).'] '.$subject);

View File

@@ -109,7 +109,7 @@ class MediaCore
// If the string is too big preg_replace return an error
// In this case, we don't compress the content
if (preg_last_error() == PREG_BACKTRACK_LIMIT_ERROR)
if (function_exists('preg_last_error') && preg_last_error() == PREG_BACKTRACK_LIMIT_ERROR)
{
if (_PS_MODE_DEV_)
error_log('ERROR: PREG_BACKTRACK_LIMIT_ERROR in function packJSinHTML');

View File

@@ -85,11 +85,11 @@ class MetaCore extends ObjectModel
// Add modules controllers to list (this function is cool !)
foreach (glob(_PS_MODULE_DIR_.'*/controllers/front/*.php') as $file)
{
$filename = basename($file, '.php');
$filename = Tools::strtolower(basename($file, '.php'));
if ($filename == 'index')
continue;
$module = basename(dirname(dirname(dirname($file))));
$module = Tools::strtolower(basename(dirname(dirname(dirname($file)))));
$selected_pages[$module.' - '.$filename] = 'module-'.$module.'-'.$filename;
}
@@ -277,24 +277,31 @@ class MetaCore extends ObjectModel
FROM `'._DB_PREFIX_.'category_lang` cl
WHERE cl.`id_lang` = '.(int)$id_lang.'
AND cl.`id_category` = '.(int)$id_category.Shop::addSqlRestrictionOnLang('cl');
if ($row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql))
$cache_id = 'Meta::getCategoryMetas'.(int)$id_category.'-'.(int)$id_lang;
if (!Cache::isStored($cache_id))
{
if (empty($row['meta_description']))
$row['meta_description'] = strip_tags($row['description']);
// Paginate title
if (!empty($row['meta_title']))
$row['meta_title'] = $title.$row['meta_title'].(!empty($page_number) ? ' ('.$page_number.')' : '').' - '.Configuration::get('PS_SHOP_NAME');
if ($row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql))
{
if (empty($row['meta_description']))
$row['meta_description'] = strip_tags($row['description']);
// Paginate title
if (!empty($row['meta_title']))
$row['meta_title'] = $title.$row['meta_title'].(!empty($page_number) ? ' ('.$page_number.')' : '').' - '.Configuration::get('PS_SHOP_NAME');
else
$row['meta_title'] = $row['name'].(!empty($page_number) ? ' ('.$page_number.')' : '').' - '.Configuration::get('PS_SHOP_NAME');
if (!empty($title))
$row['meta_title'] = $title.(!empty($page_number) ? ' ('.$page_number.')' : '').' - '.Configuration::get('PS_SHOP_NAME');
$result = Meta::completeMetaTags($row, $row['name']);
}
else
$row['meta_title'] = $row['name'].(!empty($page_number) ? ' ('.$page_number.')' : '').' - '.Configuration::get('PS_SHOP_NAME');
if (!empty($title))
$row['meta_title'] = $title.(!empty($page_number) ? ' ('.$page_number.')' : '').' - '.Configuration::get('PS_SHOP_NAME');
return Meta::completeMetaTags($row, $row['name']);
$result = Meta::getHomeMetas($id_lang, $page_name);
Cache::store($cache_id, $result);
}
return Meta::getHomeMetas($id_lang, $page_name);
return Cache::retrieve($cache_id);
}
/**

View File

@@ -191,7 +191,7 @@ abstract class ObjectModelCore
if ($id)
{
// Load object from database if object id is present
$cache_id = 'objectmodel_'.$this->def['classname'].'_'.(int)$id.'_'.(int)$id_shop.'_'.(int)$id_lang;
$cache_id = 'objectmodel_'.$this->def['classname'].'_'.(int)$id.'_'.(int)$this->id_shop.'_'.(int)$id_lang;
if (!Cache::isStored($cache_id))
{
$sql = new DbQuery();
@@ -893,7 +893,7 @@ abstract class ObjectModelCore
* @param int $id_lang
* @return bool|string
*/
public function validateField($field, $value, $id_lang = null)
public function validateField($field, $value, $id_lang = null, $skip = array(), $human_errors = false)
{
$this->cacheFieldsRequiredDatabase();
$data = $this->def['fields'][$field];
@@ -901,9 +901,12 @@ abstract class ObjectModelCore
// Check if field is required
$required_fields = (isset(self::$fieldsRequiredDatabase[get_class($this)])) ? self::$fieldsRequiredDatabase[get_class($this)] : array();
if (!$id_lang || $id_lang == Configuration::get('PS_LANG_DEFAULT'))
if (!empty($data['required']) || in_array($field, $required_fields))
if (!in_array('required', $skip) && (!empty($data['required']) || in_array($field, $required_fields)))
if (Tools::isEmpty($value))
return 'Property '.get_class($this).'->'.$field.' is empty';
if ($human_errors)
return sprintf(Tools::displayError('The %s field is required.'), $this->displayFieldName($field, get_class($this)));
else
return 'Property '.get_class($this).'->'.$field.' is empty';
// Default value
if (!$value && !empty($data['default']))
@@ -913,11 +916,11 @@ abstract class ObjectModelCore
}
// Check field values
if (!empty($data['values']) && is_array($data['values']) && !in_array($value, $data['values']))
return 'Property '.get_class($this).'->'.$field.' has bad value (allowed values are: '.implode(', ', $data['values']).')';
if (!in_array('values', $skip) && !empty($data['values']) && is_array($data['values']) && !in_array($value, $data['values']))
return 'Property '.get_class($this).'->'.$field.' has bad value (allowed values are: '.implode(', ', $data['values']).')';
// Check field size
if (!empty($data['size']))
if (!in_array('size', $skip) && !empty($data['size']))
{
$size = $data['size'];
if (!is_array($data['size']))
@@ -925,11 +928,24 @@ abstract class ObjectModelCore
$length = Tools::strlen($value);
if ($length < $size['min'] || $length > $size['max'])
return 'Property '.get_class($this).'->'.$field.' length ('.$length.') must be between '.$size['min'].' and '.$size['max'];
{
if ($human_errors)
{
if (isset($data['lang']) && $data['lang'])
{
$language = new Language((int)$id_lang);
return sprintf(Tools::displayError('The field %1$s (%2$s) is too long (%3$d chars max, html chars including).'), $this->displayFieldName($field, get_class($this)), $language->name, $size['max']);
}
else
return sprintf(Tools::displayError('The %1$s field is too long (%2$d chars max).'), $this->displayFieldName($field, get_class($this)), $size['max']);
}
else
return 'Property '.get_class($this).'->'.$field.' length ('.$length.') must be between '.$size['min'].' and '.$size['max'];
}
}
// Check field validator
if (!empty($data['validate']))
if (!in_array('validate', $skip) && !empty($data['validate']))
{
if (!method_exists('Validate', $data['validate']))
throw new PrestaShopException('Validation function not found. '.$data['validate']);
@@ -948,7 +964,12 @@ abstract class ObjectModelCore
$res = false;
}
if (!$res)
return 'Property '.get_class($this).'->'.$field.' is not valid';
{
if ($human_errors)
return sprintf(Tools::displayError('The %s field is invalid.'), $this->displayFieldName($field, get_class($this)));
else
return 'Property '.get_class($this).'->'.$field.' is not valid';
}
}
}
@@ -1118,7 +1139,7 @@ abstract class ObjectModelCore
{
$vars = get_class_vars($class_name);
foreach ($vars['shopIDs'] as $id_shop)
$or[] = ' main.id_shop = '.(int)$id_shop.' ';
$or[] = '(main.id_shop = '.(int)$id_shop.(isset($this->def['fields']['id_shop_group']) ? ' OR (id_shop = 0 AND id_shop_group='.(int)Shop::getGroupFromShop((int)$id_shop).')' : '').')';
$prepend = '';
if (count($or))
@@ -1213,11 +1234,16 @@ abstract class ObjectModelCore
if ($id_shop === null)
$id_shop = Context::getContext()->shop->id;
$sql = 'SELECT id_shop
FROM `'.pSQL(_DB_PREFIX_.$this->def['table']).'_shop`
WHERE `'.$this->def['primary'].'` = '.(int)$this->id.'
AND id_shop = '.(int)$id_shop;
return (bool)Db::getInstance()->getValue($sql);
$cache_id = 'objectmodel_shop_'.$this->def['classname'].'_'.(int)$this->id.'-'.(int)$id_shop;
if (!Cache::isStored($cache_id))
{
$sql = 'SELECT id_shop
FROM `'.pSQL(_DB_PREFIX_.$this->def['table']).'_shop`
WHERE `'.$this->def['primary'].'` = '.(int)$this->id.'
AND id_shop = '.(int)$id_shop;
Cache::store($cache_id, (bool)Db::getInstance()->getValue($sql));
}
return Cache::retrieve($cache_id);
}
/**
@@ -1637,4 +1663,4 @@ abstract class ObjectModelCore
{
$this->update_fields = $fields;
}
}
}

View File

@@ -536,6 +536,13 @@ abstract class PaymentModuleCore extends Module
if ($order_status->logable)
ProductSale::addProductSale((int)$product['id_product'], (int)$product['cart_quantity']);
// Set the order state
$new_history = new OrderHistory();
$new_history->id_order = (int)$order->id;
$new_history->changeIdOrderState((int)$id_order_state, $order, true);
$new_history->addWithemail(true, $extra_vars);
// Switch to back order if needed
if (Configuration::get('PS_STOCK_MANAGEMENT') && $order_detail->getStockState())
{
$history = new OrderHistory();
@@ -544,13 +551,6 @@ abstract class PaymentModuleCore extends Module
$history->addWithemail();
}
// Set order state in order history ONLY even if the "out of stock" status has not been yet reached
// So you migth have two order states
$new_history = new OrderHistory();
$new_history->id_order = (int)$order->id;
$new_history->changeIdOrderState((int)$id_order_state, $order, true);
$new_history->addWithemail(true, $extra_vars);
unset($order_detail);
// Order is reloaded because the status just changed

View File

@@ -229,7 +229,13 @@ class ProductCore extends ObjectModel
protected static $_prices = array();
protected static $_pricesLevel2 = array();
protected static $_incat = array();
/**
* @since 1.5.6.1
* @var array $_cart_quantity is deprecated since 1.5.6.1
*/
protected static $_cart_quantity = array();
protected static $_tax_rules_group = array();
protected static $_cacheFeatures = array();
protected static $_frontFeaturesCache = array();
@@ -519,6 +525,17 @@ class ProductCore extends ObjectModel
if (!Validate::isLoadedObject($customer))
die(Tools::displayError());
self::$_taxCalculationMethod = Group::getPriceDisplayMethod((int)$customer->id_default_group);
$cur_cart = Context::getContext()->cart;
$id_address = 0;
if (Validate::isLoadedObject($cur_cart))
$id_address = (int)$cur_cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')};
$address_infos = Address::getCountryAndState($id_address);
if (self::$_taxCalculationMethod != PS_TAX_EXC
&& !empty($address_infos['vat_number'])
&& $address_infos['id_country'] != Configuration::get('VATNUMBER_COUNTRY')
&& Configuration::get('VATNUMBER_MANAGEMENT'))
self::$_taxCalculationMethod = PS_TAX_EXC;
}
else
self::$_taxCalculationMethod = Group::getPriceDisplayMethod(Group::getCurrent()->id);
@@ -730,10 +747,10 @@ class ProductCore extends ObjectModel
/**
* @see ObjectModel::validateField()
*/
public function validateField($field, $value, $id_lang = null)
public function validateField($field, $value, $id_lang = null, $skip = array(), $human_errors = false)
{
$value = ($field == 'description_short' ? strip_tags($value) : $value);
return parent::validateField($field, $value, $id_lang);
return parent::validateField($field, $value, $id_lang, $skip, $human_errors);
}
public function toggleStatus()
@@ -2423,13 +2440,18 @@ class ProductCore extends ObjectModel
{
if (!$context)
$context = Context::getContext();
$sql = 'SELECT image_shop.`id_image`
FROM `'._DB_PREFIX_.'image` i
'.Shop::addSqlAssociation('image', 'i').'
WHERE i.`id_product` = '.(int)$id_product.'
AND image_shop.`cover` = 1';
return Db::getInstance()->getRow($sql);
$cache_id = 'Product::getOrderStates_'.(int)$id_product.'-'.(int)$context->shop->id;
if (!Cache::isStored($cache_id))
{
$sql = 'SELECT image_shop.`id_image`
FROM `'._DB_PREFIX_.'image` i
'.Shop::addSqlAssociation('image', 'i').'
WHERE i.`id_product` = '.(int)$id_product.'
AND image_shop.`cover` = 1';
$result = Db::getInstance()->getRow($sql);
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**
@@ -2491,15 +2513,17 @@ class ProductCore extends ObjectModel
$cart_quantity = 0;
if ((int)$id_cart)
{
$condition = '';
$cache_name = (int)$id_cart.'_'.(int)$id_product;
if (!isset(self::$_cart_quantity[$cache_name]) || self::$_cart_quantity[$cache_name] != (int)$quantity)
self::$_cart_quantity[$cache_name] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
SELECT SUM(`quantity`)
$cache_id = 'Product::getPriceStatic_'.(int)$id_product.'-'.(int)$id_cart;
if (!Cache::isStored($cache_id))
{
$sql = 'SELECT SUM(`quantity`)
FROM `'._DB_PREFIX_.'cart_product`
WHERE `id_product` = '.(int)$id_product.'
AND `id_cart` = '.(int)$id_cart);
$cart_quantity = self::$_cart_quantity[$cache_name];
AND `id_cart` = '.(int)$id_cart;
$cart_quantity = (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
Cache::store($cache_id, $cart_quantity);
}
$cart_quantity = Cache::retrieve($cache_id);
}
$id_currency = (int)Validate::isLoadedObject($context->currency) ? $context->currency->id : Configuration::get('PS_CURRENCY_DEFAULT');
@@ -3313,7 +3337,7 @@ class ProductCore extends ObjectModel
$context = Context::getContext();
$sql = new DbQuery();
$sql->select('p.`id_product`, pl.`name`, p.`active`, p.`reference`, m.`name` AS manufacturer_name, stock.`quantity`, product_shop.advanced_stock_management, p.`customizable`');
$sql->select('p.`id_product`, pl.`name`, p.`ean13`, p.`upc`, p.`active`, p.`reference`, m.`name` AS manufacturer_name, stock.`quantity`, product_shop.advanced_stock_management, p.`customizable`');
$sql->from('category_product', 'cp');
$sql->leftJoin('product', 'p', 'p.`id_product` = cp.`id_product`');
$sql->join(Shop::addSqlAssociation('product', 'p'));
@@ -3324,6 +3348,8 @@ class ProductCore extends ObjectModel
$sql->leftJoin('manufacturer', 'm', 'm.`id_manufacturer` = p.`id_manufacturer`');
$where = 'pl.`name` LIKE \'%'.pSQL($query).'%\'
OR p.`ean13` LIKE \'%'.pSQL($query).'%\'
OR p.`upc` LIKE \'%'.pSQL($query).'%\'
OR p.`reference` LIKE \'%'.pSQL($query).'%\'
OR p.`supplier_reference` LIKE \'%'.pSQL($query).'%\'
OR p.`id_product` IN (SELECT id_product FROM '._DB_PREFIX_.'product_supplier sp WHERE `product_supplier_reference` LIKE \'%'.pSQL($query).'%\')';
@@ -3577,6 +3603,7 @@ class ProductCore extends ObjectModel
if ($result3)
{
$result3['id_feature_value'] = $new_id_feature_value;
$result3['value'] = pSQL($result3['value']);
$return &= Db::getInstance()->insert('feature_value_lang', $result3);
}
}
@@ -4286,19 +4313,25 @@ class ProductCore extends ObjectModel
public function checkAccess($id_customer)
{
if (!$id_customer)
return (bool)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
SELECT ctg.`id_group`
FROM `'._DB_PREFIX_.'category_product` cp
INNER JOIN `'._DB_PREFIX_.'category_group` ctg ON (ctg.`id_category` = cp.`id_category`)
WHERE cp.`id_product` = '.(int)$this->id.' AND ctg.`id_group` ='.(int)Group::getCurrent()->id);
else
return (bool)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
SELECT cg.`id_group`
FROM `'._DB_PREFIX_.'category_product` cp
INNER JOIN `'._DB_PREFIX_.'category_group` ctg ON (ctg.`id_category` = cp.`id_category`)
INNER JOIN `'._DB_PREFIX_.'customer_group` cg ON (cg.`id_group` = ctg.`id_group`)
WHERE cp.`id_product` = '.(int)$this->id.' AND cg.`id_customer` = '.(int)$id_customer);
$cache_id = 'Product::checkAccess_'.(int)$this->id.'-'.(int)$id_customer.(!$id_customer ? '-'.(int)Group::getCurrent()->id : '');
if (!Cache::isStored($cache_id))
{
if (!$id_customer)
$result = (bool)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
SELECT ctg.`id_group`
FROM `'._DB_PREFIX_.'category_product` cp
INNER JOIN `'._DB_PREFIX_.'category_group` ctg ON (ctg.`id_category` = cp.`id_category`)
WHERE cp.`id_product` = '.(int)$this->id.' AND ctg.`id_group` = '.(int)Group::getCurrent()->id);
else
$result = (bool)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
SELECT cg.`id_group`
FROM `'._DB_PREFIX_.'category_product` cp
INNER JOIN `'._DB_PREFIX_.'category_group` ctg ON (ctg.`id_category` = cp.`id_category`)
INNER JOIN `'._DB_PREFIX_.'customer_group` cg ON (cg.`id_group` = ctg.`id_group`)
WHERE cp.`id_product` = '.(int)$this->id.' AND cg.`id_customer` = '.(int)$id_customer);
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
@@ -4858,8 +4891,12 @@ class ProductCore extends ObjectModel
*/
public static function getAttributesParams($id_product, $id_product_attribute)
{
$id_lang = (int)Context::getContext()->language->id;
$id_shop = (int)Context::getContext()->shop->id;
$cache_id = 'Product::getAttributesParams_'.(int)$id_product.'-'.(int)$id_product_attribute.'-'.(int)$id_lang.'-'.(int)$id_shop;
// if blocklayered module is installed we check if user has set custom attribute name
if (Module::isInstalled('blocklayered'))
if (Module::isInstalled('blocklayered') && Module::isEnabled('blocklayered'))
{
$nb_custom_values = Db::getInstance()->executeS('
SELECT DISTINCT la.`id_attribute`, la.`url_name` as `name`
@@ -4870,7 +4907,7 @@ class ProductCore extends ObjectModel
ON (pac.`id_product_attribute` = pa.`id_product_attribute`)
'.Shop::addSqlAssociation('product_attribute', 'pa').'
LEFT JOIN `'._DB_PREFIX_.'layered_indexable_attribute_lang_value` la
ON (la.`id_attribute` = a.`id_attribute` AND la.`id_lang` = '.(int)Context::getContext()->language->id.')
ON (la.`id_attribute` = a.`id_attribute` AND la.`id_lang` = '.(int)$id_lang.')
WHERE la.`url_name` IS NOT NULL AND la.`url_name` != \'\'
AND pa.`id_product` = '.(int)$id_product.'
AND pac.`id_product_attribute` = '.(int)$id_product_attribute);
@@ -4888,7 +4925,7 @@ class ProductCore extends ObjectModel
LEFT JOIN `'._DB_PREFIX_.'attribute` a
ON (a.`id_attribute_group` = g.`id_attribute_group`)
WHERE a.`id_attribute` = '.(int)$attribute['id_attribute'].'
AND g.`id_lang` = '.(int)Context::getContext()->language->id.'
AND g.`id_lang` = '.(int)$id_lang.'
AND g.`url_name` IS NOT NULL AND g.`url_name` != \'\'');
if (empty($group))
{
@@ -4898,7 +4935,7 @@ class ProductCore extends ObjectModel
LEFT JOIN `'._DB_PREFIX_.'attribute` a
ON (a.`id_attribute_group` = g.`id_attribute_group`)
WHERE a.`id_attribute` = '.(int)$attribute['id_attribute'].'
AND g.`id_lang` = '.(int)Context::getContext()->language->id.'
AND g.`id_lang` = '.(int)$id_lang.'
AND g.`name` IS NOT NULL');
}
$result[] = array_merge($attribute, $group[0]);
@@ -4907,9 +4944,9 @@ class ProductCore extends ObjectModel
SELECT DISTINCT a.`id_attribute_group`, al.`name`, agl.`name` as `group`
FROM `'._DB_PREFIX_.'attribute` a
LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al
ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)Context::getContext()->language->id.')
ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl
ON (a.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)Context::getContext()->language->id.')
ON (a.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac
ON (a.`id_attribute` = pac.`id_attribute`)
LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa
@@ -4918,45 +4955,30 @@ class ProductCore extends ObjectModel
WHERE pa.`id_product` = '.(int)$id_product.'
AND pac.id_product_attribute = '.(int)$id_product_attribute.'
AND a.`id_attribute` NOT IN('.implode(', ', $tab_id_attribute).')');
$result = array_merge($values_not_custom, $result);
}
else
{
$result = Db::getInstance()->executeS('
SELECT al.`name`, agl.`name` as `group`
FROM `'._DB_PREFIX_.'attribute` a
LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al
ON (al.`id_attribute` = a.`id_attribute` AND al.`id_lang` = '.(int)Context::getContext()->language->id.')
LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac
ON (pac.`id_attribute` = a.`id_attribute`)
LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa
ON (pa.`id_product_attribute` = pac.`id_product_attribute`)
'.Shop::addSqlAssociation('product_attribute', 'pa').'
LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl
ON (a.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)Context::getContext()->language->id.')
WHERE pa.`id_product` = '.(int)$id_product.'
AND pac.`id_product_attribute` = '.(int)$id_product_attribute.'
AND agl.`id_lang` = '.(int)Context::getContext()->language->id);
return array_merge($values_not_custom, $result);
}
}
else
if (!Cache::isStored($cache_id))
{
$result = Db::getInstance()->executeS('
SELECT al.`name`, agl.`name` as `group`
FROM `'._DB_PREFIX_.'attribute` a
LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al
ON (al.`id_attribute` = a.`id_attribute` AND al.`id_lang` = '.(int)Context::getContext()->language->id.')
ON (al.`id_attribute` = a.`id_attribute` AND al.`id_lang` = '.(int)$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac
ON (pac.`id_attribute` = a.`id_attribute`)
LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa
ON (pa.`id_product_attribute` = pac.`id_product_attribute`)
'.Shop::addSqlAssociation('product_attribute', 'pa').'
LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl
ON (a.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)Context::getContext()->language->id.')
ON (a.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)$id_lang.')
WHERE pa.`id_product` = '.(int)$id_product.'
AND pac.`id_product_attribute` = '.(int)$id_product_attribute.'
AND agl.`id_lang` = '.(int)Context::getContext()->language->id);
AND agl.`id_lang` = '.(int)$id_lang);
Cache::store($cache_id, $result);
}
$result = Cache::retrieve($cache_id);
return $result;
}

View File

@@ -74,11 +74,21 @@ class ProductSaleCore
$groups = FrontController::getCurrentCustomerGroups();
$sql_groups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1');
$interval = Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20;
//Subquery: get product ids in a separate query to (greatly!) improve performances and RAM usage
$sql = 'SELECT cp.`id_product`
FROM `'._DB_PREFIX_.'category_group` cg
LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
WHERE cg.`id_group` '.$sql_groups;
$products = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
$ids = array();
foreach ($products as $product)
$ids[$product['id_product']] = 1;
$ids = array_keys($ids);
sort($ids);
$ids = count($ids) > 0 ? implode(',', $ids) : 'NULL';
$prefix = '';
if ($order_by == 'date_add')
$prefix = 'p.';
//Main query
$sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity,
pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`,
pl.`meta_keywords`, pl.`meta_title`, pl.`name`,
@@ -103,13 +113,8 @@ class ProductSaleCore
LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`)
'.Product::sqlStock('p').'
WHERE product_shop.`active` = 1
AND product_shop.`visibility` != \'none\'
AND p.`id_product` IN (
SELECT cp.`id_product`
FROM `'._DB_PREFIX_.'category_group` cg
LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
WHERE cg.`id_group` '.$sql_groups.'
)
AND p.`visibility` != \'none\'
AND p.`id_product` IN ('.$ids.')
GROUP BY product_shop.id_product
ORDER BY '.(!empty($order_table) ? '`'.pSQL($order_table).'`.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way).'
LIMIT '.(int)($page_number * $nb_products).', '.(int)$nb_products;
@@ -141,11 +146,27 @@ class ProductSaleCore
$groups = FrontController::getCurrentCustomerGroups();
$sql_groups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1');
//Subquery: get product ids in a separate query to (greatly!) improve performances and RAM usage
$sql = 'SELECT cp.`id_product`
FROM `'._DB_PREFIX_.'category_group` cg
LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
WHERE cg.`id_group` '.$sql_groups.' AND cp.`id_product` IS NOT NULL';
$products = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
$ids = array();
foreach ($products as $product)
$ids[$product['id_product']] = 1;
$ids = array_keys($ids);
sort($ids);
$ids = count($ids) > 0 ? implode(',', $ids) : 'NULL';
//Main query
$sql = 'SELECT p.id_product, pl.`link_rewrite`, pl.`name`, pl.`description_short`, MAX(image_shop.`id_image`) id_image, il.`legend`,
ps.`quantity` AS sales, p.`ean13`, p.`upc`, cl.`link_rewrite` AS category
ps.`quantity` AS sales, p.`ean13`, p.`upc`, cl.`link_rewrite` AS category, p.show_price, p.available_for_order, p.quantity, p.customizable,
IFNULL(pa.minimal_quantity, p.minimal_quantity) as minimal_quantity, p.out_of_stock
FROM `'._DB_PREFIX_.'product_sale` ps
LEFT JOIN `'._DB_PREFIX_.'product` p ON ps.`id_product` = p.`id_product`
'.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (ps.`id_product` = pa.`id_product` AND pa.default_on = 1)
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
ON p.`id_product` = pl.`id_product`
AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').'
@@ -156,16 +177,12 @@ class ProductSaleCore
ON cl.`id_category` = product_shop.`id_category_default`
AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').'
WHERE product_shop.`active` = 1
AND product_shop.`visibility` != \'none\'
AND p.`id_product` IN (
SELECT cp.`id_product`
FROM `'._DB_PREFIX_.'category_group` cg
LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
WHERE cg.`id_group` '.$sql_groups.'
)
AND p.`visibility` != \'none\'
AND p.`id_product` IN ('.$ids.')
GROUP BY product_shop.id_product
ORDER BY sales DESC
LIMIT '.(int)($page_number * $nb_products).', '.(int)$nb_products;
if (!$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql))
return false;
@@ -173,6 +190,13 @@ class ProductSaleCore
{
$row['link'] = $context->link->getProductLink($row['id_product'], $row['link_rewrite'], $row['category'], $row['ean13']);
$row['id_image'] = Product::defineProductImage($row, $id_lang);
$row['allow_oosp'] = Product::isAvailableWhenOutOfStock($row['out_of_stock']);
$row['price_tax_exc'] = Product::getPriceStatic(
(int)$row['id_product'],
false,
((isset($row['id_product_attribute']) && !empty($row['id_product_attribute'])) ? (int)$row['id_product_attribute'] : null),
(Product::$_taxCalculationMethod == PS_TAX_EXC ? 2 : 6)
);
}
return $result;
}

View File

@@ -139,21 +139,22 @@ class ReferrerCore extends ObjectModel
}
$sql = 'SELECT COUNT(DISTINCT cs.id_connections_source) AS visits,
COUNT(DISTINCT cs.id_connections) as visitors,
COUNT(DISTINCT c.id_guest) as uniqs,
COUNT(DISTINCT cp.time_start) as pages
FROM '._DB_PREFIX_.'referrer_cache rc
LEFT JOIN '._DB_PREFIX_.'referrer r ON rc.id_referrer = r.id_referrer
LEFT JOIN '._DB_PREFIX_.'referrer_shop rs ON r.id_referrer = rs.id_referrer
LEFT JOIN '._DB_PREFIX_.'connections_source cs ON rc.id_connections_source = cs.id_connections_source
LEFT JOIN '._DB_PREFIX_.'connections c ON cs.id_connections = c.id_connections
LEFT JOIN '._DB_PREFIX_.'connections_page cp ON cp.id_connections = c.id_connections
'.$join.'
WHERE cs.date_add BETWEEN '.ModuleGraph::getDateBetween($employee).'
'.Shop::addSqlRestriction(false, 'rs').'
'.Shop::addSqlRestriction(false, 'c').'
AND rc.id_referrer = '.(int)$this->id
.$where;
COUNT(DISTINCT cs.id_connections) as visitors,
COUNT(DISTINCT c.id_guest) as uniqs,
COUNT(DISTINCT cp.time_start) as pages
FROM '._DB_PREFIX_.'referrer_cache rc
LEFT JOIN '._DB_PREFIX_.'referrer r ON rc.id_referrer = r.id_referrer
LEFT JOIN '._DB_PREFIX_.'referrer_shop rs ON r.id_referrer = rs.id_referrer
LEFT JOIN '._DB_PREFIX_.'connections_source cs ON rc.id_connections_source = cs.id_connections_source
LEFT JOIN '._DB_PREFIX_.'connections c ON cs.id_connections = c.id_connections
LEFT JOIN '._DB_PREFIX_.'connections_page cp ON cp.id_connections = c.id_connections
'.$join.'
WHERE 1'.
((isset($employee->stats_date_from) && isset($employee->stats_date_from))? ' AND cs.date_add BETWEEN \''.pSQL($employee->stats_date_from).' 00:00:00\' AND \''.pSQL($employee->stats_date_to).' 23:59:59\'' : '').
Shop::addSqlRestriction(false, 'rs').
Shop::addSqlRestriction(false, 'c').
' AND rc.id_referrer = '.(int)$this->id.
$where;
return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql);
}
@@ -314,6 +315,7 @@ class ReferrerCore extends ObjectModel
FROM '._DB_PREFIX_.'referrer r
LEFT JOIN '._DB_PREFIX_.'connections_source cs ON ('.self::$_join.')
WHERE id_referrer = '.(int)$row['id_referrer'].'
AND id_connections_source IS NOT NULL
)');
}
}

View File

@@ -94,7 +94,7 @@ class SpecificPriceCore extends ObjectModel
if (parent::add($autodate, $nullValues))
{
// Flush cache when we adding a new specific price
self::$_specificPriceCache = array();
SpecificPrice::$_specificPriceCache = array();
Product::flushPriceCache();
// Set cache of feature detachable to true
Configuration::updateGlobalValue('PS_SPECIFIC_PRICE_FEATURE_ACTIVE', '1');
@@ -108,7 +108,7 @@ class SpecificPriceCore extends ObjectModel
if (parent::update($null_values))
{
// Flush cache when we updating a new specific price
self::$_specificPriceCache = array();
SpecificPrice::$_specificPriceCache = array();
Product::flushPriceCache();
return true;
}
@@ -120,7 +120,7 @@ class SpecificPriceCore extends ObjectModel
if (parent::delete())
{
// Flush cache when we deletind a new specific price
self::$_specificPriceCache = array();
SpecificPrice::$_specificPriceCache = array();
Product::flushPriceCache();
// Refresh cache of feature detachable
Configuration::updateGlobalValue('PS_SPECIFIC_PRICE_FEATURE_ACTIVE', SpecificPrice::isCurrentlyUsed($this->def['table']));
@@ -180,9 +180,9 @@ class SpecificPriceCore extends ObjectModel
if (!SpecificPrice::isFeatureActive())
return explode(';', Configuration::get('PS_SPECIFIC_PRICE_PRIORITIES'));
if (!isset(self::$_cache_priorities[(int)$id_product]))
if (!isset(SpecificPrice::$_cache_priorities[(int)$id_product]))
{
self::$_cache_priorities[(int)$id_product] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
SpecificPrice::$_cache_priorities[(int)$id_product] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
SELECT `priority`, `id_specific_price_priority`
FROM `'._DB_PREFIX_.'specific_price_priority`
WHERE `id_product` = '.(int)$id_product.'
@@ -190,7 +190,7 @@ class SpecificPriceCore extends ObjectModel
');
}
$priority = self::$_cache_priorities[(int)$id_product];
$priority = SpecificPrice::$_cache_priorities[(int)$id_product];
if (!$priority)
$priority = Configuration::get('PS_SPECIFIC_PRICE_PRIORITIES');
@@ -209,11 +209,11 @@ class SpecificPriceCore extends ObjectModel
*/
$key = ((int)$id_product.'-'.(int)$id_shop.'-'.(int)$id_currency.'-'.(int)$id_country.'-'.(int)$id_group.'-'.(int)$quantity.'-'.(int)$id_product_attribute.'-'.(int)$id_cart.'-'.(int)$id_customer.'-'.(int)$real_quantity);
if (!array_key_exists($key, self::$_specificPriceCache))
if (!array_key_exists($key, SpecificPrice::$_specificPriceCache))
{
$now = date('Y-m-d H:i:s');
self::$_specificPriceCache[$key] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
SELECT *, '.SpecificPrice::_getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_customer).'
$query = '
SELECT *, '.SpecificPrice::_getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_customer).'
FROM `'._DB_PREFIX_.'specific_price`
WHERE `id_product` IN (0, '.(int)$id_product.')
AND `id_product_attribute` IN (0, '.(int)$id_product_attribute.')
@@ -228,11 +228,22 @@ class SpecificPriceCore extends ObjectModel
AND
(`to` = \'0000-00-00 00:00:00\' OR \''.$now.'\' <= `to`)
)
AND id_cart IN (0, '.(int)$id_cart.')'.
(($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION')) ? ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')' : 'AND `from_quantity` <= '.max(1, (int)$real_quantity)).'
ORDER BY `id_product_attribute` DESC, `from_quantity` DESC, `id_specific_price_rule` ASC, `score` DESC');
AND id_cart IN (0, '.(int)$id_cart.') ';
if ($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION'))
$query .= ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')';
else
{
$qty_to_use = $id_cart ? (int)$quantity : (int)$real_quantity;
$query .= 'AND `from_quantity` <= '.max(1, $qty_to_use);
}
$query .= ' ORDER BY `id_product_attribute` DESC, `from_quantity` DESC, `id_specific_price_rule` ASC, `score` DESC';
SpecificPrice::$_specificPriceCache[$key] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($query);
}
return self::$_specificPriceCache[$key];
return SpecificPrice::$_specificPriceCache[$key];
}
public static function setPriorities($priorities)

View File

@@ -80,13 +80,19 @@ class StateCore extends ObjectModel
*/
public static function getNameById($id_state)
{
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
SELECT `name`
FROM `'._DB_PREFIX_.'state`
WHERE `id_state` = '.(int)$id_state
);
return $result['name'];
if (!$id_state)
return false;
$cache_id = 'State::getNameById_'.(int)$id_state;
if (!Cache::isStored($cache_id))
{
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
SELECT `name`
FROM `'._DB_PREFIX_.'state`
WHERE `id_state` = '.(int)$id_state
);
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**
@@ -97,13 +103,19 @@ class StateCore extends ObjectModel
*/
public static function getIdByName($state)
{
$result = Db::getInstance()->getValue('
SELECT `id_state`
FROM `'._DB_PREFIX_.'state`
WHERE `name` LIKE \''.pSQL($state).'\'
');
return (int)$result;
if (empty($state))
return false;
$cache_id = 'State::getNameById_'.pSQL($state);
if (!Cache::isStored($cache_id))
{
$result = (int)Db::getInstance()->getValue('
SELECT `id_state`
FROM `'._DB_PREFIX_.'state`
WHERE `name` LIKE \''.pSQL($state).'\'
');
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**

View File

@@ -190,14 +190,20 @@ class TabCore extends ObjectModel
*/
public static function getTab($id_lang, $id_tab)
{
/* Tabs selection */
return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
SELECT *
FROM `'._DB_PREFIX_.'tab` t
LEFT JOIN `'._DB_PREFIX_.'tab_lang` tl
ON (t.`id_tab` = tl.`id_tab` AND tl.`id_lang` = '.(int)$id_lang.')
WHERE t.`id_tab` = '.(int)$id_tab
);
$cache_id = 'Tab::getTab_'.(int)$id_lang.'-'.(int)$id_tab;
if (!Cache::isStored($cache_id))
{
/* Tabs selection */
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
SELECT *
FROM `'._DB_PREFIX_.'tab` t
LEFT JOIN `'._DB_PREFIX_.'tab_lang` tl
ON (t.`id_tab` = tl.`id_tab` AND tl.`id_lang` = '.(int)$id_lang.')
WHERE t.`id_tab` = '.(int)$id_tab
);
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**

View File

@@ -105,7 +105,7 @@ class TagCore extends ObjectModel
{
if (!Validate::isGenericName($tag))
return false;
$tag = trim(substr($tag, 0, self::$definition['fields']['name']['size']));
$tag = trim(Tools::substr($tag, 0, self::$definition['fields']['name']['size']));
$tag_obj = new Tag(null, $tag, (int)$id_lang);
/* Tag does not exist in database */

View File

@@ -346,27 +346,20 @@ class ToolsCore
/* Automatically detect language if not already defined, detect_language is set in Cookie::update */
if ((!$cookie->id_lang || isset($cookie->detect_language)) && isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
{
$array = explode(',', Tools::strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']));
if (Tools::strlen($array[0]) > 2)
$array = explode(',', Tools::strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']));
$string = $array[0];
if (Validate::isLanguageCode($string))
{
$tab = explode('-', $array[0]);
$string = $tab[0];
}
else
$string = $array[0];
if (Validate::isLanguageIsoCode($string))
{
$lang = new Language(Language::getIdByIso($string));
if (Validate::isLoadedObject($lang) && $lang->active)
{
$language = new Language((int)$lang->id);
if (Validate::isLoadedObject($language))
Context::getContext()->language = $language;
$lang = Language::getLanguageByIETFCode($string);
if (Validate::isLoadedObject($lang) && $lang->active && $lang->isAssociatedToShop())
{
Context::getContext()->language = $lang;
$cookie->id_lang = (int)$lang->id;
}
}
}
}
if (isset($cookie->detect_language))
unset($cookie->detect_language);
@@ -376,7 +369,7 @@ class ToolsCore
$iso = Language::getIsoById((int)$cookie->id_lang);
@include_once(_PS_THEME_DIR_.'lang/'.$iso.'.php');
return $iso;
}
@@ -526,9 +519,9 @@ class ToolsCore
case 4:
$ret = number_format($price, $c_decimals, '.', ',').$blank.$c_char;
break;
/* 0'000.00 X Added for the switzerland currency */
/* X 0'000.00 Added for the switzerland currency */
case 5:
$ret = number_format($price, $c_decimals, '.', "'").$blank.$c_char;
$ret = $c_char.$blank.number_format($price, $c_decimals, '.', "'");
break;
}
if ($is_negative)
@@ -675,21 +668,26 @@ class ToolsCore
{
if (is_array($string))
return array_map(array('Tools', 'htmlentitiesUTF8'), $string);
return htmlentities((string)$string, $type, 'utf-8');
}
public static function htmlentitiesDecodeUTF8($string)
{
if (is_array($string))
return array_map(array('Tools', 'htmlentitiesDecodeUTF8'), $string);
{
$string = array_map(array('Tools', 'htmlentitiesDecodeUTF8'), $string);
return (string)array_shift($string);
}
return html_entity_decode((string)$string, ENT_QUOTES, 'utf-8');
}
public static function safePostVars()
{
if (!is_array($_POST))
return array();
$_POST = array_map(array('Tools', 'htmlentitiesUTF8'), $_POST);
if (!isset($_POST) || !is_array($_POST))
$_POST = array();
else
$_POST = array_map(array('Tools', 'htmlentitiesUTF8'), $_POST);
}
/**
@@ -718,6 +716,21 @@ class ToolsCore
}
return false;
}
/**
* Delete file
*
* @param string File path
* @param array Excluded files
*/
public static function deleteFile($file, $exclude_files = array())
{
if (isset($exclude_files) && !is_array($exclude_files))
$exclude_files = array($exclude_files);
if (file_exists($file) && is_file($file) && array_search(basename($file), $exclude_files) === FALSE)
unlink($file);
}
/**
* Clear smarty cache folders
@@ -1091,63 +1104,94 @@ class ToolsCore
/* One source among others:
http://www.tachyonsoft.com/uc0000.htm
http://www.tachyonsoft.com/uc0001.htm
http://www.tachyonsoft.com/uc0004.htm
*/
$patterns = array(
/* Lowercase */
/* a */ '/[\x{00E0}\x{00E1}\x{00E2}\x{00E3}\x{00E4}\x{00E5}\x{0101}\x{0103}\x{0105}]/u',
/* c */ '/[\x{00E7}\x{0107}\x{0109}\x{010D}]/u',
/* d */ '/[\x{010F}\x{0111}]/u',
/* e */ '/[\x{00E8}\x{00E9}\x{00EA}\x{00EB}\x{0113}\x{0115}\x{0117}\x{0119}\x{011B}]/u',
/* g */ '/[\x{011F}\x{0121}\x{0123}]/u',
/* h */ '/[\x{0125}\x{0127}]/u',
/* i */ '/[\x{00EC}\x{00ED}\x{00EE}\x{00EF}\x{0129}\x{012B}\x{012D}\x{012F}\x{0131}]/u',
/* j */ '/[\x{0135}]/u',
/* k */ '/[\x{0137}\x{0138}]/u',
/* l */ '/[\x{013A}\x{013C}\x{013E}\x{0140}\x{0142}]/u',
/* n */ '/[\x{00F1}\x{0144}\x{0146}\x{0148}\x{0149}\x{014B}]/u',
/* o */ '/[\x{00F2}\x{00F3}\x{00F4}\x{00F5}\x{00F6}\x{00F8}\x{014D}\x{014F}\x{0151}]/u',
/* r */ '/[\x{0155}\x{0157}\x{0159}]/u',
/* s */ '/[\x{015B}\x{015D}\x{015F}\x{0161}]/u',
/* ss*/ '/[\x{00DF}]/u',
/* t */ '/[\x{0163}\x{0165}\x{0167}]/u',
/* u */ '/[\x{00F9}\x{00FA}\x{00FB}\x{00FC}\x{0169}\x{016B}\x{016D}\x{016F}\x{0171}\x{0173}]/u',
/* w */ '/[\x{0175}]/u',
/* y */ '/[\x{00FF}\x{0177}\x{00FD}]/u',
/* z */ '/[\x{017A}\x{017C}\x{017E}]/u',
/* ae*/ '/[\x{00E6}]/u',
/* oe*/ '/[\x{0153}]/u',
/* a */ '/[\x{00E0}\x{00E1}\x{00E2}\x{00E3}\x{00E4}\x{00E5}\x{0101}\x{0103}\x{0105}\x{0430}]/u',
/* b */ '/[\x{0431}]/u',
/* c */ '/[\x{00E7}\x{0107}\x{0109}\x{010D}\x{0446}]/u',
/* d */ '/[\x{010F}\x{0111}\x{0434}]/u',
/* e */ '/[\x{00E8}\x{00E9}\x{00EA}\x{00EB}\x{0113}\x{0115}\x{0117}\x{0119}\x{011B}\x{0435}\x{044D}]/u',
/* f */ '/[\x{0444}]/u',
/* g */ '/[\x{011F}\x{0121}\x{0123}\x{0433}\x{0491}]/u',
/* h */ '/[\x{0125}\x{0127}]/u',
/* i */ '/[\x{00EC}\x{00ED}\x{00EE}\x{00EF}\x{0129}\x{012B}\x{012D}\x{012F}\x{0131}\x{0438}\x{0456}]/u',
/* j */ '/[\x{0135}\x{0439}]/u',
/* k */ '/[\x{0137}\x{0138}\x{043A}]/u',
/* l */ '/[\x{013A}\x{013C}\x{013E}\x{0140}\x{0142}\x{043B}]/u',
/* m */ '/[\x{043C}]/u',
/* n */ '/[\x{00F1}\x{0144}\x{0146}\x{0148}\x{0149}\x{014B}\x{043D}]/u',
/* o */ '/[\x{00F2}\x{00F3}\x{00F4}\x{00F5}\x{00F6}\x{00F8}\x{014D}\x{014F}\x{0151}\x{043E}]/u',
/* p */ '/[\x{043F}]/u',
/* r */ '/[\x{0155}\x{0157}\x{0159}\x{0440}]/u',
/* s */ '/[\x{015B}\x{015D}\x{015F}\x{0161}\x{0441}]/u',
/* ss */ '/[\x{00DF}]/u',
/* t */ '/[\x{0163}\x{0165}\x{0167}\x{0442}]/u',
/* u */ '/[\x{00F9}\x{00FA}\x{00FB}\x{00FC}\x{0169}\x{016B}\x{016D}\x{016F}\x{0171}\x{0173}\x{0443}]/u',
/* v */ '/[\x{0432}]/u',
/* w */ '/[\x{0175}]/u',
/* y */ '/[\x{00FF}\x{0177}\x{00FD}\x{044B}]/u',
/* z */ '/[\x{017A}\x{017C}\x{017E}\x{0437}]/u',
/* ae */ '/[\x{00E6}]/u',
/* ch */ '/[\x{0447}]/u',
/* kh */ '/[\x{0445}]/u',
/* oe */ '/[\x{0153}]/u',
/* sh */ '/[\x{0448}]/u',
/* shh*/ '/[\x{0449}]/u',
/* ya */ '/[\x{044F}]/u',
/* ye */ '/[\x{0454}]/u',
/* yi */ '/[\x{0457}]/u',
/* yo */ '/[\x{0451}]/u',
/* yu */ '/[\x{044E}]/u',
/* zh */ '/[\x{0436}]/u',
/* Uppercase */
/* A */ '/[\x{0100}\x{0102}\x{0104}\x{00C0}\x{00C1}\x{00C2}\x{00C3}\x{00C4}\x{00C5}]/u',
/* C */ '/[\x{00C7}\x{0106}\x{0108}\x{010A}\x{010C}]/u',
/* D */ '/[\x{010E}\x{0110}]/u',
/* E */ '/[\x{00C8}\x{00C9}\x{00CA}\x{00CB}\x{0112}\x{0114}\x{0116}\x{0118}\x{011A}]/u',
/* G */ '/[\x{011C}\x{011E}\x{0120}\x{0122}]/u',
/* H */ '/[\x{0124}\x{0126}]/u',
/* I */ '/[\x{0128}\x{012A}\x{012C}\x{012E}\x{0130}]/u',
/* J */ '/[\x{0134}]/u',
/* K */ '/[\x{0136}]/u',
/* L */ '/[\x{0139}\x{013B}\x{013D}\x{0139}\x{0141}]/u',
/* N */ '/[\x{00D1}\x{0143}\x{0145}\x{0147}\x{014A}]/u',
/* O */ '/[\x{00D3}\x{014C}\x{014E}\x{0150}]/u',
/* R */ '/[\x{0154}\x{0156}\x{0158}]/u',
/* S */ '/[\x{015A}\x{015C}\x{015E}\x{0160}]/u',
/* T */ '/[\x{0162}\x{0164}\x{0166}]/u',
/* U */ '/[\x{00D9}\x{00DA}\x{00DB}\x{00DC}\x{0168}\x{016A}\x{016C}\x{016E}\x{0170}\x{0172}]/u',
/* W */ '/[\x{0174}]/u',
/* Y */ '/[\x{0176}]/u',
/* Z */ '/[\x{0179}\x{017B}\x{017D}]/u',
/* AE*/ '/[\x{00C6}]/u',
/* OE*/ '/[\x{0152}]/u');
/* A */ '/[\x{0100}\x{0102}\x{0104}\x{00C0}\x{00C1}\x{00C2}\x{00C3}\x{00C4}\x{00C5}\x{0410}]/u',
/* B */ '/[\x{0411}]]/u',
/* C */ '/[\x{00C7}\x{0106}\x{0108}\x{010A}\x{010C}\x{0426}]/u',
/* D */ '/[\x{010E}\x{0110}\x{0414}]/u',
/* E */ '/[\x{00C8}\x{00C9}\x{00CA}\x{00CB}\x{0112}\x{0114}\x{0116}\x{0118}\x{011A}\x{0415}\x{042D}]/u',
/* F */ '/[\x{0424}]/u',
/* G */ '/[\x{011C}\x{011E}\x{0120}\x{0122}\x{0413}\x{0490}]/u',
/* H */ '/[\x{0124}\x{0126}]/u',
/* I */ '/[\x{0128}\x{012A}\x{012C}\x{012E}\x{0130}\x{0418}\x{0406}]/u',
/* J */ '/[\x{0134}\x{0419}]/u',
/* K */ '/[\x{0136}\x{041A}]/u',
/* L */ '/[\x{0139}\x{013B}\x{013D}\x{0139}\x{0141}\x{041B}]/u',
/* M */ '/[\x{041C}]/u',
/* N */ '/[\x{00D1}\x{0143}\x{0145}\x{0147}\x{014A}\x{041D}]/u',
/* O */ '/[\x{00D3}\x{014C}\x{014E}\x{0150}\x{041E}]/u',
/* P */ '/[\x{041F}]/u',
/* R */ '/[\x{0154}\x{0156}\x{0158}\x{0420}]/u',
/* S */ '/[\x{015A}\x{015C}\x{015E}\x{0160}\x{0421}]/u',
/* T */ '/[\x{0162}\x{0164}\x{0166}\x{0422}]/u',
/* U */ '/[\x{00D9}\x{00DA}\x{00DB}\x{00DC}\x{0168}\x{016A}\x{016C}\x{016E}\x{0170}\x{0172}\x{0423}]/u',
/* V */ '/[\x{0412}]/u',
/* W */ '/[\x{0174}]/u',
/* Y */ '/[\x{0176}\x{042B}]/u',
/* Z */ '/[\x{0179}\x{017B}\x{017D}\x{0417}]/u',
/* AE */ '/[\x{00C6}]/u',
/* CH */ '/[\x{0427}]/u',
/* KH */ '/[\x{0425}]/u',
/* OE */ '/[\x{0152}]/u',
/* SH */ '/[\x{0428}]/u',
/* SHH*/ '/[\x{0429}]/u',
/* YA */ '/[\x{042F}]/u',
/* YE */ '/[\x{0404}]/u',
/* YI */ '/[\x{0407}]/u',
/* YO */ '/[\x{0401}]/u',
/* YU */ '/[\x{042E}]/u',
/* ZH */ '/[\x{0416}]/u');
// ö to oe
// å to aa
// ä to ae
$replacements = array(
'a', 'c', 'd', 'e', 'g', 'h', 'i', 'j', 'k', 'l', 'n', 'o', 'r', 's', 'ss', 't', 'u', 'y', 'w', 'z', 'ae', 'oe',
'A', 'C', 'D', 'E', 'G', 'H', 'I', 'J', 'K', 'L', 'N', 'O', 'R', 'S', 'T', 'U', 'Z', 'AE', 'OE'
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 'ss', 't', 'u', 'v', 'w', 'y', 'z', 'ae', 'ch', 'kh', 'oe', 'sh', 'shh', 'ya', 'ye', 'yi', 'yo', 'yu', 'zh',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'V', 'W', 'Y', 'Z', 'AE', 'CH', 'KH', 'OE', 'SH', 'SHH', 'YA', 'YE', 'YI', 'YO', 'YU', 'ZH'
);
return preg_replace($patterns, $replacements, $str);
@@ -1171,6 +1215,134 @@ class ToolsCore
return (utf8_encode(substr($str, 0, $max_length - Tools::strlen($suffix)).$suffix));
}
/*Copied from CakePHP String utility file*/
public static function truncateString($text, $length = 120, $options = array())
{
$default = array(
'ellipsis' => '...', 'exact' => true, 'html' => true
);
if (isset($options['ending']))
$default['ellipsis'] = $options['ending'];
elseif (!empty($options['html']) && Configure::read('App.encoding') === 'UTF-8')
$default['ellipsis'] = "\xe2\x80\xa6";
$options = array_merge($default, $options);
extract($options);
if ($html)
{
if (Tools::strlen(preg_replace('/<.*?>/', '', $text)) <= $length)
return $text;
$totalLength = Tools::strlen(strip_tags($ellipsis));
$openTags = array();
$truncate = '';
preg_match_all('/(<\/?([\w+]+)[^>]*>)?([^<>]*)/', $text, $tags, PREG_SET_ORDER);
foreach ($tags as $tag)
{
if (!preg_match('/img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param/s', $tag[2]))
{
if (preg_match('/<[\w]+[^>]*>/s', $tag[0]))
array_unshift($openTags, $tag[2]);
elseif (preg_match('/<\/([\w]+)[^>]*>/s', $tag[0], $closeTag))
{
$pos = array_search($closeTag[1], $openTags);
if ($pos !== false)
array_splice($openTags, $pos, 1);
}
}
$truncate .= $tag[1];
$contentLength = Tools::strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', ' ', $tag[3]));
if ($contentLength + $totalLength > $length)
{
$left = $length - $totalLength;
$entitiesLength = 0;
if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', $tag[3], $entities, PREG_OFFSET_CAPTURE))
{
foreach ($entities[0] as $entity)
{
if ($entity[1] + 1 - $entitiesLength <= $left)
{
$left--;
$entitiesLength += Tools::strlen($entity[0]);
}
else
break;
}
}
$truncate .= Tools::substr($tag[3], 0, $left + $entitiesLength);
break;
}
else
{
$truncate .= $tag[3];
$totalLength += $contentLength;
}
if ($totalLength >= $length)
break;
}
}
else
{
if (Tools::strlen($text) <= $length)
return $text;
$truncate = Tools::substr($text, 0, $length - Tools::strlen($ellipsis));
}
if (!$exact)
{
$spacepos = mb_strrpos($truncate, ' ');
if ($html)
{
$truncateCheck = Tools::substr($truncate, 0, $spacepos);
$lastOpenTag = Tools::strrpos($truncateCheck, '<');
$lastCloseTag = Tools::strrpos($truncateCheck, '>');
if ($lastOpenTag > $lastCloseTag)
{
preg_match_all('/<[\w]+[^>]*>/s', $truncate, $lastTagMatches);
$lastTag = array_pop($lastTagMatches[0]);
$spacepos = Tools::strrpos($truncate, $lastTag) + Tools::strlen($lastTag);
}
$bits = Tools::substr($truncate, $spacepos);
preg_match_all('/<\/([a-z]+)>/', $bits, $droppedTags, PREG_SET_ORDER);
if (!empty($droppedTags))
{
if (!empty($openTags))
{
foreach ($droppedTags as $closingTag)
if (!in_array($closingTag[1], $openTags))
array_unshift($openTags, $closingTag[1]);
}
else
{
foreach ($droppedTags as $closingTag)
$openTags[] = $closingTag[1];
}
}
}
$truncate = Tools::substr($truncate, 0, $spacepos);
}
$truncate .= $ellipsis;
if ($html)
foreach ($openTags as $tag)
$truncate .= '</' . $tag . '>';
return $truncate;
}
/**
* Generate date form
*
@@ -1269,6 +1441,13 @@ class ToolsCore
return substr($str, $start, ($length === false ? Tools::strlen($str) : (int)$length));
}
public static function strrpos($str, $find, $offset = 0, $encoding = 'utf-8')
{
if (function_exists('mb_strrpos'))
return mb_strrpos($str, $find, $offset, $encoding);
return strrpos($str, $find, $offset);
}
public static function ucfirst($str)
{
return Tools::strtoupper(Tools::substr($str, 0, 1)).Tools::substr($str, 1);
@@ -1676,13 +1855,15 @@ class ToolsCore
fwrite($write_fd, "# http://www.prestashop.com - http://www.prestashop.com/forums\n\n");
if ($disable_modsec)
fwrite($write_fd, "<IfModule mod_security.c>\nSecFilterEngine Off\nSecFilterScanPOST Off\n</IfModule>\n");
fwrite($write_fd, "<IfModule mod_security.c>\nSecFilterEngine Off\nSecFilterScanPOST Off\n</IfModule>\n\n");
// RewriteEngine
fwrite($write_fd, "<IfModule mod_rewrite.c>\n");
// Ensure HTTP_MOD_REWRITE variable is set in environment
fwrite($write_fd, "<IfModule mod_env.c>\n");
fwrite($write_fd, "SetEnv HTTP_MOD_REWRITE On\n");
fwrite($write_fd, "</IfModule>\n\n");
// Disable multiviews ?
if ($disable_multiviews)

View File

@@ -44,7 +44,7 @@ class ValidateCore
*/
public static function isEmail($email)
{
return !empty($email) && preg_match(Tools::cleanNonUnicodeSupport('/^[a-z\p{L}0-9!#$%&\'*+\/=?^`{}|~_-]+[.a-z\p{L}0-9!#$%&\'*+\/=?^`{}|~_-]*@[a-z\p{L}0-9]+[._a-z\p{L}0-9-]*\.[a-z0-9]+$/ui'), $email);
return !empty($email) && preg_match(Tools::cleanNonUnicodeSupport('/^[a-z\p{L}0-9!#$%&\'*+\/=?^`{}|~_-]+[.a-z\p{L}0-9!#$%&\'*+\/=?^`{}|~_-]*@[a-z\p{L}0-9]+[._a-z\p{L}0-9-]*\.[a-z\p{L}0-9]+$/ui'), $email);
}
/**
@@ -1067,4 +1067,4 @@ class ValidateCore
{
return (preg_match('/^[0-1]\.[0-9]{1,2}(\.[0-9]{1,2}){0,2}$/', $version) && ip2long($version));
}
}
}

View File

@@ -54,12 +54,18 @@ class ZoneCore extends ObjectModel
*/
public static function getZones($active = false)
{
return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT *
FROM `'._DB_PREFIX_.'zone`
'.($active ? 'WHERE active = 1' : '').'
ORDER BY `name` ASC
');
$cache_id = 'Zone::getZones_'.(bool)$active;
if (!Cache::isStored($cache_id))
{
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT *
FROM `'._DB_PREFIX_.'zone`
'.($active ? 'WHERE active = 1' : '').'
ORDER BY `name` ASC
');
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**

View File

@@ -153,6 +153,8 @@ class CacheMemcacheCore extends Cache
*/
protected function _writeKeys()
{
if (!$this->is_connected)
return false;
$this->memcache->set(_COOKIE_IV_, $this->keys);
}

View File

@@ -693,7 +693,7 @@ class AdminControllerCore extends Controller
$this->redirect_after = self::$currentIndex.'&conf=1&token='.$this->token;
$this->errors[] = Tools::displayError('An error occurred during deletion.');
if ($res)
Logger::addLog(sprintf($this->l('%s deletion'), $this->className), 1, null, $this->className, (int)$this->object->id, true, (int)$this->context->employee->id);
Logger::addLog(sprintf($this->l('%s deletion', 'AdminTab', false, false), $this->className), 1, null, $this->className, (int)$this->object->id, true, (int)$this->context->employee->id);
}
}
else
@@ -744,7 +744,7 @@ class AdminControllerCore extends Controller
/* voluntary do affectation here */
elseif (($_POST[$this->identifier] = $this->object->id) && $this->postImage($this->object->id) && !count($this->errors) && $this->_redirect)
{
Logger::addLog(sprintf($this->l('%s addition'), $this->className), 1, null, $this->className, (int)$this->object->id, true, (int)$this->context->employee->id);
Logger::addLog(sprintf($this->l('%s addition', 'AdminTab', false, false), $this->className), 1, null, $this->className, (int)$this->object->id, true, (int)$this->context->employee->id);
$parent_id = (int)Tools::getValue('id_parent', 1);
$this->afterAdd($this->object);
$this->updateAssoShop($this->object->id);
@@ -841,10 +841,10 @@ class AdminControllerCore extends Controller
$this->redirect_after = self::$currentIndex.'&'.$this->identifier.'='.$parent_id.'&conf=4&token='.$this->token;
// Default behavior (save and back)
if (empty($this->redirect_after))
if (empty($this->redirect_after) && $this->redirect_after !== false)
$this->redirect_after = self::$currentIndex.($parent_id ? '&'.$this->identifier.'='.$object->id : '').'&conf=4&token='.$this->token;
}
Logger::addLog(sprintf($this->l('%s edition'), $this->className), 1, null, $this->className, (int)$object->id, true, (int)$this->context->employee->id);
Logger::addLog(sprintf($this->l('%s edition', 'AdminTab', false, false), $this->className), 1, null, $this->className, (int)$object->id, true, (int)$this->context->employee->id);
}
else
$this->errors[] = Tools::displayError('An error occurred while updating an object.').
@@ -1542,12 +1542,14 @@ class AdminControllerCore extends Controller
if (!$this->isFresh(Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST, 86400))
file_put_contents(_PS_ROOT_DIR_.Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST, Tools::addonsRequest('native'));
libxml_use_internal_errors(true);
$country_module_list = file_get_contents(_PS_ROOT_DIR_.Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST);
if (!empty($country_module_list) && $country_module_list_xml = simplexml_load_string($country_module_list))
if (!empty($country_module_list) && is_string($country_module_list) && $country_module_list_xml = simplexml_load_string($country_module_list))
{
$country_module_list_array = array();
foreach ($country_module_list_xml->module as $k => $m)
$country_module_list_array[] = (string)$m->name;
if (is_array($country_module_list_xml->module))
foreach ($country_module_list_xml->module as $k => $m)
$country_module_list_array[] = (string)$m->name;
$this->tab_modules_list['slider_list'] = array_intersect($this->tab_modules_list['slider_list'], $country_module_list_array);
}
@@ -1940,7 +1942,10 @@ class AdminControllerCore extends Controller
$this->context->shop = new Shop(Configuration::get('PS_SHOP_DEFAULT'));
elseif ($this->context->shop->id != $shop_id)
$this->context->shop = new Shop($shop_id);
// Replace current default country
$this->context->country = new Country((int)Configuration::get('PS_COUNTRY_DEFAULT'));
$this->initBreadcrumbs();
}
@@ -2189,8 +2194,10 @@ class AdminControllerCore extends Controller
if (preg_match('/[.!]/', $order_by))
{
$order_by_split = preg_split('/[.!]/', $order_by);
$order_by = pSQL($order_by_split[0]).'.`'.pSQL($order_by_split[1]).'`';
$order_by = bqSQL($order_by_split[0]).'.`'.bqSQL($order_by_split[1]).'`';
}
elseif ($order_by)
$order_by = '`'.bqSQL($order_by).'`';
$this->_orderWay = Tools::strtoupper($order_way);
@@ -2284,7 +2291,7 @@ class AdminControllerCore extends Controller
(isset($this->_filter) ? $this->_filter : '').$where_shop.'
'.(isset($this->_group) ? $this->_group.' ' : '').'
'.$having_clause.'
ORDER BY '.(($order_by == $this->identifier) ? 'a.' : '').pSQL($order_by).' '.pSQL($order_way).
ORDER BY '.((str_replace('`', '', $order_by) == $this->identifier) ? 'a.' : '').$order_by.' '.pSQL($order_way).
($this->_tmpTableFilter ? ') tmpTable WHERE 1'.$this->_tmpTableFilter : '').
(($use_limit === true) ? ' LIMIT '.(int)$start.','.(int)$limit : '');
@@ -2336,22 +2343,20 @@ class AdminControllerCore extends Controller
public function getLanguages()
{
$cookie = $this->context->cookie;
$this->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0;
$this->allow_employee_form_lang = (int)Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG');
if ($this->allow_employee_form_lang && !$cookie->employee_form_lang)
$cookie->employee_form_lang = (int)Configuration::get('PS_LANG_DEFAULT');
$use_lang_from_cookie = false;
$lang_exists = false;
$this->_languages = Language::getLanguages(false);
if ($this->allow_employee_form_lang)
foreach ($this->_languages as $lang)
if ($cookie->employee_form_lang == $lang['id_lang'])
$use_lang_from_cookie = true;
if (!$use_lang_from_cookie)
$this->default_form_language = (int)Configuration::get('PS_LANG_DEFAULT');
else
$this->default_form_language = (int)$cookie->employee_form_lang;
foreach ($this->_languages as $lang)
if (isset($cookie->employee_form_lang) && $cookie->employee_form_lang == $lang['id_lang'])
$lang_exists = true;
$this->default_form_language = $lang_exists ? (int)$cookie->employee_form_lang : (int)Configuration::get('PS_LANG_DEFAULT');
foreach ($this->_languages as $k => $language)
$this->_languages[$k]['is_default'] = (int)($language['id_lang'] == $this->default_form_language);
$this->_languages[$k]['is_default'] = ((int)($language['id_lang'] == $this->default_form_language));
return $this->_languages;
}
@@ -2433,93 +2438,50 @@ class AdminControllerCore extends Controller
if (!$class_name)
$class_name = $this->className;
/* Class specific validation rules */
if (!empty($class_name))
$rules = call_user_func(array($class_name, 'getValidationRules'), $class_name);
$object = new $class_name();
if (isset($rules) && count($rules) && (count($rules['requiredLang']) || count($rules['sizeLang']) || count($rules['validateLang'])))
if (method_exists($this, 'getValidationRules'))
$definition = $this->getValidationRules();
else
$definition = ObjectModel::getDefinition($class_name);
$default_language = new Language((int)Configuration::get('PS_LANG_DEFAULT'));
foreach ($definition['fields'] as $field => $def)
{
/* Language() instance determined by default language */
$default_language = new Language((int)Configuration::get('PS_LANG_DEFAULT'));
$skip = array();
if (in_array($field, array('passwd', 'no-picture')))
$skip = array('required');
/* All availables languages */
$languages = Language::getLanguages(false);
if (isset($def['lang']) && $def['lang'] && isset($def['required']) && $def['required'])
{
$value = Tools::getValue($field.'_'.$default_language->id);
if (Tools::isEmpty($value))
$this->errors[$field.'_'.$default_language->id] = sprintf(
Tools::displayError('The field %1$s is required at least in %2$s.'),
$object->displayFieldName($field, $class_name),
$default_language->name
);
foreach (Language::getLanguages(false) as $language)
{
$value = Tools::getValue($field.'_'.$language['id_lang']);
if (!empty($value))
if (($error = $object->validateField($field, $value, $language['id_lang'], $skip, true)) !== true)
$this->errors[$field.'_'.$language['id_lang']] = $error;
}
}
else
if (($error = $object->validateField($field, Tools::getValue($field), null, $skip, true)) !== true)
$this->errors[$field] = $error;
}
/* Checking for required fields */
if (isset($rules['required']) && is_array($rules['required']))
foreach ($rules['required'] as $field)
if (($value = Tools::getValue($field)) == false && (string)$value != '0')
if (!Tools::getValue($this->identifier) || ($field != 'passwd' && $field != 'no-picture'))
$this->errors[$field] = sprintf(
Tools::displayError('The %s field is required.'),
call_user_func(array($class_name, 'displayFieldName'), $field, $class_name)
);
/* Checking for multilingual required fields */
if (isset($rules['requiredLang']) && is_array($rules['requiredLang']))
foreach ($rules['requiredLang'] as $field_lang)
if (($empty = Tools::getValue($field_lang.'_'.$default_language->id)) === false || $empty !== '0' && empty($empty))
$this->errors[$field_lang.'_'.$default_language->id] = sprintf(
Tools::displayError('The field %1$s is required at least in %2$s.'),
call_user_func(array($class_name, 'displayFieldName'), $field_lang, $class_name),
$default_language->name
);
/* Checking for maximum fields sizes */
if (isset($rules['size']) && is_array($rules['size']))
foreach ($rules['size'] as $field => $max_length)
if (Tools::getValue($field) !== false && Tools::strlen(Tools::getValue($field)) > $max_length)
$this->errors[$field] = sprintf(
Tools::displayError('The %1$s field is too long (%2$d chars max).'),
call_user_func(array($class_name, 'displayFieldName'), $field, $class_name),
$max_length
);
/* Checking for maximum multilingual fields size */
if (isset($rules['sizeLang']) && is_array($rules['sizeLang']))
foreach ($rules['sizeLang'] as $field_lang => $max_length)
foreach ($languages as $language)
{
$field_lang_value = Tools::getValue($field_lang.'_'.$language['id_lang']);
if ($field_lang_value !== false && Tools::strlen($field_lang_value) > $max_length)
$this->errors[$field_lang.'_'.$language['id_lang']] = sprintf(
Tools::displayError('The field %1$s (%2$s) is too long (%3$d chars max, html chars including).'),
call_user_func(array($class_name, 'displayFieldName'), $field_lang, $class_name),
$language['name'],
$max_length
);
}
/* Overload this method for custom checking */
$this->_childValidation();
/* Checking for fields validity */
if (isset($rules['validate']) && is_array($rules['validate']))
foreach ($rules['validate'] as $field => $function)
if (($value = Tools::getValue($field)) !== false && ($field != 'passwd'))
if (!Validate::$function($value) && !empty($value))
$this->errors[$field] = sprintf(
Tools::displayError('The %s field is invalid.'),
call_user_func(array($class_name, 'displayFieldName'), $field, $class_name)
);
/* Checking for passwd_old validity */
if (($value = Tools::getValue('passwd')) != false)
{
if ($class_name == 'Employee' && !Validate::isPasswdAdmin($value))
$this->errors['passwd'] = sprintf(
Tools::displayError('The %s field is invalid.'),
call_user_func(array($class_name, 'displayFieldName'), 'passwd', $class_name)
);
elseif ($class_name == 'Customer' && !Validate::isPasswd($value))
$this->errors['passwd'] = sprintf(
Tools::displayError('The %s field is invalid.'),
call_user_func(array($class_name, 'displayFieldName'), 'passwd', $class_name)
);
}
/* Checking for multilingual fields validity */
if (isset($rules['validateLang']) && is_array($rules['validateLang']))
if (isset($rules['validateLang']) && is_array($rules['validateLang']))
foreach ($rules['validateLang'] as $field_lang => $function)
foreach ($languages as $language)
if (($value = Tools::getValue($field_lang.'_'.$language['id_lang'])) !== false && !empty($value))
@@ -2811,7 +2773,7 @@ class AdminControllerCore extends Controller
}
if ($delete_ok)
Logger::addLog(sprintf($this->l('%s deletion'), $this->className), 1, null, $this->className, (int)$to_delete->id, true, (int)$this->context->employee->id);
Logger::addLog(sprintf($this->l('%s deletion', 'AdminTab', false, false), $this->className), 1, null, $this->className, (int)$to_delete->id, true, (int)$this->context->employee->id);
else
$this->errors[] = sprintf(Tools::displayError('Can\'t delete #%d'), $id);
}
@@ -3085,4 +3047,4 @@ class AdminControllerCore extends Controller
return $return;
}
}
}

View File

@@ -175,8 +175,8 @@ abstract class ControllerCore
// then using displayAjax[action]
if ($this->ajax)
{
$action = Tools::getValue('action');
if (!empty($action) && method_exists($this, 'displayAjax'.Tools::toCamelCase($action, true)))
$action = Tools::toCamelCase(Tools::getValue('action'), true);
if (!empty($action) && method_exists($this, 'displayAjax'.$action))
$this->{'displayAjax'.$action}();
elseif (method_exists($this, 'displayAjax'))
$this->displayAjax();
@@ -334,12 +334,14 @@ abstract class ControllerCore
}
}
else
{
$plugin_path = Media::getJqueryPluginPath($name, $folder);
if(!empty($plugin_path['css']))
$this->addCSS($plugin_path['css']);
if(!empty($plugin_path['js']))
$this->addJS($plugin_path['js']);
}
}
/**

View File

@@ -251,6 +251,8 @@ class FrontControllerCore extends Controller
$this->context->cart = $cart;
CartRule::autoAddToCart($this->context);
}
else
$this->context->cart = $cart;
/* get page name to display it in body id */
@@ -325,7 +327,7 @@ class FrontControllerCore extends Controller
'currencies' => Currency::getCurrencies(),
'languages' => $languages,
'meta_language' => implode('-', $meta_language),
'priceDisplay' => Product::getTaxCalculationMethod(),
'priceDisplay' => Product::getTaxCalculationMethod((int)$this->context->cookie->id_customer),
'add_prod_display' => (int)Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
'shop_name' => Configuration::get('PS_SHOP_NAME'),
'roundMode' => (int)Configuration::get('PS_PRICE_ROUND_MODE'),
@@ -578,6 +580,9 @@ class FrontControllerCore extends Controller
header('HTTP/1.1 503 temporarily overloaded');
$this->context->smarty->assign($this->initLogoAndFavicon());
$this->context->smarty->assign(array(
'HOOK_MAINTENANCE' => Hook::exec('displayMaintenance', array()),
));
$template_dir = ($this->context->getMobileDevice() == true ? _PS_THEME_MOBILE_DIR_ : _PS_THEME_DIR_);
$this->smartyOutputContent($template_dir.'maintenance.tpl');
@@ -845,7 +850,7 @@ class FrontControllerCore extends Controller
if (!is_numeric(Tools::getValue('p', 1)) || Tools::getValue('p', 1) < 0)
Tools::redirect(self::$link->getPaginationLink(false, false, $this->n, false, 1, false));
$current_url = tools::htmlentitiesUTF8($_SERVER['REQUEST_URI']);
$current_url = Tools::htmlentitiesUTF8($_SERVER['REQUEST_URI']);
//delete parameter page
$current_url = preg_replace('/(\?)?(&amp;)?p=\d+/', '$1', $current_url);
@@ -914,7 +919,7 @@ class FrontControllerCore extends Controller
$ips = array_map('trim', $ips);
if (is_array($ips) && count($ips))
foreach ($ips as $ip)
if (!empty($ip) && strpos($user_ip, $ip) === 0)
if (!empty($ip) && preg_match('/^'.$ip.'.*/', $user_ip))
$allowed = true;
return $allowed;
}

View File

@@ -523,13 +523,13 @@ abstract class DbCore
$this->last_cached = true;
return $result;
}
$this->result = $this->query($sql);
if (!$this->result)
return false;
$this->last_cached = false;
$result = $this->nextRow($this->result);
if (is_null($result))
$result = false;
if ($use_cache && $this->is_cache_enabled)
Cache::getInstance()->setQuery($sql, $result);
return $result;

View File

@@ -213,20 +213,18 @@ class HelperCore
$html = '
<script type="text/javascript">
var inputName = "'.$input_name.'";
';
var inputName = \''.addcslashes($input_name, '\'').'\';'."\n";
if (count($selected_cat) > 0)
{
if (isset($selected_cat[0]))
$html .= 'var selectedCat = "'.implode(',', $selected_cat).'";';
$html .= ' var selectedCat = '.(int)implode(',', $selected_cat).';'."\n";
else
$html .= 'var selectedCat = "'.implode(',', array_keys($selected_cat)).'";';
$html .= ' var selectedCat = '.(int)implode(',', array_keys($selected_cat)).';'."\n";
}
else
$html .= 'var selectedCat = "";';
$html .= '
var selectedLabel = \''.$translations['selected'].'\';
var home = \''.$root['name'].'\';
$html .= ' var selectedCat = \'\';'."\n";
$html .= ' var selectedLabel = \''.$translations['selected'].'\';
var home = \''.addcslashes($root['name'], '\'').'\';
var use_radio = '.(int)$use_radio.';';
if (!$use_in_popup)
$html .= '

View File

@@ -444,13 +444,13 @@ class HelperListCore extends Helper
self::$cache_lang['Delete'] = $this->l('Delete', 'Helper');
if (!array_key_exists('DeleteItem', self::$cache_lang))
self::$cache_lang['DeleteItem'] = $this->l('Delete selected item?', 'Helper');
self::$cache_lang['DeleteItem'] = $this->l('Delete selected item?', 'Helper', true, false);
if (!array_key_exists('Name', self::$cache_lang))
self::$cache_lang['Name'] = $this->l('Name:', 'Helper');
self::$cache_lang['Name'] = $this->l('Name:', 'Helper', true, false);
if (!is_null($name))
$name = '\n\n'.self::$cache_lang['Name'].' '.$name;
$name = addcslashes('\n\n'.self::$cache_lang['Name'].' '.$name, '\'');
$data = array(
$this->identifier => $id,
@@ -459,7 +459,7 @@ class HelperListCore extends Helper
);
if ($this->specificConfirmDelete !== false)
$data['confirm'] = !is_null($this->specificConfirmDelete) ? '\r'.$this->specificConfirmDelete : Tools::safeOutput(addcslashes(self::$cache_lang['DeleteItem'].$name, '\''));
$data['confirm'] = !is_null($this->specificConfirmDelete) ? '\r'.$this->specificConfirmDelete : Tools::safeOutput(self::$cache_lang['DeleteItem'].$name);
$tpl->assign(array_merge($this->tpl_delete_link_vars, $data));
@@ -513,7 +513,7 @@ class HelperListCore extends Helper
if (Tools::getIsset($this->table.'Orderby'))
$order = '&'.$this->table.'Orderby='.urlencode($this->orderBy).'&'.$this->table.'Orderway='.urlencode(strtolower($this->orderWay));
$action = $this->currentIndex.$identifier.'&token='.$token.$order.'#'.$this->table;
$action = $this->currentIndex.$identifier.'&token='.$token.'#'.$this->table;
/* Determine current page number */
$page = (int)Tools::getValue('submitFilter'.$this->list_id);

View File

@@ -203,7 +203,7 @@ abstract class ModuleCore
}
// Check PS version compliancy
if (version_compare(_PS_VERSION_, $this->ps_versions_compliancy['min']) < 0 || version_compare(_PS_VERSION_, $this->ps_versions_compliancy['max']) >= 0)
if (version_compare(_PS_VERSION_, $this->ps_versions_compliancy['min']) < 0 || version_compare(_PS_VERSION_, $this->ps_versions_compliancy['max']) > 0)
{
$this->_errors[] = $this->l('The version of your module is not compliant with your PrestaShop version.');
return false;
@@ -938,7 +938,7 @@ abstract class ModuleCore
public static function configXmlStringFormat($string)
{
return str_replace('\'', '\\\'', Tools::htmlentitiesDecodeUTF8($string));
return Tools::htmlentitiesDecodeUTF8($string);
}
@@ -1234,11 +1234,7 @@ abstract class ModuleCore
$module->interest = 0;
}
usort($module_list, create_function('$a,$b', '
if ($a->displayName == $b->displayName)
return 0;
return ($a->displayName < $b->displayName) ? -1 : 1;
'));
usort($module_list, create_function('$a,$b', 'return strnatcasecmp($a->displayName, $b->displayName);'));
if ($errors)
{
@@ -1262,7 +1258,7 @@ abstract class ModuleCore
$modules = scandir(_PS_MODULE_DIR_);
foreach ($modules as $name)
{
if (is_dir(_PS_MODULE_DIR_.$name) && Tools::file_exists_cache(_PS_MODULE_DIR_.$name.'/'.$name.'.php'))
if (is_dir(_PS_MODULE_DIR_.$name.DIRECTORY_SEPARATOR) && Tools::file_exists_cache(_PS_MODULE_DIR_.$name.'/'.$name.'.php'))
{
if (!Validate::isModuleName($name))
throw new PrestaShopException(sprintf('Module %s is not a valid module name', $name));
@@ -1297,6 +1293,26 @@ abstract class ModuleCore
return $db->executeS('SELECT * FROM `'._DB_PREFIX_.'module` m WHERE `name` NOT IN ('.implode(',', $arr_native_modules).') ');
}
public static function getNativeModuleList()
{
$module_list_xml = _PS_ROOT_DIR_.self::CACHE_FILE_MODULES_LIST;
if (!file_exists($module_list_xml))
return false;
$native_modules = simplexml_load_file($module_list_xml);
$native_modules = $native_modules->modules;
$modules = array();
foreach ($native_modules as $native_modules_type)
if (in_array($native_modules_type['type'], array('native', 'partner')))
{
foreach ($native_modules_type->module as $module)
$modules[] = $module['name'];
}
return $modules;
}
/**
* Return installed modules
*
@@ -1580,6 +1596,18 @@ abstract class ModuleCore
return Cache::retrieve('Module::isInstalled'.$module_name);
}
public function isEnabledForShopContext()
{
$shop_list = Shop::getContextListShopID();
return (bool)Db::getInstance()->getValue('
SELECT COUNT(*) n
FROM `'._DB_PREFIX_.'module_shop`
WHERE id_module='.(int)$this->id.' AND id_shop IN ('.implode(',', array_map('intval', Shop::getContextListShopID())).')
GROUP BY id_module
HAVING n='.(int)count(Shop::getContextListShopID())
);
}
public static function isEnabled($module_name)
{
if (!Cache::isStored('Module::isEnabled'.$module_name))
@@ -1757,6 +1785,7 @@ abstract class ModuleCore
@unlink($file);
@file_put_contents($file, $xml);
}
@chmod($file, 0664);
}
}
@@ -1835,7 +1864,13 @@ abstract class ModuleCore
*/
public static function getModuleIdByName($name)
{
return Db::getInstance()->getValue('SELECT `id_module` FROM `'._DB_PREFIX_.'module` WHERE `name` = "'.pSQL($name).'"');
$cache_id = 'Module::getModuleIdByName_'.pSQL($name);
if (!Cache::isStored($cache_id))
{
$result = (int)Db::getInstance()->getValue('SELECT `id_module` FROM `'._DB_PREFIX_.'module` WHERE `name` = "'.pSQL($name).'"');
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**
@@ -2082,7 +2117,7 @@ abstract class ModuleCore
// Remplacer la ligne de declaration par "remove"
foreach ($override_file as $line_number => &$line_content)
if (preg_match('/(public|private|protected)\s+(static\s+)?\$'.$property->getName().'/i', $line_content))
if (preg_match('/(public|private|protected|const)\s+(static\s+)?(\$)?'.$property->getName().'/i', $line_content))
{
$line_content = '#--remove--#';
break;

View File

@@ -721,11 +721,17 @@ class OrderCore extends ObjectModel
public static function getDiscountsCustomer($id_customer, $id_cart_rule)
{
return Db::getInstance()->getValue('
SELECT COUNT(*) FROM `'._DB_PREFIX_.'orders` o
LEFT JOIN '._DB_PREFIX_.'order_cart_rule ocr ON (ocr.id_order = o.id_order)
WHERE o.id_customer = '.(int)$id_customer.'
AND ocr.id_cart_rule = '.(int)$id_cart_rule);
$cache_id = 'Order::getDiscountsCustomer_'.(int)$id_customer.'-'.(int)$id_cart_rule;
if (!Cache::isStored($cache_id))
{
$result = (int)Db::getInstance()->getValue('
SELECT COUNT(*) FROM `'._DB_PREFIX_.'orders` o
LEFT JOIN '._DB_PREFIX_.'order_cart_rule ocr ON (ocr.id_order = o.id_order)
WHERE o.id_customer = '.(int)$id_customer.'
AND ocr.id_cart_rule = '.(int)$id_cart_rule);
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**
@@ -1086,6 +1092,41 @@ class OrderCore extends ObjectModel
');
}
public static function setLastInvoiceNumber($order_invoice_id, $id_shop)
{
if (!$order_invoice_id)
return false;
$number = Configuration::get('PS_INVOICE_START_NUMBER', null, null, $id_shop);
// If invoice start number has been set, you clean the value of this configuration
if ($number)
Configuration::updateValue('PS_INVOICE_START_NUMBER', false, false, null, $id_shop);
$sql = 'UPDATE `'._DB_PREFIX_.'order_invoice` SET number =';
if ($number)
$sql .= (int)$number;
else
$sql .= '(SELECT new_number FROM (SELECT (MAX(`number`) + 1) AS new_number
FROM `'._DB_PREFIX_.'order_invoice`) AS result)';
$sql .=' WHERE `id_order_invoice` = '.(int)$order_invoice_id;
return Db::getInstance()->execute($sql);
}
public function getInvoiceNumber($order_invoice_id)
{
if (!$order_invoice_id)
return false;
return Db::getInstance()->getValue('
SELECT `number`
FROM `'._DB_PREFIX_.'order_invoice`
WHERE `id_order_invoice` = '.(int)$order_invoice_id
);
}
/**
* This method allows to generate first invoice of the current order
*/
@@ -1095,13 +1136,7 @@ class OrderCore extends ObjectModel
{
$order_invoice = new OrderInvoice();
$order_invoice->id_order = $this->id;
$order_invoice->number = Configuration::get('PS_INVOICE_START_NUMBER', null, null, $this->id_shop);
// If invoice start number has been set, you clean the value of this configuration
if ($order_invoice->number)
Configuration::updateValue('PS_INVOICE_START_NUMBER', false, false, null, $this->id_shop);
else
$order_invoice->number = Order::getLastInvoiceNumber() + 1;
$order_invoice->number = 0;
$invoice_address = new Address((int)$this->id_address_invoice);
$carrier = new Carrier((int)$this->id_carrier);
$tax_calculator = $carrier->getTaxCalculator($invoice_address);
@@ -1120,6 +1155,7 @@ class OrderCore extends ObjectModel
// Save Order invoice
$order_invoice->add();
$this->setLastInvoiceNumber($order_invoice->id, $this->id_shop);
$order_invoice->saveCarrierTaxCalculator($tax_calculator->getTaxesAmount($order_invoice->total_shipping_tax_excl));
@@ -1175,11 +1211,46 @@ class OrderCore extends ObjectModel
// Keep it for backward compatibility, to remove on 1.6 version
$this->invoice_date = $order_invoice->date_add;
$this->invoice_number = $order_invoice->number;
$this->invoice_number = $this->getInvoiceNumber($order_invoice->id);
$this->update();
}
}
public function setDeliveryNumber($order_invoice_id, $id_shop)
{
if (!$order_invoice_id)
return false;
$number = Configuration::get('PS_DELIVERY_NUMBER', null, null, $id_shop);
// If invoice start number has been set, you clean the value of this configuration
if ($number)
Configuration::updateValue('PS_DELIVERY_NUMBER', false, false, null, $id_shop);
$sql = 'UPDATE `'._DB_PREFIX_.'order_invoice` SET delivery_number =';
if ($number)
$sql .= (int)$number;
else
$sql .= '(SELECT new_number FROM (SELECT (MAX(`delivery_number`) + 1) AS new_number
FROM `'._DB_PREFIX_.'order_invoice`) AS result)';
$sql .=' WHERE `id_order_invoice` = '.(int)$order_invoice_id;
return Db::getInstance()->execute($sql);
}
public function getDeliveryNumber($order_invoice_id)
{
if (!$order_invoice_id)
return false;
return Db::getInstance()->getValue('
SELECT `delivery_number`
FROM `'._DB_PREFIX_.'order_invoice`
WHERE `id_order_invoice` = '.(int)$order_invoice_id
);
}
public function setDelivery()
{
// Get all invoice
@@ -1188,24 +1259,14 @@ class OrderCore extends ObjectModel
{
if ($order_invoice->delivery_number)
continue;
$number = (int)Configuration::get('PS_DELIVERY_NUMBER', null, null, $this->id_shop);
if (!$number)
{
//if delivery number is not set or wrong, we set a default one.
Configuration::updateValue('PS_DELIVERY_NUMBER', 1, false, null, $this->id_shop);
$number = 1;
}
// Set delivery number on invoice
$order_invoice->delivery_number = $number;
$order_invoice->delivery_number = 0;
$order_invoice->delivery_date = date('Y-m-d H:i:s');
// Update Order Invoice
$order_invoice->update();
// Keep for backward compatibility
$this->delivery_number = $number;
Configuration::updateValue('PS_DELIVERY_NUMBER', $number + 1, false, null, $this->id_shop);
$this->setDeliveryNumber($order_invoice->id, $this->id_shop);
$this->delivery_number = $this->getDeliveryNumber($order_invoice->id);
}
// Keep it for backward compatibility, to remove on 1.6 version
@@ -1890,10 +1951,9 @@ class OrderCore extends ObjectModel
}
/**
* Return a unique reference like : GWJTHMZUN#2
* Return id of carrier
*
* With multishipping, order reference are the same for all orders made with the same cart
* in this case this method suffix the order reference by a # and the order number
* Get id of the carrier used in order
*
* @since 1.5.5.0
*/

View File

@@ -466,7 +466,7 @@ class OrderInvoiceCore extends ObjectModel
FROM `'._DB_PREFIX_.'order_invoice` oi
LEFT JOIN `'._DB_PREFIX_.'orders` o ON (o.`id_order` = oi.`id_order`)
WHERE DATE_ADD(oi.delivery_date, INTERVAL -1 DAY) <= \''.pSQL($date_to).'\'
AND oi.date_add >= \''.pSQL($date_from).'\'
AND oi.delivery_date >= \''.pSQL($date_from).'\'
'.Shop::addSqlRestriction(Shop::SHARE_ORDER, 'o').'
ORDER BY oi.delivery_date ASC
');

View File

@@ -144,6 +144,7 @@ class OrderReturnCore extends ObjectModel
$data[$k]['type'] = 'Return';
$data[$k]['tracking_number'] = $or['id_order_return'];
$data[$k]['can_edit'] = false;
$data[$k]['reference'] = Order::getUniqReferenceOf($or['id_order']);
}
return $data;
}

View File

@@ -112,12 +112,18 @@ class OrderStateCore extends ObjectModel
*/
public static function getOrderStates($id_lang)
{
return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT *
FROM `'._DB_PREFIX_.'order_state` os
LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = '.(int)$id_lang.')
WHERE deleted = 0
ORDER BY `name` ASC');
$cache_id = 'OrderState::getOrderStates_'.(int)$id_lang;
if (!Cache::isStored($cache_id))
{
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT *
FROM `'._DB_PREFIX_.'order_state` os
LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = '.(int)$id_lang.')
WHERE deleted = 0
ORDER BY `name` ASC');
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}
/**

View File

@@ -187,14 +187,19 @@ class ShopCore extends ObjectModel
public function setUrl()
{
$row = Db::getInstance()->getRow('
SELECT su.physical_uri, su.virtual_uri, su.domain, su.domain_ssl, t.id_theme, t.name, t.directory
FROM '._DB_PREFIX_.'shop s
LEFT JOIN '._DB_PREFIX_.'shop_url su ON (s.id_shop = su.id_shop)
LEFT JOIN '._DB_PREFIX_.'theme t ON (t.id_theme = s.id_theme)
WHERE s.id_shop = '.(int)$this->id.'
AND s.active = 1 AND s.deleted = 0 AND su.main = 1');
$cache_id = 'Shop::setUrl_'.(int)$this->id;
if (!Cache::isStored($cache_id))
{
$row = Db::getInstance()->getRow('
SELECT su.physical_uri, su.virtual_uri, su.domain, su.domain_ssl, t.id_theme, t.name, t.directory
FROM '._DB_PREFIX_.'shop s
LEFT JOIN '._DB_PREFIX_.'shop_url su ON (s.id_shop = su.id_shop)
LEFT JOIN '._DB_PREFIX_.'theme t ON (t.id_theme = s.id_theme)
WHERE s.id_shop = '.(int)$this->id.'
AND s.active = 1 AND s.deleted = 0 AND su.main = 1');
Cache::store($cache_id, $row);
}
$row = Cache::retrieve($cache_id);
if (!$row)
return false;
@@ -799,7 +804,7 @@ class ShopCore extends ObjectModel
{
if (Shop::getContext() == Shop::CONTEXT_SHOP)
$list = ($share) ? Shop::getSharedShops(Shop::getContextShopID(), $share) : array(Shop::getContextShopID());
else if (Shop::getContext() == Shop::CONTEXT_GROUP)
elseif (Shop::getContext() == Shop::CONTEXT_GROUP)
$list = Shop::getShops(true, Shop::getContextShopGroupID(), true);
else
$list = Shop::getShops(true, null, true);

View File

@@ -53,6 +53,8 @@ class StockAvailableCore extends ObjectModel
/** @var bool determine if a product is out of stock - it was previously in Product class */
public $out_of_stock = false;
protected static $cache_quantity_available;
/**
* @see ObjectModel::$definition
*/
@@ -343,18 +345,23 @@ class StockAvailableCore extends ObjectModel
if ($id_product_attribute === null)
$id_product_attribute = 0;
$query = new DbQuery();
$query->select('SUM(quantity)');
$query->from('stock_available');
$key = (int)$id_product.'-'.(int)$id_product_attribute.'-'.(int)$id_shop;
if (!isset(self::$cache_quantity_available[$key]))
{
$query = new DbQuery();
$query->select('SUM(quantity)');
$query->from('stock_available');
// if null, it's a product without attributes
if ($id_product !== null)
$query->where('id_product = '.(int)$id_product);
$query->where('id_product_attribute = '.(int)$id_product_attribute);
$query = StockAvailable::addSqlShopRestriction($query, $id_shop);
// if null, it's a product without attributes
if ($id_product !== null)
$query->where('id_product = '.(int)$id_product);
$query->where('id_product_attribute = '.(int)$id_product_attribute);
$query = StockAvailable::addSqlShopRestriction($query, $id_shop);
return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query);
self::$cache_quantity_available[$key] = (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query);
}
return self::$cache_quantity_available[$key];
}
/**

View File

@@ -236,7 +236,10 @@ class StockMvtCore extends ObjectModel
$query->innerJoin('stock', 's', 's.id_stock = sm.id_stock');
$query->innerJoin('warehouse', 'w', 'w.id_warehouse = s.id_warehouse');
$query->where('sm.sign = 1');
$query->where('s.id_product = '.(int)$id_product.' OR s.id_product_attribute = '.(int)$id_product_attribute);
if ($id_product_attribute)
$query->where('s.id_product = '.(int)$id_product.' AND s.id_product_attribute = '.(int)$id_product_attribute);
else
$query->where('s.id_product = '.(int)$id_product);
$query->orderBy('date_add DESC');
$res = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($query);

View File

@@ -124,9 +124,13 @@ class TaxRuleCore extends ObjectModel
*/
public static function isTaxInUse($id_tax)
{
return Db::getInstance()->getValue('
SELECT COUNT(*) FROM `'._DB_PREFIX_.'tax_rule` WHERE `id_tax` = '.(int)$id_tax
);
$cache_id = 'TaxRule::isTaxInUse_'.(int)$id_tax;
if (!Cache::isStored($cache_id))
{
$result = (int)Db::getInstance()->getValue('SELECT COUNT(*) FROM `'._DB_PREFIX_.'tax_rule` WHERE `id_tax` = '.(int)$id_tax);
Cache::store($cache_id, $result);
}
return Cache::retrieve($cache_id);
}

View File

@@ -33,9 +33,6 @@ class TaxRulesTaxManagerCore implements TaxManagerInterface
public $type;
public $tax_calculator;
protected static $cache_tax_calculator;
/**
*
* @param Address $address
@@ -80,7 +77,8 @@ class TaxRulesTaxManagerCore implements TaxManagerInterface
if (!empty($this->address->postcode))
$postcode = $this->address->postcode;
if (!isset(self::$cache_tax_calculator[(int)$this->address->id_country.'-'.$postcode.'-'.$this->type]))
$cache_id = (int)$this->address->id_country.'-'.(int)$this->address->id_state.'-'.$postcode.'-'.(int)$this->type;
if (!Cache::isStored($cache_id))
{
$rows = Db::getInstance()->executeS('
SELECT *
@@ -110,11 +108,8 @@ class TaxRulesTaxManagerCore implements TaxManagerInterface
if ($row['behavior'] == 0)
break;
}
self::$cache_tax_calculator[$postcode.'-'.$this->type] = new TaxCalculator($taxes, $behavior);
Cache::store($cache_id, new TaxCalculator($taxes, $behavior));
}
return self::$cache_tax_calculator[$postcode.'-'.$this->type];
return Cache::retrieve($cache_id);
}
}
}

View File

@@ -1187,7 +1187,8 @@ class WebserviceRequestCore
else
{
$object = new $this->resourceConfiguration['retrieveData']['className']();
if ($object->isMultiShopField($this->resourceConfiguration['fields'][$fieldName]['sqlId']) || $fieldName == 'id')
$assoc = Shop::getAssoTable($this->resourceConfiguration['retrieveData']['table']);
if ($assoc !== false && $assoc['type'] == 'shop' && ($object->isMultiShopField($this->resourceConfiguration['fields'][$fieldName]['sqlId']) || $fieldName == 'id'))
$table_alias = 'multi_shop_'.$this->resourceConfiguration['retrieveData']['table'];
else
$table_alias = '';

View File

@@ -845,11 +845,13 @@ class WebserviceSpecificManagementImagesCore implements WebserviceSpecificManage
$imaged = imagegif($destImage, $newPath);
break;
case 'png':
$imaged = imagepng($destImage, $newPath, 7);
$quality = (Configuration::get('PS_PNG_QUALITY') === false ? 7 : Configuration::get('PS_PNG_QUALITY'));
$imaged = imagepng($destImage, $newPath, (int)$quality);
break;
case 'jpeg':
default:
$imaged = imagejpeg($destImage, $newPath, 90);
$quality = (Configuration::get('PS_JPEG_QUALITY') === false ? 90 : Configuration::get('PS_JPEG_QUALITY'));
$imaged = imagejpeg($destImage, $newPath, (int)$quality);
break;
}
imagedestroy($destImage);

View File

@@ -73,8 +73,10 @@ function bqSQL($string)
function displayFatalError()
{
$error = error_get_last();
if ($error !== NULL && in_array($error['type'], array(E_ERROR, E_PARSE)))
$error = null;
if (function_exists('error_get_last'))
$error = error_get_last();
if ($error !== NULL && in_array($error['type'], array(E_ERROR, E_PARSE, E_COMPILE_ERROR )))
echo '[PrestaShop] Fatal error in module '.substr(basename($error['file']), 0, -4).':<br />'.$error['message'];
}

View File

@@ -38,13 +38,14 @@ if (file_exists(_PS_THEME_DIR_.'mobile/'))
{
define('_PS_THEME_MOBILE_DIR_', _PS_THEME_DIR_.'mobile/');
define('_THEME_MOBILE_DIR_', _THEMES_DIR_._THEME_NAME_.'/mobile/');
define('_PS_THEME_MOBILE_OVERRIDE_DIR_', _PS_THEME_MOBILE_DIR_.'override/');
}
else
{
define('_PS_THEME_MOBILE_DIR_', _PS_ROOT_DIR_.'/themes/default/mobile/');
define('_THEME_MOBILE_DIR_', __PS_BASE_URI__.'themes/default/mobile/');
}
define('_PS_THEME_MOBILE_OVERRIDE_DIR_', _PS_THEME_MOBILE_DIR_.'override/');
define('_THEME_MOBILE_IMG_DIR_', _THEME_MOBILE_DIR_.'img/');
define('_THEME_MOBILE_CSS_DIR_', _THEME_MOBILE_DIR_.'css/');
define('_THEME_MOBILE_JS_DIR_', _THEME_MOBILE_DIR_.'js/');

View File

@@ -37,7 +37,7 @@ if (!Tools::getSafeModeStatus())
$smarty->setConfigDir(_PS_SMARTY_DIR_.'configs');
$smarty->caching = false;
$smarty->force_compile = (Configuration::get('PS_SMARTY_FORCE_COMPILE') == _PS_SMARTY_FORCE_COMPILE_) ? true : false;
$smarty->compile_check = (Configuration::get('PS_SMARTY_FORCE_COMPILE') <= _PS_SMARTY_CHECK_COMPILE_) ? true : false;
$smarty->compile_check = (Configuration::get('PS_SMARTY_FORCE_COMPILE') >= _PS_SMARTY_CHECK_COMPILE_) ? true : false;
// Production mode
$smarty->debugging = false;
@@ -70,7 +70,8 @@ smartyRegisterFunction($smarty, 'function', 'd', 'smartyDieObject'); // Debug on
smartyRegisterFunction($smarty, 'function', 'l', 'smartyTranslate', false);
smartyRegisterFunction($smarty, 'function', 'hook', 'smartyHook');
smartyRegisterFunction($smarty, 'function', 'toolsConvertPrice', 'toolsConvertPrice');
smartyRegisterFunction($smarty, 'modifier', 'json_encode', array('Tools', 'jsonEncode'));
smartyRegisterFunction($smarty, 'modifier', 'json_decode', array('Tools', 'jsonDecode'));
smartyRegisterFunction($smarty, 'function', 'dateFormat', array('Tools', 'dateFormat'));
smartyRegisterFunction($smarty, 'function', 'convertPrice', array('Product', 'convertPrice'));
smartyRegisterFunction($smarty, 'function', 'convertPriceWithCurrency', array('Product', 'convertPriceWithCurrency'));

View File

@@ -299,6 +299,9 @@ class AdminAddressesControllerCore extends AdminController
public function processSave()
{
if (Tools::getValue('submitFormAjax'))
$this->redirect_after = false;
// Transform e-mail in id_customer for parent processing
if (Validate::isEmail(Tools::getValue('email')))
{

Some files were not shown because too many files have changed in this diff Show More