Compare commits
917 Commits
Author | SHA1 | Date | |
---|---|---|---|
823e1cfd0e | |||
c0e6781dda | |||
341e002ef2 | |||
a87d04ef5f | |||
11656c72ca | |||
72ee7c9ab6 | |||
483ebd64fe | |||
1a6fadf976 | |||
9b3c7707f0 | |||
261ef2f312 | |||
0abb336850 | |||
82b55210d8 | |||
41f36ef5e6 | |||
71dfbff8d7 | |||
1c57e8dd1d | |||
625308b74b | |||
466e557c1d | |||
121013a48a | |||
1fcc5f92a8 | |||
1c8e2038f6 | |||
29b0a28173 | |||
bd6d5f0128 | |||
6bbd622a98 | |||
d39bf7bc86 | |||
ffd80cde21 | |||
65e2dc8dff | |||
e52c25ad0b | |||
55c7791efa | |||
ec2fc0ab4f | |||
16d4d16950 | |||
b7be76a7e4 | |||
d6072c8591 | |||
23d2631fd7 | |||
06b3690d48 | |||
3c32b3650e | |||
101bae34e8 | |||
f7d53906e2 | |||
bdc9e40627 | |||
d5dfdca9d2 | |||
ce6c4929a0 | |||
c3ac31de69 | |||
24e1238e50 | |||
281e578f4d | |||
1a88ae05e6 | |||
df0c579af0 | |||
a25dbc6bd2 | |||
8e1c8a5ba5 | |||
cce2983347 | |||
6c2bed771c | |||
ae265ba5e7 | |||
909c79559b | |||
97c8573de8 | |||
6274d2c1ff | |||
409b7edb94 | |||
6b82b3af83 | |||
3013f33b35 | |||
77fbb45c71 | |||
2a0849e49a | |||
ac8e713935 | |||
118dfc79b3 | |||
6727752a2d | |||
75a6a093ed | |||
922cba9f5a | |||
35d0b2aa3c | |||
776afaff03 | |||
1c46900156 | |||
08a2264709 | |||
f7db1bf20f | |||
ffd14a8734 | |||
161c1bcb80 | |||
02514ff446 | |||
fdce67d101 | |||
8d1cbc6b88 | |||
b73f8a1c28 | |||
00a0c3d795 | |||
6b8d769e43 | |||
10b79c586b | |||
3c3579a29d | |||
017f02afc4 | |||
df235541d1 | |||
a456047969 | |||
ac48e61264 | |||
604bf2db77 | |||
4055d3e68a | |||
393722038b | |||
54c90bec11 | |||
039ee80db4 | |||
9f30f356cb | |||
fd10883652 | |||
6805111c47 | |||
86ce4a75b4 | |||
03932db20d | |||
d3f247f6fb | |||
c5af0fb37c | |||
9532be0cdc | |||
e0748c2eb6 | |||
5811836238 | |||
92b3854516 | |||
e85801db50 | |||
53dd6a82e6 | |||
75b230b2ed | |||
47a5ddb442 | |||
d0f779bb9b | |||
568b79e854 | |||
06bbeb0d2e | |||
75bb94b9a7 | |||
dfd0f1ad2a | |||
7a4b1589af | |||
da9d8d9d62 | |||
e3bc6ce1d3 | |||
ecd0f5827a | |||
c8be7f84a4 | |||
826e6264eb | |||
cc0b6edb34 | |||
0e564a24c9 | |||
7da12be242 | |||
095e317f3b | |||
67eeef26a0 | |||
2273812b2d | |||
4842e3f62b | |||
01c69f0712 | |||
baa5b762e2 | |||
76cd034fd3 | |||
a929fb3482 | |||
5ea3e12e26 | |||
141a22b6ff | |||
3f1d19f53e | |||
fcfb3ea677 | |||
dfceb941db | |||
9db6e5ac13 | |||
aceb94da3e | |||
12c7682a26 | |||
5d282a4cc4 | |||
a8bf3ec857 | |||
bb9573a82f | |||
15534ba9fa | |||
6aecf5e796 | |||
25f81af87b | |||
c78b43f7b0 | |||
6daeb9e474 | |||
5986e8a378 | |||
14068d24a8 | |||
dd7ee7f2ef | |||
0f1bd2377e | |||
5326b94c04 | |||
17f8fb3b58 | |||
ceca7b10b5 | |||
89c0ae5ead | |||
89be290465 | |||
3c3b122fe4 | |||
61369e7ad1 | |||
2c31e1aefc | |||
eb28a76636 | |||
86afa350fa | |||
6864132afc | |||
49ab83efd3 | |||
27d7b07239 | |||
48ee5c5e1b | |||
be87e4c740 | |||
7f6d010b9c | |||
62437c8fac | |||
2d3b999d27 | |||
72655e6673 | |||
de0749b51b | |||
3598ab2954 | |||
67d94bce61 | |||
fa158effc3 | |||
3e3781bc28 | |||
bc70f39ba5 | |||
998eb3b8a1 | |||
8fd4d2f9bc | |||
f04bc17e28 | |||
ca0561d97c | |||
2251d34122 | |||
eb832f42e5 | |||
83b4103788 | |||
1b9c65189d | |||
c2281b93ef | |||
1b3601ce87 | |||
78905834bd | |||
c270546a9b | |||
ad15e8b827 | |||
f84bcbb878 | |||
62d4d8243a | |||
3e238af50a | |||
54a0add941 | |||
d84f94817b | |||
2939545c8c | |||
c4dc05a4c1 | |||
87b763ddae | |||
c745711a2e | |||
49c8f567e6 | |||
2a1b5e2900 | |||
f2ab357654 | |||
8ad199ee3d | |||
6ddadfd8e5 | |||
cee8b784a4 | |||
f8e2dd5fab | |||
20a4cc45d7 | |||
8db6367cba | |||
090a4318b3 | |||
d17fa93bb7 | |||
f030c2f064 | |||
323cea2e0b | |||
f81fad1c49 | |||
ad3e9aba65 | |||
b035efb710 | |||
ffc373e68f | |||
e42f0bd538 | |||
b86f7fbd4a | |||
96b12bf0d4 | |||
97e50f245c | |||
9d32fa2b86 | |||
5937915d21 | |||
ca15d8f362 | |||
f097111d70 | |||
177541bef3 | |||
3f2a33a7fe | |||
cd9c62b3a3 | |||
4a2d59e4b8 | |||
c702c41fed | |||
b3e3ead5ac | |||
9bfa8280fd | |||
55b4e7335d | |||
f7c2aab390 | |||
cdab4659a6 | |||
fc69015448 | |||
9e656294a6 | |||
8e91faf2d2 | |||
36c8619b63 | |||
d77afce37b | |||
bca34949a9 | |||
07baed8713 | |||
6687c324e5 | |||
03d1dacb88 | |||
77d8296642 | |||
999370646b | |||
d8f4af660f | |||
5f146bfbdc | |||
950ba8cc9d | |||
2448e50793 | |||
5e29699563 | |||
b78fc84a89 | |||
665c8dea6d | |||
159297e421 | |||
fc502a1c64 | |||
457c8e0f66 | |||
660398bad7 | |||
fad19249db | |||
060aa9e4d5 | |||
9052247e53 | |||
df06b1f7ba | |||
8d324f9c79 | |||
f18d4eee1d | |||
fd51122918 | |||
15bd0400ea | |||
1147b5c5e1 | |||
2cbd3d5923 | |||
11753b4476 | |||
f2a6d35351 | |||
c4a23de744 | |||
a47cbe49fe | |||
5f5815cbd9 | |||
e811660d7c | |||
10083e7ee8 | |||
d89455d86a | |||
5e7c9597cd | |||
49180ab4ed | |||
c4fc466876 | |||
75203d6e8e | |||
f61c2a977a | |||
a02ce894c8 | |||
2d92bd3963 | |||
b8c0b47faf | |||
2a8563ce9a | |||
f924a2b2b3 | |||
5846c111fe | |||
f86f38d8b0 | |||
68d0aaff84 | |||
f5f04c90d9 | |||
d8525bf123 | |||
25d6192e0e | |||
90a5a8a96a | |||
69852c82bc | |||
f3ae03a133 | |||
9b5cc38c94 | |||
890cf97127 | |||
87a1f2cd18 | |||
50fc319afd | |||
a2f53e1e58 | |||
e6b9cb16b5 | |||
6f2447533c | |||
6f946b32ac | |||
33e2dca864 | |||
a890a70beb | |||
e92c709796 | |||
bcf75ebfbd | |||
c8a6a21f9c | |||
a176556081 | |||
949373b39e | |||
e26beac06c | |||
4bfc75288f | |||
d1e4c9761f | |||
dbafb6f4bb | |||
7ad8e3ea05 | |||
e142f961d9 | |||
5c97b5cea6 | |||
d21cfcba78 | |||
c9300e5979 | |||
8cefdd027d | |||
c3ade0fe0f | |||
d3284c67d8 | |||
6b3085ef27 | |||
748e6d0873 | |||
a9abe8aaa1 | |||
1fbf91a9cb | |||
9485ebe4cb | |||
88e7cb8761 | |||
857a6ff808 | |||
2d6bbcec9e | |||
748bb3befb | |||
29d6b1c758 | |||
696ca111b7 | |||
a8381b4c18 | |||
0895abc30b | |||
3539c3b04e | |||
77aa46f753 | |||
42ef876963 | |||
3bfcaa4187 | |||
5a5e9dc72c | |||
4606d987b2 | |||
b403816c88 | |||
470c017184 | |||
0720db7b17 | |||
1a61f34c19 | |||
94eda284ed | |||
9ae67cd2f3 | |||
b6b5461241 | |||
9fac118004 | |||
92c7384816 | |||
9be5dab828 | |||
c6ae372429 | |||
22e0b71012 | |||
f0bec949bb | |||
0d42ca0740 | |||
18228b1b8e | |||
824ab8401a | |||
7249abc649 | |||
5336720809 | |||
3a7e4e8db6 | |||
51cc6b41a7 | |||
38b3a72c92 | |||
fb79bce39c | |||
2c6b29747a | |||
fd28afdd80 | |||
032a150b11 | |||
c34e249cd0 | |||
953ba662e8 | |||
e79ef549d6 | |||
5459aae163 | |||
a3145fbd00 | |||
bd04f94c76 | |||
74da56e58d | |||
b26e7dcb7d | |||
3cee46072b | |||
b590f91534 | |||
10e6822ad5 | |||
9944a192e2 | |||
8ad50b10dd | |||
ee90649833 | |||
a4601da9e0 | |||
b1fcd4ecc8 | |||
e110eba5d8 | |||
30e602adc2 | |||
1989d642fc | |||
1a3413f702 | |||
b61d78dbaa | |||
a0dca415b5 | |||
88fd7e5d49 | |||
0253e55de2 | |||
bff6911bb4 | |||
4542f9f9b2 | |||
323ff59b41 | |||
590d36ede2 | |||
a7cc6ee6d0 | |||
ad1edcf9a2 | |||
eeb96186c1 | |||
2e839715b5 | |||
548fd25756 | |||
ff2fbcddef | |||
022bc9ce7b | |||
cbe5dc9376 | |||
de564c31a0 | |||
8927026ee4 | |||
3cda662220 | |||
f9f55be851 | |||
05da19288e | |||
d2efd48aea | |||
3028fc13cd | |||
14bc21f3d5 | |||
b23b1f2e06 | |||
7a75eb3472 | |||
2cff4db256 | |||
666b564215 | |||
f46b7ea0e4 | |||
b2134f1841 | |||
7b76ab131f | |||
0b7c7678bd | |||
b967a09aa5 | |||
ca1ee90f52 | |||
65b62c7b5a | |||
4176043958 | |||
28927ad747 | |||
92d0618907 | |||
a9f3e1ba26 | |||
e0ba8a81fe | |||
ad9a1120f4 | |||
8619b49d19 | |||
409e10fad1 | |||
a7b4ea2d15 | |||
cd0d35279e | |||
f25b1a1154 | |||
bf2ddaef9f | |||
ca732f3ca6 | |||
9ffdfd25d0 | |||
aadcb23282 | |||
bc817b750e | |||
2e76d9d305 | |||
9300ab9640 | |||
3753808b98 | |||
446ad40f96 | |||
fb18127346 | |||
26623db2b7 | |||
1a27befb75 | |||
e2e261e01b | |||
713b5ebb96 | |||
7ab84f63c9 | |||
79efa1f1a9 | |||
1570d71470 | |||
da03bcfa5b | |||
eca93bc3af | |||
fbfb97bf14 | |||
67452ceb8d | |||
abf920ea36 | |||
9390809f6b | |||
a5737b7553 | |||
8fca6e2485 | |||
1702bcef88 | |||
ef4c0cdd45 | |||
4dbd5292bc | |||
2784ad2209 | |||
19a60d9e76 | |||
73223780a1 | |||
fc8b05efca | |||
13f236ea03 | |||
8372ee2ad2 | |||
d1efca6560 | |||
78b05a211d | |||
fff6c3b086 | |||
7878f972e5 | |||
74f33031a8 | |||
eeb2f78770 | |||
f24bd9a4b9 | |||
251d98ea03 | |||
c0963f90bd | |||
de41c5ac01 | |||
6794db3719 | |||
5bba67c169 | |||
95ac9e7d28 | |||
4d0a09cad0 | |||
bad28659df | |||
c21986a97e | |||
5ed49819ca | |||
5660620685 | |||
6c39349989 | |||
eea5e43149 | |||
a96bee2873 | |||
961fcb2ecd | |||
34aa4f4c25 | |||
17d1e7e4b4 | |||
a74f92a0a9 | |||
d160b5df52 | |||
26d55460fb | |||
05106a0d18 | |||
0724114e96 | |||
4b7826b078 | |||
497a51ea18 | |||
d682636992 | |||
2e556c175a | |||
90d8f0b129 | |||
b9e0e0db39 | |||
f9a1982b16 | |||
d5b52e78fc | |||
0cb4a00ca2 | |||
036469232a | |||
d7cdad6b6e | |||
003fedcef5 | |||
1d083f5f19 | |||
2758ec5f1b | |||
edc7a0b323 | |||
952bb60404 | |||
baffca39e6 | |||
a7a45b3c1c | |||
d914c6f613 | |||
31910f6e94 | |||
e2bd95780b | |||
150ea0c02f | |||
1a07031e2a | |||
da3e98e474 | |||
8363fdead5 | |||
af3345bdd2 | |||
7654446466 | |||
21113f8ffd | |||
036e18ba53 | |||
1d8836f230 | |||
4d0af131cb | |||
16c0c466f6 | |||
047f107f66 | |||
5768638a2e | |||
55c3badb40 | |||
63ef8f8f34 | |||
bf83bd85d2 | |||
3da45bdacd | |||
fa3cc1bfa3 | |||
1c9b42fc42 | |||
c4a4aeb1f3 | |||
a2e1f16a86 | |||
8651581fb5 | |||
ba171115cd | |||
0f1b4b3a85 | |||
7e2672bd46 | |||
75ee6d3691 | |||
49e0379cfd | |||
7684f8eb89 | |||
f87e0677aa | |||
aee11cb237 | |||
9029a94be1 | |||
87c5ba2024 | |||
a5018c438b | |||
8560e967c2 | |||
0f67af5f11 | |||
d226331f19 | |||
fc5630f3aa | |||
ea7c39bf14 | |||
b85c5e392b | |||
5ff93c45d6 | |||
0d09fee84c | |||
2e3769971b | |||
e4d1ab4440 | |||
b5c92a6a1d | |||
9cbe14fd8f | |||
955935f0ce | |||
eb92745950 | |||
f9369cee0e | |||
ccafb3e8e4 | |||
7f92710ec2 | |||
02e66468f2 | |||
a667b0370d | |||
ce1c3a852a | |||
19de4af4e7 | |||
a21517ed2e | |||
02ceb0e0bd | |||
ca341f6f6c | |||
b2a73203ed | |||
0fd9ff177e | |||
cc90fc2273 | |||
07aa29e4bc | |||
64ae2817a0 | |||
724ade6971 | |||
e4717f0e6d | |||
da1d28da2a | |||
f2948915b8 | |||
7b6922cfe0 | |||
c76b4c3f30 | |||
9fda66c29a | |||
781d9a5e24 | |||
6fdc6020a0 | |||
ad23734411 | |||
e48f3e2334 | |||
c6019faa0e | |||
20cab1770b | |||
58db7a75fa | |||
b40ab119c4 | |||
9b474de209 | |||
0ce3c1f131 | |||
97ec7d756b | |||
0a13e35413 | |||
112579c9d2 | |||
d2e3dfe700 | |||
b13a5a5043 | |||
be53996c7f | |||
3bea31ea12 | |||
3e1aed8641 | |||
27bb3de75c | |||
040785408c | |||
ef25c9c153 | |||
6823ce3dc8 | |||
78f7a1c063 | |||
fe3f767697 | |||
7398ceb5ef | |||
ebbf7d2e41 | |||
35cfb1a78f | |||
e5aa333b13 | |||
1dfbb9361f | |||
06fd8a15d8 | |||
efe74087f7 | |||
9dd7efeeb6 | |||
22687433fa | |||
c1396000d0 | |||
f67da9bd13 | |||
6c55881789 | |||
da03e95be9 | |||
fa4fb40872 | |||
03504a6402 | |||
0ca6c2913a | |||
840b962d55 | |||
3bc31b9d73 | |||
7168174c39 | |||
2944363e29 | |||
0e2295a8aa | |||
ead8d63525 | |||
50bce3d8c5 | |||
5eb277f501 | |||
cde775bded | |||
2d9e6d211c | |||
d133346e84 | |||
f1d5871957 | |||
c70d1e083a | |||
ff42c6a433 | |||
4b7d80aced | |||
e8b76b774b | |||
5632f91d34 | |||
a09ae7bfce | |||
6c75eba8f2 | |||
c8d83033a7 | |||
88333ef673 | |||
53c62a2301 | |||
047013d031 | |||
733ef26509 | |||
813d78d9b4 | |||
1c20abd750 | |||
016a809022 | |||
3e53329646 | |||
c0e3a0c96e | |||
7d26d202e2 | |||
9b59393ad2 | |||
6ac06f669b | |||
2e81467326 | |||
ccec25d46b | |||
1387bfae25 | |||
f1ab4f3c80 | |||
8cac9eae8b | |||
ecf0df8d5d | |||
f64fdce167 | |||
68baee6d33 | |||
ee03f49920 | |||
46a3d36986 | |||
ca3d331719 | |||
a485913372 | |||
de58ddcd07 | |||
a6b9e55a34 | |||
09a8d2c626 | |||
accc950511 | |||
2d9d8faa3d | |||
c0a02874f8 | |||
82786c6937 | |||
a5af8068ef | |||
c03ccd2cf7 | |||
ceae2be327 | |||
b86bf1d7c0 | |||
170c8a6be3 | |||
2c6ab43006 | |||
1a6d98d8a1 | |||
359193f1a6 | |||
aadd51f4d6 | |||
d4a3d67693 | |||
b84b3b4dde | |||
6c2534df81 | |||
b4f9ac45a7 | |||
29d696bdb4 | |||
2127d5ca16 | |||
f34acde600 | |||
eb54510036 | |||
65003dcc98 | |||
479c13a994 | |||
48a88e212c | |||
a58a65b5cf | |||
e18e149b9b | |||
c28b0590c2 | |||
88ead8b16b | |||
8b6ef5f03f | |||
efa82f4a9c | |||
81448227f9 | |||
c6f3a2e83d | |||
d7e4e424a2 | |||
fec70444ee | |||
529f86c873 | |||
724c9fe521 | |||
6cf511e6b7 | |||
79cc6137ad | |||
b7655ec501 | |||
587bb0fab2 | |||
86550e62ff | |||
1d165e8b71 | |||
e242d7ecab | |||
d13b01791b | |||
7e7d1f1f43 | |||
ef7cd70c5f | |||
106387fab8 | |||
8bf2d89906 | |||
54de5c4258 | |||
f4c386daf2 | |||
89f21660c3 | |||
5e2687bd44 | |||
690f8f1739 | |||
13af9832f7 | |||
5eb78c0ed9 | |||
92c8c0a653 | |||
a1096af3de | |||
0fe4c582a1 | |||
f915c591fa | |||
9f6202e639 | |||
433342c2a8 | |||
b72f16cb52 | |||
befbd1438d | |||
18f00cbe3c | |||
38ed0dc1aa | |||
2cabb31734 | |||
3af3db940c | |||
dabc0a4c2e | |||
ac0a51a8b5 | |||
ebf143002c | |||
08e8c3fa2c | |||
101da263fd | |||
b7d1f9e1f1 | |||
a22dc8b5ce | |||
9fad0cdcc8 | |||
1271185c5d | |||
5fdcfdd7bd | |||
22dea7f64f | |||
23c015f696 | |||
0ac0e9398b | |||
5c87a74d7b | |||
8c8fd91c7e | |||
54b858056f | |||
f262b661e9 | |||
adf0ac8f80 | |||
3b8a2d5b03 | |||
f19afc81ed | |||
982cf3bb9f | |||
7cec74d5e3 | |||
30227c9362 | |||
886ed303be | |||
3f43830154 | |||
229d521502 | |||
0cd487f211 | |||
6214f6a363 | |||
95b7d1f74e | |||
0b06e12ef9 | |||
fb2624bf7a | |||
a38097391d | |||
7b3e4cc67d | |||
d0854b9302 | |||
240a3afd9e | |||
8aeddf77c1 | |||
1306097cab | |||
a5b8a44c52 | |||
6e4b2bab77 | |||
3b77620511 | |||
5b82100c30 | |||
7d950f7f2c | |||
21fee2dbb1 | |||
b7fbf1f96f | |||
c2d531872d | |||
48de07f997 | |||
cca7530631 | |||
7aa6625e08 | |||
02a1870642 | |||
ac2b29628d | |||
1dba8f3eb8 | |||
de84e3471b | |||
7c7c36a5e6 | |||
44581b4682 | |||
2fe0a8e7b1 | |||
81d8eb54d0 | |||
663dfd12ec | |||
9c44759f96 | |||
327bf0ddb6 | |||
55f8e592c8 | |||
56d7dbedfc | |||
9b07bcf38e | |||
94af270ca6 | |||
91b93bd220 | |||
4af57f42b7 | |||
b4f5546a5f | |||
cb909e41de | |||
faac5a6c43 | |||
06d5b30544 | |||
c57b0e26e5 | |||
ab46dd9ab2 | |||
f2636c87d8 | |||
4901cb9052 | |||
a46848922f | |||
d7069c8da8 | |||
19f1685d8a | |||
71fd25f02c | |||
fde15d6946 | |||
4b34c1664d | |||
b408c9d192 | |||
2ce3efb4fb | |||
da2c0b6440 | |||
2a87b98d9a | |||
aa2d5f0f06 | |||
21a903b1e5 | |||
ef8c10fae7 | |||
6c877ed334 | |||
85789361f2 | |||
367e43d773 | |||
465a9c5e03 | |||
4decb9b5d7 | |||
c4b2ebeea7 | |||
c775d71642 | |||
1a0f6b1721 | |||
cfac4034a3 | |||
7dfae68bb9 | |||
87024d284a | |||
35bba82fb0 | |||
6a4fc3154b | |||
18058ed8ce | |||
735057f4dd | |||
5685fde159 | |||
b9998df747 | |||
388395f5e4 | |||
0895e51a0a | |||
73556a40bb | |||
820cc6c0b0 | |||
d2be706829 | |||
cac0c14ecd | |||
aaf35147b9 | |||
ee295cf7dc | |||
0d6d43381c | |||
a66bc7d948 | |||
c405994451 | |||
9ede4c38f2 | |||
d98963fe9c | |||
6a85cae5ad | |||
090f367da0 | |||
714396cbad | |||
25b9844197 | |||
8d8d35a540 | |||
63d02f358c | |||
d364b11012 | |||
a5743ca323 | |||
a87431fc9c | |||
3aa5cd285b | |||
70b500443f | |||
a65e8dcd63 | |||
8ac66696cb | |||
3d579cb689 | |||
bb779bdb97 | |||
dbd9d2bf34 | |||
937c36ca6d | |||
b57a83e9cf | |||
2e7931970d | |||
e0fe61ccc7 | |||
6ee961f618 | |||
c13f01899b | |||
8194ef7c67 | |||
c4fd214e04 | |||
cdc2594bba | |||
39e27d5082 | |||
95c8b7a975 | |||
84aa2b719c | |||
cffbdc2928 | |||
a5bd94fe6e | |||
afcccc2354 | |||
19c6c403d7 | |||
df88e5a195 | |||
0bf76c3778 | |||
c8ea16040e | |||
653f9a6842 | |||
a451421ecd | |||
3da3bf63fc | |||
abcf4c3a70 | |||
903c4e703c | |||
abd64c2a9b | |||
78b9374d2b | |||
26ad49dd85 | |||
a3ceda9653 | |||
52e025746a | |||
7dce2beb3b | |||
6641556084 | |||
2455ec0f28 | |||
6e9f30719b | |||
ead284fff7 | |||
bb932110dc | |||
1746ff7919 | |||
5edb042dd3 | |||
6b12d9746f | |||
487d21b696 | |||
58671aeea9 | |||
e0ac420cd4 | |||
e74b515366 | |||
21c6250214 | |||
a0f4929a57 | |||
84f8544210 | |||
e21933cd93 | |||
9b73143b2c | |||
a5593535a0 | |||
b2c25db925 | |||
822a71b264 | |||
e601461101 | |||
29d4d2d7ac | |||
0449dd7936 | |||
137d901078 | |||
15d98f43a7 | |||
1d158a3fde |
2
.gitignore
vendored
2
.gitignore
vendored
@ -9,3 +9,5 @@ site/i18n/*.json
|
|||||||
core/vendor/tinymce/link_list.json
|
core/vendor/tinymce/link_list.json
|
||||||
robots.txt
|
robots.txt
|
||||||
sitemap.xml
|
sitemap.xml
|
||||||
|
.gitignore
|
||||||
|
core/module/config/tool/data.key
|
11
.htaccess
11
.htaccess
@ -32,5 +32,16 @@ Options -Indexes
|
|||||||
Options -MultiViews
|
Options -MultiViews
|
||||||
</IfModule>
|
</IfModule>
|
||||||
|
|
||||||
|
# Enlever le slash final des URL
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-d
|
||||||
|
RewriteCond %{REQUEST_URI} ^(.+)/$
|
||||||
|
RewriteRule ^ %1 [R=301,L]
|
||||||
|
|
||||||
# ne pas supprimer la ligne URL rewriting !
|
# ne pas supprimer la ligne URL rewriting !
|
||||||
# URL rewriting
|
# URL rewriting
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
627
CHANGES.md
627
CHANGES.md
File diff suppressed because it is too large
Load Diff
25
LISEZMOI.md
25
LISEZMOI.md
@ -1,4 +1,4 @@
|
|||||||
# ZwiiCMS 12.3.11
|
# ZwiiCMS 13.5.00
|
||||||
|
|
||||||
Zwii est un CMS sans base de données (flat-file) qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation.
|
Zwii est un CMS sans base de données (flat-file) qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation.
|
||||||
|
|
||||||
@ -15,14 +15,13 @@ ZwiiCMS a été créé par un développeur de talent, [Rémi Jean](https://remij
|
|||||||
|
|
||||||
Cette œuvre est mise à disposition sous licence Attribution - Pas d'utilisation Commerciale - Pas de Modification 4.0 International.
|
Cette œuvre est mise à disposition sous licence Attribution - Pas d'utilisation Commerciale - Pas de Modification 4.0 International.
|
||||||
|
|
||||||
Pour voir une copie de cette licence, visitez http://creativecommons.org/licenses/by-nc-nd/4.0/ ou écrivez à Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
|
Pour voir une copie de cette licence, visitez <http://creativecommons.org/licenses/by-nc-nd/4.0/> ou écrivez à Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
|
||||||
|
|
||||||
## Téléchargement de ZwiiCMS
|
## Téléchargement de ZwiiCMS
|
||||||
|
|
||||||
Pour télécharger la dernière version publiée, rendez-vous :
|
Pour télécharger la dernière version publiée, rendez-vous :
|
||||||
- sur [la page des mises à jour](https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS/releases)
|
* sur [la page des mises à jour](https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS/releases)
|
||||||
- ou sur [la page de téléchargement du site](https://zwiicms.fr/telechargement)
|
* ou sur [la page de téléchargement du site](https://zwiicms.fr/telechargement)
|
||||||
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@ -30,7 +29,6 @@ Décompressez l'archive de Zwii et téléversez son contenu à la racine de votr
|
|||||||
|
|
||||||
Vous trouverez de plus amples explications, en particulier pour une installation chez Free, dans la rubrique "Téléchargements" du forum.
|
Vous trouverez de plus amples explications, en particulier pour une installation chez Free, dans la rubrique "Téléchargements" du forum.
|
||||||
|
|
||||||
|
|
||||||
## Procédures de mise à jour
|
## Procédures de mise à jour
|
||||||
|
|
||||||
A l'occasion de l'installation d'une verion majeure, il est recommandé de réaliser une copie de sauvegarde.
|
A l'occasion de l'installation d'une verion majeure, il est recommandé de réaliser une copie de sauvegarde.
|
||||||
@ -47,7 +45,6 @@ A l'occasion de l'installation d'une verion majeure, il est recommandé de réal
|
|||||||
* Décompressez la nouvelle version sur votre ordinateur.
|
* Décompressez la nouvelle version sur votre ordinateur.
|
||||||
* Transférez son contenu sur votre serveur en activant le remplacement des fichiers.
|
* Transférez son contenu sur votre serveur en activant le remplacement des fichiers.
|
||||||
|
|
||||||
|
|
||||||
## Arborescence générale
|
## Arborescence générale
|
||||||
|
|
||||||
*Légende : [R] Répertoire - [F] Fichier*
|
*Légende : [R] Répertoire - [F] Fichier*
|
||||||
@ -76,11 +73,12 @@ A l'occasion de l'installation d'une verion majeure, il est recommandé de réal
|
|||||||
[F] page.json Données des pages
|
[F] page.json Données des pages
|
||||||
[F] module.json Données des modules de pages
|
[F] module.json Données des modules de pages
|
||||||
[F] local.json Données du site propres à la langue
|
[F] local.json Données du site propres à la langue
|
||||||
|
[F] .default Indicateur de la langue de site par défaut
|
||||||
[R] content Dossier des contenus de page
|
[R] content Dossier des contenus de page
|
||||||
[F] accueil.html Exemple contenu de la page d'accueil
|
[F] accueil.html Exemple contenu de la page d'accueil
|
||||||
[R] fonts Dossier contenant les fontes installées
|
[R] font Dossier contenant les fontes installées
|
||||||
[F] fonts.html Fichier contenant les appels des fontes à charger sur cdnFonts
|
[F] font.html Fichier contenant les appels des fontes à charger sur cdnFonts
|
||||||
[F] fonts.css Fichier contenant la feuille de style liée aux polices de caractères locales
|
[F] font.css Fichier contenant la feuille de style liée aux polices de caractères locales
|
||||||
[F] fontes.woff Fichiers locaux des fontes (woff, etc..)
|
[F] fontes.woff Fichiers locaux des fontes (woff, etc..)
|
||||||
[R] modules Personnalisation des modules ou données propres
|
[R] modules Personnalisation des modules ou données propres
|
||||||
[F] admin.css Thème des pages d'administration
|
[F] admin.css Thème des pages d'administration
|
||||||
@ -89,9 +87,10 @@ A l'occasion de l'installation d'une verion majeure, il est recommandé de réal
|
|||||||
[F] config.json Configuration du site
|
[F] config.json Configuration du site
|
||||||
[F] core.json Configuration du noyau
|
[F] core.json Configuration du noyau
|
||||||
[F] custom.css Feuille de style de la personnalisation avancée
|
[F] custom.css Feuille de style de la personnalisation avancée
|
||||||
[F] fonts.json Descripteur des fontes personnalisées
|
[F] font.json Descripteur des fontes personnalisées
|
||||||
[F] journal.log Journalisation des actions
|
[F] journal.log Journalisation des activités
|
||||||
[F] languages.json Configuration des langues de l'interface
|
[F] language.json Langues de l'interface
|
||||||
|
[F] profil.json Profils des utilisateurs
|
||||||
[F] theme.css Thème du site
|
[F] theme.css Thème du site
|
||||||
[F] theme.json Données du site
|
[F] theme.json Données du site
|
||||||
[F] user.json Données des utilisateurs
|
[F] user.json Données des utilisateurs
|
||||||
|
23
README.md
23
README.md
@ -1,4 +1,4 @@
|
|||||||
# ZwiiCMS 12.3.11
|
# ZwiiCMS 13.5.00
|
||||||
|
|
||||||
Zwii is a database-less (flat-file) CMS that allows you to easily create and manage a web site without any programming knowledge.
|
Zwii is a database-less (flat-file) CMS that allows you to easily create and manage a web site without any programming knowledge.
|
||||||
|
|
||||||
@ -15,14 +15,13 @@ ZwiiCMS was created by a talented developer, [Rémi Jean](https://remijean.fr/).
|
|||||||
|
|
||||||
This work is licensed under the Attribution-Noncommercial-No Derivative Works 4.0 International License.
|
This work is licensed under the Attribution-Noncommercial-No Derivative Works 4.0 International License.
|
||||||
|
|
||||||
To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/ or write to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
|
To view a copy of this license, visit <http://creativecommons.org/licenses/by-nc-nd/4.0/> or write to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
|
||||||
|
|
||||||
## Downloading ZwiiCMS
|
## Downloading ZwiiCMS
|
||||||
|
|
||||||
To download the latest released version, go to :
|
To download the latest released version, go to :
|
||||||
- [the Updates page](https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS/releases)
|
* [the Updates page](https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS/releases)
|
||||||
- or at [the site download page](https://zwiicms.fr/telechargement)
|
* or at [the site download page](https://zwiicms.fr/download)
|
||||||
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@ -30,7 +29,6 @@ Unzip the Zwii archive and upload its contents to the root of your server or to
|
|||||||
|
|
||||||
You will find more explanations, in particular for an installation at Free, in the "Downloads" section of the forum.
|
You will find more explanations, in particular for an installation at Free, in the "Downloads" section of the forum.
|
||||||
|
|
||||||
|
|
||||||
## Update procedures
|
## Update procedures
|
||||||
|
|
||||||
When installing a major version, it is recommended to make a backup copy.
|
When installing a major version, it is recommended to make a backup copy.
|
||||||
@ -47,7 +45,6 @@ When installing a major version, it is recommended to make a backup copy.
|
|||||||
* Unzip the new version on your computer.
|
* Unzip the new version on your computer.
|
||||||
* Transfer its content to your server by activating the file replacement.
|
* Transfer its content to your server by activating the file replacement.
|
||||||
|
|
||||||
|
|
||||||
## General tree structure
|
## General tree structure
|
||||||
|
|
||||||
*Legend: [D] Directory - [FILE] File
|
*Legend: [D] Directory - [FILE] File
|
||||||
@ -77,6 +74,7 @@ text
|
|||||||
[FILE] page.json Page data
|
[FILE] page.json Page data
|
||||||
[FILE] module.json Page module data
|
[FILE] module.json Page module data
|
||||||
[FILE] local.json Language-specific site data
|
[FILE] local.json Language-specific site data
|
||||||
|
[FILE] .default Unique file of default site language
|
||||||
[DIR] content Folder of page contents
|
[DIR] content Folder of page contents
|
||||||
[FILE] home.html Sample home page content
|
[FILE] home.html Sample home page content
|
||||||
[DIR] fonts Folder containing the installed fonts
|
[DIR] fonts Folder containing the installed fonts
|
||||||
@ -90,12 +88,13 @@ text
|
|||||||
[FILE] config.json Site configuration
|
[FILE] config.json Site configuration
|
||||||
[FILE] core.json Core configuration
|
[FILE] core.json Core configuration
|
||||||
[FILE] custom.css Advanced customization stylesheet
|
[FILE] custom.css Advanced customization stylesheet
|
||||||
[FILE] fonts.json Custom font descriptor
|
[FILE] font.json Custom font descriptor
|
||||||
[FILE] journal.log Action logging
|
[FILE] journal.log Activities logging
|
||||||
[FILE] languages.json Interface database languages
|
[FILE] language.json Interface languages database
|
||||||
|
[FILE] profil.json Users profiles database
|
||||||
[FILE] theme.css Site theme
|
[FILE] theme.css Site theme
|
||||||
[FILE] theme.json Site data
|
[FILE] theme.json Site database
|
||||||
[FILE] user.json User data
|
[FILE] user.json User database
|
||||||
[FILE] .backup Marker for file backup if present
|
[FILE] .backup Marker for file backup if present
|
||||||
[DIR] file File manager upload directory
|
[DIR] file File manager upload directory
|
||||||
[DIR] source Various resources
|
[DIR] source Various resources
|
||||||
|
@ -2,8 +2,11 @@
|
|||||||
|
|
||||||
class autoload {
|
class autoload {
|
||||||
public static function autoloader () {
|
public static function autoloader () {
|
||||||
|
require_once 'core/core.php';
|
||||||
|
require_once 'core/class/router.class.php';
|
||||||
require_once 'core/class/helper.class.php';
|
require_once 'core/class/helper.class.php';
|
||||||
require_once 'core/class/template.class.php';
|
require_once 'core/class/template.class.php';
|
||||||
|
require_once 'core/class/layout.class.php';
|
||||||
require_once 'core/class/sitemap/Runtime.class.php';
|
require_once 'core/class/sitemap/Runtime.class.php';
|
||||||
require_once 'core/class/sitemap/FileSystem.class.php';
|
require_once 'core/class/sitemap/FileSystem.class.php';
|
||||||
require_once 'core/class/sitemap/SitemapGenerator.class.php';
|
require_once 'core/class/sitemap/SitemapGenerator.class.php';
|
||||||
|
@ -8,7 +8,7 @@ class helper
|
|||||||
|
|
||||||
/** Filtres personnalisés */
|
/** Filtres personnalisés */
|
||||||
const FILTER_BOOLEAN = 1;
|
const FILTER_BOOLEAN = 1;
|
||||||
const FILTER_DATETIME = 2;
|
const FILTER_DATETIME = 2; // filtre pour le champ de formulaire A conserver pour la compatibilité
|
||||||
const FILTER_FLOAT = 3;
|
const FILTER_FLOAT = 3;
|
||||||
const FILTER_ID = 4;
|
const FILTER_ID = 4;
|
||||||
const FILTER_INT = 5;
|
const FILTER_INT = 5;
|
||||||
@ -16,8 +16,14 @@ class helper
|
|||||||
const FILTER_PASSWORD = 7;
|
const FILTER_PASSWORD = 7;
|
||||||
const FILTER_STRING_LONG = 8;
|
const FILTER_STRING_LONG = 8;
|
||||||
const FILTER_STRING_SHORT = 9;
|
const FILTER_STRING_SHORT = 9;
|
||||||
const FILTER_TIMESTAMP = 10;
|
const FILTER_TIMESTAMP = 10; // Saisie d'une date en locatime
|
||||||
const FILTER_URL = 11;
|
const FILTER_URL = 11;
|
||||||
|
const FILTER_DATE = 12; // filtre pour le champ de formulaire
|
||||||
|
const FILTER_TIME = 13; // filtre pour le champ de formulair
|
||||||
|
const FILTER_MONTH = 14; // filtre pour le champ de formulair
|
||||||
|
const FILTER_YEAR = 16; // filtre pour le champ de formulair
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -26,22 +32,6 @@ class helper
|
|||||||
|
|
||||||
public static function translate($text)
|
public static function translate($text)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
*
|
|
||||||
$target = 'redirection';
|
|
||||||
$url = $_SERVER['QUERY_STRING'];
|
|
||||||
$module = explode('/', $url);
|
|
||||||
if ( $module[0] === $target)
|
|
||||||
{
|
|
||||||
// La traduction existe déjà dans le core
|
|
||||||
if (array_key_exists($text, core::$dialog) === false && !empty($text)) {
|
|
||||||
$dialogues = json_decode(file_get_contents('module/' . $target . '/i18n/fr_FR.json' ), true);
|
|
||||||
$data = array_merge($dialogues,[$text => '']);
|
|
||||||
file_put_contents ('module/' . $target . '/i18n/fr_FR.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT), LOCK_EX);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// La traduction existe déjà dans le core
|
// La traduction existe déjà dans le core
|
||||||
/*
|
/*
|
||||||
@ -59,16 +49,17 @@ class helper
|
|||||||
* Date au format time()
|
* Date au format time()
|
||||||
* $format strftime
|
* $format strftime
|
||||||
*/
|
*/
|
||||||
public static function dateUTF8($format, $date)
|
public static function dateUTF8($format, $date, $locale = 'fr_FR')
|
||||||
{
|
{
|
||||||
require_once 'core/class/strftime/php-8.1-strftime.class.php';
|
require_once 'core/class/strftime/php-8.1-strftime.class.php';
|
||||||
return mb_convert_encoding(\PHP81_BC\strftime($format, $date), 'UTF-8', mb_list_encodings());
|
return mb_convert_encoding(\PHP81_BC\strftime($format, $date, $locale), 'UTF-8', mb_list_encodings());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fonction pour assurer la traduction des messages
|
* Fonction pour assurer la traduction des messages
|
||||||
*/
|
*/
|
||||||
public static function googleTranslate($to, $text){
|
public static function googleTranslate($to, $text)
|
||||||
|
{
|
||||||
if (!file_exists('site/i18n/' . $to . '.json')) {
|
if (!file_exists('site/i18n/' . $to . '.json')) {
|
||||||
file_put_contents('site/i18n/' . $to . '.json', json_encode([]));
|
file_put_contents('site/i18n/' . $to . '.json', json_encode([]));
|
||||||
}
|
}
|
||||||
@ -92,7 +83,7 @@ class helper
|
|||||||
// Créer la variable
|
// Créer la variable
|
||||||
$data = array_merge($data, [$text => '']);
|
$data = array_merge($data, [$text => '']);
|
||||||
}
|
}
|
||||||
file_put_contents ('site/i18n/' . $to . '.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT), LOCK_EX);
|
file_put_contents('site/i18n/' . $to . '.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -353,13 +344,12 @@ class helper
|
|||||||
{
|
{
|
||||||
// N'interroge que le serveur Apache
|
// N'interroge que le serveur Apache
|
||||||
if (strpos($_SERVER["SERVER_SOFTWARE"], 'Apache') > 0) {
|
if (strpos($_SERVER["SERVER_SOFTWARE"], 'Apache') > 0) {
|
||||||
self::$rewriteStatus === false;
|
self::$rewriteStatus = false;
|
||||||
} elseif (self::$rewriteStatus === null) {
|
} else {
|
||||||
// Ouvre et scinde le fichier .htaccess
|
// Ouvre et scinde le fichier .htaccess
|
||||||
$htaccess = explode('# URL rewriting', file_get_contents('.htaccess'));
|
$htaccess = explode('# URL rewriting', file_get_contents('.htaccess'));
|
||||||
// Retourne un boolean en fonction du contenu de la partie réservée à l'URL rewriting
|
// Retourne un boolean en fonction du contenu de la partie réservée à l'URL rewriting
|
||||||
//self::$rewriteStatus = (empty($htaccess[1]) === false);
|
self::$rewriteStatus = (strpos($htaccess[1], 'RewriteEngine on') !== false);
|
||||||
self::$rewriteStatus = (strpos($htaccess[1], 'RewriteEngine on') > 0) ? true : false;
|
|
||||||
}
|
}
|
||||||
return self::$rewriteStatus;
|
return self::$rewriteStatus;
|
||||||
}
|
}
|
||||||
@ -381,11 +371,11 @@ class helper
|
|||||||
public static function checkNewVersion($channel)
|
public static function checkNewVersion($channel)
|
||||||
{
|
{
|
||||||
$version = helper::getOnlineVersion($channel);
|
$version = helper::getOnlineVersion($channel);
|
||||||
|
$update = false;
|
||||||
if (!empty($version)) {
|
if (!empty($version)) {
|
||||||
return ((version_compare(common::ZWII_VERSION, $version)) === -1);
|
$update = version_compare(common::ZWII_VERSION, $version) == -1;
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return $update;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -418,8 +408,8 @@ class helper
|
|||||||
*/
|
*/
|
||||||
public static function deleteCookie($cookieKey)
|
public static function deleteCookie($cookieKey)
|
||||||
{
|
{
|
||||||
unset($_COOKIE[$cookieKey]);
|
|
||||||
setcookie($cookieKey, '', time() - 3600, helper::baseUrl(false, false), '', false, true);
|
setcookie($cookieKey, '', time() - 3600, helper::baseUrl(false, false), '', false, true);
|
||||||
|
unset($_COOKIE[$cookieKey]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -442,16 +432,19 @@ class helper
|
|||||||
$text = (int) $date->format('U');
|
$text = (int) $date->format('U');
|
||||||
break;
|
break;
|
||||||
case self::FILTER_FLOAT:
|
case self::FILTER_FLOAT:
|
||||||
$text = filter_var($text, FILTER_SANITIZE_NUMBER_FLOAT);
|
$text = str_replace(',', '.', $text); // Remplacer les virgules par des points
|
||||||
|
$text = filter_var($text, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
|
||||||
$text = (float) $text;
|
$text = (float) $text;
|
||||||
break;
|
break;
|
||||||
case self::FILTER_ID:
|
case self::FILTER_ID:
|
||||||
$text = mb_strtolower($text, 'UTF-8');
|
$text = mb_strtolower($text, 'UTF-8');
|
||||||
$text = strip_tags(str_replace(
|
$text = strip_tags(
|
||||||
|
str_replace(
|
||||||
explode(',', 'á,à,â,ä,ã,å,ç,é,è,ê,ë,í,ì,î,ï,ñ,ó,ò,ô,ö,õ,ú,ù,û,ü,ý,ÿ,\',", '),
|
explode(',', 'á,à,â,ä,ã,å,ç,é,è,ê,ë,í,ì,î,ï,ñ,ó,ò,ô,ö,õ,ú,ù,û,ü,ý,ÿ,\',", '),
|
||||||
explode(',', 'a,a,a,a,a,a,c,e,e,e,e,i,i,i,i,n,o,o,o,o,o,u,u,u,u,y,y,-,-,-'),
|
explode(',', 'a,a,a,a,a,a,c,e,e,e,e,i,i,i,i,n,o,o,o,o,o,u,u,u,u,y,y,-,-,-'),
|
||||||
$text
|
$text
|
||||||
));
|
)
|
||||||
|
);
|
||||||
$text = preg_replace('/([^a-z0-9-])/', '', $text);
|
$text = preg_replace('/([^a-z0-9-])/', '', $text);
|
||||||
// Supprime les emoji
|
// Supprime les emoji
|
||||||
$text = preg_replace('/[[:^print:]]/', '', $text);
|
$text = preg_replace('/[[:^print:]]/', '', $text);
|
||||||
@ -487,6 +480,11 @@ class helper
|
|||||||
case self::FILTER_URL:
|
case self::FILTER_URL:
|
||||||
$text = filter_var($text, FILTER_SANITIZE_URL);
|
$text = filter_var($text, FILTER_SANITIZE_URL);
|
||||||
break;
|
break;
|
||||||
|
case self::FILTER_DATE:
|
||||||
|
$text = date('Y-m-d', $text);
|
||||||
|
break;
|
||||||
|
case self::FILTER_TIME:
|
||||||
|
$text = date('H:i', $text);
|
||||||
}
|
}
|
||||||
return $text;
|
return $text;
|
||||||
}
|
}
|
||||||
@ -571,7 +569,7 @@ class helper
|
|||||||
* @param null|int $sufix Suffixe de l'url
|
* @param null|int $sufix Suffixe de l'url
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public static function pagination($array, $url, $item, $sufix = null)
|
public static function pagination($array, $url, $item, $suffix = null)
|
||||||
{
|
{
|
||||||
// Scinde l'url
|
// Scinde l'url
|
||||||
$url = explode('/', $url);
|
$url = explode('/', $url);
|
||||||
@ -595,7 +593,7 @@ class helper
|
|||||||
if ($nbPage > 1) {
|
if ($nbPage > 1) {
|
||||||
for ($i = 1; $i <= $nbPage; $i++) {
|
for ($i = 1; $i <= $nbPage; $i++) {
|
||||||
$disabled = ($i === $currentPage) ? ' class="disabled"' : false;
|
$disabled = ($i === $currentPage) ? ' class="disabled"' : false;
|
||||||
$pages .= '<a href="' . helper::baseUrl() . $urlCurrent . '/' . $i . $sufix . '"' . $disabled . '>' . $i . '</a>';
|
$pages .= '<a href="' . helper::baseUrl() . $urlCurrent . '/' . $i . $suffix . '"' . $disabled . '>' . $i . '</a>';
|
||||||
}
|
}
|
||||||
$pages = '<div class="pagination">' . $pages . '</div>';
|
$pages = '<div class="pagination">' . $pages . '</div>';
|
||||||
}
|
}
|
||||||
@ -675,20 +673,43 @@ class helper
|
|||||||
public static function subword($text, $start, $length)
|
public static function subword($text, $start, $length)
|
||||||
{
|
{
|
||||||
$text = trim($text);
|
$text = trim($text);
|
||||||
if (strlen($text) > $length) {
|
|
||||||
|
// Vérifier si la longueur du texte sans les balises dépasse la longueur souhaitée
|
||||||
|
if (mb_strlen(strip_tags($text)) > $length) {
|
||||||
|
// Utiliser mb_substr pour couper le texte
|
||||||
$text = mb_substr($text, $start, $length);
|
$text = mb_substr($text, $start, $length);
|
||||||
$text = mb_substr($text, 0, min(mb_strlen($text), mb_strrpos($text, ' ')));
|
|
||||||
|
// S'assurer que le texte ne se termine pas au milieu d'un mot
|
||||||
|
$lastSpace = mb_strrpos($text, ' ');
|
||||||
|
if ($lastSpace !== false) {
|
||||||
|
$text = mb_substr($text, 0, $lastSpace);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fermer les balises HTML ouvertes
|
||||||
|
$dom = new DOMDocument();
|
||||||
|
@$dom->loadHTML('<div>' . $text . '</div>', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
|
||||||
|
$text = $dom->saveHTML();
|
||||||
|
|
||||||
|
// Retirer la balise de conteneur ajoutée
|
||||||
|
$text = preg_replace('~^<div>(.*)</div>$~s', '$1', $text);
|
||||||
|
|
||||||
|
// Ajouter des points de suspension si le texte a été coupé
|
||||||
|
$text .= '...';
|
||||||
|
}
|
||||||
|
|
||||||
return $text;
|
return $text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cryptage
|
* Cryptage
|
||||||
* @param string $key la clé d'encryptage
|
* @param string $key la clé d'encryptage
|
||||||
* @param string $string la chaine à coder
|
* @param string $string la chaine à coder
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function encrypt($string, $key) {
|
public static function encrypt($string, $key)
|
||||||
|
{
|
||||||
$encrypted = openssl_encrypt($string, "AES-256-CBC", $key, 0, substr(md5($key), 0, 16));
|
$encrypted = openssl_encrypt($string, "AES-256-CBC", $key, 0, substr(md5($key), 0, 16));
|
||||||
return base64_encode($encrypted);
|
return base64_encode($encrypted);
|
||||||
}
|
}
|
||||||
@ -699,7 +720,8 @@ class helper
|
|||||||
* @param string $string la chaine à décoder
|
* @param string $string la chaine à décoder
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function decrypt($string, $key) {
|
public static function decrypt($string, $key)
|
||||||
|
{
|
||||||
$decrypted = openssl_decrypt(base64_decode($string), "AES-256-CBC", $key, 0, substr(md5($key), 0, 16));
|
$decrypted = openssl_decrypt(base64_decode($string), "AES-256-CBC", $key, 0, substr(md5($key), 0, 16));
|
||||||
return $decrypted;
|
return $decrypted;
|
||||||
}
|
}
|
||||||
|
@ -141,7 +141,7 @@ class Dot implements \ArrayAccess, \Iterator, \Countable
|
|||||||
} elseif (is_array($key)) {
|
} elseif (is_array($key)) {
|
||||||
// Iterate array of paths
|
// Iterate array of paths
|
||||||
foreach ($key as $k) {
|
foreach ($key as $k) {
|
||||||
self::delete($k);
|
self::deleteValue($array, $k);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,12 @@ class JsonDb extends \Prowebcraft\Dot
|
|||||||
protected $db = '';
|
protected $db = '';
|
||||||
protected $data = null;
|
protected $data = null;
|
||||||
protected $config = [];
|
protected $config = [];
|
||||||
|
// Tentative d'encodage après échec
|
||||||
|
const MAX_JSON_ENCODE_ATTEMPTS = 5;
|
||||||
|
// Tentative d'écriture après échec
|
||||||
|
const MAX_FILE_WRITE_ATTEMPTS = 5;
|
||||||
|
// Délais entre deux tentaives
|
||||||
|
const RETRY_DELAY_SECONDS = 1;
|
||||||
|
|
||||||
public function __construct($config = [])
|
public function __construct($config = [])
|
||||||
{
|
{
|
||||||
@ -121,10 +127,10 @@ class JsonDb extends \Prowebcraft\Dot
|
|||||||
} else {
|
} else {
|
||||||
if ($this->config['backup']) {
|
if ($this->config['backup']) {
|
||||||
try {
|
try {
|
||||||
//todo make backup of database
|
|
||||||
copy($this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name'], $this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name'] . '.backup');
|
copy($this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name'], $this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name'] . '.backup');
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
|
error_log('Erreur de chargement : ' . $e);
|
||||||
|
exit('Erreur de chargement : ' . $e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -142,21 +148,44 @@ class JsonDb extends \Prowebcraft\Dot
|
|||||||
*/
|
*/
|
||||||
public function save()
|
public function save()
|
||||||
{
|
{
|
||||||
$v = json_encode($this->data, JSON_UNESCAPED_UNICODE);
|
// Encode les données au format JSON avec les options spécifiées
|
||||||
$l = strlen($v);
|
//$encoded_data = json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT | JSON_PRETTY_PRINT);
|
||||||
$t = 0;
|
$encoded_data = json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT);
|
||||||
while ($t < 5) {
|
|
||||||
$w = file_put_contents($this->db, $v); // Multi user get a locker
|
// Vérifie la longueur de la chaîne JSON encodée
|
||||||
if ($w == $l) {
|
$encoded_length = strlen($encoded_data);
|
||||||
|
|
||||||
|
// Initialise le compteur de tentatives
|
||||||
|
$attempt = 0;
|
||||||
|
|
||||||
|
// Tente d'encoder les données en JSON et de les sauvegarder jusqu'à 5 fois en cas d'échec
|
||||||
|
while ($attempt < 5) {
|
||||||
|
// Essaye d'écrire les données encodées dans le fichier de base de données
|
||||||
|
$write_result = file_put_contents($this->db, $encoded_data, LOCK_EX); // Les utilisateurs multiples obtiennent un verrou
|
||||||
|
|
||||||
|
//$now = \DateTime::createFromFormat('U.u', microtime(true));
|
||||||
|
//file_put_contents("tmplog.txt", '[JsonDb][' . $now->format('H:i:s.u') . ']--' . $this->db . "\r\n", FILE_APPEND);
|
||||||
|
|
||||||
|
// Vérifie si l'écriture a réussi
|
||||||
|
if ($write_result === $encoded_length) {
|
||||||
|
// Sort de la boucle si l'écriture a réussi
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$t++;
|
|
||||||
}
|
// Incrémente le compteur de tentatives
|
||||||
if ($w !== $l) {
|
$attempt++;
|
||||||
exit('Erreur d\'écriture, les données n\'ont pas été sauvegardées');
|
|
||||||
}
|
// Attente
|
||||||
|
sleep(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Vérifie si l'écriture a échoué même après plusieurs tentatives
|
||||||
|
if ($write_result !== $encoded_length) {
|
||||||
|
// Enregistre un message d'erreur dans le journal des erreurs
|
||||||
|
error_log('Erreur d\'écriture, les données n\'ont pas été sauvegardées.');
|
||||||
|
|
||||||
|
// Affiche un message d'erreur et termine le script
|
||||||
|
exit('Erreur d\'écriture, les données n\'ont pas été sauvegardées.');
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -55,9 +55,9 @@ class layout extends common
|
|||||||
* Formate le contenu de la page selon les gabarits
|
* Formate le contenu de la page selon les gabarits
|
||||||
* @param Page par defaut
|
* @param Page par defaut
|
||||||
*/
|
*/
|
||||||
public function showSection()
|
public function showMain()
|
||||||
{
|
{
|
||||||
echo '<section>';
|
echo '<main><section>';
|
||||||
// Récupérer la config de la page courante
|
// Récupérer la config de la page courante
|
||||||
$blocks = is_null($this->getData(['page', $this->getUrl(0), 'block'])) ? '12' : $this->getData(['page', $this->getUrl(0), 'block']);
|
$blocks = is_null($this->getData(['page', $this->getUrl(0), 'block'])) ? '12' : $this->getData(['page', $this->getUrl(0), 'block']);
|
||||||
$blocks = explode('-', $blocks);
|
$blocks = explode('-', $blocks);
|
||||||
@ -82,19 +82,33 @@ class layout extends common
|
|||||||
$content = 'col' . $blocks[1];
|
$content = 'col' . $blocks[1];
|
||||||
$blockright = 'col' . $blocks[2];
|
$blockright = 'col' . $blocks[2];
|
||||||
}
|
}
|
||||||
// Page pleine pour la configuration des modules et l'édition des pages sauf l'affichage d'un article de blog
|
// Toujours en pleine page pour la configuration des modules et l'édition des pages sauf l'affichage d'un article de blog
|
||||||
$pattern = ['config', 'edit', 'add', 'comment', 'data'];
|
$pattern = ['config', 'edit', 'add', 'comment', 'data', 'option', 'theme', 'comment', 'article', 'data', 'gallery', 'update', 'users', 'validate'];
|
||||||
if (
|
if (
|
||||||
(sizeof($blocks) === 1 ||
|
(sizeof($blocks) === 1 ||
|
||||||
in_array($this->getUrl(1), $pattern))
|
in_array($this->getUrl(1), $pattern))
|
||||||
) { // Pleine page en mode configuration
|
) { // Pleine page en mode configuration
|
||||||
|
if (
|
||||||
|
($this->getData(['page', $this->getUrl(0), 'navLeft']) === 'top'
|
||||||
|
|| $this->getData(['page', $this->getUrl(0), 'navRight']) === 'top')
|
||||||
|
&& in_array($this->getUrl(1), $pattern) === false
|
||||||
|
) {
|
||||||
|
$this->showNavButtons('top');
|
||||||
|
}
|
||||||
$this->showContent();
|
$this->showContent();
|
||||||
|
if (
|
||||||
|
($this->getData(['page', $this->getUrl(0), 'navLeft']) === 'bottom'
|
||||||
|
|| $this->getData(['page', $this->getUrl(0), 'navRight']) === 'bottom')
|
||||||
|
&& in_array($this->getUrl(1), $pattern) === false
|
||||||
|
) {
|
||||||
|
$this->showNavButtons('bottom');
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
echo '<div class="row siteContainer">';
|
echo '<div class="row siteContainer">';
|
||||||
/**
|
/**
|
||||||
* Barre gauche
|
* Barre gauche
|
||||||
*/
|
*/
|
||||||
if ($blockleft !== "") {
|
if ($blockleft !== '') {
|
||||||
echo '<div class="' . $blockleft . '" id="contentLeft"><aside>';
|
echo '<div class="' . $blockleft . '" id="contentLeft"><aside>';
|
||||||
// Détermine si le menu est présent
|
// Détermine si le menu est présent
|
||||||
if ($this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'displayMenu']) === 'none') {
|
if ($this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'displayMenu']) === 'none') {
|
||||||
@ -117,12 +131,14 @@ class layout extends common
|
|||||||
* Contenu de page
|
* Contenu de page
|
||||||
*/
|
*/
|
||||||
echo '<div class="' . $content . '" id="contentSite">';
|
echo '<div class="' . $content . '" id="contentSite">';
|
||||||
|
$this->showNavButtons('top');
|
||||||
$this->showContent();
|
$this->showContent();
|
||||||
|
$this->showNavButtons('bottom');
|
||||||
echo '</div>';
|
echo '</div>';
|
||||||
/**
|
/**
|
||||||
* Barre droite
|
* Barre droite
|
||||||
*/
|
*/
|
||||||
if ($blockright !== "") {
|
if ($blockright !== '') {
|
||||||
echo '<div class="' . $blockright . '" id="contentRight"><aside>';
|
echo '<div class="' . $blockright . '" id="contentRight"><aside>';
|
||||||
// Détermine si le menu est présent
|
// Détermine si le menu est présent
|
||||||
if ($this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'displayMenu']) === 'none') {
|
if ($this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'displayMenu']) === 'none') {
|
||||||
@ -143,7 +159,7 @@ class layout extends common
|
|||||||
}
|
}
|
||||||
echo '</div>';
|
echo '</div>';
|
||||||
}
|
}
|
||||||
echo '</section>';
|
echo '</section></main>';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -317,12 +333,12 @@ class layout extends common
|
|||||||
$items .= '<span id="footerDisplayCookie"';
|
$items .= '<span id="footerDisplayCookie"';
|
||||||
$items .= ($this->getData(['config', 'cookieConsent']) === true && $this->getData(['theme', 'footer', 'displayCookie']) === true) ? '>' : ' class="displayNone" >';
|
$items .= ($this->getData(['config', 'cookieConsent']) === true && $this->getData(['theme', 'footer', 'displayCookie']) === true) ? '>' : ' class="displayNone" >';
|
||||||
$label = empty($this->getData(['locale', 'cookies', 'cookiesFooterText'])) ? 'Cookies' : $this->getData(['locale', 'cookies', 'cookiesFooterText']);
|
$label = empty($this->getData(['locale', 'cookies', 'cookiesFooterText'])) ? 'Cookies' : $this->getData(['locale', 'cookies', 'cookiesFooterText']);
|
||||||
$items .= '<wbr> | <a href="javascript:void(0)" class="skiptranslate" id="footerLinkCookie">' . $label . '</a>';
|
$items .= '<wbr> | <a href="javascript:void(0)" id="footerLinkCookie">' . $label . '</a>';
|
||||||
$items .= '</span>';
|
$items .= '</span>';
|
||||||
// Affichage du lien de connexion
|
// Affichage du lien de connexion
|
||||||
if (
|
if (
|
||||||
($this->getData(['theme', 'footer', 'loginLink'])
|
($this->getData(['theme', 'footer', 'loginLink'])
|
||||||
and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
|
and $this->isConnected() === false
|
||||||
)
|
)
|
||||||
or $this->getUrl(0) === 'theme'
|
or $this->getUrl(0) === 'theme'
|
||||||
) {
|
) {
|
||||||
@ -337,19 +353,14 @@ class layout extends common
|
|||||||
}
|
}
|
||||||
// Affichage de la barre de membre simple
|
// Affichage de la barre de membre simple
|
||||||
if (
|
if (
|
||||||
$this->getUser('group') === self::GROUP_MEMBER
|
$this->getUser('group') >= self::GROUP_MEMBER && $this->getUser('group') < self::GROUP_ADMIN
|
||||||
&& $this->getData(['theme', 'footer', 'memberBar']) === true
|
&& $this->getData(['theme', 'footer', 'memberBar']) === true
|
||||||
) {
|
) {
|
||||||
$items .= '<span id="footerDisplayMemberAccount"';
|
$items .= '<span id="footerDisplayMemberAccount"';
|
||||||
$items .= $this->getData(['theme', 'footer', 'displaymemberAccount']) === false ? ' class="displayNone">' : '>';
|
$items .= $this->getData(['theme', 'footer', 'displaymemberAccount']) === false ? ' class="displayNone">' : '>';
|
||||||
$items .= '<wbr> | ' .
|
$items .= '<wbr> | ';
|
||||||
template::ico('user', [
|
|
||||||
'margin' => 'all',
|
|
||||||
'help' => 'Mon compte',
|
|
||||||
'href' => helper::baseUrl() . 'user/edit/' . $this->getUser('id') . '/' . $_SESSION['csrf']
|
|
||||||
]);
|
|
||||||
if (
|
if (
|
||||||
$this->getData(['user', $this->getUser('id'), 'files']) === true
|
$this->getUser('permission', 'filemanager') === true
|
||||||
) {
|
) {
|
||||||
$items .= '<wbr>' . template::ico('folder', [
|
$items .= '<wbr>' . template::ico('folder', [
|
||||||
'href' => helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php?type=0&akey=' . md5_file(self::DATA_DIR . 'core.json') . '&lang=' . $this->getData(['user', $this->getUser('id'), 'language']),
|
'href' => helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php?type=0&akey=' . md5_file(self::DATA_DIR . 'core.json') . '&lang=' . $this->getData(['user', $this->getUser('id'), 'language']),
|
||||||
@ -358,6 +369,15 @@ class layout extends common
|
|||||||
'help' => 'Fichiers du site'
|
'help' => 'Fichiers du site'
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', 'user', 'edit') === true
|
||||||
|
) {
|
||||||
|
$items .= '<wbr>' . template::ico('user', [
|
||||||
|
'margin' => 'all',
|
||||||
|
'help' => 'Mon compte',
|
||||||
|
'href' => helper::baseUrl() . 'user/edit/' . $this->getUser('id')
|
||||||
|
]);
|
||||||
|
}
|
||||||
$items .= '<wbr>' . template::ico('logout', [
|
$items .= '<wbr>' . template::ico('logout', [
|
||||||
'margin' => 'all',
|
'margin' => 'all',
|
||||||
'help' => 'Déconnecter',
|
'help' => 'Déconnecter',
|
||||||
@ -431,7 +451,7 @@ class layout extends common
|
|||||||
$socialUrl = '';
|
$socialUrl = '';
|
||||||
}
|
}
|
||||||
if ($socialId !== '') {
|
if ($socialId !== '') {
|
||||||
$socials .= '<a href="' . $socialUrl . $socialId . '" onclick="window.open(this.href);return false" data-tippy-content="' . $title . '">' . template::ico(substr(str_replace('User', '', $socialName), 0, -2)) . '</a>';
|
$socials .= '<a href="' . $socialUrl . $socialId . '" onclick="window.open(this.href);return false" data-tippy-content="' . $title . '" alt="' . $title . '">' . template::ico(substr(str_replace('User', '', $socialName), 0, -2)) . '</a>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($socials !== '') {
|
if ($socials !== '') {
|
||||||
@ -481,7 +501,7 @@ class layout extends common
|
|||||||
// Lien de connexion
|
// Lien de connexion
|
||||||
if (
|
if (
|
||||||
($this->getData(['theme', 'menu', 'loginLink'])
|
($this->getData(['theme', 'menu', 'loginLink'])
|
||||||
and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
|
and $this->isConnected() === false
|
||||||
)
|
)
|
||||||
or $this->getUrl(0) === 'theme'
|
or $this->getUrl(0) === 'theme'
|
||||||
) {
|
) {
|
||||||
@ -494,11 +514,12 @@ class layout extends common
|
|||||||
}
|
}
|
||||||
// Commandes pour les membres simples
|
// Commandes pour les membres simples
|
||||||
if (
|
if (
|
||||||
$this->getUser('group') == self::GROUP_MEMBER
|
$this->getUser('group') === self::GROUP_MEMBER
|
||||||
&& $this->getData(['theme', 'menu', 'memberBar']) === true
|
&& $this->getData(['theme', 'menu', 'memberBar']) === true
|
||||||
) {
|
) {
|
||||||
if (
|
if (
|
||||||
$this->getData(['user', $this->getUser('id'), 'files']) === true
|
$this->getUser('group') >= self::GROUP_MEMBER &&
|
||||||
|
$this->getUser('permission', 'filemanager') === true
|
||||||
) {
|
) {
|
||||||
$itemsRight .= '<li>' . template::ico('folder', [
|
$itemsRight .= '<li>' . template::ico('folder', [
|
||||||
'href' => helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php?type=0&akey=' . md5_file(self::DATA_DIR . 'core.json') . '&lang=' . $this->getData(['user', $this->getUser('id'), 'language']),
|
'href' => helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php?type=0&akey=' . md5_file(self::DATA_DIR . 'core.json') . '&lang=' . $this->getData(['user', $this->getUser('id'), 'language']),
|
||||||
@ -506,11 +527,15 @@ class layout extends common
|
|||||||
'help' => 'Fichiers du site'
|
'help' => 'Fichiers du site'
|
||||||
]) . '</li>';
|
]) . '</li>';
|
||||||
}
|
}
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', 'user', 'edit') === true
|
||||||
|
) {
|
||||||
$itemsRight .= '<li>' . template::ico('user', [
|
$itemsRight .= '<li>' . template::ico('user', [
|
||||||
'help' => 'Mon compte',
|
'help' => 'Mon compte',
|
||||||
'margin' => 'right',
|
'margin' => 'right',
|
||||||
'href' => helper::baseUrl() . 'user/edit/' . $this->getUser('id') . '/' . $_SESSION['csrf']
|
'href' => helper::baseUrl() . 'user/edit/' . $this->getUser('id')
|
||||||
]) . '</li>';
|
]) . '</li>';
|
||||||
|
}
|
||||||
$itemsRight .= '<li>' .
|
$itemsRight .= '<li>' .
|
||||||
template::ico('logout', [
|
template::ico('logout', [
|
||||||
'help' => 'Déconnecter',
|
'help' => 'Déconnecter',
|
||||||
@ -563,10 +588,10 @@ class layout extends common
|
|||||||
|
|
||||||
if (
|
if (
|
||||||
($this->getData(['page', $parentPageId, 'disable']) === true
|
($this->getData(['page', $parentPageId, 'disable']) === true
|
||||||
and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
|
and $this->isConnected() === false
|
||||||
) or ($this->getData(['page', $parentPageId, 'disable']) === true
|
) or ($this->getData(['page', $parentPageId, 'disable']) === true
|
||||||
and $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
and $this->isConnected() === true
|
||||||
and $this->getUser('group') < self::GROUP_MODERATOR
|
and $this->getUser('group') < self::GROUP_EDITOR
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
$pageUrl = ($this->getData(['locale', 'homePageId']) === $this->getUrl(0)) ? helper::baseUrl(false) : helper::baseUrl() . $this->getUrl(0);
|
$pageUrl = ($this->getData(['locale', 'homePageId']) === $this->getUrl(0)) ? helper::baseUrl(false) : helper::baseUrl() . $this->getUrl(0);
|
||||||
@ -629,10 +654,10 @@ class layout extends common
|
|||||||
$items .= '<li id=' . $childKey . '>';
|
$items .= '<li id=' . $childKey . '>';
|
||||||
if (
|
if (
|
||||||
($this->getData(['page', $childKey, 'disable']) === true
|
($this->getData(['page', $childKey, 'disable']) === true
|
||||||
and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
|
and $this->isConnected() === false
|
||||||
) or ($this->getData(['page', $childKey, 'disable']) === true
|
) or ($this->getData(['page', $childKey, 'disable']) === true
|
||||||
and $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
and $this->isConnected() === true
|
||||||
and $this->getUser('group') < self::GROUP_MODERATOR
|
and $this->getUser('group') < self::GROUP_EDITOR
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
$pageUrl = ($this->getData(['locale', 'homePageId']) === $this->getUrl(0)) ? helper::baseUrl(false) : helper::baseUrl() . $this->getUrl(0);
|
$pageUrl = ($this->getData(['locale', 'homePageId']) === $this->getUrl(0)) ? helper::baseUrl(false) : helper::baseUrl() . $this->getUrl(0);
|
||||||
@ -725,7 +750,7 @@ class layout extends common
|
|||||||
$items .= '<li class="menuSideChild">';
|
$items .= '<li class="menuSideChild">';
|
||||||
if (
|
if (
|
||||||
$this->getData(['page', $parentPageId, 'disable']) === true
|
$this->getData(['page', $parentPageId, 'disable']) === true
|
||||||
and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
|
and $this->isConnected() === false
|
||||||
) {
|
) {
|
||||||
$items .= '<a href="' . $this->getUrl(1) . '">';
|
$items .= '<a href="' . $this->getUrl(1) . '">';
|
||||||
} else {
|
} else {
|
||||||
@ -749,7 +774,7 @@ class layout extends common
|
|||||||
|
|
||||||
if (
|
if (
|
||||||
$this->getData(['page', $childKey, 'disable']) === true
|
$this->getData(['page', $childKey, 'disable']) === true
|
||||||
and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
|
and $this->isConnected() === false
|
||||||
) {
|
) {
|
||||||
$itemsChildren .= '<a href="' . $this->getUrl(1) . '">';
|
$itemsChildren .= '<a href="' . $this->getUrl(1) . '">';
|
||||||
} else {
|
} else {
|
||||||
@ -815,12 +840,34 @@ class layout extends common
|
|||||||
*/
|
*/
|
||||||
public function showMetaImage()
|
public function showMetaImage()
|
||||||
{
|
{
|
||||||
$items = '<meta property="og:image" content="' . helper::baseUrl(false) . self::FILE_DIR . 'source/screenshot.jpg" />';
|
$imagePath = self::FILE_DIR . 'source/' . $this->getData(['config', 'seo', 'openGraphImage']);
|
||||||
$items .= '<meta property="og:image:type" content="image/jpeg" />';
|
if (
|
||||||
$items .= '<meta property="og:image:width" content="1200" />';
|
$this->getData(['config', 'seo', 'openGraphImage'])
|
||||||
$items .= '<meta property="og:image:height" content="627" />';
|
&& file_exists($imagePath)
|
||||||
|
) {
|
||||||
|
$typeMime = exif_imagetype($imagePath);
|
||||||
|
switch ($typeMime) {
|
||||||
|
case IMAGETYPE_JPEG:
|
||||||
|
$typeMime = 'image/jpeg';
|
||||||
|
break;
|
||||||
|
case IMAGETYPE_PNG:
|
||||||
|
$typeMime = 'image/png';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Type incorrect
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$imageSize = getimagesize($imagePath);
|
||||||
|
$wide = $imageSize[0];
|
||||||
|
$height = $imageSize[1];
|
||||||
|
//Sortie
|
||||||
|
$items = '<meta property="og:image" content="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['config', 'seo', 'openGraphImage']) . '" />';
|
||||||
|
$items .= '<meta property="og:image:type" content="' . $typeMime . '" />';
|
||||||
|
$items .= '<meta property="og:image:width" content="' . $wide . '" />';
|
||||||
|
$items .= '<meta property="og:image:height" content="' . $height . '" />';
|
||||||
echo $items;
|
echo $items;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Affiche la notification
|
* Affiche la notification
|
||||||
@ -863,28 +910,31 @@ class layout extends common
|
|||||||
*/
|
*/
|
||||||
public function showBar()
|
public function showBar()
|
||||||
{
|
{
|
||||||
if ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')) {
|
if ($this->isConnected() === true) {
|
||||||
// Items de gauche
|
// Items de gauche
|
||||||
$leftItems = '';
|
$leftItems = '';
|
||||||
// Sélecteur de langues
|
// Sélecteur de langues
|
||||||
if ($this->getUser('group') >= self::GROUP_MODERATOR) {
|
if ($this->getUser('group') >= self::GROUP_EDITOR) {
|
||||||
$c = 0;
|
|
||||||
$leftItem = '';
|
$leftItem = '';
|
||||||
foreach (self::$languages as $key => $value) {
|
foreach (self::$languages as $key => $value) {
|
||||||
if (is_dir(self::DATA_DIR . $key)) {
|
if (is_dir(self::DATA_DIR . $key)) {
|
||||||
$c++;
|
$location = helper::baseUrl() . 'language/content/' . $key;
|
||||||
$location = helper::baseUrl() . 'translate/content/' . $key;
|
$leftItem .= '<option name="' . $key . '" value="' . $location . '" ' . ($key === self::$siteContent ? 'selected' : '') . '>' . $value . '</option>';
|
||||||
$leftItem .= '<option name="' . $key . '" value="' . $location . '" ' . ($key === self::$i18nContent ? 'selected' : '') . '>' . $value . '</option>';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($c > 1) {
|
|
||||||
$leftItems .= '<li><select id="barSelectLanguage" >';
|
$leftItems .= '<li><select id="barSelectLanguage" >';
|
||||||
$leftItems .= $leftItem;
|
$leftItems .= $leftItem;
|
||||||
$leftItems .= '</select></li>';
|
$leftItems .= '</select></li>';
|
||||||
}
|
}
|
||||||
|
if ($this->getUser('group') >= self::GROUP_ADMIN) {
|
||||||
|
$leftItems .= '<li>' . template::ico('flag', [
|
||||||
|
'help' => 'Langues',
|
||||||
|
'href' => helper::baseUrl() . 'language'
|
||||||
|
]) . '</li>';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Liste des pages
|
// Liste des pages
|
||||||
if ($this->getUser('group') >= self::GROUP_MODERATOR) {
|
if ($this->getUser('group') >= self::GROUP_EDITOR) {
|
||||||
$leftItems .= '<li><select id="barSelectPage">';
|
$leftItems .= '<li><select id="barSelectPage">';
|
||||||
$leftItems .= '<option value="">' . helper::translate('Pages du site') . '</option>';
|
$leftItems .= '<option value="">' . helper::translate('Pages du site') . '</option>';
|
||||||
$leftItems .= '<optgroup label="' . helper::translate('Pages orphelines') . '">';
|
$leftItems .= '<optgroup label="' . helper::translate('Pages orphelines') . '">';
|
||||||
@ -935,49 +985,81 @@ class layout extends common
|
|||||||
}
|
}
|
||||||
$leftItems .= '</optgroup>';
|
$leftItems .= '</optgroup>';
|
||||||
$leftItems .= '</select></li>';
|
$leftItems .= '</select></li>';
|
||||||
|
// Bouton Ajouter une page
|
||||||
|
if ($this->getUser('permission', 'page', 'add')) {
|
||||||
$leftItems .= '<li>' . template::ico('plus', [
|
$leftItems .= '<li>' . template::ico('plus', [
|
||||||
'href' => helper::baseUrl() . 'page/add',
|
'href' => helper::baseUrl() . 'page/add/' . self::$siteContent,
|
||||||
'help' => 'Nouvelle page ou barre latérale'
|
'help' => 'Nouvelle page ou barre latérale'
|
||||||
]) . '</li>';
|
]) . '</li>';
|
||||||
|
}
|
||||||
if (
|
if (
|
||||||
// Sur un module de page qui autorise le bouton de modification de la page
|
// Sur un module de page qui autorise le bouton de modification de la page
|
||||||
$this->core->output['showBarEditButton']
|
$this->core->output['showBarEditButton']
|
||||||
// Sur une page sans module
|
// Sur une page sans module
|
||||||
or $this->getData(['page', $this->getUrl(0), 'moduleId']) === ''
|
or $this->getData(['page', $this->getUrl(0), 'moduleId']) === ''
|
||||||
// Sur une page avec un module invalide
|
// Sur une page avec un module invalide
|
||||||
or (!is_null($this->getData(['page', $this->getUrl(2), 'moduleId'])) &&
|
or (!is_null($this->getData(['page', $this->getUrl(2), 'moduleId'])) and
|
||||||
!class_exists($this->getData(['page', $this->getUrl(2), 'moduleId']))
|
!class_exists($this->getData(['page', $this->getUrl(2), 'moduleId']))
|
||||||
)
|
)
|
||||||
// Sur une page d'accueil
|
// Sur une page d'accueil
|
||||||
or $this->getUrl(0) === ''
|
or $this->getUrl(0) === ''
|
||||||
|
) {
|
||||||
|
// Bouton Editer une page
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', 'page', 'edit')
|
||||||
|
and $this->geturl(1) !== 'edit'
|
||||||
) {
|
) {
|
||||||
$leftItems .= '<li>' . template::ico('pencil', [
|
$leftItems .= '<li>' . template::ico('pencil', [
|
||||||
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0),
|
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0) . '/' . self::$siteContent,
|
||||||
'help' => 'Éditer la page'
|
'help' => 'Éditer la page'
|
||||||
]) . '</li>';
|
]) . '</li>';
|
||||||
if ($this->getData(['page', $this->getUrl(0), 'moduleId'])) {
|
}
|
||||||
|
// Bouton Editer le module d'une page
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', 'page', 'module')
|
||||||
|
and $this->geturl(1) !== 'edit'
|
||||||
|
and $this->getData(['page', $this->getUrl(0), 'moduleId'])
|
||||||
|
) {
|
||||||
$leftItems .= '<li>' . template::ico('gear', [
|
$leftItems .= '<li>' . template::ico('gear', [
|
||||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/config',
|
'href' => helper::baseUrl() . $this->getUrl(0) . '/config',
|
||||||
'help' => 'Module de la page'
|
'help' => 'Module de la page'
|
||||||
]) . '</li>';
|
]) . '</li>';
|
||||||
}
|
}
|
||||||
|
// Bouton dupliquer une page
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', 'page', 'duplicate')
|
||||||
|
and $this->geturl(1) !== 'edit'
|
||||||
|
) {
|
||||||
$leftItems .= '<li>' . template::ico('clone', [
|
$leftItems .= '<li>' . template::ico('clone', [
|
||||||
'href' => helper::baseUrl() . 'page/duplicate/' . $this->getUrl(0) . '&csrf=' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . 'page/duplicate/' . $this->getUrl(0) . '/' . self::$siteContent,
|
||||||
'help' => 'Dupliquer la page'
|
'help' => 'Dupliquer la page'
|
||||||
])
|
])
|
||||||
. '</li>';
|
. '</li>';
|
||||||
|
}
|
||||||
|
// Bouton Effacer une page
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', 'page', 'delete')
|
||||||
|
and $this->geturl(1) !== 'edit'
|
||||||
|
|
||||||
|
) {
|
||||||
$leftItems .= '<li>' . template::ico('trash', [
|
$leftItems .= '<li>' . template::ico('trash', [
|
||||||
'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(0) . '&csrf=' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(0) . '/' . self::$siteContent,
|
||||||
'help' => 'Supprimer la page',
|
'help' => 'Supprimer la page',
|
||||||
'id' => 'pageDelete'
|
'id' => 'pageDelete'
|
||||||
])
|
])
|
||||||
. '</li>';
|
. '</li>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// Items de droite
|
// Items de droite
|
||||||
$rightItems = '';
|
$rightItems = '';
|
||||||
if ($this->getUser('group') >= self::GROUP_MODERATOR) {
|
if (
|
||||||
|
$this->getUser('group') >= self::GROUP_EDITOR
|
||||||
|
&& $this->getUser(
|
||||||
|
'permission',
|
||||||
|
'filemanager'
|
||||||
|
)
|
||||||
|
) {
|
||||||
$rightItems .= '<li>' . template::ico('folder', [
|
$rightItems .= '<li>' . template::ico('folder', [
|
||||||
'help' => 'Fichiers',
|
'help' => 'Fichiers',
|
||||||
'href' => helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php?type=0&akey=' . md5_file(self::DATA_DIR . 'core.json') . '&lang=' . $this->getData(['user', $this->getUser('id'), 'language']),
|
'href' => helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php?type=0&akey=' . md5_file(self::DATA_DIR . 'core.json') . '&lang=' . $this->getData(['user', $this->getUser('id'), 'language']),
|
||||||
@ -989,23 +1071,14 @@ class layout extends common
|
|||||||
'help' => 'Thème',
|
'help' => 'Thème',
|
||||||
'href' => helper::baseUrl() . 'theme'
|
'href' => helper::baseUrl() . 'theme'
|
||||||
]) . '</li>';
|
]) . '</li>';
|
||||||
$rightItems .= '<li>' . template::ico('puzzle', [
|
$rightItems .= '<li>' . template::ico('users', [
|
||||||
'help' => 'Modules',
|
'help' => 'Utilisateurs',
|
||||||
'href' => helper::baseUrl() . 'plugin'
|
'href' => helper::baseUrl() . 'user'
|
||||||
]) . '</li>';
|
|
||||||
$rightItems .= '<li>' . template::ico('flag', [
|
|
||||||
'help' => 'Multilingue',
|
|
||||||
'href' => helper::baseUrl() . 'translate'
|
|
||||||
]) . '</li>';
|
]) . '</li>';
|
||||||
$rightItems .= '<li>' . template::ico('cog-alt', [
|
$rightItems .= '<li>' . template::ico('cog-alt', [
|
||||||
'help' => 'Configuration',
|
'help' => 'Configuration',
|
||||||
'href' => helper::baseUrl() . 'config'
|
'href' => helper::baseUrl() . 'config'
|
||||||
]) . '</li>';
|
]) . '</li>';
|
||||||
$rightItems .= '<li>' . template::ico('users', [
|
|
||||||
'help' => 'Utilisateurs',
|
|
||||||
'href' => helper::baseUrl() . 'user'
|
|
||||||
]) . '</li>';
|
|
||||||
|
|
||||||
// Mise à jour automatique
|
// Mise à jour automatique
|
||||||
$today = mktime(0, 0, 0);
|
$today = mktime(0, 0, 0);
|
||||||
$checkUpdate = $this->getData(['core', 'lastAutoUpdate']);
|
$checkUpdate = $this->getData(['core', 'lastAutoUpdate']);
|
||||||
@ -1017,23 +1090,61 @@ class layout extends common
|
|||||||
$today > $checkUpdate + $this->getData(['config', 'autoUpdateDelay', 86400])
|
$today > $checkUpdate + $this->getData(['config', 'autoUpdateDelay', 86400])
|
||||||
) {
|
) {
|
||||||
// Dernier auto controle
|
// Dernier auto controle
|
||||||
$this->setData(['core', 'lastAutoUpdate', $today]);
|
$this->setData(['core', 'lastAutoUpdate', $today], false);
|
||||||
if (
|
if (
|
||||||
helper::checkNewVersion(common::ZWII_UPDATE_CHANNEL)
|
helper::checkNewVersion(common::ZWII_UPDATE_CHANNEL)
|
||||||
) {
|
) {
|
||||||
$this->setData(['core', 'updateAvailable', true]);
|
$this->setData(['core', 'updateAvailable', true], false);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Modules installés
|
||||||
|
$infoModules = helper::getModules();
|
||||||
|
// Recherche de mise à jour des modules
|
||||||
|
$store = plugin::getStore();
|
||||||
|
if (is_array($store)) {
|
||||||
|
// Parcourir les données des modules du store
|
||||||
|
foreach ($store as $key => $value) {
|
||||||
|
if (empty($key)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Mise à jour d'un module
|
||||||
|
// Le module est installé et une mise à jour est en ligne
|
||||||
|
if (
|
||||||
|
isset($infoModules[$key])
|
||||||
|
&&
|
||||||
|
version_compare($infoModules[$key]['version'], $value['version'], '<')
|
||||||
|
) {
|
||||||
|
$this->setData(['core', 'updateModuleAvailable', true], false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Sauvegarde la base manuellement
|
||||||
|
$this->saveDB('core');
|
||||||
|
}
|
||||||
|
}
|
||||||
// Afficher le bouton : Mise à jour détectée + activée
|
// Afficher le bouton : Mise à jour détectée + activée
|
||||||
if ($this->getData(['core', 'updateAvailable'])) {
|
if ($this->getData(['core', 'updateAvailable'])) {
|
||||||
$rightItems .= '<li><a href="' . helper::baseUrl() . 'install/update" data-tippy-content="Mettre à jour Zwii ' . common::ZWII_VERSION . ' vers ' . helper::getOnlineVersion(common::ZWII_UPDATE_CHANNEL) . '">' . template::ico('update colorRed') . '</a></li>';
|
$rightItems .= '<li><a href="' . helper::baseUrl() . 'install/update" data-tippy-content="Mettre à jour Zwii ' . common::ZWII_VERSION . ' vers ' . helper::getOnlineVersion(common::ZWII_UPDATE_CHANNEL) . '">' . template::ico('update colorRed') . '</a></li>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($this->getUser('group') >= self::GROUP_MODERATOR) {
|
if ($this->getData(['core', 'updateModuleAvailable'])) {
|
||||||
$rightItems .= '<li><a href="' . helper::baseUrl() . 'user/edit/' . $this->getUser('id') . '/' . $_SESSION['csrf'] .
|
$rightItems .= '<li>' . template::ico('puzzle colorRed', [
|
||||||
|
'help' => 'Modules',
|
||||||
|
'href' => helper::baseUrl() . 'plugin'
|
||||||
|
]) . '</li>';
|
||||||
|
} else {
|
||||||
|
$rightItems .= '<li>' . template::ico('puzzle', [
|
||||||
|
'help' => 'Modules',
|
||||||
|
'href' => helper::baseUrl() . 'plugin'
|
||||||
|
]) . '</li>';
|
||||||
|
}
|
||||||
|
// Boutons depuis le groupe éditeur
|
||||||
|
if (
|
||||||
|
$this->getUser('group') >= self::GROUP_EDITOR
|
||||||
|
&& $this->getUser('permission', 'user', 'edit')
|
||||||
|
|
||||||
|
) {
|
||||||
|
$rightItems .= '<li><a href="' . helper::baseUrl() . 'user/edit/' . $this->getUser('id') .
|
||||||
'" data-tippy-content="' . helper::translate('Configurer mon compte') . '">' .
|
'" data-tippy-content="' . helper::translate('Configurer mon compte') . '">' .
|
||||||
template::ico('user', ['margin' => 'right']) . '<span id="displayUsername">' . $this->getUser('firstname') . ' ' . $this->getUser('lastname') .
|
template::ico('user', ['margin' => 'right']) . '<span id="displayUsername">' . $this->getUser('firstname') . ' ' . $this->getUser('lastname') .
|
||||||
'</span></a></li>';
|
'</span></a></li>';
|
||||||
@ -1101,8 +1212,8 @@ class layout extends common
|
|||||||
public function showFonts()
|
public function showFonts()
|
||||||
{
|
{
|
||||||
// Import des fontes liées au thème
|
// Import des fontes liées au thème
|
||||||
if (file_exists(self::DATA_DIR . 'fonts/fonts.html')) {
|
if (file_exists(self::DATA_DIR . 'font/font.html')) {
|
||||||
include_once(self::DATA_DIR . 'fonts/fonts.html');
|
include_once(self::DATA_DIR . 'font/font.html');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1115,8 +1226,8 @@ class layout extends common
|
|||||||
$vars = 'var baseUrl = ' . json_encode(helper::baseUrl(false)) . ';';
|
$vars = 'var baseUrl = ' . json_encode(helper::baseUrl(false)) . ';';
|
||||||
$vars .= 'var baseUrlQs = ' . json_encode(helper::baseUrl()) . ';';
|
$vars .= 'var baseUrlQs = ' . json_encode(helper::baseUrl()) . ';';
|
||||||
if (
|
if (
|
||||||
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
$this->isConnected() === true
|
||||||
and $this->getUser('group') >= self::GROUP_MODERATOR
|
and $this->getUser('group') >= self::GROUP_EDITOR
|
||||||
) {
|
) {
|
||||||
$vars .= 'var privateKey = ' . json_encode(md5_file(self::DATA_DIR . 'core.json')) . ';';
|
$vars .= 'var privateKey = ' . json_encode(md5_file(self::DATA_DIR . 'core.json')) . ';';
|
||||||
}
|
}
|
||||||
@ -1164,8 +1275,8 @@ class layout extends common
|
|||||||
public function showi18n($lang)
|
public function showi18n($lang)
|
||||||
{
|
{
|
||||||
if (
|
if (
|
||||||
(isset($_SESSION['ZWII_CONTENT'])
|
(isset($_SESSION['ZWII_SITE_CONTENT'])
|
||||||
and $_SESSION['ZWII_CONTENT'] === $lang
|
and $_SESSION['ZWII_SITE_CONTENT'] === $lang
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
$select = ' class="i18nFlagSelected" ';
|
$select = ' class="i18nFlagSelected" ';
|
||||||
@ -1174,8 +1285,75 @@ class layout extends common
|
|||||||
}
|
}
|
||||||
|
|
||||||
$items = '<li>';
|
$items = '<li>';
|
||||||
$items .= '<a href="' . helper::baseUrl() . 'translate/content/' . $lang . '"><img ' . $select . ' alt="' . self::$languages[$lang] . '" src="' . helper::baseUrl(false) . 'core/vendor/i18n/png/' . $lang . '.png"/></a>';
|
$items .= '<a href="' . helper::baseUrl() . 'language/content/' . $lang . '"><img ' . $select . ' alt="' . self::$languages[$lang] . '" src="' . helper::baseUrl(false) . 'core/vendor/i18n/png/' . $lang . '.png"/></a>';
|
||||||
$items .= '</li>';
|
$items .= '</li>';
|
||||||
return $items;
|
return $items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Affiche une icône de navigation
|
||||||
|
// @param $position string 'top' or 'bottom
|
||||||
|
public function showNavButtons($position)
|
||||||
|
{
|
||||||
|
// Boutons par défaut
|
||||||
|
$leftButton = 'left';
|
||||||
|
$rightButton = 'right-dir';
|
||||||
|
|
||||||
|
// Déterminer la hiérarchie des pages
|
||||||
|
$hierarchy = array();
|
||||||
|
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||||
|
$hierarchy[] = $parentKey;
|
||||||
|
foreach ($parentValue as $childKey) {
|
||||||
|
$hierarchy[] = $childKey;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Parcourir la hiérarchie et rechercher les éléments avant et après
|
||||||
|
$elementToFind = $this->getUrl(0);
|
||||||
|
|
||||||
|
// Trouver la clé de l'élément recherché
|
||||||
|
$key = array_search($elementToFind, $hierarchy);
|
||||||
|
|
||||||
|
$previousPage = null;
|
||||||
|
$nextPage = null;
|
||||||
|
|
||||||
|
if ($key !== false) {
|
||||||
|
// Trouver l'élément précédent
|
||||||
|
$previousKey = ($key > 0) ? $key - 1 : null;
|
||||||
|
$previousValue = ($previousKey !== null) ? $hierarchy[$previousKey] : null;
|
||||||
|
|
||||||
|
// Trouver l'élément suivant
|
||||||
|
$nextKey = ($key < count($hierarchy) - 1) ? $key + 1 : null;
|
||||||
|
$nextValue = ($nextKey !== null) ? $hierarchy[$nextKey] : null;
|
||||||
|
|
||||||
|
$previousPage = $previousValue;
|
||||||
|
$nextPage = $nextValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Jeux d'icônes sinon celui par défaut
|
||||||
|
if ($this->getData(['page', $this->getUrl(0), 'navTemplate'])) {
|
||||||
|
$leftButton = self::$navIconTemplate[$this->getData(['page', $this->getUrl(0), 'navTemplate'])]['left'];
|
||||||
|
$rightButton = self::$navIconTemplate[$this->getData(['page', $this->getUrl(0), 'navTemplate'])]['right'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$items = '<div class="navButton">';
|
||||||
|
$items .= '<div class="row">';
|
||||||
|
$items .= '<div class="col1">';
|
||||||
|
if (
|
||||||
|
$previousPage !== null && $this->getData(['page', $this->getUrl(0), 'navLeft']) === $position
|
||||||
|
) {
|
||||||
|
$items .= template::button('navPreviousButtonLeft', [
|
||||||
|
'href' => helper::baseUrl() . $previousPage,
|
||||||
|
'value' => template::ico($leftButton)
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
$items .= '</div>';
|
||||||
|
$items .= '<div class="col1 offset10">';
|
||||||
|
if ($nextPage !== null && $this->getData(['page', $this->getUrl(0), 'navRight']) === $position) {
|
||||||
|
$items .= template::button('navNextButtonRight', [
|
||||||
|
'href' => helper::baseUrl() . $nextPage,
|
||||||
|
'value' => template::ico($rightButton)
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
$items .= '</div></div></div>';
|
||||||
|
echo $items;
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,12 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
|
||||||
* Chargement des classes filles
|
|
||||||
* router : aiguillage des pages
|
|
||||||
*/
|
|
||||||
|
|
||||||
require_once('core/class/layout.class.php');
|
|
||||||
|
|
||||||
class core extends common
|
class core extends common
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -18,16 +11,16 @@ class core extends common
|
|||||||
parent::__construct();
|
parent::__construct();
|
||||||
// Token CSRF
|
// Token CSRF
|
||||||
if (empty($_SESSION['csrf'])) {
|
if (empty($_SESSION['csrf'])) {
|
||||||
$_SESSION['csrf'] = bin2hex(openssl_random_pseudo_bytes(32));
|
$_SESSION['csrf'] = bin2hex(openssl_random_pseudo_bytes(64));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fuseau horaire
|
// Fuseau horaire
|
||||||
self::$timezone = $this->getData(['config', 'timezone']); // Utile pour transmettre le timezone à la classe helper
|
common::$timezone = $this->getData(['config', 'timezone']); // Utile pour transmettre le timezone à la classe helper
|
||||||
date_default_timezone_set(self::$timezone);
|
date_default_timezone_set(common::$timezone);
|
||||||
// Supprime les fichiers temporaires
|
// Supprime les fichiers temporaires
|
||||||
$lastClearTmp = mktime(0, 0, 0);
|
$lastClearTmp = mktime(0, 0, 0);
|
||||||
if ($lastClearTmp > $this->getData(['core', 'lastClearTmp']) + 86400) {
|
if ($lastClearTmp > $this->getData(['core', 'lastClearTmp']) + 86400) {
|
||||||
$iterator = new DirectoryIterator(self::TEMP_DIR);
|
$iterator = new DirectoryIterator(common::TEMP_DIR);
|
||||||
foreach ($iterator as $fileInfos) {
|
foreach ($iterator as $fileInfos) {
|
||||||
if (
|
if (
|
||||||
$fileInfos->isFile() &&
|
$fileInfos->isFile() &&
|
||||||
@ -39,8 +32,6 @@ class core extends common
|
|||||||
}
|
}
|
||||||
// Date de la dernière suppression
|
// Date de la dernière suppression
|
||||||
$this->setData(['core', 'lastClearTmp', $lastClearTmp]);
|
$this->setData(['core', 'lastClearTmp', $lastClearTmp]);
|
||||||
// Enregistre les données
|
|
||||||
//$this->SaveData();
|
|
||||||
}
|
}
|
||||||
// Backup automatique des données
|
// Backup automatique des données
|
||||||
$lastBackup = mktime(0, 0, 0);
|
$lastBackup = mktime(0, 0, 0);
|
||||||
@ -50,11 +41,11 @@ class core extends common
|
|||||||
and $this->getData(['user']) // Pas de backup pendant l'installation
|
and $this->getData(['user']) // Pas de backup pendant l'installation
|
||||||
) {
|
) {
|
||||||
// Copie des fichier de données
|
// Copie des fichier de données
|
||||||
helper::autoBackup(self::BACKUP_DIR, ['backup', 'tmp', 'file']);
|
helper::autoBackup(common::BACKUP_DIR, ['backup', 'tmp', 'file']);
|
||||||
// Date du dernier backup
|
// Date du dernier backup
|
||||||
$this->setData(['core', 'lastBackup', $lastBackup]);
|
$this->setData(['core', 'lastBackup', $lastBackup]);
|
||||||
// Supprime les backups de plus de 30 jours
|
// Supprime les backups de plus de 30 jours
|
||||||
$iterator = new DirectoryIterator(self::BACKUP_DIR);
|
$iterator = new DirectoryIterator(common::BACKUP_DIR);
|
||||||
foreach ($iterator as $fileInfos) {
|
foreach ($iterator as $fileInfos) {
|
||||||
if (
|
if (
|
||||||
$fileInfos->isFile()
|
$fileInfos->isFile()
|
||||||
@ -67,23 +58,23 @@ class core extends common
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Crée le fichier de personnalisation avancée
|
// Crée le fichier de personnalisation avancée
|
||||||
if (file_exists(self::DATA_DIR . 'custom.css') === false) {
|
if (file_exists(common::DATA_DIR . 'custom.css') === false) {
|
||||||
file_put_contents(self::DATA_DIR . 'custom.css', file_get_contents('core/module/theme/resource/custom.css'));
|
$this->secure_file_put_contents(common::DATA_DIR . 'custom.css', file_get_contents('core/module/theme/resource/custom.css'));
|
||||||
chmod(self::DATA_DIR . 'custom.css', 0755);
|
chmod(common::DATA_DIR . 'custom.css', 0755);
|
||||||
}
|
}
|
||||||
// Crée le fichier de personnalisation
|
// Crée le fichier de personnalisation
|
||||||
if (file_exists(self::DATA_DIR . 'theme.css') === false) {
|
if (file_exists(common::DATA_DIR . 'theme.css') === false) {
|
||||||
file_put_contents(self::DATA_DIR . 'theme.css', '');
|
$this->secure_file_put_contents(common::DATA_DIR . 'theme.css', '');
|
||||||
chmod(self::DATA_DIR . 'theme.css', 0755);
|
chmod(common::DATA_DIR . 'theme.css', 0755);
|
||||||
}
|
}
|
||||||
// Crée le fichier de personnalisation de l'administration
|
// Crée le fichier de personnalisation de l'administration
|
||||||
if (file_exists(self::DATA_DIR . 'admin.css') === false) {
|
if (file_exists(common::DATA_DIR . 'admin.css') === false) {
|
||||||
file_put_contents(self::DATA_DIR . 'admin.css', '');
|
$this->secure_file_put_contents(common::DATA_DIR . 'admin.css', '');
|
||||||
chmod(self::DATA_DIR . 'admin.css', 0755);
|
chmod(common::DATA_DIR . 'admin.css', 0755);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check la version rafraichissement du theme
|
// Check la version rafraichissement du theme
|
||||||
$cssVersion = preg_split('/\*+/', file_get_contents(self::DATA_DIR . 'theme.css'));
|
$cssVersion = preg_split('/\*+/', file_get_contents(common::DATA_DIR . 'theme.css'));
|
||||||
if (empty($cssVersion[1]) or $cssVersion[1] !== md5(json_encode($this->getData(['theme'])))) {
|
if (empty($cssVersion[1]) or $cssVersion[1] !== md5(json_encode($this->getData(['theme'])))) {
|
||||||
// Version
|
// Version
|
||||||
$css = '/*' . md5(json_encode($this->getData(['theme']))) . '*/';
|
$css = '/*' . md5(json_encode($this->getData(['theme']))) . '*/';
|
||||||
@ -97,9 +88,9 @@ class core extends common
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Fonts disponibles
|
// Fonts disponibles
|
||||||
$fontsAvailable['files'] = $this->getData(['fonts', 'files']);
|
$fontsAvailable['files'] = $this->getData(['font', 'files']);
|
||||||
$fontsAvailable['imported'] = $this->getData(['fonts', 'imported']);
|
$fontsAvailable['imported'] = $this->getData(['font', 'imported']);
|
||||||
$fontsAvailable['websafe'] = self::$fontsWebSafe;
|
$fontsAvailable['websafe'] = common::$fontsWebSafe;
|
||||||
|
|
||||||
// Fontes installées
|
// Fontes installées
|
||||||
$fonts = [
|
$fonts = [
|
||||||
@ -112,53 +103,14 @@ class core extends common
|
|||||||
// Suppression des polices identiques
|
// Suppression des polices identiques
|
||||||
$fonts = array_unique($fonts);
|
$fonts = array_unique($fonts);
|
||||||
|
|
||||||
/**
|
|
||||||
* Charge les fontes websafe
|
|
||||||
*/
|
|
||||||
$fontFile = '';
|
|
||||||
foreach ($fonts as $fontId) {
|
|
||||||
if (isset($fontsAvailable['websafe'][$fontId])) {
|
|
||||||
$fonts[$fontId] = $fontsAvailable['websafe'][$fontId]['font-family'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Chargement des polices en ligne dans un fichier fonts.html inclus dans main.php
|
* Charge les fontes
|
||||||
*/
|
|
||||||
$fontFile = '';
|
|
||||||
$gf = false;
|
|
||||||
foreach ($fonts as $fontId) {
|
|
||||||
if (isset($fontsAvailable['imported'][$fontId])) {
|
|
||||||
$fontFile .= '<link href="' . $fontsAvailable['imported'][$fontId]['resource'] . '" rel="stylesheet">';
|
|
||||||
// Tableau pour la construction de la feuille de style
|
|
||||||
$fonts[$fontId] = $fontsAvailable['imported'][$fontId]['font-family'];
|
|
||||||
$gf = strpos($fontsAvailable['imported'][$fontId]['resource'], 'fonts.googleapis.com') === false ? $gf || false : $gf || true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Ajoute le préconnect des fontes Googles.
|
|
||||||
$fontFile = $gf ? '<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>' . $fontFile
|
|
||||||
: $fontFile;
|
|
||||||
// Enregistre la personnalisation
|
|
||||||
if (!is_dir(self::DATA_DIR . 'fonts')) {
|
|
||||||
mkdir(self::DATA_DIR . 'fonts');
|
|
||||||
}
|
|
||||||
file_put_contents(self::DATA_DIR . 'fonts/fonts.html', $fontFile);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fontes installées localement
|
|
||||||
*/
|
*/
|
||||||
foreach ($fonts as $fontId) {
|
foreach ($fonts as $fontId) {
|
||||||
// Validité du tableau :
|
foreach (['websafe', 'imported', 'files'] as $typeFont) {
|
||||||
if (isset($fontsAvailable['files'][$fontId])) {
|
if (isset($fontsAvailable[$typeFont][$fontId])) {
|
||||||
if (file_exists(self::DATA_DIR . 'fonts/' . $fontId)) {
|
$fonts[$fontId] = $fontsAvailable[$typeFont][$fontId]['font-family'];
|
||||||
// Chargement de la police
|
|
||||||
$css .= '@font-face {font-family:"' . $fontsAvailable['files'][$fontId]['font-family'] . '";';
|
|
||||||
$css .= 'src: url("' . helper::baseUrl(false) . self::DATA_DIR . 'fonts/' . $fontsAvailable['files'][$fontId]['resource'] . '");}';
|
|
||||||
// Tableau pour la construction de la feuille de style
|
|
||||||
$fonts[$fontId] = $fontsAvailable['files'][$fontId]['font-family'];
|
|
||||||
} else {
|
|
||||||
// Le fichier de font n'est pas disponible, fonte par défaut
|
|
||||||
$fonts[$fontId] = 'verdana';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -309,7 +261,7 @@ class core extends common
|
|||||||
|
|
||||||
$css .= 'footer span, #footerText > p {color:' . $this->getData(['theme', 'footer', 'textColor']) . ';font-family:' . $fonts[$this->getData(['theme', 'footer', 'font'])] . ';font-weight:' . $this->getData(['theme', 'footer', 'fontWeight']) . ';font-size:' . $this->getData(['theme', 'footer', 'fontSize']) . ';text-transform:' . $this->getData(['theme', 'footer', 'textTransform']) . '}';
|
$css .= 'footer span, #footerText > p {color:' . $this->getData(['theme', 'footer', 'textColor']) . ';font-family:' . $fonts[$this->getData(['theme', 'footer', 'font'])] . ';font-weight:' . $this->getData(['theme', 'footer', 'fontWeight']) . ';font-size:' . $this->getData(['theme', 'footer', 'fontSize']) . ';text-transform:' . $this->getData(['theme', 'footer', 'textTransform']) . '}';
|
||||||
$css .= 'footer {background-color:' . $colors['normal'] . ';color:' . $this->getData(['theme', 'footer', 'textColor']) . '}';
|
$css .= 'footer {background-color:' . $colors['normal'] . ';color:' . $this->getData(['theme', 'footer', 'textColor']) . '}';
|
||||||
$css .= 'footer a{color:' . $this->getData(['theme', 'footer', 'textColor']) . '}';
|
//$css .= 'footer a{color:' . $this->getData(['theme', 'footer', 'textColor']) . '}';
|
||||||
$css .= 'footer #footersite > div {margin:' . $this->getData(['theme', 'footer', 'height']) . ' 0}';
|
$css .= 'footer #footersite > div {margin:' . $this->getData(['theme', 'footer', 'height']) . ' 0}';
|
||||||
|
|
||||||
$css .= 'footer #footerbody > div {margin:' . $this->getData(['theme', 'footer', 'height']) . ' 0}';
|
$css .= 'footer #footerbody > div {margin:' . $this->getData(['theme', 'footer', 'height']) . ' 0}';
|
||||||
@ -318,14 +270,8 @@ class core extends common
|
|||||||
$css .= '#footerText > p {text-align:' . $this->getData(['theme', 'footer', 'textAlign']) . '}';
|
$css .= '#footerText > p {text-align:' . $this->getData(['theme', 'footer', 'textAlign']) . '}';
|
||||||
$css .= '#footerCopyright{text-align:' . $this->getData(['theme', 'footer', 'copyrightAlign']) . '}';
|
$css .= '#footerCopyright{text-align:' . $this->getData(['theme', 'footer', 'copyrightAlign']) . '}';
|
||||||
|
|
||||||
// Enregistre les fontes
|
|
||||||
if (!is_dir(self::DATA_DIR . 'fonts')) {
|
|
||||||
mkdir(self::DATA_DIR . 'fonts');
|
|
||||||
}
|
|
||||||
file_put_contents(self::DATA_DIR . 'fonts/fonts.html', $fontFile);
|
|
||||||
|
|
||||||
// Enregistre la personnalisation
|
// Enregistre la personnalisation
|
||||||
file_put_contents(self::DATA_DIR . 'theme.css', $css);
|
$this->secure_file_put_contents(common::DATA_DIR . 'theme.css', $css);
|
||||||
|
|
||||||
// Effacer le cache pour tenir compte de la couleur de fond TinyMCE
|
// Effacer le cache pour tenir compte de la couleur de fond TinyMCE
|
||||||
header("Expires: Tue, 01 Jan 2000 00:00:00 GMT");
|
header("Expires: Tue, 01 Jan 2000 00:00:00 GMT");
|
||||||
@ -336,16 +282,16 @@ class core extends common
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check la version rafraichissement du theme admin
|
// Check la version rafraichissement du theme admin
|
||||||
$cssVersion = preg_split('/\*+/', file_get_contents(self::DATA_DIR . 'admin.css'));
|
$cssVersion = preg_split('/\*+/', file_get_contents(common::DATA_DIR . 'admin.css'));
|
||||||
if (empty($cssVersion[1]) or $cssVersion[1] !== md5(json_encode($this->getData(['admin'])))) {
|
if (empty($cssVersion[1]) or $cssVersion[1] !== md5(json_encode($this->getData(['admin'])))) {
|
||||||
|
|
||||||
// Version
|
// Version
|
||||||
$css = '/*' . md5(json_encode($this->getData(['admin']))) . '*/';
|
$css = '/*' . md5(json_encode($this->getData(['admin']))) . '*/';
|
||||||
|
|
||||||
// Fonts disponibles
|
// Fonts disponibles
|
||||||
$fontsAvailable['files'] = $this->getData(['fonts', 'files']);
|
$fontsAvailable['files'] = $this->getData(['font', 'files']);
|
||||||
$fontsAvailable['imported'] = $this->getData(['fonts', 'imported']);
|
$fontsAvailable['imported'] = $this->getData(['font', 'imported']);
|
||||||
$fontsAvailable['websafe'] = self::$fontsWebSafe;
|
$fontsAvailable['websafe'] = common::$fontsWebSafe;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Import des polices de caractères
|
* Import des polices de caractères
|
||||||
@ -359,44 +305,12 @@ class core extends common
|
|||||||
$fonts = array_unique($fonts);
|
$fonts = array_unique($fonts);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Charge les fontes websafe
|
* Charge les fontes
|
||||||
*/
|
|
||||||
$fontFile = '';
|
|
||||||
foreach ($fonts as $fontId) {
|
|
||||||
if (isset($fontsAvailable['websafe'][$fontId])) {
|
|
||||||
$fonts[$fontId] = $fontsAvailable['websafe'][$fontId]['font-family'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Chargement des polices en ligne dans un fichier fonts.html inclus dans main.php
|
|
||||||
*/
|
|
||||||
$fontFile = '';
|
|
||||||
foreach ($fonts as $fontId) {
|
|
||||||
if (isset($fontsAvailable['imported'][$fontId])) {
|
|
||||||
$fontFile .= '<link href="' . $fontsAvailable['imported'][$fontId]['resource'] . '" rel="stylesheet">';
|
|
||||||
// Tableau pour la construction de la feuille de style
|
|
||||||
$fonts[$fontId] = $fontsAvailable['imported'][$fontId]['font-family'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Enregistre la personnalisation
|
|
||||||
file_put_contents(self::DATA_DIR . 'fonts/fonts.html', $fontFile);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fontes installées localement
|
|
||||||
*/
|
*/
|
||||||
foreach ($fonts as $fontId) {
|
foreach ($fonts as $fontId) {
|
||||||
// Validité du tableau :
|
foreach (['websafe', 'imported', 'files'] as $typeFont) {
|
||||||
if (isset($fontsAvailable['files'][$fontId])) {
|
if (isset($fontsAvailable[$typeFont][$fontId])) {
|
||||||
if (file_exists(self::DATA_DIR . 'fonts/' . $fontId)) {
|
$fonts[$fontId] = $fontsAvailable[$typeFont][$fontId]['font-family'];
|
||||||
// Chargement de la police
|
|
||||||
$css .= '@font-face {font-family:"' . $fontsAvailable['files'][$fontId]['font-family'] . '";';
|
|
||||||
$css .= 'src: url("' . helper::baseUrl(false) . self::DATA_DIR . 'fonts/' . $fontsAvailable['files'][$fontId]['resource'] . '");}';
|
|
||||||
// Tableau pour la construction de la feuille de style
|
|
||||||
$fonts[$fontId] = $fontsAvailable['files'][$fontId]['font-family'];
|
|
||||||
} else {
|
|
||||||
// Le fichier de font n'est pas disponible, fonte par défaut
|
|
||||||
$fonts[$fontId] = 'verdana';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -407,6 +321,26 @@ class core extends common
|
|||||||
$css .= 'p, div, label, select, input, table, span {font-family:' . $fonts[$this->getData(['admin', 'fontText'])] . '}';
|
$css .= 'p, div, label, select, input, table, span {font-family:' . $fonts[$this->getData(['admin', 'fontText'])] . '}';
|
||||||
$css .= 'body,.row > div {font-size:' . $this->getData(['admin', 'fontSize']) . '}';
|
$css .= 'body,.row > div {font-size:' . $this->getData(['admin', 'fontSize']) . '}';
|
||||||
$css .= 'body h1, h2, h3, h4 a, h5, h6 {font-family:' . $fonts[$this->getData(['admin', 'fontTitle'])] . ';color:' . $this->getData(['admin', 'colorTitle']) . ';}';
|
$css .= 'body h1, h2, h3, h4 a, h5, h6 {font-family:' . $fonts[$this->getData(['admin', 'fontTitle'])] . ';color:' . $this->getData(['admin', 'colorTitle']) . ';}';
|
||||||
|
$css .= '.container {max-width:' . $this->getData(['admin', 'width']) . '}';
|
||||||
|
$margin = $this->getData(['theme', 'site', 'margin']) ? '0' : '20px';
|
||||||
|
// Marge supplémentaire lorsque le pied de page est fixe
|
||||||
|
if (
|
||||||
|
$this->getData(['theme', 'footer', 'fixed']) === true &&
|
||||||
|
$this->getData(['theme', 'footer', 'position']) === 'body'
|
||||||
|
) {
|
||||||
|
|
||||||
|
$marginBottomLarge = ((str_replace('px', '', $this->getData(['theme', 'footer', 'height'])) * 2) + 31) . 'px';
|
||||||
|
$marginBottomSmall = ((str_replace('px', '', $this->getData(['theme', 'footer', 'height'])) * 2) + 93) . 'px';
|
||||||
|
} else {
|
||||||
|
$marginBottomSmall = $margin;
|
||||||
|
$marginBottomLarge = $margin;
|
||||||
|
}
|
||||||
|
$css .= $this->getData(['admin', 'width']) === '100%'
|
||||||
|
? '@media (min-width: 769px) {#site{margin:0 auto ' . $marginBottomLarge . ' 0 !important;}}@media (max-width: 768px) {#site{margin:0 auto ' . $marginBottomSmall . ' 0 !important;}}#site.light{margin:5% auto !important;} body{margin:0 auto !important;} #bar{margin:0 auto !important;} body > header{margin:0 auto !important;} body > nav {margin: 0 auto !important;} body > footer {margin:0 auto !important;}'
|
||||||
|
: '@media (min-width: 769px) {#site{margin: ' . $margin . ' auto ' . $marginBottomLarge . ' auto !important;}}@media (max-width: 768px) {#site{margin: ' . $margin . ' auto ' . $marginBottomSmall . ' auto !important;}}#site.light{margin: 5% auto !important;} body{margin:0px 10px;} #bar{margin: 0 -10px;} body > header{margin: 0 -10px;} body > nav {margin: 0 -10px;} body > footer {margin: 0 -10px;} ';
|
||||||
|
$css .= $this->getData(['admin', 'width']) === '750px'
|
||||||
|
? '.button, button{font-size:0.8em;}'
|
||||||
|
: '';
|
||||||
|
|
||||||
// TinyMCE
|
// TinyMCE
|
||||||
$colors = helper::colorVariants($this->getData(['admin', 'colorText']));
|
$colors = helper::colorVariants($this->getData(['admin', 'colorText']));
|
||||||
@ -431,7 +365,7 @@ class core extends common
|
|||||||
// Bordure du contour TinyMCE
|
// Bordure du contour TinyMCE
|
||||||
$css .= '.mce-tinymce{border: 1px solid ' . $this->getData(['admin', 'borderBlockColor']) . '!important;}';
|
$css .= '.mce-tinymce{border: 1px solid ' . $this->getData(['admin', 'borderBlockColor']) . '!important;}';
|
||||||
// Enregistre la personnalisation
|
// Enregistre la personnalisation
|
||||||
file_put_contents(self::DATA_DIR . 'admin.css', $css);
|
$this->secure_file_put_contents(common::DATA_DIR . 'admin.css', $css);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@ -447,8 +381,8 @@ class core extends common
|
|||||||
require 'core/module/' . $classPath;
|
require 'core/module/' . $classPath;
|
||||||
}
|
}
|
||||||
// Module
|
// Module
|
||||||
elseif (is_readable(self::MODULE_DIR . $classPath)) {
|
elseif (is_readable(common::MODULE_DIR . $classPath)) {
|
||||||
require self::MODULE_DIR . $classPath;
|
require common::MODULE_DIR . $classPath;
|
||||||
}
|
}
|
||||||
// Librairie
|
// Librairie
|
||||||
elseif (is_readable('core/vendor/' . $classPath)) {
|
elseif (is_readable('core/vendor/' . $classPath)) {
|
||||||
@ -462,7 +396,6 @@ class core extends common
|
|||||||
public function router()
|
public function router()
|
||||||
{
|
{
|
||||||
|
|
||||||
//
|
|
||||||
$layout = new layout($this);
|
$layout = new layout($this);
|
||||||
|
|
||||||
// Installation
|
// Installation
|
||||||
@ -474,19 +407,14 @@ class core extends common
|
|||||||
header('Location:' . helper::baseUrl() . 'install');
|
header('Location:' . helper::baseUrl() . 'install');
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Journalisation
|
// Journalisation
|
||||||
$dataLog = helper::dateUTF8('%Y %m %d', time()) . ' - ' . helper::dateUTF8('%H:%M', time());
|
$this->saveLog();
|
||||||
$dataLog .= helper::getIp($this->getData(['config', 'connect', 'anonymousIp'])) . ';';
|
|
||||||
$dataLog .= $this->getUser('id') ? $this->getUser('id') . ';' : 'anonyme' . ';';
|
|
||||||
$dataLog .= $this->getUrl();
|
|
||||||
$dataLog .= PHP_EOL;
|
|
||||||
if ($this->getData(['config', 'connect', 'log'])) {
|
|
||||||
file_put_contents(self::DATA_DIR . 'journal.log', $dataLog, FILE_APPEND);
|
|
||||||
}
|
|
||||||
// Force la déconnexion des membres bannis ou d'une seconde session
|
// Force la déconnexion des membres bannis ou d'une seconde session
|
||||||
if (
|
if (
|
||||||
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
$this->isConnected() === true
|
||||||
and ($this->getUser('group') === self::GROUP_BANNED
|
and ($this->getUser('group') === common::GROUP_BANNED
|
||||||
or ($_SESSION['csrf'] !== $this->getData(['user', $this->getUser('id'), 'accessCsrf'])
|
or ($_SESSION['csrf'] !== $this->getData(['user', $this->getUser('id'), 'accessCsrf'])
|
||||||
and $this->getData(['config', 'connect', 'autoDisconnect']) === true)
|
and $this->getData(['config', 'connect', 'autoDisconnect']) === true)
|
||||||
)
|
)
|
||||||
@ -499,9 +427,9 @@ class core extends common
|
|||||||
$this->getData(['config', 'maintenance'])
|
$this->getData(['config', 'maintenance'])
|
||||||
and in_array($this->getUrl(0), ['maintenance', 'user']) === false
|
and in_array($this->getUrl(0), ['maintenance', 'user']) === false
|
||||||
and $this->getUrl(1) !== 'login'
|
and $this->getUrl(1) !== 'login'
|
||||||
and ($this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
|
and ($this->isConnected() === false
|
||||||
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
or ($this->isConnected() === true
|
||||||
and $this->getUser('group') < self::GROUP_ADMIN
|
and $this->getUser('group') < common::GROUP_ADMIN
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
@ -514,30 +442,15 @@ class core extends common
|
|||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pour éviter une 404 sur une langue étrangère, bascule dans la langue correcte.
|
|
||||||
if (is_null($this->getData(['page', $this->getUrl(0)]))) {
|
|
||||||
foreach (self::$languages as $key => $value) {
|
|
||||||
if (
|
|
||||||
is_dir(self::DATA_DIR . $key) &&
|
|
||||||
file_exists(self::DATA_DIR . $key . '/page.json')
|
|
||||||
) {
|
|
||||||
$pagesId = json_decode(file_get_contents(self::DATA_DIR . $key . '/page.json'), true);
|
|
||||||
if (array_key_exists($this->getUrl(0), $pagesId['page'])) {
|
|
||||||
$_SESSION['ZWII_CONTENT'] = $key;
|
|
||||||
header('Refresh:0; url=' . helper::baseUrl() . $this->getUrl(0));
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check l'accès à la page
|
// Check l'accès à la page
|
||||||
$access = null;
|
$access = null;
|
||||||
if ($this->getData(['page', $this->getUrl(0)]) !== null) {
|
if ($this->getData(['page', $this->getUrl(0)]) !== null) {
|
||||||
if (
|
if (
|
||||||
$this->getData(['page', $this->getUrl(0), 'group']) === self::GROUP_VISITOR
|
$this->getData(['page', $this->getUrl(0), 'group']) === common::GROUP_VISITOR
|
||||||
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
or ($this->isConnected() === true
|
||||||
and $this->getUser('group') >= $this->getData(['page', $this->getUrl(0), 'group'])
|
// and $this->getUser('group') >= $this->getData(['page', $this->getUrl(0), 'group'])
|
||||||
|
// Modification qui tient compte du profil de la page
|
||||||
|
and ($this->getUser('group') * 10 + $this->getUser('profil')) >= ($this->getData(['page', $this->getUrl(0), 'group']) * 10 + $this->getData(['page', $this->getUrl(0), 'profil']))
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
$access = true;
|
$access = true;
|
||||||
@ -551,14 +464,22 @@ class core extends common
|
|||||||
// Empêcher l'accès aux pages désactivées par URL directe
|
// Empêcher l'accès aux pages désactivées par URL directe
|
||||||
if (
|
if (
|
||||||
($this->getData(['page', $this->getUrl(0), 'disable']) === true
|
($this->getData(['page', $this->getUrl(0), 'disable']) === true
|
||||||
and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
|
and $this->isConnected() === false
|
||||||
) or ($this->getData(['page', $this->getUrl(0), 'disable']) === true
|
) or ($this->getData(['page', $this->getUrl(0), 'disable']) === true
|
||||||
and $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
and $this->isConnected() === true
|
||||||
and $this->getUser('group') < self::GROUP_MODERATOR
|
and $this->getUser('group') < common::GROUP_EDITOR
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
$access = false;
|
$access = false;
|
||||||
}
|
}
|
||||||
|
// Lève une erreur si l'url est celle d'une page avec des éléments surnuméraires https://www.site.fr/page/truc
|
||||||
|
if (
|
||||||
|
array_key_exists($this->getUrl(0), $this->getData(['page']))
|
||||||
|
and $this->getUrl(1)
|
||||||
|
and $this->getData(['page', $this->getUrl(0), 'moduleId']) === ''
|
||||||
|
) {
|
||||||
|
$access = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -571,6 +492,7 @@ class core extends common
|
|||||||
*/
|
*/
|
||||||
$accessInfo['userName'] = '';
|
$accessInfo['userName'] = '';
|
||||||
$accessInfo['pageId'] = '';
|
$accessInfo['pageId'] = '';
|
||||||
|
if ($this->getData(['user'])) {
|
||||||
foreach ($this->getData(['user']) as $userId => $userIds) {
|
foreach ($this->getData(['user']) as $userId => $userIds) {
|
||||||
if (!is_null($this->getData(['user', $userId, 'accessUrl']))) {
|
if (!is_null($this->getData(['user', $userId, 'accessUrl']))) {
|
||||||
$t = explode('/', $this->getData(['user', $userId, 'accessUrl']));
|
$t = explode('/', $this->getData(['user', $userId, 'accessUrl']));
|
||||||
@ -579,21 +501,23 @@ class core extends common
|
|||||||
$this->getUser('id') &&
|
$this->getUser('id') &&
|
||||||
$userId !== $this->getUser('id') &&
|
$userId !== $this->getUser('id') &&
|
||||||
$this->getData(['user', $userId, 'accessUrl']) === $this->getUrl() &&
|
$this->getData(['user', $userId, 'accessUrl']) === $this->getUrl() &&
|
||||||
array_intersect($t, self::$accessList) &&
|
array_intersect($t, common::$concurrentAccess) &&
|
||||||
array_intersect($t, self::$accessExclude) !== false &&
|
//array_intersect($t, common::$accessExclude) !== false &&
|
||||||
time() < $this->getData(['user', $userId, 'accessTimer']) + self::ACCESS_TIMER
|
time() < $this->getData(['user', $userId, 'accessTimer']) + common::ACCESS_TIMER
|
||||||
) {
|
) {
|
||||||
$access = false;
|
$access = false;
|
||||||
$accessInfo['userName'] = $this->getData(['user', $userId, 'lastname']) . ' ' . $this->getData(['user', $userId, 'firstname']);
|
$accessInfo['userName'] = $this->getData(['user', $userId, 'lastname']) . ' ' . $this->getData(['user', $userId, 'firstname']);
|
||||||
$accessInfo['pageId'] = end($t);
|
$accessInfo['pageId'] = end($t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// Accès concurrent stocke la page visitée
|
// Accès concurrent stocke la page visitée
|
||||||
if (
|
if (
|
||||||
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
$this->isConnected() === true
|
||||||
&& $this->getUser('id')
|
&& $this->getUser('id')
|
||||||
|
&& !$this->isPost()
|
||||||
) {
|
) {
|
||||||
$this->setData(['user', $this->getUser('id'), 'accessUrl', $this->getUrl()]);
|
$this->setData(['user', $this->getUser('id'), 'accessUrl', $this->getUrl()], false);
|
||||||
$this->setData(['user', $this->getUser('id'), 'accessTimer', time()]);
|
$this->setData(['user', $this->getUser('id'), 'accessTimer', time()]);
|
||||||
}
|
}
|
||||||
// Breadcrumb
|
// Breadcrumb
|
||||||
@ -617,10 +541,10 @@ class core extends common
|
|||||||
$inlineScript[] = $this->getData(['page', $this->getUrl(0), 'js']) === null ? '' : $this->getData(['page', $this->getUrl(0), 'js']);
|
$inlineScript[] = $this->getData(['page', $this->getUrl(0), 'js']) === null ? '' : $this->getData(['page', $this->getUrl(0), 'js']);
|
||||||
|
|
||||||
// Importe le contenu, le CSS et le script des barres
|
// Importe le contenu, le CSS et le script des barres
|
||||||
$contentRight = $this->getData(['page', $this->getUrl(0), 'barRight']) ? $this->getPage($this->getData(['page', $this->getUrl(0), 'barRight']), self::$i18nContent) : '';
|
$contentRight = $this->getData(['page', $this->getUrl(0), 'barRight']) ? $this->getPage($this->getData(['page', $this->getUrl(0), 'barRight']), common::$siteContent) : '';
|
||||||
$inlineStyle[] = $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'css']) === null ? '' : $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'css']);
|
$inlineStyle[] = $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'css']) === null ? '' : $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'css']);
|
||||||
$inlineScript[] = $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'js']) === null ? '' : $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'js']);
|
$inlineScript[] = $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'js']) === null ? '' : $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'js']);
|
||||||
$contentLeft = $this->getData(['page', $this->getUrl(0), 'barLeft']) ? $this->getPage($this->getData(['page', $this->getUrl(0), 'barLeft']), self::$i18nContent) : '';
|
$contentLeft = $this->getData(['page', $this->getUrl(0), 'barLeft']) ? $this->getPage($this->getData(['page', $this->getUrl(0), 'barLeft']), common::$siteContent) : '';
|
||||||
$inlineStyle[] = $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'css']) === null ? '' : $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'css']);
|
$inlineStyle[] = $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'css']) === null ? '' : $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'css']);
|
||||||
$inlineScript[] = $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'js']) === null ? '' : $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'js']);
|
$inlineScript[] = $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'js']) === null ? '' : $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'js']);
|
||||||
|
|
||||||
@ -638,7 +562,7 @@ class core extends common
|
|||||||
|
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'title' => $title,
|
'title' => $title,
|
||||||
'content' => $this->getPage($this->getUrl(0), self::$i18nContent),
|
'content' => $this->getPage($this->getUrl(0), common::$siteContent),
|
||||||
'metaDescription' => $this->getData(['page', $this->getUrl(0), 'metaDescription']),
|
'metaDescription' => $this->getData(['page', $this->getUrl(0), 'metaDescription']),
|
||||||
'metaTitle' => $this->getData(['page', $this->getUrl(0), 'metaTitle']),
|
'metaTitle' => $this->getData(['page', $this->getUrl(0), 'metaTitle']),
|
||||||
'typeMenu' => $this->getData(['page', $this->getUrl(0), 'typeMenu']),
|
'typeMenu' => $this->getData(['page', $this->getUrl(0), 'typeMenu']),
|
||||||
@ -664,7 +588,7 @@ class core extends common
|
|||||||
: $this->getData(['page', $this->getUrl(0), 'metaDescription']);
|
: $this->getData(['page', $this->getUrl(0), 'metaDescription']);
|
||||||
|
|
||||||
// Importe le CSS de la page principale
|
// Importe le CSS de la page principale
|
||||||
$pageContent = $this->getPage($this->getUrl(0), self::$i18nContent);
|
$pageContent = $this->getPage($this->getUrl(0), common::$siteContent);
|
||||||
|
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'title' => $title,
|
'title' => $title,
|
||||||
@ -709,9 +633,10 @@ class core extends common
|
|||||||
$output = $module->output;
|
$output = $module->output;
|
||||||
// Check le groupe de l'utilisateur
|
// Check le groupe de l'utilisateur
|
||||||
if (
|
if (
|
||||||
($module::$actions[$action] === self::GROUP_VISITOR
|
($module::$actions[$action] === common::GROUP_VISITOR
|
||||||
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
or ($this->isConnected() === true
|
||||||
and $this->getUser('group') >= $module::$actions[$action]
|
and $this->getUser('group') >= $module::$actions[$action]
|
||||||
|
and $this->getUser('permission', $moduleId, $action)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
and $output['access'] === true
|
and $output['access'] === true
|
||||||
@ -721,10 +646,10 @@ class core extends common
|
|||||||
foreach ($_POST as $postId => $postValue) {
|
foreach ($_POST as $postId => $postValue) {
|
||||||
if (is_array($postValue)) {
|
if (is_array($postValue)) {
|
||||||
foreach ($postValue as $subPostId => $subPostValue) {
|
foreach ($postValue as $subPostId => $subPostValue) {
|
||||||
self::$inputBefore[$postId . '_' . $subPostId] = $subPostValue;
|
common::$inputBefore[$postId . '_' . $subPostId] = $subPostValue;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self::$inputBefore[$postId] = $postValue;
|
common::$inputBefore[$postId] = $postValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -764,9 +689,9 @@ class core extends common
|
|||||||
// Contenu par vue
|
// Contenu par vue
|
||||||
elseif ($output['view']) {
|
elseif ($output['view']) {
|
||||||
// Chemin en fonction d'un module du coeur ou d'un module
|
// Chemin en fonction d'un module du coeur ou d'un module
|
||||||
$modulePath = in_array($moduleId, self::$coreModuleIds) ? 'core/' : '';
|
$modulePath = in_array($moduleId, common::$coreModuleIds) ? 'core/' : '';
|
||||||
// CSS
|
// CSS
|
||||||
$stylePath = $modulePath . self::MODULE_DIR . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.css';
|
$stylePath = $modulePath . common::MODULE_DIR . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.css';
|
||||||
if (file_exists($stylePath)) {
|
if (file_exists($stylePath)) {
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'style' => file_get_contents($stylePath)
|
'style' => file_get_contents($stylePath)
|
||||||
@ -779,7 +704,7 @@ class core extends common
|
|||||||
}
|
}
|
||||||
|
|
||||||
// JS
|
// JS
|
||||||
$scriptPath = $modulePath . self::MODULE_DIR . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.js.php';
|
$scriptPath = $modulePath . common::MODULE_DIR . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.js.php';
|
||||||
if (file_exists($scriptPath)) {
|
if (file_exists($scriptPath)) {
|
||||||
ob_start();
|
ob_start();
|
||||||
include $scriptPath;
|
include $scriptPath;
|
||||||
@ -788,7 +713,7 @@ class core extends common
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
// Vue
|
// Vue
|
||||||
$viewPath = $modulePath . self::MODULE_DIR . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.php';
|
$viewPath = $modulePath . common::MODULE_DIR . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.php';
|
||||||
if (file_exists($viewPath)) {
|
if (file_exists($viewPath)) {
|
||||||
ob_start();
|
ob_start();
|
||||||
include $viewPath;
|
include $viewPath;
|
||||||
@ -797,7 +722,7 @@ class core extends common
|
|||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'content' => ob_get_clean() . ($output['showPageContent'] ? $pageContent : '')
|
'content' => ob_get_clean() . ($output['showPageContent'] ? $pageContent : '')
|
||||||
]);
|
]);
|
||||||
} else if ($modpos === 'free') {
|
} elseif ($modpos === 'free' && strstr($pageContent, '[MODULE]')) {
|
||||||
if (strstr($pageContent, '[MODULE]', true) === false) {
|
if (strstr($pageContent, '[MODULE]', true) === false) {
|
||||||
$begin = strstr($pageContent, '[]', true);
|
$begin = strstr($pageContent, '[]', true);
|
||||||
} else {
|
} else {
|
||||||
@ -857,7 +782,7 @@ class core extends common
|
|||||||
if ($accessInfo['userName']) {
|
if ($accessInfo['userName']) {
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'title' => 'Accès verrouillé',
|
'title' => 'Accès verrouillé',
|
||||||
'content' => template::speech(sprintf(helper::translate('La page %s est ouverte par l\'utilisateur %s'), $accessInfo['pageId'], $accessInfo['userName']))
|
'content' => template::speech('<p>' . sprintf(helper::translate('La page %s est ouverte par l\'utilisateur %s</p><p><a style="color:inherit" href="javascript:history.back()">%s</a></p>'), $accessInfo['pageId'], $accessInfo['userName'], helper::translate('Retour')))
|
||||||
|
|
||||||
]);
|
]);
|
||||||
} else {
|
} else {
|
||||||
@ -869,12 +794,35 @@ class core extends common
|
|||||||
} else {
|
} else {
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'title' => 'Accès interdit',
|
'title' => 'Accès interdit',
|
||||||
'content' => template::speech(helper::translate('Vous n\'êtes pas autorisé à consulter cette page (erreur 403)'))
|
'content' => template::speech('<p>' . helper::translate('Vous n\'êtes pas autorisé à consulter cette page (erreur 403)') . '</p><p><a style="color:inherit" href="javascript:history.back()">' . helper::translate('Retour') . '</a></p>')
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} elseif ($this->output['content'] === '') {
|
} elseif ($this->output['content'] === '') {
|
||||||
http_response_code(404);
|
http_response_code(404);
|
||||||
|
// Pour éviter une 404, bascule dans l'espace correct si la page existe dans cette langue.
|
||||||
|
// Parcourir les espaces
|
||||||
|
foreach (common::$languages as $langId => $value) {
|
||||||
|
;
|
||||||
|
if (
|
||||||
|
// l'espace existe
|
||||||
|
is_dir(common::DATA_DIR . $langId) &&
|
||||||
|
file_exists(common::DATA_DIR . $langId . '/page.json')
|
||||||
|
) {
|
||||||
|
// Lire les données des pages
|
||||||
|
$pagesId = json_decode(file_get_contents(common::DATA_DIR . $langId . '/page.json'), true);
|
||||||
|
if (
|
||||||
|
// La page existe
|
||||||
|
is_array($pagesId['page']) &&
|
||||||
|
array_key_exists($this->getUrl(0), $pagesId['page'])
|
||||||
|
) {
|
||||||
|
// Basculer
|
||||||
|
$_SESSION['ZWII_SITE_CONTENT'] = $langId;
|
||||||
|
header('Refresh:0; url=' . helper::baseUrl() . $this->getUrl());
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (
|
if (
|
||||||
$this->getData(['locale', 'page404']) !== 'none'
|
$this->getData(['locale', 'page404']) !== 'none'
|
||||||
and $this->getData(['page', $this->getData(['locale', 'page404'])])
|
and $this->getData(['page', $this->getData(['locale', 'page404'])])
|
||||||
@ -883,7 +831,7 @@ class core extends common
|
|||||||
} else {
|
} else {
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'title' => 'Page indisponible',
|
'title' => 'Page indisponible',
|
||||||
'content' => template::speech(helper::translate('La page demandée n\'existe pas ou est introuvable (erreur 404)'))
|
'content' => template::speech('<p>' . helper::translate('La page demandée n\'existe pas ou est introuvable (erreur 404)') . '</p><p><a style="color:inherit" href="javascript:history.back()">' . helper::translate('Retour') . '</a></p>')
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -906,25 +854,25 @@ class core extends common
|
|||||||
}
|
}
|
||||||
switch ($this->output['display']) {
|
switch ($this->output['display']) {
|
||||||
// Layout brut
|
// Layout brut
|
||||||
case self::DISPLAY_RAW:
|
case common::DISPLAY_RAW:
|
||||||
echo $this->output['content'];
|
echo $this->output['content'];
|
||||||
break;
|
break;
|
||||||
// Layout vide
|
// Layout vide
|
||||||
case self::DISPLAY_LAYOUT_BLANK:
|
case common::DISPLAY_LAYOUT_BLANK:
|
||||||
require 'core/layout/blank.php';
|
require 'core/layout/blank.php';
|
||||||
break;
|
break;
|
||||||
// Affichage en JSON
|
// Affichage en JSON
|
||||||
case self::DISPLAY_JSON:
|
case common::DISPLAY_JSON:
|
||||||
header('Content-Type: application/json');
|
header('Content-Type: application/json');
|
||||||
echo json_encode($this->output['content']);
|
echo json_encode($this->output['content']);
|
||||||
break;
|
break;
|
||||||
// RSS feed
|
// RSS feed
|
||||||
case self::DISPLAY_RSS:
|
case common::DISPLAY_RSS:
|
||||||
header('Content-type: application/rss+xml; charset=UTF-8');
|
header('Content-type: application/rss+xml; charset=UTF-8');
|
||||||
echo $this->output['content'];
|
echo $this->output['content'];
|
||||||
break;
|
break;
|
||||||
// Layout allégé
|
// Layout allégé
|
||||||
case self::DISPLAY_LAYOUT_LIGHT:
|
case common::DISPLAY_LAYOUT_LIGHT:
|
||||||
ob_start();
|
ob_start();
|
||||||
require 'core/layout/light.php';
|
require 'core/layout/light.php';
|
||||||
$content = ob_get_clean();
|
$content = ob_get_clean();
|
||||||
@ -935,7 +883,7 @@ class core extends common
|
|||||||
echo $content;
|
echo $content;
|
||||||
break;
|
break;
|
||||||
// Layout principal
|
// Layout principal
|
||||||
case self::DISPLAY_LAYOUT_MAIN:
|
case common::DISPLAY_LAYOUT_MAIN:
|
||||||
ob_start();
|
ob_start();
|
||||||
require 'core/layout/main.php';
|
require 'core/layout/main.php';
|
||||||
$content = ob_get_clean();
|
$content = ob_get_clean();
|
||||||
|
@ -128,7 +128,17 @@ class SitemapGenerator
|
|||||||
*/
|
*/
|
||||||
private $sampleRobotsLines = [
|
private $sampleRobotsLines = [
|
||||||
"User-agent: *",
|
"User-agent: *",
|
||||||
|
"Disallow: /",
|
||||||
|
"User-agent: Googlebot",
|
||||||
"Allow: /",
|
"Allow: /",
|
||||||
|
"User-agent: bingbot",
|
||||||
|
"Allow: /",
|
||||||
|
"User-agent: Slurp",
|
||||||
|
"Allow: /",
|
||||||
|
"User-agent: DuckDuckBot",
|
||||||
|
"Allow: /",
|
||||||
|
"User-agent: Baiduspider",
|
||||||
|
"Allow: /"
|
||||||
];
|
];
|
||||||
/**
|
/**
|
||||||
* @var array list of valid changefreq values according to the spec
|
* @var array list of valid changefreq values according to the spec
|
||||||
|
@ -93,19 +93,19 @@ class template
|
|||||||
// Icône de l'opérateur et calcul du résultat
|
// Icône de l'opérateur et calcul du résultat
|
||||||
switch ($operator) {
|
switch ($operator) {
|
||||||
case 1:
|
case 1:
|
||||||
$operator = template::ico('plus');
|
$operator = template::ico('plus', ['fontSize' => '2em;']);
|
||||||
$result = $firstNumber + $secondNumber;
|
$result = $firstNumber + $secondNumber;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
$operator = template::ico('minus');
|
$operator = template::ico('minus', ['fontSize' => '2em;']);
|
||||||
$result = $firstNumber - $secondNumber;
|
$result = $firstNumber - $secondNumber;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
$operator = template::ico('cancel');
|
$operator = template::ico('cancel', ['fontSize' => '2em;']);
|
||||||
$result = $firstNumber * $secondNumber;
|
$result = $firstNumber * $secondNumber;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
$operator = template::ico('divide');
|
$operator = template::ico('divide', ['fontSize' => '2em;']);
|
||||||
$limit2 = [10, 10, 6, 5, 4, 3, 2, 2, 2, 2];
|
$limit2 = [10, 10, 6, 5, 4, 3, 2, 2, 2, 2];
|
||||||
for ($i = 1; $i <= $firstNumber; $i++) {
|
for ($i = 1; $i <= $firstNumber; $i++) {
|
||||||
$limit = $limit2[$i - 1];
|
$limit = $limit2[$i - 1];
|
||||||
@ -134,7 +134,7 @@ class template
|
|||||||
// Label
|
// Label
|
||||||
$html .= self::label(
|
$html .= self::label(
|
||||||
$attributes['id'],
|
$attributes['id'],
|
||||||
'<img class="captcha' . ucFirst($attributes['type']) . '" src="' . helper::baseUrl(false) . 'site/tmp/' . $firstLetter . '.png" /> <strong>' . $operator . '</strong> <img class="captcha' . ucFirst($attributes['type']) . '" src="' . helper::baseUrl(false) . 'site/tmp/' . $secondLetter . '.png" />' . template::ico('eq'),
|
'<img class="captcha' . ucFirst($attributes['type']) . '" src="' . helper::baseUrl(false) . 'site/tmp/' . $firstLetter . '.png" /> <strong>' . $operator . '</strong> <img class="captcha' . ucFirst($attributes['type']) . '" src="' . helper::baseUrl(false) . 'site/tmp/' . $secondLetter . '.png" />' . template::ico('eq', ['fontSize' => '2em;']),
|
||||||
[
|
[
|
||||||
'help' => $attributes['help']
|
'help' => $attributes['help']
|
||||||
]
|
]
|
||||||
@ -224,7 +224,7 @@ class template
|
|||||||
* Crée un champ date
|
* Crée un champ date
|
||||||
* @param string $nameId Nom et id du champ
|
* @param string $nameId Nom et id du champ
|
||||||
* @param array $attributes Attributs ($key => $value)
|
* @param array $attributes Attributs ($key => $value)
|
||||||
* @param string type date time datetime-local month week
|
* @param string type date seule ; time heure seule ; datetime-local (jour et heure)
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function date($nameId, array $attributes = [])
|
public static function date($nameId, array $attributes = [])
|
||||||
@ -250,11 +250,26 @@ class template
|
|||||||
$attributes['label'] = helper::translate($attributes['label']);
|
$attributes['label'] = helper::translate($attributes['label']);
|
||||||
$attributes['help'] = helper::translate($attributes['help']);
|
$attributes['help'] = helper::translate($attributes['help']);
|
||||||
//$attributes['placeholder'] = helper::translate($attributes['placeholder']);
|
//$attributes['placeholder'] = helper::translate($attributes['placeholder']);
|
||||||
|
// Filtre selon le type
|
||||||
|
switch ($attributes['type']) {
|
||||||
|
case 'datetime-local':
|
||||||
|
$filter = helper::FILTER_TIMESTAMP;
|
||||||
|
break;
|
||||||
|
case 'date':
|
||||||
|
$filter = helper::FILTER_DATE; // Pour générer une valeur uniquement sur la date
|
||||||
|
break;
|
||||||
|
case 'time':
|
||||||
|
$filter = helper::FILTER_TIME; // Pour générer une valeur uniquement sur l'heure
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$filter = null; // pas de filtre pour month and year
|
||||||
|
break;
|
||||||
|
}
|
||||||
// Sauvegarde des données en cas d'erreur
|
// Sauvegarde des données en cas d'erreur
|
||||||
if ($attributes['before'] and array_key_exists($attributes['id'], common::$inputBefore)) {
|
if ($attributes['before'] and array_key_exists($attributes['id'], common::$inputBefore)) {
|
||||||
$attributes['value'] = common::$inputBefore[$attributes['id']];
|
$attributes['value'] = common::$inputBefore[$attributes['id']];
|
||||||
} else {
|
} else {
|
||||||
$attributes['value'] = ($attributes['value'] ? helper::filter($attributes['value'], helper::FILTER_TIMESTAMP) : '');
|
$attributes['value'] = ($attributes['value'] ? helper::filter($attributes['value'], $filter) : '');
|
||||||
}
|
}
|
||||||
// Début du wrapper
|
// Début du wrapper
|
||||||
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
|
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
|
||||||
@ -310,6 +325,7 @@ class template
|
|||||||
'name' => $nameId,
|
'name' => $nameId,
|
||||||
'type' => 2,
|
'type' => 2,
|
||||||
'value' => '',
|
'value' => '',
|
||||||
|
'folder' => '',
|
||||||
'language' => 'fr_FR'
|
'language' => 'fr_FR'
|
||||||
], $attributes);
|
], $attributes);
|
||||||
// Traduction de l'aide et de l'étiquette
|
// Traduction de l'aide et de l'étiquette
|
||||||
@ -352,13 +368,15 @@ class template
|
|||||||
'&field_id=' . $attributes['id'] .
|
'&field_id=' . $attributes['id'] .
|
||||||
'&type=' . $attributes['type'] .
|
'&type=' . $attributes['type'] .
|
||||||
'&akey=' . md5_file(core::DATA_DIR . 'core.json') .
|
'&akey=' . md5_file(core::DATA_DIR . 'core.json') .
|
||||||
|
// Ajoute le nom du dossier si la variable est passée
|
||||||
|
(!empty($attributes['folder']) ? '&fldr=' . $attributes['folder'] : '') .
|
||||||
($attributes['extensions'] ? '&extensions=' . $attributes['extensions'] : '')
|
($attributes['extensions'] ? '&extensions=' . $attributes['extensions'] : '')
|
||||||
. '"
|
. '"
|
||||||
class="inputFile %s %s"
|
class="inputFile %s %s"
|
||||||
%s
|
%s
|
||||||
data-lity
|
data-lity
|
||||||
>
|
>
|
||||||
' . self::ico('upload', ['margin' => 'right']) . '
|
' . self::ico('upload-cloud', ['margin' => 'right']) . '
|
||||||
<span class="inputFileLabel"></span>
|
<span class="inputFileLabel"></span>
|
||||||
</a>',
|
</a>',
|
||||||
$attributes['class'],
|
$attributes['class'],
|
||||||
@ -397,7 +415,7 @@ class template
|
|||||||
$html = '<form id="' . $id . '" method="post">';
|
$html = '<form id="' . $id . '" method="post">';
|
||||||
// Stock le token CSRF
|
// Stock le token CSRF
|
||||||
$html .= self::hidden('csrf', [
|
$html .= self::hidden('csrf', [
|
||||||
'value' => $_SESSION['csrf']
|
'value' => htmlentities($_SESSION['csrf'], ENT_QUOTES | ENT_HTML5, 'UTF-8')
|
||||||
]);
|
]);
|
||||||
// Retourne le html
|
// Retourne le html
|
||||||
return $html;
|
return $html;
|
||||||
@ -494,8 +512,8 @@ class template
|
|||||||
$lang = $langId;
|
$lang = $langId;
|
||||||
break;
|
break;
|
||||||
case 'selected':
|
case 'selected':
|
||||||
if (isset($_SESSION['ZWII_CONTENT'])) {
|
if (isset($_SESSION['ZWII_SITE_CONTENT'])) {
|
||||||
$lang = $_SESSION['ZWII_CONTENT'];
|
$lang = $_SESSION['ZWII_SITE_CONTENT'];
|
||||||
} else {
|
} else {
|
||||||
$lang = 'fr_FR';
|
$lang = 'fr_FR';
|
||||||
}
|
}
|
||||||
@ -686,15 +704,16 @@ class template
|
|||||||
'label' => '',
|
'label' => '',
|
||||||
'name' => $nameId,
|
'name' => $nameId,
|
||||||
'selected' => '',
|
'selected' => '',
|
||||||
'fonts' => []
|
'font' => [],
|
||||||
|
'multiple' => ''
|
||||||
], $attributes);
|
], $attributes);
|
||||||
// Traduction de l'aide et de l'étiquette
|
// Traduction de l'aide et de l'étiquette
|
||||||
$attributes['label'] = helper::translate($attributes['label']);
|
$attributes['label'] = helper::translate($attributes['label']);
|
||||||
$attributes['help'] = helper::translate($attributes['help']);
|
$attributes['help'] = helper::translate($attributes['help']);
|
||||||
// Stocker les fontes et remettre à zéro le tableau des fontes transmis pour éviter une erreur de sprintAttributes
|
// Stocker les fontes et remettre à zéro le tableau des fontes transmis pour éviter une erreur de sprintAttributes
|
||||||
if (empty($attributes['fonts']) === false) {
|
if (empty($attributes['font']) === false) {
|
||||||
$fonts = $attributes['fonts'];
|
$fonts = $attributes['font'];
|
||||||
$attributes['fonts'] = [];
|
$attributes['font'] = [];
|
||||||
}
|
}
|
||||||
// Sauvegarde des données en cas d'erreur
|
// Sauvegarde des données en cas d'erreur
|
||||||
if ($attributes['before'] and array_key_exists($attributes['id'], common::$inputBefore)) {
|
if ($attributes['before'] and array_key_exists($attributes['id'], common::$inputBefore)) {
|
||||||
@ -715,6 +734,11 @@ class template
|
|||||||
$attributes['class'] .= ' notice';
|
$attributes['class'] .= ' notice';
|
||||||
}
|
}
|
||||||
$html .= self::notice($attributes['id'], $notice);
|
$html .= self::notice($attributes['id'], $notice);
|
||||||
|
// Attribut multiple
|
||||||
|
if ($attributes['multiple'] === true) {
|
||||||
|
echo "ppp";
|
||||||
|
$attributes['multiple'] = 'multiple';
|
||||||
|
}
|
||||||
// Début sélection
|
// Début sélection
|
||||||
$html .= sprintf(
|
$html .= sprintf(
|
||||||
'<select %s>',
|
'<select %s>',
|
||||||
@ -744,6 +768,7 @@ class template
|
|||||||
return $html;
|
return $html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Crée une bulle de dialogue
|
* Crée une bulle de dialogue
|
||||||
* @param string $text Texte de la bulle
|
* @param string $text Texte de la bulle
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
@ -216,12 +216,14 @@ core.start = function () {
|
|||||||
// Variables des cookies
|
// Variables des cookies
|
||||||
var getUrl = window.location;
|
var getUrl = window.location;
|
||||||
var domain = "domain=" + getUrl.hostname + ";";
|
var domain = "domain=" + getUrl.hostname + ";";
|
||||||
|
var basePath = getUrl.pathname.substring(0, getUrl.pathname.lastIndexOf('/') + 1);
|
||||||
|
var path = "path=" + basePath + ";";
|
||||||
var e = new Date();
|
var e = new Date();
|
||||||
e.setFullYear(e.getFullYear() + 1);
|
e.setFullYear(e.getFullYear() + 1);
|
||||||
var expires = "expires=" + e.toUTCString();
|
var expires = "expires=" + e.toUTCString() + ";";
|
||||||
|
|
||||||
// Stocke le cookie d'acceptation
|
// Stocke le cookie d'acceptation
|
||||||
document.cookie = "ZWII_COOKIE_CONSENT=true;samesite=strict;" + domain + expires;
|
document.cookie = "ZWII_COOKIE_CONSENT=true; samesite=lax; " + domain + path + expires;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@ -291,7 +293,7 @@ core.start = function () {
|
|||||||
});
|
});
|
||||||
// Confirmation de mise à jour
|
// Confirmation de mise à jour
|
||||||
$("#barUpdate").on("click", function () {
|
$("#barUpdate").on("click", function () {
|
||||||
message = "<?php echo helper::translate('Mettre à jour') . ' ?';?>";
|
message = "<?php echo helper::translate('Mise à jour') . ' ?';?>";
|
||||||
return core.confirm(message, function () {
|
return core.confirm(message, function () {
|
||||||
$(location).attr("href", $("#barUpdate").attr("href"));
|
$(location).attr("href", $("#barUpdate").attr("href"));
|
||||||
});
|
});
|
||||||
@ -462,7 +464,7 @@ $(document).ready(function () {
|
|||||||
/**
|
/**
|
||||||
* Chargement paresseux des images et des iframes
|
* Chargement paresseux des images et des iframes
|
||||||
*/
|
*/
|
||||||
$("img,picture,iframe").attr("loading", "lazy");
|
$("img").attr("loading", "lazy");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Effet accordéon
|
* Effet accordéon
|
||||||
@ -532,7 +534,7 @@ $(document).ready(function () {
|
|||||||
var langSelected = $(this).val();
|
var langSelected = $(this).val();
|
||||||
var langSelected = langSelected.split("/");
|
var langSelected = langSelected.split("/");
|
||||||
// Lit le cookie de langue
|
// Lit le cookie de langue
|
||||||
var langSession = "<?php echo $_SESSION['ZWII_CONTENT'];?>";
|
var langSession = "<?php echo isset($_SESSION['ZWII_SITE_CONTENT']) ? $_SESSION['ZWII_SITE_CONTENT'] : '';?>";
|
||||||
// Découpe l'URL pour exclure le changement de page avec le thème
|
// Découpe l'URL pour exclure le changement de page avec le thème
|
||||||
var url = window.location;
|
var url = window.location;
|
||||||
var currentUrl = url.href.split("/");
|
var currentUrl = url.href.split("/");
|
||||||
|
504
core/core.php
504
core/core.php
@ -8,16 +8,12 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* Chargement des classes filles
|
|
||||||
* router : aiguillage des pages
|
|
||||||
*/
|
|
||||||
require_once('core/class/router.class.php');
|
|
||||||
|
|
||||||
class common
|
class common
|
||||||
{
|
{
|
||||||
@ -31,6 +27,8 @@ class common
|
|||||||
const GROUP_BANNED = -1;
|
const GROUP_BANNED = -1;
|
||||||
const GROUP_VISITOR = 0;
|
const GROUP_VISITOR = 0;
|
||||||
const GROUP_MEMBER = 1;
|
const GROUP_MEMBER = 1;
|
||||||
|
const GROUP_EDITOR = 2;
|
||||||
|
// Groupe MODERATOR, compatibilité avec les anciens modules :
|
||||||
const GROUP_MODERATOR = 2;
|
const GROUP_MODERATOR = 2;
|
||||||
const GROUP_ADMIN = 3;
|
const GROUP_ADMIN = 3;
|
||||||
const SIGNATURE_ID = 1;
|
const SIGNATURE_ID = 1;
|
||||||
@ -52,41 +50,65 @@ class common
|
|||||||
// Contrôle d'édition temps maxi en secondes avant déconnexion 30 minutes
|
// Contrôle d'édition temps maxi en secondes avant déconnexion 30 minutes
|
||||||
const ACCESS_TIMER = 1800;
|
const ACCESS_TIMER = 1800;
|
||||||
|
|
||||||
// Numéro de version et branche pour l'auto-update
|
// Numéro de version
|
||||||
const ZWII_VERSION = '12.3.11';
|
const ZWII_VERSION = '13.5.00';
|
||||||
|
|
||||||
// URL autoupdate
|
// URL autoupdate
|
||||||
const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/update/raw/branch/master/';
|
const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/cms-update/raw/branch/master/';
|
||||||
const ZWII_UPDATE_CHANNEL = "v12";
|
|
||||||
|
|
||||||
// URL langues de l'UI en ligne
|
/**
|
||||||
const ZWII_UI_URL = 'https://forge.chapril.org/ZwiiCMS-Team/zwiicms-translations/raw/branch/master/';
|
* Branche de base pour la mise à jour
|
||||||
|
* Pour les versions supérieures à 13.4 et inférieure à 14, la branche reste sur v134
|
||||||
|
* La branche v13 est maintenue afin de télécharger un correctif permettant d'installer
|
||||||
|
* les version supérieures.
|
||||||
|
*/
|
||||||
|
const ZWII_UPDATE_CHANNEL = 'v134';
|
||||||
|
|
||||||
|
// Valeurs possibles multiple de 10, 10 autorise 9 profils, 100 autorise 99 profils
|
||||||
|
const MAX_PROFILS = 10;
|
||||||
|
|
||||||
|
const MAX_FILE_WRITE_ATTEMPTS = 5;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Nombre maximal de tentatives d'encodage JSON
|
||||||
|
*/
|
||||||
|
const MAX_JSON_ENCODE_ATTEMPTS = 3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Temps d'attente entre les tentatives en secondes
|
||||||
|
*/
|
||||||
|
const RETRY_DELAY_SECONDS = 1;
|
||||||
|
|
||||||
|
|
||||||
public static $actions = [];
|
public static $actions = [];
|
||||||
public static $coreModuleIds = [
|
public static $coreModuleIds = [
|
||||||
'config',
|
"config",
|
||||||
'install',
|
"dashboard",
|
||||||
'maintenance',
|
"install",
|
||||||
'page',
|
"language",
|
||||||
'sitemap',
|
"maintenance",
|
||||||
'theme',
|
"page",
|
||||||
'user',
|
"plugin",
|
||||||
'translate',
|
"sitemap",
|
||||||
'plugin'
|
"theme",
|
||||||
|
"user"
|
||||||
];
|
];
|
||||||
public static $accessList = [
|
public static $concurrentAccess = [
|
||||||
'user',
|
"config",
|
||||||
'theme',
|
"edit",
|
||||||
'config',
|
"language",
|
||||||
'edit',
|
"plugin",
|
||||||
'config',
|
"theme",
|
||||||
'translate'
|
"user"
|
||||||
];
|
];
|
||||||
|
/*
|
||||||
|
Cette variable est supprimée du test dans le routeur.
|
||||||
public static $accessExclude = [
|
public static $accessExclude = [
|
||||||
'login',
|
'login',
|
||||||
'logout'
|
'logout',
|
||||||
|
"maintenance",
|
||||||
];
|
];
|
||||||
|
*/
|
||||||
private $data = [];
|
private $data = [];
|
||||||
private $hierarchy = [
|
private $hierarchy = [
|
||||||
'all' => [],
|
'all' => [],
|
||||||
@ -131,7 +153,7 @@ class common
|
|||||||
// 'codemirror', // Désactivé par défaut
|
// 'codemirror', // Désactivé par défaut
|
||||||
'tippy',
|
'tippy',
|
||||||
'zwiico',
|
'zwiico',
|
||||||
'imagemap',
|
//'imagemap',
|
||||||
'simplelightbox'
|
'simplelightbox'
|
||||||
],
|
],
|
||||||
'view' => ''
|
'view' => ''
|
||||||
@ -140,24 +162,24 @@ class common
|
|||||||
self::GROUP_BANNED => 'Banni',
|
self::GROUP_BANNED => 'Banni',
|
||||||
self::GROUP_VISITOR => 'Visiteur',
|
self::GROUP_VISITOR => 'Visiteur',
|
||||||
self::GROUP_MEMBER => 'Membre',
|
self::GROUP_MEMBER => 'Membre',
|
||||||
self::GROUP_MODERATOR => 'Éditeur',
|
self::GROUP_EDITOR => 'Éditeur',
|
||||||
self::GROUP_ADMIN => 'Administrateur'
|
self::GROUP_ADMIN => 'Administrateur'
|
||||||
];
|
];
|
||||||
public static $groupEdits = [
|
public static $groupEdits = [
|
||||||
self::GROUP_BANNED => 'Banni',
|
self::GROUP_BANNED => 'Banni',
|
||||||
self::GROUP_MEMBER => 'Membre',
|
self::GROUP_MEMBER => 'Membre',
|
||||||
self::GROUP_MODERATOR => 'Éditeur',
|
self::GROUP_EDITOR => 'Éditeur',
|
||||||
self::GROUP_ADMIN => 'Administrateur'
|
self::GROUP_ADMIN => 'Administrateur'
|
||||||
];
|
];
|
||||||
public static $groupNews = [
|
public static $groupNews = [
|
||||||
self::GROUP_MEMBER => 'Membre',
|
self::GROUP_MEMBER => 'Membre',
|
||||||
self::GROUP_MODERATOR => 'Éditeur',
|
self::GROUP_EDITOR => 'Éditeur',
|
||||||
self::GROUP_ADMIN => 'Administrateur'
|
self::GROUP_ADMIN => 'Administrateur'
|
||||||
];
|
];
|
||||||
public static $groupPublics = [
|
public static $groupPublics = [
|
||||||
self::GROUP_VISITOR => 'Visiteur',
|
self::GROUP_VISITOR => 'Visiteur',
|
||||||
self::GROUP_MEMBER => 'Membre',
|
self::GROUP_MEMBER => 'Membre',
|
||||||
self::GROUP_MODERATOR => 'Éditeur',
|
self::GROUP_EDITOR => 'Éditeur',
|
||||||
self::GROUP_ADMIN => 'Administrateur'
|
self::GROUP_ADMIN => 'Administrateur'
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -167,7 +189,7 @@ class common
|
|||||||
// Langue de l'interface sélectionnée
|
// Langue de l'interface sélectionnée
|
||||||
public static $i18nUI = 'fr_FR';
|
public static $i18nUI = 'fr_FR';
|
||||||
// Langues de contenu
|
// Langues de contenu
|
||||||
public static $i18nContent = 'fr_FR';
|
public static $siteContent = 'fr_FR';
|
||||||
public static $languages = [
|
public static $languages = [
|
||||||
'az_AZ' => 'Azərbaycan dili',
|
'az_AZ' => 'Azərbaycan dili',
|
||||||
'bg_BG' => 'български език',
|
'bg_BG' => 'български език',
|
||||||
@ -222,13 +244,14 @@ class common
|
|||||||
'blacklist' => '',
|
'blacklist' => '',
|
||||||
'config' => '',
|
'config' => '',
|
||||||
'core' => '',
|
'core' => '',
|
||||||
'fonts' => '',
|
'font' => '',
|
||||||
'module' => '',
|
'module' => '',
|
||||||
'locale' => '',
|
'locale' => '',
|
||||||
'page' => '',
|
'page' => '',
|
||||||
'theme' => '',
|
'theme' => '',
|
||||||
'user' => '',
|
'user' => '',
|
||||||
'languages' => '',
|
'language' => '',
|
||||||
|
'profil' => '',
|
||||||
];
|
];
|
||||||
|
|
||||||
public static $fontsWebSafe = [
|
public static $fontsWebSafe = [
|
||||||
@ -294,12 +317,40 @@ class common
|
|||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// Boutons de navigation dans la page
|
||||||
|
public static $navIconTemplate = [
|
||||||
|
'open' => [
|
||||||
|
'left' => 'left-open',
|
||||||
|
'right' => 'right-open',
|
||||||
|
],
|
||||||
|
'dir' => [
|
||||||
|
'left' => 'left',
|
||||||
|
'right' => 'right-dir',
|
||||||
|
],
|
||||||
|
'big' => [
|
||||||
|
'left' => 'left-big',
|
||||||
|
'right' => 'right-big',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructeur commun
|
* Constructeur commun
|
||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
|
// Récupération du cache des propriétés
|
||||||
|
if(isset($GLOBALS['common_cache'])) {
|
||||||
|
$this->input['_POST'] = $GLOBALS['common_cache']['input']['_POST'];
|
||||||
|
$this->input['_COOKIE'] = $GLOBALS['common_cache']['input']['_COOKIE'];
|
||||||
|
self::$siteContent = $GLOBALS['common_cache']['siteContent'];
|
||||||
|
$this->dataFiles = $GLOBALS['common_cache']['dataFiles'];
|
||||||
|
$this->user = $GLOBALS['common_cache']['user'];
|
||||||
|
self::$i18nUI = $GLOBALS['common_cache']['i18nUI'];
|
||||||
|
$this->hierarchy = $GLOBALS['common_cache']['hierarchy'];
|
||||||
|
$this->url = $GLOBALS['common_cache']['url'];
|
||||||
|
self::$dialog = $GLOBALS['common_cache']['dialog'];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Extraction des données http
|
// Extraction des données http
|
||||||
if (isset($_POST)) {
|
if (isset($_POST)) {
|
||||||
@ -309,50 +360,41 @@ class common
|
|||||||
$this->input['_COOKIE'] = $_COOKIE;
|
$this->input['_COOKIE'] = $_COOKIE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extraction de la sesion
|
|
||||||
// $this->input['_SESSION'] = $_SESSION;
|
|
||||||
|
|
||||||
// Déterminer la langue du contenu du site
|
// Déterminer la langue du contenu du site
|
||||||
if (isset($_SESSION['ZWII_CONTENT'])) {
|
if (isset($_SESSION['ZWII_SITE_CONTENT'])) {
|
||||||
// Déterminé par la session présente
|
// Déterminé par la session présente
|
||||||
self::$i18nContent = $_SESSION['ZWII_CONTENT'];
|
self::$siteContent = $_SESSION['ZWII_SITE_CONTENT'];
|
||||||
} else {
|
} else {
|
||||||
// Détermine la langue par défaut
|
// Détermine la langue par défaut
|
||||||
foreach (self::$languages as $key => $value) {
|
foreach (self::$languages as $key => $value) {
|
||||||
if (file_exists(self::DATA_DIR . $key . '/.default')) {
|
if (file_exists(self::DATA_DIR . $key . '/.default')) {
|
||||||
self::$i18nContent = $key;
|
self::$siteContent = $key;
|
||||||
$_SESSION['ZWII_CONTENT'] = $key;
|
$_SESSION['ZWII_SITE_CONTENT'] = $key;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
\setlocale(LC_ALL, self::$i18nContent . '.UTF8');
|
|
||||||
|
// Localisation
|
||||||
|
\setlocale(LC_ALL, self::$siteContent . '.UTF8');
|
||||||
|
|
||||||
// Instanciation de la classe des entrées / sorties
|
// Instanciation de la classe des entrées / sorties
|
||||||
// Récupère les descripteurs
|
$this->jsonDB(self::$siteContent);
|
||||||
foreach ($this->dataFiles as $keys => $value) {
|
|
||||||
// Constructeur JsonDB;
|
|
||||||
$this->dataFiles[$keys] = new \Prowebcraft\JsonDb([
|
|
||||||
'name' => $keys . '.json',
|
|
||||||
'dir' => $this->dataPath($keys, self::$i18nContent),
|
|
||||||
'backup' => file_exists('site/data/.backup')
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Installation fraîche, initialisation des modules
|
// Installation fraîche, initialisation des modules
|
||||||
if ($this->user === []) {
|
if ($this->user === []) {
|
||||||
foreach ($this->dataFiles as $stageId => $item) {
|
foreach ($this->dataFiles as $stageId => $item) {
|
||||||
$folder = $this->dataPath($stageId, self::$i18nContent);
|
$folder = $this->dataPath($stageId, self::$siteContent);
|
||||||
if (
|
if (
|
||||||
file_exists($folder . $stageId . '.json') === false
|
file_exists($folder . $stageId . '.json') === false
|
||||||
) {
|
) {
|
||||||
$this->initData($stageId, self::$i18nContent);
|
$this->initData($stageId, self::$siteContent);
|
||||||
common::$coreNotices[] = $stageId;
|
common::$coreNotices[] = $stageId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Récupére un utilisateur connecté
|
// Récupère un utilisateur connecté
|
||||||
if ($this->user === []) {
|
if ($this->user === []) {
|
||||||
$this->user = $this->getData(['user', $this->getInput('ZWII_USER_ID')]);
|
$this->user = $this->getData(['user', $this->getInput('ZWII_USER_ID')]);
|
||||||
}
|
}
|
||||||
@ -411,9 +453,8 @@ class common
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mise à jour des données core
|
// Cache
|
||||||
include('core/include/update.inc.php');
|
$GLOBALS['common_construct']['dialog'] = self::$dialog;
|
||||||
|
|
||||||
|
|
||||||
// Données de proxy
|
// Données de proxy
|
||||||
$proxy = $this->getData(['config', 'proxyType']) . $this->getData(['config', 'proxyUrl']) . ':' . $this->getData(['config', 'proxyPort']);
|
$proxy = $this->getData(['config', 'proxyType']) . $this->getData(['config', 'proxyUrl']) . ':' . $this->getData(['config', 'proxyPort']);
|
||||||
@ -435,6 +476,25 @@ class common
|
|||||||
);
|
);
|
||||||
stream_context_set_default($context);
|
stream_context_set_default($context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Mise en cache des propriétés
|
||||||
|
$GLOBALS['common_cache'] = [
|
||||||
|
'input' => [
|
||||||
|
'_POST' => $this->input['_POST'],
|
||||||
|
'_COOKIE' => $this->input['_COOKIE'],
|
||||||
|
],
|
||||||
|
'siteContent' => self::$siteContent,
|
||||||
|
'dataFiles' => $this->dataFiles,
|
||||||
|
'user' => $this->user,
|
||||||
|
'i18nUI' => self::$i18nUI,
|
||||||
|
'hierarchy' => $this->hierarchy,
|
||||||
|
'url' => $this->url,
|
||||||
|
'dialog' => self::$dialog,
|
||||||
|
];
|
||||||
|
|
||||||
|
// Mise à jour des données core
|
||||||
|
include('core/include/update.inc.php');
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -469,11 +529,11 @@ class common
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check du token CSRF (true = bo
|
* Check du token CSRF
|
||||||
*/
|
*/
|
||||||
public function checkCSRF()
|
public function checkCSRF()
|
||||||
{
|
{
|
||||||
return ((empty($_POST['csrf']) or hash_equals($_SESSION['csrf'], $_POST['csrf']) === false) === false);
|
return ((empty($_POST['csrf']) or hash_equals($_POST['csrf'], $_SESSION['csrf']) === false) === false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -499,7 +559,7 @@ class common
|
|||||||
* Sauvegarde des données
|
* Sauvegarde des données
|
||||||
* @param array $keys Clé(s) des données
|
* @param array $keys Clé(s) des données
|
||||||
*/
|
*/
|
||||||
public function setData($keys = [])
|
public function setData($keys = [], $save = true)
|
||||||
{
|
{
|
||||||
// Pas d'enregistrement lorsqu'une notice est présente ou tableau transmis vide
|
// Pas d'enregistrement lorsqu'une notice est présente ou tableau transmis vide
|
||||||
if (
|
if (
|
||||||
@ -527,7 +587,7 @@ class common
|
|||||||
$query .= '.' . $keys[$i];
|
$query .= '.' . $keys[$i];
|
||||||
}
|
}
|
||||||
// Appliquer la modification, le dernier élément étant la donnée à sauvegarder
|
// Appliquer la modification, le dernier élément étant la donnée à sauvegarder
|
||||||
$success = is_object($db->set($query, $keys[count($keys) - 1], true));
|
$success = is_object($db->set($query, $keys[count($keys) - 1], $save));
|
||||||
}
|
}
|
||||||
return $success;
|
return $success;
|
||||||
}
|
}
|
||||||
@ -539,7 +599,6 @@ class common
|
|||||||
*/
|
*/
|
||||||
public function getData($keys = [])
|
public function getData($keys = [])
|
||||||
{
|
{
|
||||||
|
|
||||||
// Eviter une requete vide
|
// Eviter une requete vide
|
||||||
if (count($keys) >= 1) {
|
if (count($keys) >= 1) {
|
||||||
// descripteur de la base
|
// descripteur de la base
|
||||||
@ -582,7 +641,48 @@ class common
|
|||||||
public function setPage($page, $value, $lang)
|
public function setPage($page, $value, $lang)
|
||||||
{
|
{
|
||||||
|
|
||||||
return file_put_contents(self::DATA_DIR . $lang . '/content/' . $page . '.html', $value);
|
return $this->secure_file_put_contents(self::DATA_DIR . $lang . '/content/' . $page . '.html', $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Écrit les données dans un fichier avec plusieurs tentatives d'écriture et verrouillage
|
||||||
|
*
|
||||||
|
* @param string $filename Le nom du fichier
|
||||||
|
* @param string $data Les données à écrire dans le fichier
|
||||||
|
* @param int $flags Les drapeaux optionnels à passer à la fonction $this->secure_file_put_contents
|
||||||
|
* @return bool True si l'écriture a réussi, sinon false
|
||||||
|
*/
|
||||||
|
function secure_file_put_contents($filename, $data, $flags = 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Initialise le compteur de tentatives
|
||||||
|
$attempts = 0;
|
||||||
|
|
||||||
|
// Vérifie la longueur des données
|
||||||
|
$data_length = strlen($data);
|
||||||
|
|
||||||
|
// Effectue jusqu'à 5 tentatives d'écriture
|
||||||
|
while ($attempts < 5) {
|
||||||
|
// Essaye d'écrire les données dans le fichier avec verrouillage exclusif
|
||||||
|
$write_result = file_put_contents($filename, $data, LOCK_EX | $flags);
|
||||||
|
|
||||||
|
//$now = \DateTime::createFromFormat('U.u', microtime(true));
|
||||||
|
//file_put_contents("tmplog.txt", '[SecurePut][' . $now->format('H:i:s.u') . ']--' . $filename . "\r\n", FILE_APPEND);
|
||||||
|
|
||||||
|
// Vérifie si l'écriture a réussi
|
||||||
|
if ($write_result !== false && $write_result === $data_length) {
|
||||||
|
// Sort de la boucle si l'écriture a réussi
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Incrémente le compteur de tentatives
|
||||||
|
$attempts++;
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Échec de l'écriture après plusieurs tentatives
|
||||||
|
// Etat de l'écriture
|
||||||
|
return ($attempts < 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -598,78 +698,85 @@ class common
|
|||||||
return unlink(self::DATA_DIR . $lang . '/content/' . $this->getData(['page', $page, 'content']));
|
return unlink(self::DATA_DIR . $lang . '/content/' . $this->getData(['page', $page, 'content']));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function jsonDB($lang)
|
||||||
|
{
|
||||||
|
// Instanciation de la classe des entrées / sorties
|
||||||
|
// Récupère les descripteurs
|
||||||
|
foreach ($this->dataFiles as $keys => $value) {
|
||||||
|
// Constructeur JsonDB;
|
||||||
|
$this->dataFiles[$keys] = new \Prowebcraft\JsonDb([
|
||||||
|
'name' => $keys . '.json',
|
||||||
|
'dir' => $this->dataPath($keys, $lang),
|
||||||
|
'backup' => file_exists('site/data/.backup')
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialisation des données
|
* Initialisation des données
|
||||||
* @param array $module : nom du module à générer
|
* @param string $module : nom du module à générer
|
||||||
|
* @param string $lang la langue à créer
|
||||||
|
* @param bool $sampleSite créer un site exemple en FR
|
||||||
* choix valides : core config user theme page module
|
* choix valides : core config user theme page module
|
||||||
*/
|
*/
|
||||||
public function initData($module, $lang, $sampleSite = false)
|
public function initData($module, $lang, $sampleSite = false)
|
||||||
{
|
{
|
||||||
|
|
||||||
// Créer la base de données des langues
|
|
||||||
if ($module === 'languages') {
|
|
||||||
copy('core/module/install/ressource/i18n/languages.json', self::DATA_DIR . 'languages.json');
|
|
||||||
$this->copyDir('core/module/install/ressource/i18n', self::I18N_DIR);
|
|
||||||
unlink(self::I18N_DIR . 'languages.json');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tableau avec les données vierges
|
// Tableau avec les données vierges
|
||||||
require_once('core/module/install/ressource/defaultdata.php');
|
require_once('core/module/install/ressource/defaultdata.php');
|
||||||
|
|
||||||
// Stockage dans un sous-dossier localisé
|
|
||||||
if (!file_exists(self::DATA_DIR . $lang)) {
|
if (!file_exists(self::DATA_DIR . $lang)) {
|
||||||
mkdir(self::DATA_DIR . $lang, 0755);
|
mkdir(self::DATA_DIR . $lang, 0755);
|
||||||
}
|
}
|
||||||
$db = $this->dataFiles[$module];
|
|
||||||
|
|
||||||
if ($sampleSite === true && $lang === 'fr_FR') {
|
// Localisation
|
||||||
$db->set($module, init::$siteData[$module]);
|
if (
|
||||||
} else {
|
$module === 'page' ||
|
||||||
$db->set($module, init::$defaultData[$module]);
|
$module === 'module' ||
|
||||||
|
$module === 'locale'
|
||||||
|
) {
|
||||||
|
// Création des sous-dossiers localisés
|
||||||
|
if (!file_exists(self::DATA_DIR . $lang)) {
|
||||||
|
mkdir(self::DATA_DIR . $lang, 0755);
|
||||||
}
|
}
|
||||||
$db->save;
|
if (!file_exists(self::DATA_DIR . $lang . '/content')) {
|
||||||
|
mkdir(self::DATA_DIR . $lang . '/content', 0755);
|
||||||
|
|
||||||
|
|
||||||
// Créer le jeu de pages du site de test
|
|
||||||
if ($module === 'page') {
|
|
||||||
|
|
||||||
// Dossier du contenu des pages
|
|
||||||
$langFolder = $lang . '/content/';
|
|
||||||
|
|
||||||
// Dossier des pages
|
|
||||||
if (!is_dir(self::DATA_DIR . $langFolder)) {
|
|
||||||
mkdir(self::DATA_DIR . $langFolder, 0755);
|
|
||||||
}
|
}
|
||||||
// Site de test ou page simple
|
// Site en français avec site exemple
|
||||||
if ($lang === 'fr_FR') {
|
if ($lang == 'fr_FR' && $sampleSite === true && $module === 'page') {
|
||||||
if ($sampleSite === true) {
|
$this->setData([$module, init::$siteTemplate[$module]]);
|
||||||
|
// Création des pages
|
||||||
foreach (init::$siteContent as $key => $value) {
|
foreach (init::$siteContent as $key => $value) {
|
||||||
// Creation du contenu de la page
|
$this->setPage($key, $value['content'], 'fr_FR');
|
||||||
if (!empty($this->getData(['page', $key, 'content']))) {
|
|
||||||
file_put_contents(self::DATA_DIR . $langFolder . $this->getData(['page', $key, 'content']), $value);
|
|
||||||
}
|
}
|
||||||
|
// Version en langue étrangère ou fr_FR sans site de test
|
||||||
|
} else {
|
||||||
|
// En_EN par défaut si le contenu localisé n'est pas traduit
|
||||||
|
$langDefault = array_key_exists($lang, init::$defaultDataI18n) === true ? $lang : 'default';
|
||||||
|
// Charger les données de cette langue
|
||||||
|
$this->setData([$module, init::$defaultDataI18n[$langDefault][$module]]);
|
||||||
|
// Créer la page d'accueil, une seule page dans cette configuration
|
||||||
|
$pageId = init::$defaultDataI18n[$langDefault]['locale']['homePageId'];
|
||||||
|
$content = init::$defaultDataI18n[$langDefault]['html'];
|
||||||
|
$this->setPage($pageId, $content, $lang);
|
||||||
|
//file_put_contents(self::DATA_DIR . $lang . '/content/' . init::$defaultDataI18n[$langDefault]['page'][$pageId]['content'], $content);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Créer la page d'accueil
|
// Installation des données des autres modules cad theme profil font config, admin et core
|
||||||
file_put_contents(self::DATA_DIR . $langFolder . 'accueil.html', '<p>Contenu de votre nouvelle page.</p>');
|
$this->setData([$module, init::$defaultData[$module]]);
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// En_EN si le contenu localisé n'est pas traduit
|
|
||||||
if (!isset(init::$defaultDataI18n[$lang])) {
|
|
||||||
$lang = 'en_EN';
|
|
||||||
}
|
|
||||||
// Messages localisés
|
|
||||||
$this->setData(['locale', init::$defaultDataI18n[$lang]['locale']]);
|
|
||||||
// Page dans une autre langue, page d'accueil
|
|
||||||
$this->setData(['page', init::$defaultDataI18n[$lang]['page']]);
|
|
||||||
// Créer la page d'accueil
|
|
||||||
$pageId = init::$defaultDataI18n[$lang]['locale']['homePageId'];
|
|
||||||
$content = init::$defaultDataI18n[$lang]['html'];
|
|
||||||
file_put_contents(self::DATA_DIR . $langFolder . init::$defaultDataI18n[$lang]['page'][$pageId]['content'], $content);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Forçage de l'enregistrement
|
||||||
|
* @param mixed $module
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function saveDB($module): void
|
||||||
|
{
|
||||||
|
$db = $this->dataFiles[$module];
|
||||||
|
$db->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -714,8 +821,11 @@ class common
|
|||||||
$this->getData(['page', $pageId, 'parentPageId']) === ""
|
$this->getData(['page', $pageId, 'parentPageId']) === ""
|
||||||
// Ignore les pages dont l'utilisateur n'a pas accès
|
// Ignore les pages dont l'utilisateur n'a pas accès
|
||||||
and ($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR
|
and ($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR
|
||||||
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
or ($this->isConnected() === true
|
||||||
and $this->getUser('group') >= $this->getData(['page', $pageId, 'group'])
|
//and $this->getUser('group') >= $this->getData(['page', $pageId, 'group'])
|
||||||
|
// Modification qui tient compte du profil de la page
|
||||||
|
and ($this->getUser('group') * self::MAX_PROFILS + $this->getUser('profil')) >= ($this->getData(['page', $pageId, 'group']) * self::MAX_PROFILS + $this->getData(['page', $pageId, 'profil']))
|
||||||
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
@ -730,17 +840,22 @@ class common
|
|||||||
}
|
}
|
||||||
// Enfants
|
// Enfants
|
||||||
foreach ($pages as $pageId => $pagePosition) {
|
foreach ($pages as $pageId => $pagePosition) {
|
||||||
|
|
||||||
if (
|
if (
|
||||||
// Page parent
|
// Page parent
|
||||||
$parentId = $this->getData(['page', $pageId, 'parentPageId'])
|
$parentId = $this->getData(['page', $pageId, 'parentPageId'])
|
||||||
// Ignore les pages dont l'utilisateur n'a pas accès
|
// Ignore les pages dont l'utilisateur n'a pas accès
|
||||||
and (
|
and (
|
||||||
($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR
|
(
|
||||||
and $this->getData(['page', $parentId, 'group']) === self::GROUP_VISITOR
|
$this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR
|
||||||
|
and
|
||||||
|
$this->getData(['page', $parentId, 'group']) === self::GROUP_VISITOR
|
||||||
)
|
)
|
||||||
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
or (
|
||||||
and $this->getUser('group') >= $this->getData(['page', $parentId, 'group'])
|
$this->isConnected() === true
|
||||||
and $this->getUser('group') >= $this->getData(['page', $pageId, 'group'])
|
and
|
||||||
|
$this->getUser('group') * self::MAX_PROFILS + $this->getUser('profil')) >= ($this->getData(['page', $pageId, 'group']) * self::MAX_PROFILS + $this->getData(['page', $pageId, 'profil'])
|
||||||
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
@ -772,7 +887,7 @@ class common
|
|||||||
// Boucler sur les enfants et récupérer le tableau children avec la liste des enfants
|
// Boucler sur les enfants et récupérer le tableau children avec la liste des enfants
|
||||||
foreach ($childIds as $childId) {
|
foreach ($childIds as $childId) {
|
||||||
$children[] = [
|
$children[] = [
|
||||||
'title' => ' » ' . html_entity_decode($this->getData(['page', $childId, 'shortTitle']), ENT_QUOTES),
|
'title' => '↳' . html_entity_decode($this->getData(['page', $childId, 'title']), ENT_QUOTES),
|
||||||
'value' => $rewrite . $childId
|
'value' => $rewrite . $childId
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@ -780,18 +895,18 @@ class common
|
|||||||
if (empty($childIds)) {
|
if (empty($childIds)) {
|
||||||
// Pas d'enfant, uniquement l'entrée du parent
|
// Pas d'enfant, uniquement l'entrée du parent
|
||||||
$parents[] = [
|
$parents[] = [
|
||||||
'title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES),
|
'title' => html_entity_decode($this->getData(['page', $parentId, 'title']), ENT_QUOTES),
|
||||||
'value' => $rewrite . $parentId
|
'value' => $rewrite . $parentId
|
||||||
];
|
];
|
||||||
} else {
|
} else {
|
||||||
// Des enfants, on ajoute la page parent en premier
|
// Des enfants, on ajoute la page parent en premier
|
||||||
array_unshift($children, [
|
array_unshift($children, [
|
||||||
'title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES),
|
'title' => html_entity_decode($this->getData(['page', $parentId, 'title']), ENT_QUOTES),
|
||||||
'value' => $rewrite . $parentId
|
'value' => $rewrite . $parentId
|
||||||
]);
|
]);
|
||||||
// puis on ajoute les enfants au parent
|
// puis on ajoute les enfants au parent
|
||||||
$parents[] = [
|
$parents[] = [
|
||||||
'title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES),
|
'title' => html_entity_decode($this->getData(['page', $parentId, 'title']), ENT_QUOTES),
|
||||||
'value' => $rewrite . $parentId,
|
'value' => $rewrite . $parentId,
|
||||||
'menu' => $children
|
'menu' => $children
|
||||||
];
|
];
|
||||||
@ -908,12 +1023,14 @@ class common
|
|||||||
* @param int $key Clé de la valeur
|
* @param int $key Clé de la valeur
|
||||||
* @return string|null
|
* @return string|null
|
||||||
*/
|
*/
|
||||||
public function getUser($key)
|
public function getUser($key, $perm1 = null, $perm2 = null)
|
||||||
{
|
{
|
||||||
if (is_array($this->user) === false) {
|
if (is_array($this->user) === false) {
|
||||||
return false;
|
return false;
|
||||||
} elseif ($key === 'id') {
|
} elseif ($key === 'id') {
|
||||||
return $this->getInput('ZWII_USER_ID');
|
return $this->getInput('ZWII_USER_ID');
|
||||||
|
} elseif ($key === 'permission') {
|
||||||
|
return $this->getPermission($perm1, $perm2);
|
||||||
} elseif (array_key_exists($key, $this->user)) {
|
} elseif (array_key_exists($key, $this->user)) {
|
||||||
return $this->user[$key];
|
return $this->user[$key];
|
||||||
} else {
|
} else {
|
||||||
@ -921,6 +1038,59 @@ class common
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retourne les permissions de l'utilisateur connecté
|
||||||
|
* @param int $key Clé de la valeur du groupe
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getPermission($key1, $key2 = null)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Administrateur, toutes les permissions
|
||||||
|
if ($this->getUser('group') === self::GROUP_ADMIN) {
|
||||||
|
return true;
|
||||||
|
} elseif ($this->getUser('group') <= self::GROUP_VISITOR) { // Groupe sans autorisation
|
||||||
|
return false;
|
||||||
|
} elseif (
|
||||||
|
// Groupe avec profil, consultation des autorisations sur deux clés
|
||||||
|
$key1
|
||||||
|
&& $key2
|
||||||
|
&& $this->user
|
||||||
|
&& $this->getData(['profil', $this->user['group'], $this->user['profil'], $key1])
|
||||||
|
&& array_key_exists($key2, $this->getData(['profil', $this->user['group'], $this->user['profil'], $key1]))
|
||||||
|
) {
|
||||||
|
return $this->getData(['profil', $this->user['group'], $this->user['profil'], $key1, $key2]);
|
||||||
|
// Groupe avec profil, consultation des autorisations sur une seule clé
|
||||||
|
} elseif (
|
||||||
|
$key1
|
||||||
|
&& $this->user
|
||||||
|
&& $this->getData(['profil', $this->user['group'], $this->user['profil']])
|
||||||
|
&& array_key_exists($key1, $this->getData(['profil', $this->user['group'], $this->user['profil']]))
|
||||||
|
) {
|
||||||
|
return $this->getData(['profil', $this->user['group'], $this->user['profil'], $key1]);
|
||||||
|
} else {
|
||||||
|
// Une permission non spécifiée dans le profil est autorisée selon la valeur de $actions
|
||||||
|
if (class_exists($key1)) {
|
||||||
|
$module = new $key1;
|
||||||
|
if (array_key_exists($key2, $module::$actions)) {
|
||||||
|
return $this->getUser('group') >= $module::$actions[$key2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool l'utilisateur est connecté true sinon false
|
||||||
|
*/
|
||||||
|
public function isConnected() {
|
||||||
|
return (
|
||||||
|
!empty($this->getUser('authKey'))
|
||||||
|
&&
|
||||||
|
$this->getUser('authKey') === $this->getInput('ZWII_AUTH_KEY'));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check qu'une valeur est transmise par la méthode _POST
|
* Check qu'une valeur est transmise par la méthode _POST
|
||||||
* @return bool
|
* @return bool
|
||||||
@ -963,6 +1133,8 @@ class common
|
|||||||
|
|
||||||
public function updateSitemap()
|
public function updateSitemap()
|
||||||
{
|
{
|
||||||
|
// Le drapeau prend true quand au moins une page est trouvée
|
||||||
|
$flag = false;
|
||||||
|
|
||||||
// Rafraîchit la liste des pages après une modification de pageId notamment
|
// Rafraîchit la liste des pages après une modification de pageId notamment
|
||||||
$this->buildHierarchy();
|
$this->buildHierarchy();
|
||||||
@ -970,7 +1142,7 @@ class common
|
|||||||
// Actualise la liste des pages pour TinyMCE
|
// Actualise la liste des pages pour TinyMCE
|
||||||
$this->tinyMcePages();
|
$this->tinyMcePages();
|
||||||
|
|
||||||
//require_once "core/vendor/sitemap/SitemapGenerator.php";
|
//require_once 'core/vendor/sitemap/SitemapGenerator.php';
|
||||||
|
|
||||||
$timezone = $this->getData(['config', 'timezone']);
|
$timezone = $this->getData(['config', 'timezone']);
|
||||||
$outputDir = getcwd();
|
$outputDir = getcwd();
|
||||||
@ -993,7 +1165,7 @@ class common
|
|||||||
$datetime = new DateTime(date('c'));
|
$datetime = new DateTime(date('c'));
|
||||||
$datetime->format(DateTime::ATOM); // Updated ISO8601
|
$datetime->format(DateTime::ATOM); // Updated ISO8601
|
||||||
|
|
||||||
foreach ($this->getHierarchy(null, null, null) as $parentPageId => $childrenPageIds) {
|
foreach ($this->getHierarchy() as $parentPageId => $childrenPageIds) {
|
||||||
// Exclure les barres et les pages non publiques et les pages masquées
|
// Exclure les barres et les pages non publiques et les pages masquées
|
||||||
if (
|
if (
|
||||||
$this->getData(['page', $parentPageId, 'group']) !== 0 ||
|
$this->getData(['page', $parentPageId, 'group']) !== 0 ||
|
||||||
@ -1006,16 +1178,18 @@ class common
|
|||||||
// Cas de la page d'accueil ne pas dupliquer l'URL
|
// Cas de la page d'accueil ne pas dupliquer l'URL
|
||||||
$pageId = ($parentPageId !== $this->getData(['locale', 'homePageId'])) ? $parentPageId : '';
|
$pageId = ($parentPageId !== $this->getData(['locale', 'homePageId'])) ? $parentPageId : '';
|
||||||
$sitemap->addUrl('/' . $pageId, $datetime);
|
$sitemap->addUrl('/' . $pageId, $datetime);
|
||||||
|
$flag = true;
|
||||||
}
|
}
|
||||||
// Articles du blog
|
// Articles du blog
|
||||||
if (
|
if (
|
||||||
$this->getData(['page', $parentPageId, 'moduleId']) === 'blog' &&
|
$this->getData(['page', $parentPageId, 'moduleId']) === 'blog'
|
||||||
!empty($this->getData(['module', $parentPageId]))
|
&& !empty($this->getData(['module', $parentPageId]))
|
||||||
|
&& $this->getData(['module', $parentPageId, 'posts'])
|
||||||
) {
|
) {
|
||||||
foreach ($this->getData(['module', $parentPageId, 'posts']) as $articleId => $article) {
|
foreach ($this->getData(['module', $parentPageId, 'posts']) as $articleId => $article) {
|
||||||
if ($this->getData(['module', $parentPageId, 'posts', $articleId, 'state']) === true) {
|
if ($this->getData(['module', $parentPageId, 'posts', $articleId, 'state']) === true) {
|
||||||
$date = $this->getData(['module', $parentPageId, 'posts', $articleId, 'publishedOn']);
|
$date = $this->getData(['module', $parentPageId, 'posts', $articleId, 'publishedOn']);
|
||||||
$sitemap->addUrl('/' . $parentPageId . '/' . $articleId, new DateTime("@{$date}", new DateTimeZone($timezone)));
|
$sitemap->addUrl('/' . $parentPageId . '/' . $articleId, DateTime::createFromFormat('U', $date));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1027,6 +1201,7 @@ class common
|
|||||||
// Cas de la page d'accueil ne pas dupliquer l'URL
|
// Cas de la page d'accueil ne pas dupliquer l'URL
|
||||||
$pageId = ($childKey !== $this->getData(['locale', 'homePageId'])) ? $childKey : '';
|
$pageId = ($childKey !== $this->getData(['locale', 'homePageId'])) ? $childKey : '';
|
||||||
$sitemap->addUrl('/' . $childKey, $datetime);
|
$sitemap->addUrl('/' . $childKey, $datetime);
|
||||||
|
$flag = true;
|
||||||
|
|
||||||
// La sous-page est un blog
|
// La sous-page est un blog
|
||||||
if (
|
if (
|
||||||
@ -1043,6 +1218,10 @@ class common
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($flag === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Flush all stored urls from memory to the disk and close all necessary tags.
|
// Flush all stored urls from memory to the disk and close all necessary tags.
|
||||||
$sitemap->flush();
|
$sitemap->flush();
|
||||||
|
|
||||||
@ -1057,7 +1236,7 @@ class common
|
|||||||
}
|
}
|
||||||
$sitemap->updateRobots();
|
$sitemap->updateRobots();
|
||||||
} else {
|
} else {
|
||||||
file_put_contents('robots.txt', 'User-agent: *' . PHP_EOL . 'Disallow: /');
|
$this->secure_file_put_contents('robots.txt', 'User-agent: *' . PHP_EOL . 'Disallow: /');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Submit your sitemaps to Google, Yahoo, Bing and Ask.com
|
// Submit your sitemaps to Google, Yahoo, Bing and Ask.com
|
||||||
@ -1067,9 +1246,9 @@ class common
|
|||||||
|
|
||||||
return (file_exists('sitemap.xml') && file_exists('robots.txt'));
|
return (file_exists('sitemap.xml') && file_exists('robots.txt'));
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Création d'une miniature
|
* Création d'une miniature
|
||||||
* Fonction utilisée lors de la mise à jour d'une version 9 à une version 10
|
* Fonction utilisée lors de la mise à jour d'une version 9 à une version 10
|
||||||
@ -1100,9 +1279,11 @@ class common
|
|||||||
case 'webp':
|
case 'webp':
|
||||||
$source_image = imagecreatefromwebp($src);
|
$source_image = imagecreatefromwebp($src);
|
||||||
break;
|
break;
|
||||||
|
case 'avif':
|
||||||
|
$source_image = imagecreatefromavif($src);
|
||||||
}
|
}
|
||||||
// Image valide
|
// Image valide
|
||||||
if ($source_image) {
|
if (is_object($source_image)) {
|
||||||
$width = imagesx($source_image);
|
$width = imagesx($source_image);
|
||||||
$height = imagesy($source_image);
|
$height = imagesy($source_image);
|
||||||
/* find the "desired height" of this thumbnail, relative to the desired width */
|
/* find the "desired height" of this thumbnail, relative to the desired width */
|
||||||
@ -1119,8 +1300,10 @@ class common
|
|||||||
return (imagepng($virtual_image, $dest));
|
return (imagepng($virtual_image, $dest));
|
||||||
case 'image/gif':
|
case 'image/gif':
|
||||||
return (imagegif($virtual_image, $dest));
|
return (imagegif($virtual_image, $dest));
|
||||||
case 'webp':
|
case 'image/webp':
|
||||||
$source_image = imagecreatefromwebp($src);
|
return (imagewebp($virtual_image, $dest));
|
||||||
|
case 'image/avif':
|
||||||
|
return (imageavif($virtual_image, $dest));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return (false);
|
return (false);
|
||||||
@ -1133,9 +1316,8 @@ class common
|
|||||||
* @param string|array $to Destinataire
|
* @param string|array $to Destinataire
|
||||||
* @param string $subject Sujet
|
* @param string $subject Sujet
|
||||||
* @param string $content Contenu
|
* @param string $content Contenu
|
||||||
* @return bool
|
|
||||||
*/
|
*/
|
||||||
public function sendMail($to, $subject, $content, $replyTo = null, $from = '')
|
public function sendMail($to, $subject, $content, $replyTo = null, $from = 'no-reply@localhost')
|
||||||
{
|
{
|
||||||
// Layout
|
// Layout
|
||||||
ob_start();
|
ob_start();
|
||||||
@ -1214,13 +1396,13 @@ class common
|
|||||||
* Effacer un dossier non vide.
|
* Effacer un dossier non vide.
|
||||||
* @param string URL du dossier à supprimer
|
* @param string URL du dossier à supprimer
|
||||||
*/
|
*/
|
||||||
public function removeDir($path)
|
public function deleteDir($path)
|
||||||
{
|
{
|
||||||
foreach (new DirectoryIterator($path) as $item) {
|
foreach (new DirectoryIterator($path) as $item) {
|
||||||
if ($item->isFile())
|
if ($item->isFile())
|
||||||
@unlink($item->getRealPath());
|
@unlink($item->getRealPath());
|
||||||
if (!$item->isDot() && $item->isDir())
|
if (!$item->isDot() && $item->isDir())
|
||||||
$this->removeDir($item->getRealPath());
|
$this->deleteDir($item->getRealPath());
|
||||||
}
|
}
|
||||||
return (rmdir($path));
|
return (rmdir($path));
|
||||||
}
|
}
|
||||||
@ -1316,4 +1498,40 @@ class common
|
|||||||
}
|
}
|
||||||
$zip->close();
|
$zip->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Journalisation
|
||||||
|
*/
|
||||||
|
public function saveLog($message = '')
|
||||||
|
{
|
||||||
|
// Journalisation
|
||||||
|
$dataLog = helper::dateUTF8('%Y%m%d', time(), self::$i18nUI) . ';' . helper::dateUTF8('%H:%M', time(), self::$i18nUI). ';';
|
||||||
|
$dataLog .= helper::getIp($this->getData(['config', 'connect', 'anonymousIp'])) . ';';
|
||||||
|
$dataLog .= empty($this->getUser('id')) ? 'visitor;' : $this->getUser('id') . ';';
|
||||||
|
$dataLog .= $message ? $this->getUrl() . ';' . $message : $this->getUrl();
|
||||||
|
$dataLog .= PHP_EOL;
|
||||||
|
if ($this->getData(['config', 'connect', 'log'])) {
|
||||||
|
$this->secure_file_put_contents(self::DATA_DIR . 'journal.log', $dataLog, FILE_APPEND);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retourne la signature d'un utilisateur
|
||||||
|
*/
|
||||||
|
public function signature($userId)
|
||||||
|
{
|
||||||
|
switch ($this->getData(['user', $userId, 'signature'])) {
|
||||||
|
case 1:
|
||||||
|
return $userId;
|
||||||
|
case 2:
|
||||||
|
return $this->getData(['user', $userId, 'pseudo']);
|
||||||
|
case 3:
|
||||||
|
return $this->getData(['user', $userId, 'firstname']) . ' ' . $this->getData(['user', $userId, 'lastname']);
|
||||||
|
case 4:
|
||||||
|
return $this->getData(['user', $userId, 'lastname']) . ' ' . $this->getData(['user', $userId, 'firstname']);
|
||||||
|
default:
|
||||||
|
return $this->getData(['user', $userId, 'firstname']);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -9,8 +9,8 @@ if(version_compare(PHP_VERSION, '7.2.0', '<') ) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( version_compare(PHP_VERSION, '8.2.999', '>') ) {
|
if ( version_compare(PHP_VERSION, '8.3.999', '>') ) {
|
||||||
exit('PHP 8.2 pas encore supporté, installez PHP 7.n ou PHP 8.1.n - PHP 8.2 not yet supported, install PHP 7.n or PHP 8.1.n');
|
exit('PHP 8.3 pas encore supporté, installez PHP 7.n ou PHP 8.1.n - PHP 8.3 not yet supported, install PHP 7.n or PHP 8.1.n');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -34,11 +34,11 @@ $b = false;
|
|||||||
foreach ($e as $k => $v) {
|
foreach ($e as $k => $v) {
|
||||||
if (array_search($v,$m) === false) {
|
if (array_search($v,$m) === false) {
|
||||||
$b = true;
|
$b = true;
|
||||||
echo '<pre><p>Module ' . $v . ' manquant - Module ' . $v . ' missing.</p></pre>';
|
echo '<pre><p>Module PHP : ' . $v . ' manquant - Module PHP ' . $v . ' missing.</p></pre>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($b)
|
if ($b)
|
||||||
exit('<pre><p>ZwiiCMS ne peut pas démarrer ; activez les extensions requises - ZwiiCMS cannot start, enabled missing extensions.</p></pre>');
|
exit('<pre><p>ZwiiCMS ne peut pas démarrer ; activez les extensions requises dans PHP.ini- ZwiiCMS cannot start, enabled PHP missing extensions into PHP.ini</p></pre>');
|
||||||
/**
|
/**
|
||||||
* Contrôle les htacess
|
* Contrôle les htacess
|
||||||
*/
|
*/
|
||||||
@ -48,9 +48,9 @@ $d = [
|
|||||||
'site/data/',
|
'site/data/',
|
||||||
'site/backup/',
|
'site/backup/',
|
||||||
'site/tmp/',
|
'site/tmp/',
|
||||||
'site/i18n/'
|
// 'site/i18n/', pas contrôler pour éviter les pbs de mise à jour
|
||||||
];
|
];
|
||||||
foreach ($d as $key) {
|
foreach ($d as $key) {
|
||||||
if (file_exists($key . '.htaccess') === false)
|
if (file_exists($key . '.htaccess') === false)
|
||||||
exit('<pre>ZwiiCMS ne peut pas démarrer, le fichier ' .$key . '.htaccess est manquant.<br />ZwiiCMS cannot start, file ' . $key . '.htaccess is missing manquant.</pre>' );
|
exit('<pre>ZwiiCMS ne peut pas démarrer, le fichier ' .$key . '.htaccess est manquant.<br />ZwiiCMS cannot start, file ' . $key . '.htaccess is missing.</pre>' );
|
||||||
}
|
}
|
||||||
|
@ -5,10 +5,12 @@
|
|||||||
* */
|
* */
|
||||||
|
|
||||||
if (file_exists('site/data/core.json')) {
|
if (file_exists('site/data/core.json')) {
|
||||||
$version = json_decode(file_get_contents('site/data/core.json'), true);
|
$core = json_decode(file_get_contents('site/data/core.json'), true);
|
||||||
|
$version = $core['core']['dataVersion'];
|
||||||
// Avant version 12.0.00
|
// Avant version 12.0.00
|
||||||
if ($version['core']['dataVersion'] < 12000) {
|
if (
|
||||||
|
$version < 12000
|
||||||
|
) {
|
||||||
// Correspondance pour les dossiers de langue à convertir
|
// Correspondance pour les dossiers de langue à convertir
|
||||||
$languages = [
|
$languages = [
|
||||||
'fr' => 'fr_FR',
|
'fr' => 'fr_FR',
|
||||||
@ -24,7 +26,27 @@ if (file_exists('site/data/core.json')) {
|
|||||||
$end = rename('site/data/' . $key, 'site/data/' . $value);
|
$end = rename('site/data/' . $key, 'site/data/' . $value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sleep(1);
|
sleep(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Renomme les bases de données
|
||||||
|
if (
|
||||||
|
$version < 12400
|
||||||
|
) {
|
||||||
|
// Renommage les fichiers de données au pluriel
|
||||||
|
$t = [
|
||||||
|
'site/data/languages.json' => 'site/data/language.json',
|
||||||
|
'site/data/fonts.json' => 'site/data/font.json'
|
||||||
|
];
|
||||||
|
foreach ($t as $k => $v) {
|
||||||
|
if (file_exists($k)) {
|
||||||
|
$d = file_get_contents($k);
|
||||||
|
$d = str_replace('"' . basename($k, '.json') . '"' , '"' . basename($v, '.json') . '"', $d);
|
||||||
|
file_put_contents($v, $d);
|
||||||
|
unlink($k);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
@ -3,7 +3,11 @@
|
|||||||
/**
|
/**
|
||||||
* Mises à jour suivant les versions de Zwii
|
* Mises à jour suivant les versions de Zwii
|
||||||
*/
|
*/
|
||||||
if ($this->getData(['core', 'dataVersion']) < 9227) {
|
|
||||||
|
// Pas d'installation depuis une version inférieur
|
||||||
|
if (
|
||||||
|
$this->getData(['core', 'dataVersion']) < 9227
|
||||||
|
) {
|
||||||
// Arrêt du script
|
// Arrêt du script
|
||||||
exit('ZwiiCMS version 12 est incompatible avec la base de données installée. L\'installation d\'une version intermédiaire 10 ou 11 est nécessaire.');
|
exit('ZwiiCMS version 12 est incompatible avec la base de données installée. L\'installation d\'une version intermédiaire 10 ou 11 est nécessaire.');
|
||||||
}
|
}
|
||||||
@ -14,15 +18,15 @@ if ($this->getData(['core', 'dataVersion']) < 10000) {
|
|||||||
|
|
||||||
//----------------------------------------
|
//----------------------------------------
|
||||||
// Mettre à jour les données des galeries
|
// Mettre à jour les données des galeries
|
||||||
$pageList = array();
|
$hierarchy = array();
|
||||||
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
|
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||||
$pageList[] = $parentKey;
|
$hierarchy[] = $parentKey;
|
||||||
foreach ($parentValue as $childKey) {
|
foreach ($parentValue as $childKey) {
|
||||||
$pageList[] = $childKey;
|
$hierarchy[] = $childKey;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Mise à jour des données pour la galerie v2
|
// Mise à jour des données pour la galerie v2
|
||||||
foreach ($pageList as $parentKey => $parent) {
|
foreach ($hierarchy as $parentKey => $parent) {
|
||||||
//La page a une galerie
|
//La page a une galerie
|
||||||
if ($this->getData(['page', $parent, 'moduleId']) === 'gallery') {
|
if ($this->getData(['page', $parent, 'moduleId']) === 'gallery') {
|
||||||
// Parcourir les dossiers de la galerie
|
// Parcourir les dossiers de la galerie
|
||||||
@ -131,7 +135,7 @@ if ($this->getData(['core', 'dataVersion']) < 10200) {
|
|||||||
}
|
}
|
||||||
// Créer les en-têtes du journal
|
// Créer les en-têtes du journal
|
||||||
$d = 'Date;Heure;IP;Id;Action' . PHP_EOL;
|
$d = 'Date;Heure;IP;Id;Action' . PHP_EOL;
|
||||||
file_put_contents(self::DATA_DIR . 'journal.log', $d);
|
$this->secure_file_put_contents(self::DATA_DIR . 'journal.log', $d);
|
||||||
// Init préservation htaccess
|
// Init préservation htaccess
|
||||||
$this->setData(['config', 'autoUpdateHtaccess', false]);
|
$this->setData(['config', 'autoUpdateHtaccess', false]);
|
||||||
// Options de barre de membre simple
|
// Options de barre de membre simple
|
||||||
@ -175,15 +179,15 @@ if ($this->getData(['core', 'dataVersion']) < 10300) {
|
|||||||
$this->setData(['config', 'searchPageId', '']);
|
$this->setData(['config', 'searchPageId', '']);
|
||||||
|
|
||||||
// Mettre à jour les données des galeries
|
// Mettre à jour les données des galeries
|
||||||
$pageList = array(); foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
|
$hierarchy = array(); foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||||
$pageList[] = $parentKey;
|
$hierarchy[] = $parentKey;
|
||||||
foreach ($parentValue as $childKey) {
|
foreach ($parentValue as $childKey) {
|
||||||
$pageList[] = $childKey;
|
$hierarchy[] = $childKey;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Mise à jour des données de thème de la galerie
|
// Mise à jour des données de thème de la galerie
|
||||||
// Les données de thème sont communes au site
|
// Les données de thème sont communes au site
|
||||||
foreach ($pageList as $parentKey => $parent) {
|
foreach ($hierarchy as $parentKey => $parent) {
|
||||||
//La page a une galerie
|
//La page a une galerie
|
||||||
if ($this->getData(['page', $parent, 'moduleId']) === 'gallery') {
|
if ($this->getData(['page', $parent, 'moduleId']) === 'gallery') {
|
||||||
foreach ($this->getData(['module', $parent]) as $galleryKey => $galleryItem) {
|
foreach ($this->getData(['module', $parent]) as $galleryKey => $galleryItem) {
|
||||||
@ -235,15 +239,15 @@ if ($this->getData(['core', 'dataVersion']) < 10304) {
|
|||||||
// Version 10.3.06
|
// Version 10.3.06
|
||||||
if ($this->getData(['core', 'dataVersion']) < 10306) {
|
if ($this->getData(['core', 'dataVersion']) < 10306) {
|
||||||
// Liste des pages
|
// Liste des pages
|
||||||
$pageList = array();
|
$hierarchy = array();
|
||||||
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
|
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||||
$pageList[] = $parentKey;
|
$hierarchy[] = $parentKey;
|
||||||
foreach ($parentValue as $childKey) {
|
foreach ($parentValue as $childKey) {
|
||||||
$pageList[] = $childKey;
|
$hierarchy[] = $childKey;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Mettre à jour les données des blogs les articles sont dans posts
|
// Mettre à jour les données des blogs les articles sont dans posts
|
||||||
foreach ($pageList as $parentKey => $parent) {
|
foreach ($hierarchy as $parentKey => $parent) {
|
||||||
//La page a un blog
|
//La page a un blog
|
||||||
if ($this->getData(['page', $parent, 'moduleId']) === 'blog') {
|
if ($this->getData(['page', $parent, 'moduleId']) === 'blog') {
|
||||||
if (is_array($this->getData(['module', $parent]))) {
|
if (is_array($this->getData(['module', $parent]))) {
|
||||||
@ -258,7 +262,7 @@ if ($this->getData(['core', 'dataVersion']) < 10306) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach ($pageList as $parentKey => $parent) {
|
foreach ($hierarchy as $parentKey => $parent) {
|
||||||
//La page a une news
|
//La page a une news
|
||||||
if ($this->getData(['page', $parent, 'moduleId']) === 'news') {
|
if ($this->getData(['page', $parent, 'moduleId']) === 'news') {
|
||||||
if (is_array($this->getData(['module', $parent]))) {
|
if (is_array($this->getData(['module', $parent]))) {
|
||||||
@ -293,16 +297,16 @@ if ($this->getData(['core', 'dataVersion']) < 10400) {
|
|||||||
|
|
||||||
// Ajouter les champs de blog v3
|
// Ajouter les champs de blog v3
|
||||||
// Liste des pages dans pageList
|
// Liste des pages dans pageList
|
||||||
$pageList = array();
|
$hierarchy = array();
|
||||||
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
|
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||||
$pageList[] = $parentKey;
|
$hierarchy[] = $parentKey;
|
||||||
foreach ($parentValue as $childKey) {
|
foreach ($parentValue as $childKey) {
|
||||||
$pageList[] = $childKey;
|
$hierarchy[] = $childKey;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Parcourir pageList et rechercher les modules de blog
|
// Parcourir pageList et rechercher les modules de blog
|
||||||
|
|
||||||
foreach ($pageList as $parentKey => $parent) {
|
foreach ($hierarchy as $parentKey => $parent) {
|
||||||
//La page est un blog
|
//La page est un blog
|
||||||
if ($this->getData(['page', $parent, 'moduleId']) === 'blog') {
|
if ($this->getData(['page', $parent, 'moduleId']) === 'blog') {
|
||||||
$articleIds = array_keys(helper::arrayColumn($this->getData(['module', $parent, 'posts']), 'publishedOn', 'SORT_DESC'));
|
$articleIds = array_keys(helper::arrayColumn($this->getData(['module', $parent, 'posts']), 'publishedOn', 'SORT_DESC'));
|
||||||
@ -384,15 +388,15 @@ if ($this->getData(['core', 'dataVersion']) < 10600) {
|
|||||||
// Mise à jour des données des modules autonomes
|
// Mise à jour des données des modules autonomes
|
||||||
|
|
||||||
// Liste des pages dans pageList
|
// Liste des pages dans pageList
|
||||||
$pageList = array();
|
$hierarchy = array();
|
||||||
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
|
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||||
$pageList[] = $parentKey;
|
$hierarchy[] = $parentKey;
|
||||||
foreach ($parentValue as $childKey) {
|
foreach ($parentValue as $childKey) {
|
||||||
$pageList[] = $childKey;
|
$hierarchy[] = $childKey;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Parcourir pageList et rechercher les modules au CSS autonomes
|
// Parcourir pageList et rechercher les modules au CSS autonomes
|
||||||
foreach ($pageList as $parentKey => $parent) {
|
foreach ($hierarchy as $parentKey => $parent) {
|
||||||
if (
|
if (
|
||||||
$this->getData(['page', $parent, 'moduleId']) === 'search'
|
$this->getData(['page', $parent, 'moduleId']) === 'search'
|
||||||
|| $this->getData(['page', $parent, 'moduleId']) === 'gallery'
|
|| $this->getData(['page', $parent, 'moduleId']) === 'gallery'
|
||||||
@ -442,20 +446,20 @@ if ($this->getData(['core', 'dataVersion']) < 11000) {
|
|||||||
|
|
||||||
// Externaliser les contenus des pages
|
// Externaliser les contenus des pages
|
||||||
// Liste des pages dans pageList
|
// Liste des pages dans pageList
|
||||||
$pageList = array();
|
$hierarchy = array();
|
||||||
// Creation du contenu de la page
|
// Creation du contenu de la page
|
||||||
if (!is_dir(self::DATA_DIR . self::$i18nContent . '/content')) {
|
if (!is_dir(self::DATA_DIR . self::$siteContent . '/content')) {
|
||||||
mkdir(self::DATA_DIR . self::$i18nContent . '/content', 0755);
|
mkdir(self::DATA_DIR . self::$siteContent . '/content', 0755);
|
||||||
}
|
}
|
||||||
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
|
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||||
$pageList[] = $parentKey;
|
$hierarchy[] = $parentKey;
|
||||||
foreach ($parentValue as $childKey) {
|
foreach ($parentValue as $childKey) {
|
||||||
$pageList[] = $childKey;
|
$hierarchy[] = $childKey;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach ($pageList as $parentKey => $parent) {
|
foreach ($hierarchy as $parentKey => $parent) {
|
||||||
$content = $this->getData(['page', $parent, 'content']);
|
$content = $this->getData(['page', $parent, 'content']);
|
||||||
//file_put_contents(self::DATA_DIR . self::$i18nContent . '/content/' . $parent . '.html', $content);
|
//$this->secure_file_put_contents(self::DATA_DIR . self::$siteContent . '/content/' . $parent . '.html', $content);
|
||||||
$this->setPage($parent, $content, 'fr');
|
$this->setPage($parent, $content, 'fr');
|
||||||
$this->setData(['page', $parent, 'content', $parent . '.html']);
|
$this->setData(['page', $parent, 'content', $parent . '.html']);
|
||||||
}
|
}
|
||||||
@ -505,13 +509,13 @@ if ($this->getData(['core', 'dataVersion']) < 11200) {
|
|||||||
$this->setData(['config', 'connect', 'captchaType', 'alpha']);
|
$this->setData(['config', 'connect', 'captchaType', 'alpha']);
|
||||||
|
|
||||||
// Ajout de la variable shortTitle basée sur Title
|
// Ajout de la variable shortTitle basée sur Title
|
||||||
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
|
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||||
$pageList[] = $parentKey;
|
$hierarchy[] = $parentKey;
|
||||||
foreach ($parentValue as $childKey) {
|
foreach ($parentValue as $childKey) {
|
||||||
$pageList[] = $childKey;
|
$hierarchy[] = $childKey;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach ($pageList as $parentKey => $parent) {
|
foreach ($hierarchy as $parentKey => $parent) {
|
||||||
$this->setData(['page', $parent, 'shortTitle', $this->getData(['page', $parent, 'title'])]);
|
$this->setData(['page', $parent, 'shortTitle', $this->getData(['page', $parent, 'title'])]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -569,8 +573,8 @@ if ($this->getData(['core', 'dataVersion']) < 11203) {
|
|||||||
$c3 = 0;
|
$c3 = 0;
|
||||||
$success = false;
|
$success = false;
|
||||||
// Boucler sur les pages
|
// Boucler sur les pages
|
||||||
foreach ($this->getHierarchy(null, null, null) as $parentId => $childIds) {
|
foreach ($this->getHierarchy() as $parentId => $childIds) {
|
||||||
$content = $this->getPage($parentId, self::$i18nContent);
|
$content = $this->getPage($parentId, self::$siteContent);
|
||||||
$titre = $this->getData(['page', $parentId, 'title']);
|
$titre = $this->getData(['page', $parentId, 'title']);
|
||||||
$content = $titre . ' ' . $content;
|
$content = $titre . ' ' . $content;
|
||||||
$replace = str_replace('href="' . $old, 'href="' . $new, stripslashes($content), $c1);
|
$replace = str_replace('href="' . $old, 'href="' . $new, stripslashes($content), $c1);
|
||||||
@ -578,17 +582,17 @@ if ($this->getData(['core', 'dataVersion']) < 11203) {
|
|||||||
|
|
||||||
if ($c1 > 0 || $c2 > 0) {
|
if ($c1 > 0 || $c2 > 0) {
|
||||||
$success = true;
|
$success = true;
|
||||||
$this->setPage($parentId, $replace, self::$i18nContent);
|
$this->setPage($parentId, $replace, self::$siteContent);
|
||||||
$c3 += $c1 + $c2;
|
$c3 += $c1 + $c2;
|
||||||
}
|
}
|
||||||
foreach ($childIds as $childId) {
|
foreach ($childIds as $childId) {
|
||||||
$content = $this->getPage($childId, self::$i18nContent);
|
$content = $this->getPage($childId, self::$siteContent);
|
||||||
$content = $titre . ' ' . $content;
|
$content = $titre . ' ' . $content;
|
||||||
$replace = str_replace('href="' . $old, 'href="' . $new, stripslashes($content), $c1);
|
$replace = str_replace('href="' . $old, 'href="' . $new, stripslashes($content), $c1);
|
||||||
$replace = str_replace('src="' . $old, 'src="' . $new, stripslashes($replace), $c2);
|
$replace = str_replace('src="' . $old, 'src="' . $new, stripslashes($replace), $c2);
|
||||||
if ($c1 > 0 || $c2 > 0) {
|
if ($c1 > 0 || $c2 > 0) {
|
||||||
$success = true;
|
$success = true;
|
||||||
$this->setPage($childId, $replace, self::$i18nContent);
|
$this->setPage($childId, $replace, self::$siteContent);
|
||||||
$c3 += $c1 + $c2;
|
$c3 += $c1 + $c2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -665,13 +669,13 @@ if ($this->getData(['core', 'dataVersion']) < 11300) {
|
|||||||
if ($this->getData(['core', 'dataVersion']) < 11303) {
|
if ($this->getData(['core', 'dataVersion']) < 11303) {
|
||||||
|
|
||||||
// Ajout de la variable shortTitle basée sur Title
|
// Ajout de la variable shortTitle basée sur Title
|
||||||
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
|
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||||
$pageList[] = $parentKey;
|
$hierarchy[] = $parentKey;
|
||||||
foreach ($parentValue as $childKey) {
|
foreach ($parentValue as $childKey) {
|
||||||
$pageList[] = $childKey;
|
$hierarchy[] = $childKey;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach ($pageList as $parentKey => $parent) {
|
foreach ($hierarchy as $parentKey => $parent) {
|
||||||
$this->setData(['page', $parent, 'extraPosition', false]);
|
$this->setData(['page', $parent, 'extraPosition', false]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -684,10 +688,10 @@ if ($this->getData(['core', 'dataVersion']) < 11303) {
|
|||||||
if ($this->getData(['core', 'dataVersion']) < 11306) {
|
if ($this->getData(['core', 'dataVersion']) < 11306) {
|
||||||
|
|
||||||
// Supprime les fontes déclarées en double par la version précédentes
|
// Supprime les fontes déclarées en double par la version précédentes
|
||||||
$files = $this->getData(['fonts', 'files']);
|
$files = $this->getData(['font', 'files']);
|
||||||
foreach ($files as $fontId => $fontFile) {
|
foreach ($files as $fontId => $fontFile) {
|
||||||
if (!is_null($this->getData(['fonts', 'imported', $fontId]))) {
|
if (!is_null($this->getData(['font', 'imported', $fontId]))) {
|
||||||
$this->deleteData(['fonts', 'imported', $fontId]);
|
$this->deleteData(['font', 'imported', $fontId]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Mise à jour
|
// Mise à jour
|
||||||
@ -699,7 +703,7 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
|
|||||||
|
|
||||||
// Effacer le dossier
|
// Effacer le dossier
|
||||||
if (is_dir('core/module/addon')) {
|
if (is_dir('core/module/addon')) {
|
||||||
$this->removeDir('core/module/addon');
|
$this->deleteDir('core/module/addon');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -797,7 +801,9 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
|
|||||||
];
|
];
|
||||||
|
|
||||||
// Conversion des fontes locales
|
// Conversion des fontes locales
|
||||||
$files = $this->getData(['fonts', 'files']);
|
|
||||||
|
$files = $this->getData(['font', 'files']);
|
||||||
|
|
||||||
if (is_array($files)) {
|
if (is_array($files)) {
|
||||||
foreach ($files as $fontId => $fontName) {
|
foreach ($files as $fontId => $fontName) {
|
||||||
if (
|
if (
|
||||||
@ -805,7 +811,7 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
|
|||||||
&& file_exists(self::DATA_DIR . 'fonts/' . $fontName)
|
&& file_exists(self::DATA_DIR . 'fonts/' . $fontName)
|
||||||
) {
|
) {
|
||||||
$this->setData([
|
$this->setData([
|
||||||
'fonts',
|
'font',
|
||||||
'files',
|
'files',
|
||||||
$fontId,
|
$fontId,
|
||||||
[
|
[
|
||||||
@ -819,12 +825,12 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Consersion des fontes importées
|
// Consersion des fontes importées
|
||||||
$imported = $this->getData(['fonts', 'imported']);
|
$imported = $this->getData(['font', 'imported']);
|
||||||
if (is_array($imported)) {
|
if (is_array($imported)) {
|
||||||
foreach ($imported as $fontId => $fontUrl) {
|
foreach ($imported as $fontId => $fontUrl) {
|
||||||
if (gettype($fontUrl) === 'string') {
|
if (gettype($fontUrl) === 'string') {
|
||||||
$this->setData([
|
$this->setData([
|
||||||
'fonts',
|
'font',
|
||||||
'imported',
|
'imported',
|
||||||
$fontId,
|
$fontId,
|
||||||
[
|
[
|
||||||
@ -839,7 +845,7 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
|
|||||||
// Importation des fontes exemples
|
// Importation des fontes exemples
|
||||||
$template = $fonts;
|
$template = $fonts;
|
||||||
foreach ($template as $fontId => $fontValue) {
|
foreach ($template as $fontId => $fontValue) {
|
||||||
$this->setData(['fonts', 'imported', $fontId, $fontValue]);
|
$this->setData(['font', 'imported', $fontId, $fontValue]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Redirection des pages d'administration vers la bannière de connexion
|
// Redirection des pages d'administration vers la bannière de connexion
|
||||||
@ -897,10 +903,10 @@ if ($this->getData(['core', 'dataVersion']) < 12000) {
|
|||||||
|
|
||||||
// Supprimer les fichier associés
|
// Supprimer les fichier associés
|
||||||
if (is_dir('core/module/translate/ressource')) {
|
if (is_dir('core/module/translate/ressource')) {
|
||||||
$this->removeDir('core/module/translate/ressource');
|
$this->deleteDir('core/module/translate/ressource');
|
||||||
}
|
}
|
||||||
if (is_dir('core/vendor/i18n/css')) {
|
if (is_dir('core/vendor/i18n/css')) {
|
||||||
$this->removeDir('core/vendor/i18n/css');
|
$this->deleteDir('core/vendor/i18n/css');
|
||||||
}
|
}
|
||||||
if (file_exists('core/vendor/i18n/inc.json')) {
|
if (file_exists('core/vendor/i18n/inc.json')) {
|
||||||
unlink('core/vendor/i18n/inc.json');
|
unlink('core/vendor/i18n/inc.json');
|
||||||
@ -935,7 +941,7 @@ if ($this->getData(['core', 'dataVersion']) < 12301) {
|
|||||||
|
|
||||||
// Nettoyage de flatPickr
|
// Nettoyage de flatPickr
|
||||||
if (is_dir('core/vendor/flatpickr')) {
|
if (is_dir('core/vendor/flatpickr')) {
|
||||||
$this->removeDir('core/vendor/flatpickr');
|
$this->deleteDir('core/vendor/flatpickr');
|
||||||
}
|
}
|
||||||
|
|
||||||
// email reply
|
// email reply
|
||||||
@ -976,10 +982,137 @@ if ($this->getData(['core', 'dataVersion']) < 12309) {
|
|||||||
$d = json_decode(file_get_contents(self::DATA_DIR . $key . '/locale.json'), true);
|
$d = json_decode(file_get_contents(self::DATA_DIR . $key . '/locale.json'), true);
|
||||||
$d = array_merge($d['locale'], ['poweredPageLabel' => 'Motorisé par']);
|
$d = array_merge($d['locale'], ['poweredPageLabel' => 'Motorisé par']);
|
||||||
$t['locale'] = $d;
|
$t['locale'] = $d;
|
||||||
file_put_contents(self::DATA_DIR . $key . '/locale.json', json_encode($t));
|
$this->secure_file_put_contents(self::DATA_DIR . $key . '/locale.json', $t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mise à jour
|
// Mise à jour
|
||||||
$this->setData(['core', 'dataVersion', 12309]);
|
$this->setData(['core', 'dataVersion', 12309]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Version 13.0.00
|
||||||
|
if ($this->getData(['core', 'dataVersion']) < 13000) {
|
||||||
|
|
||||||
|
// Nettoyage du dossier de langue d'installation'
|
||||||
|
if (file_exists('core/vendor/tinymce/langs/langs.zip'))
|
||||||
|
unlink('core/vendor/tinymce/langs/langs.zip');
|
||||||
|
if (file_exists('core/module/install/ressource/i18n/de.json'))
|
||||||
|
unlink('core/module/install/ressource/i18n/de.json');
|
||||||
|
if (file_exists('core/module/install/ressource/i18n/it.json'))
|
||||||
|
unlink('core/module/install/ressource/i18n/it.json');
|
||||||
|
if (file_exists('core/module/install/ressource/i18n/pt_PT.json'))
|
||||||
|
unlink('core/module/install/ressource/i18n/pt_PT.json');
|
||||||
|
if (file_exists('core/module/install/ressource/i18n/gr_GR.json'))
|
||||||
|
unlink('core/module/install/ressource/i18n/gr_GR.json');
|
||||||
|
|
||||||
|
// Création du dossier partage pour les nouveaux droits
|
||||||
|
if (!is_dir(self::FILE_DIR . 'source/partage')) {
|
||||||
|
mkdir(self::FILE_DIR . 'source/partage');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Efface le dossier translate
|
||||||
|
if (is_dir('core/module/translate')) {
|
||||||
|
$this->deleteDir('core/module/translate');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Renomme le fichier et le dossier des fontes
|
||||||
|
if (file_exists(self::DATA_DIR . 'fonts/fonts.html')) {
|
||||||
|
rename(self::DATA_DIR . 'fonts/fonts.html', self::DATA_DIR . 'fonts/font.html');
|
||||||
|
}
|
||||||
|
if (is_dir(self::DATA_DIR . 'fonts')) {
|
||||||
|
rename(self::DATA_DIR . 'fonts', self::DATA_DIR . 'font');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Ajouter le prénom comme pseudo et le pseudo comme signature
|
||||||
|
foreach ($this->getData(['user']) as $userId => $userIds) {
|
||||||
|
switch ($this->getData(['user', $userId, 'group'])) {
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
$this->setData(['user', $userId, 'profil', 1]);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->setData(['user', $userId, 'profil', 0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Récupérer la liste de toutes les pages dans toutes langues
|
||||||
|
$hierarchy = array();
|
||||||
|
$languages = array();
|
||||||
|
// Tableau des langues non installées
|
||||||
|
foreach (self::$languages as $key => $value) {
|
||||||
|
if (is_dir(self::DATA_DIR . $key))
|
||||||
|
$languages[] = $key;
|
||||||
|
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||||
|
$hierarchy[] = $parentKey;
|
||||||
|
foreach ($parentValue as $childKey) {
|
||||||
|
$hierarchy[] = $childKey;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mise à jour des pages, le profil est mis à 0 pour les groupes sans profil et 1 pour es groupes avec profil
|
||||||
|
$currentlanguage = self::$siteContent;
|
||||||
|
foreach ($languages as $langId) {
|
||||||
|
|
||||||
|
foreach ($hierarchy as $parentKey => $parent) {
|
||||||
|
switch ($this->getData(['page', $parent, 'group'])) {
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
$this->setData(['page', $parent, 'profil', 1]);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->setData(['page', $parent, 'profil', 0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$_SESSION['ZWII_SITE_CONTENT'] = $currentlanguage;
|
||||||
|
|
||||||
|
// Supprime la clé OpenOgraph
|
||||||
|
$this->deleteData(['config', 'seo', 'keyApi']);
|
||||||
|
|
||||||
|
// Mise à jour
|
||||||
|
$this->setData(['core', 'dataVersion', 13000]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Version 13.0.05
|
||||||
|
if ($this->getData(['core', 'dataVersion']) < 13005) {
|
||||||
|
|
||||||
|
if (is_dir('core/module/plugin/view/dataImport')) {
|
||||||
|
$this->deleteDir('core/module/plugin/view/dataImport');
|
||||||
|
}
|
||||||
|
if (file_exists('core/module/plugin/view/index/index.js.php')) {
|
||||||
|
unlink('core/module/plugin/view/index/index.js.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Installe l'adresse d'envoi si non spécifiée
|
||||||
|
if (empty($this->getData(['config', 'smtp', 'from']))) {
|
||||||
|
$this->setData(['config', 'smtp', 'from', 'no-reply@localhost']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fixe la taille de l'administration identique à la taille de site
|
||||||
|
$size = $this->getData(['theme', 'site', 'width']);
|
||||||
|
$this->setData(['admin', 'width', $size]);
|
||||||
|
|
||||||
|
// Ancienne déclaration oubliée !!
|
||||||
|
if ($this->getData(['admin', 'backgroundColorButtonHelp']) === null) {
|
||||||
|
$this->setData(['admin', 'backgroundColorButtonHelp', 'rgba(255, 153, 0, 1)']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mise à jour
|
||||||
|
$this->setData(['core', 'dataVersion', 13005]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Version 13.1.01
|
||||||
|
if ($this->getData(['core', 'dataVersion']) < 13101) {
|
||||||
|
|
||||||
|
// Supprime le choix du thème à l'installation
|
||||||
|
if (is_dir('core/module/install/ressource/themes')) {
|
||||||
|
$this->deleteDir('core/module/install/ressource/themes') ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mise à jour
|
||||||
|
$this->setData(['core', 'dataVersion', 13101]);
|
||||||
|
}
|
@ -6,7 +6,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html prefix="og: http://ogp.me/ns#" lang="<?php echo substr(self::$i18nContent, 0, 2); ?>">
|
<html prefix="og: http://ogp.me/ns#" lang="<?php echo substr(self::$siteContent, 0, 2); ?>">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
<meta http-equiv="content-type" content="text/html;">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<?php $layout->showMetaTitle(); ?>
|
<?php $layout->showMetaTitle(); ?>
|
||||||
<?php $layout->showMetaDescription(); ?>
|
<?php $layout->showMetaDescription(); ?>
|
||||||
@ -12,6 +12,9 @@
|
|||||||
<?php $layout->showVendor(); ?>
|
<?php $layout->showVendor(); ?>
|
||||||
<?php $layout->showStyle(); ?>
|
<?php $layout->showStyle(); ?>
|
||||||
<?php $layout->showFonts(); ?>
|
<?php $layout->showFonts(); ?>
|
||||||
|
<?php if (file_exists(self::DATA_DIR . 'font/font.css')): ?>
|
||||||
|
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>font/font.css?<?php echo md5_file(self::DATA_DIR . 'font/font.css'); ?>">
|
||||||
|
<?php endif; ?>
|
||||||
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css">
|
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css">
|
||||||
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/blank.css">
|
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/blank.css">
|
||||||
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR.'theme.css'); ?>">
|
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR.'theme.css'); ?>">
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
@ -1003,9 +1003,10 @@ footer #footerSocials .zwiico-twitch:hover {
|
|||||||
max-width: 500px;
|
max-width: 500px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
margin: 16px auto;
|
margin: 16px auto;
|
||||||
text-align: left;
|
text-align: center;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
transition: background-color .3s ease-out;
|
transition: background-color .3s ease-out;
|
||||||
|
z-index: 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
.speechBubble:before {
|
.speechBubble:before {
|
||||||
@ -1818,4 +1819,7 @@ th.col12 {
|
|||||||
.bannerDisplay {
|
.bannerDisplay {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
header {
|
||||||
|
background-size: cover !important;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
@ -18,6 +18,14 @@
|
|||||||
/* Site */
|
/* Site */
|
||||||
#site {
|
#site {
|
||||||
max-width: 600px !important;
|
max-width: 600px !important;
|
||||||
|
border-radius: 5px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#site > section:not(.message),
|
||||||
|
input[type='password'], input[type='text']
|
||||||
|
{
|
||||||
|
background-color: rgba(255, 255, 255, 1) !important;
|
||||||
|
color: rgba(33, 34, 35, 1) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
section {
|
section {
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html prefix="og: http://ogp.me/ns#" lang="<?php echo substr(self::$i18nContent, 0, 2); ?>">
|
<html prefix="og: http://ogp.me/ns#" lang="<?php echo substr(self::$siteContent, 0, 2); ?>">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
<meta http-equiv="content-type" content="text/html;">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<?php $layout->showMetaTitle(); ?>
|
<?php $layout->showMetaTitle(); ?>
|
||||||
<?php $layout->showMetaDescription(); ?>
|
<?php $layout->showMetaDescription(); ?>
|
||||||
@ -12,6 +12,9 @@
|
|||||||
<?php $layout->showVendor(); ?>
|
<?php $layout->showVendor(); ?>
|
||||||
<?php $layout->showStyle(); ?>
|
<?php $layout->showStyle(); ?>
|
||||||
<?php $layout->showFonts(); ?>
|
<?php $layout->showFonts(); ?>
|
||||||
|
<?php if (file_exists(self::DATA_DIR . 'font/font.css')): ?>
|
||||||
|
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>font/font.css?<?php echo md5_file(self::DATA_DIR . 'font/font.css'); ?>">
|
||||||
|
<?php endif; ?>
|
||||||
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css">
|
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css">
|
||||||
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/light.css">
|
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/light.css">
|
||||||
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR.'theme.css'); ?>">
|
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR.'theme.css'); ?>">
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="<?php echo substr(self::$i18nContent, 0, 2);?>">
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="<?php echo substr(self::$siteContent, 0, 2);?>">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
<meta http-equiv="content-type" content="text/html;">
|
||||||
<meta name="viewport" content="width=device-width">
|
<meta name="viewport" content="width=device-width">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="x-apple-disable-message-reformatting">
|
<meta name="x-apple-disable-message-reformatting">
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html prefix="og: http://ogp.me/ns#" lang="<?php echo substr(self::$i18nContent, 0, 2); ?>">
|
<html prefix="og: http://ogp.me/ns#" lang="<?php echo substr(self::$siteContent, 0, 2); ?>">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
<meta http-equiv="content-type" content="text/html;">
|
||||||
<meta meta="description=" content="ZwiiCMS le CMS multilingue sans base de données">
|
<meta meta="description=" content="ZwiiCMS le CMS multilingue sans base de données">
|
||||||
<meta name="generator" content="ZiiCMS https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS">
|
<meta name="generator" content="ZiiCMS https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
@ -13,15 +14,23 @@
|
|||||||
<?php $layout->showFavicon(); ?>
|
<?php $layout->showFavicon(); ?>
|
||||||
<?php $layout->showVendor(); ?>
|
<?php $layout->showVendor(); ?>
|
||||||
<?php $layout->showFonts(); ?>
|
<?php $layout->showFonts(); ?>
|
||||||
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css?<?php echo md5_file('core/layout/common.css'); ?>">
|
<?php if (file_exists(self::DATA_DIR . 'font/font.css')): ?>
|
||||||
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR . 'theme.css'); ?>">
|
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>font/font.css?<?php echo md5_file(self::DATA_DIR . 'font/font.css'); ?>">
|
||||||
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>custom.css?<?php echo md5_file(self::DATA_DIR . 'custom.css'); ?>">
|
<?php endif; ?>
|
||||||
|
<link rel="stylesheet"
|
||||||
|
href="<?php echo helper::baseUrl(false); ?>core/layout/common.css?<?php echo md5_file('core/layout/common.css'); ?>">
|
||||||
|
<link rel="stylesheet"
|
||||||
|
href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR . 'theme.css'); ?>">
|
||||||
|
<link rel="stylesheet"
|
||||||
|
href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>custom.css?<?php echo md5_file(self::DATA_DIR . 'custom.css'); ?>">
|
||||||
<!-- Détection RSS -->
|
<!-- Détection RSS -->
|
||||||
<?php if (($this->getData(['page', $this->getUrl(0), 'moduleId']) === 'blog'
|
<?php if (
|
||||||
|
($this->getData(['page', $this->getUrl(0), 'moduleId']) === 'blog'
|
||||||
or $this->getData(['page', $this->getUrl(0), 'moduleId']) === 'news')
|
or $this->getData(['page', $this->getUrl(0), 'moduleId']) === 'news')
|
||||||
and $this->getData(['module', $this->getUrl(0), 'config', 'feeds']) === TRUE
|
and $this->getData(['module', $this->getUrl(0), 'config', 'feeds']) === TRUE
|
||||||
): ?>
|
): ?>
|
||||||
<link rel="alternate" type="application/rss+xml" href="'<?php echo helper::baseUrl() . $this->getUrl(0) . '/rss'; ?>" title="fLUX rss">
|
<link rel="alternate" type="application/rss+xml"
|
||||||
|
href="'<?php echo helper::baseUrl() . $this->getUrl(0) . '/rss'; ?>" title="fLUX rss">
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<?php $layout->showStyle(); ?>
|
<?php $layout->showStyle(); ?>
|
||||||
<?php $layout->showInlineStyle(); ?>
|
<?php $layout->showInlineStyle(); ?>
|
||||||
@ -30,6 +39,7 @@
|
|||||||
include(self::DATA_DIR . 'head.inc.html');
|
include(self::DATA_DIR . 'head.inc.html');
|
||||||
} ?>
|
} ?>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<!-- Barre d'administration -->
|
<!-- Barre d'administration -->
|
||||||
<?php if ($this->getUser('group') > self::GROUP_MEMBER): ?>
|
<?php if ($this->getUser('group') > self::GROUP_MEMBER): ?>
|
||||||
@ -44,7 +54,7 @@
|
|||||||
if (
|
if (
|
||||||
$this->getData(['theme', 'menu', 'position']) === 'top'
|
$this->getData(['theme', 'menu', 'position']) === 'top'
|
||||||
and $this->getData(['theme', 'menu', 'fixed']) === true
|
and $this->getData(['theme', 'menu', 'fixed']) === true
|
||||||
and $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
and $this->isConnected() === true
|
||||||
and $this->getUser('group') > self::GROUP_MEMBER
|
and $this->getUser('group') > self::GROUP_MEMBER
|
||||||
) {
|
) {
|
||||||
echo '<nav id="navfixedconnected" >';
|
echo '<nav id="navfixedconnected" >';
|
||||||
@ -56,7 +66,8 @@
|
|||||||
<div id="toggle">
|
<div id="toggle">
|
||||||
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'title' ? '<div id="burgerText">' . $this->getData(['locale', 'title']) . '</div>' : ''; ?>
|
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'title' ? '<div id="burgerText">' . $this->getData(['locale', 'title']) . '</div>' : ''; ?>
|
||||||
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'logo' ? '<div id="burgerLogo"><img src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['theme', 'menu', 'burgerLogo']) . '"></div>' : ''; ?>
|
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'logo' ? '<div id="burgerLogo"><img src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['theme', 'menu', 'burgerLogo']) . '"></div>' : ''; ?>
|
||||||
<?php echo template::ico('menu', ['fontSize' => '2em']); ?></div>
|
<?php echo template::ico('menu', ['fontSize' => '2em']); ?>
|
||||||
|
</div>
|
||||||
<!-- fin du menu burger -->
|
<!-- fin du menu burger -->
|
||||||
<?php
|
<?php
|
||||||
$menuClass = $this->getData(['theme', 'menu', 'position']) === 'top' ? 'class="container-large"' : 'class="container"';
|
$menuClass = $this->getData(['theme', 'menu', 'position']) === 'top' ? 'class="container-large"' : 'class="container"';
|
||||||
@ -82,7 +93,9 @@
|
|||||||
// Affiche toujours le titre de la bannière pour l'édition du thème
|
// Affiche toujours le titre de la bannière pour l'édition du thème
|
||||||
or ($this->getUrl(0) === 'theme' and $this->getUrl(1) === 'header')
|
or ($this->getUrl(0) === 'theme' and $this->getUrl(1) === 'header')
|
||||||
): ?>
|
): ?>
|
||||||
<span id="themeHeaderTitle"><?php echo $this->getData(['locale', 'title']); ?></span>
|
<span id="themeHeaderTitle">
|
||||||
|
<?php echo $this->getData(['locale', 'title']); ?>
|
||||||
|
</span>
|
||||||
<?php else: ?>
|
<?php else: ?>
|
||||||
<span id="themeHeaderTitle"> </span>
|
<span id="themeHeaderTitle"> </span>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
@ -101,13 +114,15 @@
|
|||||||
<div id="toggle">
|
<div id="toggle">
|
||||||
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'title' ? '<div id="burgerText">' . $this->getData(['locale', 'title']) . '</div>' : ''; ?>
|
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'title' ? '<div id="burgerText">' . $this->getData(['locale', 'title']) . '</div>' : ''; ?>
|
||||||
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'logo' ? '<div id="burgerLogo"><img src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['theme', 'menu', 'burgerLogo']) . '"></div>' : ''; ?>
|
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'logo' ? '<div id="burgerLogo"><img src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['theme', 'menu', 'burgerLogo']) . '"></div>' : ''; ?>
|
||||||
<?php echo template::ico('menu', ['fontSize' => '2em']); ?></div>
|
<?php echo template::ico('menu', ['fontSize' => '2em']); ?>
|
||||||
|
</div>
|
||||||
<!-- fin du menu burger -->
|
<!-- fin du menu burger -->
|
||||||
<?php
|
<?php
|
||||||
$menuClass = $this->getData(['theme', 'menu', 'wide']) === 'none' ? 'class="container-large"' : 'class="container"';
|
$menuClass = $this->getData(['theme', 'menu', 'wide']) === 'none' ? 'class="container-large"' : 'class="container"';
|
||||||
?>
|
?>
|
||||||
<div id="menu" <?php echo $menuClass; ?>>
|
<div id="menu" <?php echo $menuClass; ?>>
|
||||||
<?php $layout->showMenu(); ?></div>
|
<?php $layout->showMenu(); ?>
|
||||||
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<!-- Site -->
|
<!-- Site -->
|
||||||
@ -118,8 +133,11 @@
|
|||||||
<div id="toggle">
|
<div id="toggle">
|
||||||
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'title' ? '<div id="burgerText">' . $this->getData(['locale', 'title']) . '</div>' : ''; ?>
|
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'title' ? '<div id="burgerText">' . $this->getData(['locale', 'title']) . '</div>' : ''; ?>
|
||||||
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'logo' ? '<div id="burgerLogo"><img src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['theme', 'menu', 'burgerLogo']) . '"></div>' : ''; ?>
|
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'logo' ? '<div id="burgerLogo"><img src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['theme', 'menu', 'burgerLogo']) . '"></div>' : ''; ?>
|
||||||
<?php echo template::ico('menu', ['fontSize' => '2em']); ?></div>
|
<?php echo template::ico('menu', ['fontSize' => '2em']); ?>
|
||||||
<div id="menu" class="container"><?php $layout->showMenu(); ?></div>
|
</div>
|
||||||
|
<div id="menu" class="container">
|
||||||
|
<?php $layout->showMenu(); ?>
|
||||||
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<?php if (
|
<?php if (
|
||||||
@ -142,7 +160,9 @@
|
|||||||
// Affiche toujours le titre de la bannière pour l'édition du thème
|
// Affiche toujours le titre de la bannière pour l'édition du thème
|
||||||
or ($this->getUrl(0) === 'theme' and $this->getUrl(1) === 'header')
|
or ($this->getUrl(0) === 'theme' and $this->getUrl(1) === 'header')
|
||||||
): ?>
|
): ?>
|
||||||
<span id="themeHeaderTitle"><?php echo $this->getData(['locale', 'title']); ?></span>
|
<span id="themeHeaderTitle">
|
||||||
|
<?php echo $this->getData(['locale', 'title']); ?>
|
||||||
|
</span>
|
||||||
<?php else: ?>
|
<?php else: ?>
|
||||||
<span id="themeHeaderTitle"> </span>
|
<span id="themeHeaderTitle"> </span>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
@ -167,18 +187,23 @@
|
|||||||
<div id="toggle">
|
<div id="toggle">
|
||||||
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'title' ? '<div id="burgerText">' . $this->getData(['locale', 'title']) . '</div>' : ''; ?>
|
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'title' ? '<div id="burgerText">' . $this->getData(['locale', 'title']) . '</div>' : ''; ?>
|
||||||
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'logo' ? '<div id="burgerLogo"><img src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['theme', 'menu', 'burgerLogo']) . '"></div>' : ''; ?>
|
<?php echo $this->getData(['theme', 'menu', 'burgerContent']) === 'logo' ? '<div id="burgerLogo"><img src="' . helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['theme', 'menu', 'burgerLogo']) . '"></div>' : ''; ?>
|
||||||
<?php echo template::ico('menu', ['fontSize' => '2em']); ?></div>
|
<?php echo template::ico('menu', ['fontSize' => '2em']); ?>
|
||||||
<div id="menu" class="container"><?php $layout->showMenu(); ?></div>
|
</div>
|
||||||
|
<div id="menu" class="container">
|
||||||
|
<?php $layout->showMenu(); ?>
|
||||||
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<!-- Corps de page -->
|
<!-- Corps de page -->
|
||||||
<?php $layout->showSection(); ?>
|
<?php $layout->showMain(); ?>
|
||||||
<!-- footer -->
|
<!-- footer -->
|
||||||
<?php $layout->showFooter(); ?>
|
<?php $layout->showFooter(); ?>
|
||||||
<!-- Fin du site -->
|
<!-- Fin du site -->
|
||||||
<?php echo $this->getData(['theme', 'footer', 'position']) === 'site' ? '</div>' : ''; ?>
|
<?php echo $this->getData(['theme', 'footer', 'position']) === 'site' ? '</div>' : ''; ?>
|
||||||
<!-- Lien remonter en haut -->
|
<!-- Lien remonter en haut -->
|
||||||
<div id="backToTop"><?php echo template::ico('up'); ?></div>
|
<div id="backToTop">
|
||||||
|
<?php echo template::ico('up'); ?>
|
||||||
|
</div>
|
||||||
<!-- Affichage du consentement aux cookies-->
|
<!-- Affichage du consentement aux cookies-->
|
||||||
<?php $layout->showCookies(); ?>
|
<?php $layout->showCookies(); ?>
|
||||||
<!-- Les scripts -->
|
<!-- Les scripts -->
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
@ -22,7 +22,7 @@ class config extends common
|
|||||||
'copyBackups' => self::GROUP_ADMIN,
|
'copyBackups' => self::GROUP_ADMIN,
|
||||||
'delBackups' => self::GROUP_ADMIN,
|
'delBackups' => self::GROUP_ADMIN,
|
||||||
'configMetaImage' => self::GROUP_ADMIN,
|
'configMetaImage' => self::GROUP_ADMIN,
|
||||||
'siteMap' => self::GROUP_ADMIN,
|
'sitemap' => self::GROUP_ADMIN,
|
||||||
'index' => self::GROUP_ADMIN,
|
'index' => self::GROUP_ADMIN,
|
||||||
'restore' => self::GROUP_ADMIN,
|
'restore' => self::GROUP_ADMIN,
|
||||||
'updateBaseUrl' => self::GROUP_ADMIN,
|
'updateBaseUrl' => self::GROUP_ADMIN,
|
||||||
@ -30,7 +30,8 @@ class config extends common
|
|||||||
'logReset' => self::GROUP_ADMIN,
|
'logReset' => self::GROUP_ADMIN,
|
||||||
'logDownload' => self::GROUP_ADMIN,
|
'logDownload' => self::GROUP_ADMIN,
|
||||||
'blacklistReset' => self::GROUP_ADMIN,
|
'blacklistReset' => self::GROUP_ADMIN,
|
||||||
'blacklistDownload' => self::GROUP_ADMIN
|
'blacklistDownload' => self::GROUP_ADMIN,
|
||||||
|
'register' => self::GROUP_ADMIN,
|
||||||
];
|
];
|
||||||
|
|
||||||
public static $timezones = [
|
public static $timezones = [
|
||||||
@ -204,14 +205,24 @@ class config extends common
|
|||||||
public static $onlineVersion = '';
|
public static $onlineVersion = '';
|
||||||
public static $updateButtonText = 'Réinstaller';
|
public static $updateButtonText = 'Réinstaller';
|
||||||
|
|
||||||
|
public static $imageOpenGraph = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Génére les fichiers pour les crawlers
|
* Génére les fichiers pour les crawlers
|
||||||
* Sitemap compressé et non compressé
|
* Sitemap compressé et non compressé
|
||||||
* Robots.txt
|
* Robots.txt
|
||||||
*/
|
*/
|
||||||
public function siteMap()
|
public function sitemap()
|
||||||
{
|
{
|
||||||
|
// La page n'existe pas
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'access' => false
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
// Mettre à jour le site map
|
// Mettre à jour le site map
|
||||||
$successSitemap = $this->updateSitemap();
|
$successSitemap = $this->updateSitemap();
|
||||||
|
|
||||||
@ -223,6 +234,8 @@ class config extends common
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sauvegarde des données
|
* Sauvegarde des données
|
||||||
@ -230,7 +243,10 @@ class config extends common
|
|||||||
public function backup()
|
public function backup()
|
||||||
{
|
{
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
// Creation du ZIP
|
// Creation du ZIP
|
||||||
$filter = $this->getInput('configBackupOption', helper::FILTER_BOOLEAN) === true ? ['backup', 'tmp'] : ['backup', 'tmp', 'file'];
|
$filter = $this->getInput('configBackupOption', helper::FILTER_BOOLEAN) === true ? ['backup', 'tmp'] : ['backup', 'tmp', 'file'];
|
||||||
$fileName = helper::autoBackup(self::TEMP_DIR, $filter);
|
$fileName = helper::autoBackup(self::TEMP_DIR, $filter);
|
||||||
@ -286,8 +302,6 @@ class config extends common
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Traitement des données reçues valides.
|
// Traitement des données reçues valides.
|
||||||
if (!empty($token) && $data !== false) {
|
if (!empty($token) && $data !== false) {
|
||||||
$data = json_decode($data, true);
|
$data = json_decode($data, true);
|
||||||
@ -320,7 +334,10 @@ class config extends common
|
|||||||
public function restore()
|
public function restore()
|
||||||
{
|
{
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
|
|
||||||
$success = false;
|
$success = false;
|
||||||
|
|
||||||
@ -349,12 +366,7 @@ class config extends common
|
|||||||
'state' => false
|
'state' => false
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
// Lire le contenu de l'archive dans le tableau files
|
|
||||||
/*
|
|
||||||
for ($i = 0; $i < $zip->numFiles; $i++) {
|
|
||||||
$stat = $zip->statIndex($i);
|
|
||||||
$files[] = (basename($stat['name']));
|
|
||||||
}*/
|
|
||||||
// Extraction de l'archive dans un dossier temporaire
|
// Extraction de l'archive dans un dossier temporaire
|
||||||
$tmpDir = uniqid(8);
|
$tmpDir = uniqid(8);
|
||||||
$success = $zip->extractTo(self::TEMP_DIR . $tmpDir);
|
$success = $zip->extractTo(self::TEMP_DIR . $tmpDir);
|
||||||
@ -382,7 +394,7 @@ class config extends common
|
|||||||
|
|
||||||
// Copie dans le dossier /site/data
|
// Copie dans le dossier /site/data
|
||||||
$success = $this->copyDir(self::TEMP_DIR . $tmpDir, 'site/');
|
$success = $this->copyDir(self::TEMP_DIR . $tmpDir, 'site/');
|
||||||
$this->removeDir(self::TEMP_DIR . $tmpDir);
|
$this->deleteDir(self::TEMP_DIR . $tmpDir);
|
||||||
|
|
||||||
// Restaurer les users originaux d'une v10 si option cochée
|
// Restaurer les users originaux d'une v10 si option cochée
|
||||||
if (
|
if (
|
||||||
@ -417,7 +429,10 @@ class config extends common
|
|||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
|
|
||||||
// Basculement en mise à jour auto, remise à 0 du compteur
|
// Basculement en mise à jour auto, remise à 0 du compteur
|
||||||
if (
|
if (
|
||||||
@ -469,7 +484,7 @@ class config extends common
|
|||||||
],
|
],
|
||||||
'seo' => [
|
'seo' => [
|
||||||
'robots' => $this->getInput('seoRobots', helper::FILTER_BOOLEAN),
|
'robots' => $this->getInput('seoRobots', helper::FILTER_BOOLEAN),
|
||||||
'keyApi' => $this->getInput('seoKeyApi', helper::FILTER_STRING_SHORT),
|
'openGraphImage' => $this->getInput('seoOpenGraphImage', helper::FILTER_STRING_SHORT),
|
||||||
],
|
],
|
||||||
'connect' => [
|
'connect' => [
|
||||||
'attempt' => $this->getInput('connectAttempt', helper::FILTER_INT),
|
'attempt' => $this->getInput('connectAttempt', helper::FILTER_INT),
|
||||||
@ -494,7 +509,8 @@ class config extends common
|
|||||||
unlink($filename);
|
unlink($filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (file_exists('site/data/.backup')) unlink('site/data/.backup');
|
if (file_exists('site/data/.backup'))
|
||||||
|
unlink('site/data/.backup');
|
||||||
} else {
|
} else {
|
||||||
touch('site/data/.backup');
|
touch('site/data/.backup');
|
||||||
}
|
}
|
||||||
@ -508,7 +524,7 @@ class config extends common
|
|||||||
) {
|
) {
|
||||||
// Ajout des lignes dans le .htaccess
|
// Ajout des lignes dans le .htaccess
|
||||||
$fileContent = file_get_contents('.htaccess');
|
$fileContent = file_get_contents('.htaccess');
|
||||||
$rewriteData = PHP_EOL .
|
$rewriteData =
|
||||||
'# URL rewriting' . PHP_EOL .
|
'# URL rewriting' . PHP_EOL .
|
||||||
'<IfModule mod_rewrite.c>' . PHP_EOL .
|
'<IfModule mod_rewrite.c>' . PHP_EOL .
|
||||||
"\tRewriteEngine on" . PHP_EOL .
|
"\tRewriteEngine on" . PHP_EOL .
|
||||||
@ -517,9 +533,9 @@ class config extends common
|
|||||||
"\tRewriteCond %{REQUEST_FILENAME} !-d" . PHP_EOL .
|
"\tRewriteCond %{REQUEST_FILENAME} !-d" . PHP_EOL .
|
||||||
"\tRewriteRule ^(.*)$ index.php?$1 [L]" . PHP_EOL .
|
"\tRewriteRule ^(.*)$ index.php?$1 [L]" . PHP_EOL .
|
||||||
'</IfModule>' . PHP_EOL .
|
'</IfModule>' . PHP_EOL .
|
||||||
'# URL rewriting' . PHP_EOL;
|
'# URL rewriting';
|
||||||
$fileContent = str_replace('# URL rewriting', $rewriteData, $fileContent);
|
$fileContent = str_replace('# URL rewriting', $rewriteData, $fileContent);
|
||||||
file_put_contents(
|
$this->secure_file_put_contents(
|
||||||
'.htaccess',
|
'.htaccess',
|
||||||
$fileContent
|
$fileContent
|
||||||
);
|
);
|
||||||
@ -535,7 +551,7 @@ class config extends common
|
|||||||
$fileContent = file_get_contents('.htaccess');
|
$fileContent = file_get_contents('.htaccess');
|
||||||
$fileContent = explode('# URL rewriting', $fileContent);
|
$fileContent = explode('# URL rewriting', $fileContent);
|
||||||
$fileContent = $fileContent[0] . '# URL rewriting' . $fileContent[2];
|
$fileContent = $fileContent[0] . '# URL rewriting' . $fileContent[2];
|
||||||
file_put_contents(
|
$this->secure_file_put_contents(
|
||||||
'.htaccess',
|
'.htaccess',
|
||||||
$fileContent
|
$fileContent
|
||||||
);
|
);
|
||||||
@ -570,14 +586,58 @@ class config extends common
|
|||||||
|
|
||||||
// Variable de version
|
// Variable de version
|
||||||
if (helper::checkNewVersion(common::ZWII_UPDATE_CHANNEL)) {
|
if (helper::checkNewVersion(common::ZWII_UPDATE_CHANNEL)) {
|
||||||
self::$updateButtonText = helper::translate('Mettre à jour');
|
self::$updateButtonText = helper::translate('Mise à jour');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Sélecteur de délais, compléter avec la traduction en jours
|
// Sélecteur de délais, compléter avec la traduction en jours
|
||||||
foreach (self::$updateDelay as $key => $value) {
|
foreach (self::$updateDelay as $key => $value) {
|
||||||
self::$updateDelay[$key] = $key === 86400 ? $value . ' ' . helper::translate('jour') : $value . ' ' . helper::translate('jours');
|
self::$updateDelay[$key] = $key === 86400 ? $value . ' ' . helper::translate('jour') : $value . ' ' . helper::translate('jours');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Paramètres de l'image OpenGraph
|
||||||
|
$imagePath = self::FILE_DIR . 'source/' . $this->getData(['config', 'seo', 'openGraphImage']);
|
||||||
|
|
||||||
|
// Par défaut
|
||||||
|
self::$imageOpenGraph['type'] = '';
|
||||||
|
self::$imageOpenGraph['size'] = '';
|
||||||
|
self::$imageOpenGraph['wide'] = '';
|
||||||
|
self::$imageOpenGraph['height'] = '';
|
||||||
|
self::$imageOpenGraph['ratio'] = 0;
|
||||||
|
if (
|
||||||
|
$this->getData(['config', 'seo', 'openGraphImage'])
|
||||||
|
&& file_exists($imagePath)
|
||||||
|
) {
|
||||||
|
// Infos sur l'image Open Graph
|
||||||
|
$typeMime = exif_imagetype($imagePath);
|
||||||
|
switch ($typeMime) {
|
||||||
|
case IMAGETYPE_JPEG:
|
||||||
|
$typeMime = 'jpeg';
|
||||||
|
break;
|
||||||
|
case IMAGETYPE_PNG:
|
||||||
|
$typeMime = 'png';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$typeMime = image_type_to_mime_type($typeMime);
|
||||||
|
}
|
||||||
|
self::$imageOpenGraph['type'] = $typeMime;
|
||||||
|
$imageSize = getimagesize($imagePath);
|
||||||
|
self::$imageOpenGraph['wide'] = $imageSize[0];
|
||||||
|
self::$imageOpenGraph['height'] = $imageSize[1];
|
||||||
|
self::$imageOpenGraph['ratio'] = self::$imageOpenGraph['wide'] / self::$imageOpenGraph['height'];
|
||||||
|
|
||||||
|
self::$imageOpenGraph['size'] = filesize($imagePath);
|
||||||
|
$tailleEnOctets = filesize($imagePath);
|
||||||
|
|
||||||
|
if ($tailleEnOctets >= 1024 * 1024) {
|
||||||
|
// Si la taille est supérieure ou égale à 1 Mo, afficher en mégaoctets
|
||||||
|
self::$imageOpenGraph['size'] = round($tailleEnOctets / (1024 * 1024), 2) . ' Mo';
|
||||||
|
} else {
|
||||||
|
// Sinon, afficher en kilooctets
|
||||||
|
self::$imageOpenGraph['size'] = round($tailleEnOctets / 1024, 2) . ' Ko';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'title' => helper::translate('Configuration'),
|
'title' => helper::translate('Configuration'),
|
||||||
@ -589,13 +649,16 @@ class config extends common
|
|||||||
public function script()
|
public function script()
|
||||||
{
|
{
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
// Ecrire les fichiers de script
|
// Ecrire les fichiers de script
|
||||||
if ($this->geturl(2) === 'head') {
|
if ($this->geturl(2) === 'head') {
|
||||||
file_put_contents(self::DATA_DIR . 'head.inc.html', $this->getInput('configScriptHead', null));
|
$this->secure_file_put_contents(self::DATA_DIR . 'head.inc.html', $this->getInput('configScriptHead', null));
|
||||||
}
|
}
|
||||||
if ($this->geturl(2) === 'body') {
|
if ($this->geturl(2) === 'body') {
|
||||||
file_put_contents(self::DATA_DIR . 'body.inc.html', $this->getInput('configScriptBody', null));
|
$this->secure_file_put_contents(self::DATA_DIR . 'body.inc.html', $this->getInput('configScriptBody', null));
|
||||||
}
|
}
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
@ -624,11 +687,20 @@ class config extends common
|
|||||||
|
|
||||||
public function logReset()
|
public function logReset()
|
||||||
{
|
{
|
||||||
|
// Action interdite
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'access' => false
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
if (file_exists(self::DATA_DIR . 'journal.log')) {
|
if (file_exists(self::DATA_DIR . 'journal.log')) {
|
||||||
unlink(self::DATA_DIR . 'journal.log');
|
unlink(self::DATA_DIR . 'journal.log');
|
||||||
// Créer les en-têtes des journaux
|
// Créer les en-têtes des journaux
|
||||||
$d = 'Date;Heure;IP;Id;Action' . PHP_EOL;
|
$d = 'Date;Heure;IP;Id;Action' . PHP_EOL;
|
||||||
file_put_contents(self::DATA_DIR . 'journal.log', $d);
|
$this->secure_file_put_contents(self::DATA_DIR . 'journal.log', $d);
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'title' => helper::translate('Configuration'),
|
'title' => helper::translate('Configuration'),
|
||||||
@ -646,6 +718,7 @@ class config extends common
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -654,6 +727,15 @@ class config extends common
|
|||||||
*/
|
*/
|
||||||
public function logDownload()
|
public function logDownload()
|
||||||
{
|
{
|
||||||
|
// Action interdite
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'access' => false
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
$fileName = self::DATA_DIR . 'journal.log';
|
$fileName = self::DATA_DIR . 'journal.log';
|
||||||
if (file_exists($fileName)) {
|
if (file_exists($fileName)) {
|
||||||
ob_start();
|
ob_start();
|
||||||
@ -675,24 +757,34 @@ class config extends common
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tableau des IP blacklistés
|
* Tableau des IP blacklistés
|
||||||
*/
|
*/
|
||||||
public function blacklistDownload()
|
public function blacklistDownload()
|
||||||
{
|
{
|
||||||
|
// Action interdite
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'access' => false
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
ob_start();
|
ob_start();
|
||||||
$fileName = self::TEMP_DIR . 'blacklist.log';
|
$fileName = self::TEMP_DIR . 'blacklist.log';
|
||||||
$d = 'Date dernière tentative;Heure dernière tentative;Id;Adresse IP;Nombre d\'échecs' . PHP_EOL;
|
$d = 'Date dernière tentative;Heure dernière tentative;Id;Adresse IP;Nombre d\'échecs' . PHP_EOL;
|
||||||
file_put_contents($fileName, $d);
|
$this->secure_file_put_contents($fileName, $d);
|
||||||
if (file_exists($fileName)) {
|
if (file_exists($fileName)) {
|
||||||
$d = $this->getData(['blacklist']);
|
$d = $this->getData(['blacklist']);
|
||||||
$data = '';
|
$data = '';
|
||||||
foreach ($d as $key => $item) {
|
foreach ($d as $key => $item) {
|
||||||
$data .= helper::dateUTF8('%Y %m %d', $item['lastFail']) . ' - ' . helper::dateUTF8('%H:%M', time());
|
$data .= helper::dateUTF8('%Y %m %d', $item['lastFail'], self::$i18nUI) . ' - ' . helper::dateUTF8('%H:%M', time(), self::$i18nUI);
|
||||||
$data .= $key . ';' . $item['ip'] . ';' . $item['connectFail'] . PHP_EOL;
|
$data .= $key . ';' . $item['ip'] . ';' . $item['connectFail'] . PHP_EOL;
|
||||||
}
|
}
|
||||||
file_put_contents($fileName, $data, FILE_APPEND);
|
$this->secure_file_put_contents($fileName, $data, FILE_APPEND);
|
||||||
header('Content-Description: File Transfer');
|
header('Content-Description: File Transfer');
|
||||||
header('Content-Type: application/octet-stream');
|
header('Content-Type: application/octet-stream');
|
||||||
header('Content-Transfer-Encoding: binary');
|
header('Content-Transfer-Encoding: binary');
|
||||||
@ -706,13 +798,14 @@ class config extends common
|
|||||||
} else {
|
} else {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'title' => helper::translate('Confighelper::translate(uration'),
|
'title' => helper::translate('Configuration'),
|
||||||
'view' => 'index',
|
'view' => 'index',
|
||||||
'notification' => helper::translate('Aucune liste noire à télécharger'),
|
'notification' => helper::translate('Aucune liste noire à télécharger'),
|
||||||
'state' => false
|
'state' => false
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Réinitialiser les ip blacklistées
|
* Réinitialiser les ip blacklistées
|
||||||
@ -720,6 +813,15 @@ class config extends common
|
|||||||
|
|
||||||
public function blacklistReset()
|
public function blacklistReset()
|
||||||
{
|
{
|
||||||
|
// Action interdite
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'access' => false
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
if (file_exists(self::DATA_DIR . 'blacklist.json')) {
|
if (file_exists(self::DATA_DIR . 'blacklist.json')) {
|
||||||
$this->setData(['blacklist', []]);
|
$this->setData(['blacklist', []]);
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
@ -739,12 +841,22 @@ class config extends common
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupération des backups auto dans le gestionnaire de fichiers
|
* Récupération des backups auto dans le gestionnaire de fichiers
|
||||||
*/
|
*/
|
||||||
public function copyBackups()
|
public function copyBackups()
|
||||||
{
|
{
|
||||||
|
// Action interdite
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'access' => false
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
|
||||||
$success = $this->copyDir(self::BACKUP_DIR, self::FILE_DIR . 'source/backup');
|
$success = $this->copyDir(self::BACKUP_DIR, self::FILE_DIR . 'source/backup');
|
||||||
|
|
||||||
@ -756,12 +868,22 @@ class config extends common
|
|||||||
'state' => $success
|
'state' => $success
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Vider le dosser des sauvegardes automatisées
|
* Vider le dosser des sauvegardes automatisées
|
||||||
*/
|
*/
|
||||||
public function delBackups()
|
public function delBackups()
|
||||||
{
|
{
|
||||||
|
// Action interdite
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'access' => false
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
$path = realpath(self::BACKUP_DIR);
|
$path = realpath(self::BACKUP_DIR);
|
||||||
$success = $fail = 0;
|
$success = $fail = 0;
|
||||||
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) {
|
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) {
|
||||||
@ -781,3 +903,41 @@ class config extends common
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction pour vérifier la présence du module de réécriture
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function isModRewriteEnabled()
|
||||||
|
{
|
||||||
|
// Check if Apache and mod_rewrite is loaded
|
||||||
|
if (function_exists('apache_get_modules')) {
|
||||||
|
$modules = apache_get_modules();
|
||||||
|
return in_array('mod_rewrite', $modules);
|
||||||
|
} else {
|
||||||
|
// Fallback if not using Apache or unable to detect modules
|
||||||
|
return getenv('HTTP_MOD_REWRITE') == 'On' || getenv('REDIRECT_STATUS') == '200';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stocke la variable dans les paramètres de l'utilisateur pour activer la tab à sa prochaine visite
|
||||||
|
* @return never
|
||||||
|
*/
|
||||||
|
public function register(): void
|
||||||
|
{
|
||||||
|
$this->setData([
|
||||||
|
'user',
|
||||||
|
$this->getUser('id'),
|
||||||
|
'view',
|
||||||
|
[
|
||||||
|
'config' => $this->getUrl(2),
|
||||||
|
'page' => $this->getData(['user', $this->getUser('id'), 'view', 'page']),
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'redirect' => helper::baseUrl() . 'config/' . $this->getUrl(2),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
4
core/module/config/tool/.htaccess
Normal file
4
core/module/config/tool/.htaccess
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<Files "data.key">
|
||||||
|
Order Allow,Deny
|
||||||
|
Deny from all
|
||||||
|
</Files>
|
47
core/module/config/tool/autobackup.php
Normal file
47
core/module/config/tool/autobackup.php
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
Ce script PHP est conçu pour être appelé via une requête HTTP GET avec une clé spécifique pour déclencher la création d'une archive ZIP de sauvegarde.
|
||||||
|
|
||||||
|
Exemple d'appel dans une URL :
|
||||||
|
http://example.com/chemin/vers/autobackup.php?key=your_secret_key
|
||||||
|
|
||||||
|
La clé doit être fournie en tant que paramètre "key" dans l'URL et correspondre à celle stockée dans le fichier "data.key" pour que la création de l'archive soit autorisée. Si la clé est valide, le script parcourt le répertoire spécifié et ajoute les fichiers à l'archive ZIP. Si la clé est invalide ou absente, le script affiche un message d'erreur et termine son exécution.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Vérification de la clé
|
||||||
|
if (isset ($_GET['key'])) {
|
||||||
|
$key = $_GET['key'];
|
||||||
|
$storedKey = file_get_contents('data.key');
|
||||||
|
if ($key !== $storedKey) {
|
||||||
|
http_response_code(401);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
// Création du ZIP
|
||||||
|
$filter = ['backup', 'tmp'];
|
||||||
|
$fileName = date('Y-m-d-H-i-s', time()) . '-rolling-backup.zip';
|
||||||
|
$zip = new ZipArchive();
|
||||||
|
$zip->open('../../../../site/backup/' . $fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE);
|
||||||
|
$directory = '../../../../site';
|
||||||
|
$files = new RecursiveIteratorIterator(
|
||||||
|
new RecursiveCallbackFilterIterator(
|
||||||
|
new RecursiveDirectoryIterator(
|
||||||
|
$directory,
|
||||||
|
RecursiveDirectoryIterator::SKIP_DOTS
|
||||||
|
),
|
||||||
|
function ($fileInfo, $key, $iterator) use ($filter) {
|
||||||
|
return $fileInfo->isFile() || !in_array($fileInfo->getBaseName(), $filter);
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
foreach ($files as $name => $file) {
|
||||||
|
if (!$file->isDir()) {
|
||||||
|
$filePath = $file->getRealPath();
|
||||||
|
$relativePath = substr($filePath, strlen(realpath($directory)) + 1);
|
||||||
|
$zip->addFile($filePath, $relativePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$zip->close();
|
||||||
|
http_response_code(201);
|
||||||
|
}
|
49
core/module/config/tool/cleanautobackup.php
Normal file
49
core/module/config/tool/cleanautobackup.php
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
Ce script PHP est conçu pour supprimer les fichiers ayant l'extension 'tar.gz' dans un répertoire de sauvegarde si leur dernière modification remonte à un certain nombre de jours spécifié via une requête HTTP GET.
|
||||||
|
|
||||||
|
Exemple d'appel dans une URL avec le nombre de jours spécifié :
|
||||||
|
http://example.com/chemin/vers/script.php?days=7&key=your_secret_key
|
||||||
|
|
||||||
|
Le script vérifie également la présence et la validité d'une clé spécifique pour déclencher son exécution. La clé doit être fournie en tant que paramètre "key" dans l'URL et correspondre à celle stockée dans le fichier "data.key" pour que la suppression des fichiers soit autorisée. Si la clé est invalide ou absente, le script affiche un message d'erreur et termine son exécution.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Vérification de la clé
|
||||||
|
if (isset ($_GET['key'])) {
|
||||||
|
// Récupération de la clé fournie en GET
|
||||||
|
$key = $_GET['key'];
|
||||||
|
|
||||||
|
// Récupération de la clé stockée dans le fichier data.key
|
||||||
|
$storedKey = file_get_contents('data.key');
|
||||||
|
|
||||||
|
// Vérification de correspondance entre les clés
|
||||||
|
if ($key !== $storedKey) {
|
||||||
|
http_response_code(401);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Récupère le nombre de jours à partir de la variable GET 'days'
|
||||||
|
$days = isset ($_GET['days']) ? (int) $_GET['days'] : 1; // Par défaut à 1 si non spécifié
|
||||||
|
|
||||||
|
// Chemin vers le répertoire contenant les fichiers
|
||||||
|
$directory = '../../../../site/backup/'; // Remplacez par le chemin réel
|
||||||
|
|
||||||
|
// Convertit le nombre de jours en secondes
|
||||||
|
$timeLimit = strtotime("-$days days");
|
||||||
|
|
||||||
|
// Crée un nouvel objet DirectoryIterator
|
||||||
|
foreach (new DirectoryIterator($directory) as $file) {
|
||||||
|
// Vérifie si l'élément courant est un fichier et a l'extension 'tar.gz'
|
||||||
|
if ($file->isFile() && $file->getExtension() === 'tar.gz') {
|
||||||
|
// Vérifie si le fichier a été modifié avant la limite de temps
|
||||||
|
if ($file->getMTime() < $timeLimit) {
|
||||||
|
// Supprime le fichier
|
||||||
|
unlink($file->getRealPath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Si la clé est manquante, affiche un message d'erreur et arrête l'exécution du script
|
||||||
|
http_response_code(201);
|
||||||
|
}
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
@ -5,8 +5,8 @@
|
|||||||
* file that was distributed with this source code.
|
* file that was distributed with this source code.
|
||||||
*
|
*
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
$(document).ready((function(){$("#configBackupForm").submit((function(e){e.preventDefault();var url="<?php echo helper::baseUrl() . $this->getUrl(0); ?>/backup",message_success="<?php echo helper::translate('Sauvegarde générée avec succès.'); ?>",message_error="<?php echo helper::translate('Erreur : sauvegarde non générée !'); ?>",message_title="<?php echo helper::translate('Sauvegarder'); ?>";$.ajax({type:"POST",url:url,data:$("form").serialize(),success:function(data){$("body, .button").css("cursor","default"),core.alert(message_success)},error:function(data){$("body, .button").css("cursor","default"),core.alert(message_error)},complete:function(){$("#configBackupSubmit").removeClass("disabled").prop("disabled",!1),$("#configBackupSubmit").removeClass("uniqueSubmission").prop("uniqueSubmission",!1),$("#configBackupSubmit span").removeClass("zwiico-spin animate-spin"),$("#configBackupSubmit span").addClass("zwiico-check zwiico-margin-right").text(message_title)}})})),$("#configBackupSubmit").on("click",(function(){if($("input[name=configBackupOption]").is(":checked")){var message_warning="<?php echo helper::translate('La sauvegarde des fichiers peut prendre du temps. Continuer ?'); ?>";return core.confirm(message_warning,(function(){$("body, .button").css("cursor","wait"),$("form#configBackupForm").submit()}))}}))}));
|
$(document).ready((function(){$("#configBackupForm").submit((function(e){e.preventDefault();var url="<?php echo helper::baseUrl() . $this->getUrl(0); ?>/backup",message_success="<?php echo helper::translate('Sauvegarde générée avec succès'); ?>",message_error="<?php echo helper::translate('Erreur : sauvegarde non générée !'); ?>",message_title="<?php echo helper::translate('Sauvegarder'); ?>";$.ajax({type:"POST",url:url,data:$("form").serialize(),success:function(data){$("body, .button").css("cursor","default"),core.alert(message_success)},error:function(data){$("body, .button").css("cursor","default"),core.alert(message_error)},complete:function(){$("#configBackupSubmit").removeClass("disabled").prop("disabled",!1),$("#configBackupSubmit").removeClass("uniqueSubmission").prop("uniqueSubmission",!1),$("#configBackupSubmit span").removeClass("zwiico-spin animate-spin"),$("#configBackupSubmit span").addClass("zwiico-check zwiico-margin-right").text(message_title)}})})),$("#configBackupSubmit").on("click",(function(){if($("input[name=configBackupOption]").is(":checked")){var message_warning="<?php echo helper::translate('La sauvegarde des fichiers peut prendre du temps. Continuer ?'); ?>";return core.confirm(message_warning,(function(){$("body, .button").css("cursor","wait"),$("form#configBackupForm").submit()}))}}))}));
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
@ -53,3 +53,15 @@
|
|||||||
.activeButton {
|
.activeButton {
|
||||||
background-color: #00BFFF;
|
background-color: #00BFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.greenInfo, .redInfo {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.greenInfo {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
.redInfo {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
File diff suppressed because one or more lines are too long
@ -7,16 +7,13 @@
|
|||||||
'value' => template::ico('home')
|
'value' => template::ico('home')
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col1">
|
<div class="col2 offset7">
|
||||||
<?php /**echo template::button('configHelp', [
|
<?php echo template::button('configLocaleButton', [
|
||||||
'class' => 'buttonHelp',
|
'value' => 'Identité',
|
||||||
'href' => 'https://doc.zwiicms.fr/configuration-du-site',
|
'href' => helper::baseUrl() . 'language/site'
|
||||||
'target' => '_blank',
|
]); ?>
|
||||||
'value' => template::ico('help'),
|
|
||||||
'help' => 'Consulter l\'aide en ligne'
|
|
||||||
]); */ ?>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col2 offset8">
|
<div class="col2">
|
||||||
<?php echo template::submit('Submit'); ?>
|
<?php echo template::submit('Submit'); ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -24,21 +21,24 @@
|
|||||||
<div class="tab">
|
<div class="tab">
|
||||||
<?php echo template::button('configSetupButton', [
|
<?php echo template::button('configSetupButton', [
|
||||||
'value' => 'Configuration',
|
'value' => 'Configuration',
|
||||||
'class' => 'buttonTab'
|
'class' => 'buttonTab',
|
||||||
|
//'href' => helper::baseUrl() . 'config/register/setup'
|
||||||
]); ?>
|
]); ?>
|
||||||
<?php echo template::button('configSocialButton', [
|
<?php echo template::button('configSocialButton', [
|
||||||
'value' => 'Référencement',
|
'value' => 'Référencement',
|
||||||
'class' => 'buttonTab'
|
'class' => 'buttonTab',
|
||||||
|
//'href' => helper::baseUrl() . 'config/register/social'
|
||||||
]); ?>
|
]); ?>
|
||||||
|
|
||||||
<?php echo template::button('configConnectButton', [
|
<?php echo template::button('configConnectButton', [
|
||||||
'value' => 'Connexion',
|
'value' => 'Connexion',
|
||||||
'class' => 'buttonTab'
|
'class' => 'buttonTab',
|
||||||
|
//'href' => helper::baseUrl() . 'config/register/connect'
|
||||||
]); ?>
|
]); ?>
|
||||||
|
|
||||||
<?php echo template::button('configNetworkButton', [
|
<?php echo template::button('configNetworkButton', [
|
||||||
'value' => 'Réseau',
|
'value' => 'Réseau',
|
||||||
'class' => 'buttonTab'
|
'class' => 'buttonTab',
|
||||||
|
//'href' => helper::baseUrl() . 'config/register/network'
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* file that was distributed with this source code.
|
* file that was distributed with this source code.
|
||||||
*
|
*
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
'value' => template::ico('left')
|
'value' => template::ico('left')
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col2 offset8">
|
<div class="col2 offset9">
|
||||||
<?php echo template::submit('configRestoreSubmit', [
|
<?php echo template::submit('configRestoreSubmit', [
|
||||||
'value' => 'Restaurer',
|
'value' => 'Restaurer',
|
||||||
'uniqueSubmission' => true,
|
'uniqueSubmission' => true,
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
'value' => template::ico('left')
|
'value' => template::ico('left')
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col2 offset8">
|
<div class="col2 offset9">
|
||||||
<?php echo template::submit('configManageSubmit', [
|
<?php echo template::submit('configManageSubmit', [
|
||||||
'value' => 'Valider',
|
'value' => 'Valider',
|
||||||
'ico' => 'check'
|
'ico' => 'check'
|
||||||
|
@ -3,12 +3,6 @@
|
|||||||
<div class="col12">
|
<div class="col12">
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<h4><?php echo helper::translate('Paramètres'); ?>
|
<h4><?php echo helper::translate('Paramètres'); ?>
|
||||||
<!--<span id="setupHelpButton" class="helpDisplayButton">
|
|
||||||
<a href="https://doc.zwiicms.fr/parametres" target="_blank" title="Cliquer pour consulter l'aide en ligne">
|
|
||||||
<?php //echo template::ico('help', ['margin' => 'left']);
|
|
||||||
?>
|
|
||||||
</a>-->
|
|
||||||
</span>
|
|
||||||
</h4>
|
</h4>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col4">
|
<div class="col4">
|
||||||
@ -17,7 +11,8 @@
|
|||||||
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
|
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
|
||||||
'help' => 'Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.',
|
'help' => 'Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.',
|
||||||
'label' => 'Favicon',
|
'label' => 'Favicon',
|
||||||
'value' => $this->getData(['config', 'favicon'])
|
'value' => $this->getData(['config', 'favicon']),
|
||||||
|
'folder' => $this->getData(['config', 'favicon']) ? dirname($this->getData(['config', 'favicon'])) : ''
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col4">
|
<div class="col4">
|
||||||
@ -26,7 +21,8 @@
|
|||||||
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
|
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
|
||||||
'help' => 'Sélectionnez une icône adaptée à un thème sombre.<br>Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.',
|
'help' => 'Sélectionnez une icône adaptée à un thème sombre.<br>Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.',
|
||||||
'label' => 'Favicon thème sombre',
|
'label' => 'Favicon thème sombre',
|
||||||
'value' => $this->getData(['config', 'faviconDark'])
|
'value' => $this->getData(['config', 'faviconDark']),
|
||||||
|
'folder' => $this->getData(['config', 'faviconDark']) ? dirname($this->getData(['config', 'faviconDark'])) : ''
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col4">
|
<div class="col4">
|
||||||
@ -48,7 +44,7 @@
|
|||||||
<?php echo template::checkbox('configRewrite', true, 'Apache URL intelligentes', [
|
<?php echo template::checkbox('configRewrite', true, 'Apache URL intelligentes', [
|
||||||
'checked' => helper::checkRewrite(),
|
'checked' => helper::checkRewrite(),
|
||||||
'help' => 'Supprime le point d\'interrogation dans les URL, l\'option est indisponible avec les autres serveurs Web',
|
'help' => 'Supprime le point d\'interrogation dans les URL, l\'option est indisponible avec les autres serveurs Web',
|
||||||
'disabled' => stripos($_SERVER["SERVER_SOFTWARE"], 'nginx')
|
'disabled' => stripos($_SERVER["SERVER_SOFTWARE"], 'Apache') === false and $module->isModRewriteEnabled()
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -59,12 +55,6 @@
|
|||||||
<div class="col12">
|
<div class="col12">
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<h4><?php echo helper::translate('Mise à jour automatisée'); ?>
|
<h4><?php echo helper::translate('Mise à jour automatisée'); ?>
|
||||||
<!--<span id="updateHelpButton" class="helpDisplayButton">
|
|
||||||
<a href="https://doc.zwiicms.fr/mise-a-jour" target="_blank" title="Cliquer pour consulter l'aide en ligne">
|
|
||||||
<?php //echo template::ico('help', ['margin' => 'left']);
|
|
||||||
?>
|
|
||||||
</a>
|
|
||||||
</span>-->
|
|
||||||
</h4>
|
</h4>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col6">
|
<div class="col6">
|
||||||
@ -89,11 +79,11 @@
|
|||||||
'selected' => $this->getData(['config', 'autoUpdateDelay']),
|
'selected' => $this->getData(['config', 'autoUpdateDelay']),
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col3 offset2 verticalAlignBottom">
|
<div class="col3 offset1 verticalAlignBottom">
|
||||||
<pre>Version installée : <strong><?php echo common::ZWII_VERSION; ?></strong></pre>
|
<pre>Version installée : <strong><?php echo common::ZWII_VERSION; ?></strong></pre>
|
||||||
<pre>Version en ligne : <strong><?php echo helper::getOnlineVersion(common::ZWII_UPDATE_CHANNEL); ?></strong></pre>
|
<pre>Version en ligne : <strong><?php echo helper::getOnlineVersion(common::ZWII_UPDATE_CHANNEL); ?></strong></pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="col3 verticalAlignBottom">
|
<div class="col3 offset2 verticalAlignBottom">
|
||||||
<?php echo template::button('configUpdateForced', [
|
<?php echo template::button('configUpdateForced', [
|
||||||
'ico' => 'download-cloud',
|
'ico' => 'download-cloud',
|
||||||
'href' => helper::baseUrl() . 'install/update',
|
'href' => helper::baseUrl() . 'install/update',
|
||||||
@ -109,12 +99,6 @@
|
|||||||
<div class="col12">
|
<div class="col12">
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<h4><?php echo helper::translate('Maintenance'); ?>
|
<h4><?php echo helper::translate('Maintenance'); ?>
|
||||||
<!--<span id="maintenanceHelpButton" class="helpDisplayButton">
|
|
||||||
<a href="https://doc.zwiicms.fr/mode-maintenance" target="_blank" title="Cliquer pour consulter l'aide en ligne">
|
|
||||||
<?php //echo template::ico('help', ['margin' => 'left']);
|
|
||||||
?>
|
|
||||||
</a>
|
|
||||||
</span>-->
|
|
||||||
</h4>
|
</h4>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col6">
|
<div class="col6">
|
||||||
@ -169,12 +153,6 @@
|
|||||||
<div class="col12">
|
<div class="col12">
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<h4><?php echo helper::translate('Scripts externes'); ?>
|
<h4><?php echo helper::translate('Scripts externes'); ?>
|
||||||
<!--<span id="specialeHelpButton" class="helpDisplayButton">
|
|
||||||
<a href="https://doc.zwiicms.fr/scripts-externes" target="_blank" title="Cliquer pour consulter l'aide en ligne">
|
|
||||||
<?php //echo template::ico('help', ['margin' => 'left']);
|
|
||||||
?>
|
|
||||||
</a>
|
|
||||||
</span>-->
|
|
||||||
</h4>
|
</h4>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col4 offset1 verticalAlignBottom">
|
<div class="col4 offset1 verticalAlignBottom">
|
||||||
@ -198,13 +176,21 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col12">
|
<div class="col12">
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<h4>ZwiiCMS <a href="https://zwiicms.fr" target="_blank">Site Web</a> - <a href="https://forum.zwiicms.fr" target="_blank">Forum</a>
|
<h4>ZwiiCMS <a href="https://zwiicms.fr" target="_blank">Site Web</a> - <a
|
||||||
|
href="https://forum.zwiicms.fr" target="_blank">Forum</a>
|
||||||
</h4>
|
</h4>
|
||||||
<div class="row textAlignCenter">
|
<div class="row textAlignCenter">
|
||||||
<div class="col12">
|
<div class="col12">
|
||||||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png" /></a>
|
<a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/4.0/"><img
|
||||||
<p>Cette œuvre est mise à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Pas de Modification 4.0 International.</a></p>
|
alt="Licence Creative Commons" style="border-width:0"
|
||||||
<p>Pour voir une copie de cette licence, visitez http://creativecommons.org/licenses/by-nc-nd/4.0/ ou écrivez à Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.</p>
|
src="https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png" /></a>
|
||||||
|
<p>Cette œuvre est mise à disposition selon les termes de la <a rel="license"
|
||||||
|
href="http://creativecommons.org/licenses/by-nc-nd/4.0/">Licence Creative Commons
|
||||||
|
Attribution - Pas d'Utilisation Commerciale - Pas de Modification 4.0
|
||||||
|
International.</a></p>
|
||||||
|
<p>Pour voir une copie de cette licence, visitez
|
||||||
|
http://creativecommons.org/licenses/by-nc-nd/4.0/ ou écrivez à Creative Commons, PO Box
|
||||||
|
1866, Mountain View, CA 94042, USA.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -4,40 +4,50 @@
|
|||||||
<div class="block">
|
<div class="block">
|
||||||
<h4>
|
<h4>
|
||||||
<?php echo helper::translate('Capture d\'écran Open Graph'); ?>
|
<?php echo helper::translate('Capture d\'écran Open Graph'); ?>
|
||||||
<!--<span id="specialeHelpButton" class="helpDisplayButton">
|
|
||||||
<a href="https://doc.zwiicms.fr/referencement" target="_blank" title="Cliquer pour consulter l'aide en ligne">
|
|
||||||
<?php //echo template::ico('help', ['margin' => 'left']); ?>
|
|
||||||
</a>
|
|
||||||
</span>-->
|
|
||||||
</h4>
|
</h4>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col7">
|
<div class="col6">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col12">
|
<div class="col12">
|
||||||
<?php echo template::text('seoKeyApi', [
|
<?php echo template::file('seoOpenGraphImage', [
|
||||||
'label' => 'Clé de l\'API <a href="https://app.screenshotapi.net/" target="_blank">ScreenShotApi</a>',
|
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
|
||||||
'value' => $this->getData(['config', 'seo', 'keyApi']),
|
'label' => 'Image Open Graph',
|
||||||
'help' => 'Créez un compte gratuit, recopier la clé , puis valider le formulaire avant de cliquer sur le bouton de génération'
|
'value' => $this->getData(['config', 'seo', 'openGraphImage']),
|
||||||
|
'folder' => $this->getData(['config', 'seo', 'openGraphImage']) ? dirname($this->getData(['config', 'seo', 'openGraphImage'])) : '',
|
||||||
|
'type' => 1,
|
||||||
|
'help' => sprintf('%s : JPG - PNG<br />', helper::translate('Format')) .
|
||||||
|
sprintf('%s : 1200 x 630 pixels<br />', helper::translate('Dimensions minimales')) .
|
||||||
|
sprintf('%s : 1.91:1<br />', helper::translate('Ratio')) .
|
||||||
|
sprintf('%s : %s, %s<br />', helper::translate('Taille maximale du fichier'), helper::translate('5 Mo pour les images JPEG'), helper::translate('1 Mo pour les images PNG'))
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col6 offset3">
|
<div class="col10 textAlignCenter">
|
||||||
<?php echo template::button('socialMetaImage', [
|
<?php if( !empty($module::$imageOpenGraph['type']) ): ?>
|
||||||
'href' => helper::baseUrl() . 'config/configMetaImage',
|
<p>
|
||||||
'value' => 'Générer une capture Open Graph'
|
<?php echo sprintf('%s : <span id="screenType">%s</span>', helper::translate('Format'), $module::$imageOpenGraph['type']); ?>
|
||||||
]); ?>
|
</p>
|
||||||
|
<p>
|
||||||
|
<?php echo sprintf('%s : <span id="screenWide">%s</span> x <span id="screenHeight">%s</span> pixels', helper::translate('Dimensions minimales'), $module::$imageOpenGraph['wide'], $module::$imageOpenGraph['height'] ); ?>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<?php echo sprintf('%s : <span id="screenRatio">%s</span><span id="screenFract">:1</span>' , helper::translate('Ratio'), round($module::$imageOpenGraph['ratio'], 2)); ?>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<?php echo sprintf('%s : <span id="screenWeight">%s</span>', helper::translate('Poids'), $module::$imageOpenGraph['size']); ?>
|
||||||
|
</p>
|
||||||
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col5">
|
<div class="col6">
|
||||||
<?php if (file_exists(self::FILE_DIR . 'source/screenshot.jpg')): ?>
|
<?php if (
|
||||||
<div class="row">
|
$this->getData(['config', 'seo', 'openGraphImage']) &&
|
||||||
<div class="col8 offset2 textAlignCenter">
|
file_exists(self::FILE_DIR . 'source/' . $this->getData(['config', 'seo', 'openGraphImage']))
|
||||||
<img src="<?php echo helper::baseUrl(false) . self::FILE_DIR . 'source/screenshot.jpg'; ?>"
|
): ?>
|
||||||
data-tippy-content="Cette capture d'écran est nécessaire aux partages sur les réseaux sociaux. Elle est régénérée lorsque le fichier 'screenshot.jpg' est effacé du gestionnaire de fichiers." />
|
<img
|
||||||
</div>
|
src="<?php echo self::FILE_DIR . 'source/' . $this->getData(['config', 'seo', 'openGraphImage']); ?>" />
|
||||||
</div>
|
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -70,12 +80,6 @@
|
|||||||
<div class="col12">
|
<div class="col12">
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<h4>
|
<h4>
|
||||||
<?php echo helper::translate('Réseaux sociaux'); ?>
|
|
||||||
<!--<span id="specialeHelpButton" class="helpDisplayButton">
|
|
||||||
<a href="https://doc.zwiicms.fr/reseaux-sociaux" target="_blank" title="Cliquer pour consulter l'aide en ligne">
|
|
||||||
<?php //echo template::ico('help', ['margin' => 'left']); ?>
|
|
||||||
</a>
|
|
||||||
</span>-->
|
|
||||||
</h4>
|
</h4>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col3">
|
<div class="col3">
|
||||||
|
50
core/module/dashboard/dashboard.php
Normal file
50
core/module/dashboard/dashboard.php
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This file is part of Zwii.
|
||||||
|
* For full copyright and license information, please see the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*
|
||||||
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
|
* @link http://zwiicms.fr/
|
||||||
|
*/
|
||||||
|
|
||||||
|
class dashboard extends common
|
||||||
|
{
|
||||||
|
|
||||||
|
public static $actions = [
|
||||||
|
'index' => self::GROUP_ADMIN,
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static $infos = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dashboard
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
|
||||||
|
self::$infos['webserver'] = $_SERVER['SERVER_SOFTWARE'];
|
||||||
|
self::$infos['php']['version'] = phpversion();
|
||||||
|
self::$infos['php']['extension'] = get_loaded_extensions();
|
||||||
|
|
||||||
|
self::$infos['system']['memory'] = memory_get_usage() . ' octets';
|
||||||
|
self::$infos['system']['peek'] = 'Pic de mémoire utilisée : ' . memory_get_peak_usage() . ' octets';
|
||||||
|
|
||||||
|
$loadAverage = sys_getloadavg();
|
||||||
|
self::$infos['system']['charge'] = 'Charge moyenne (1 min / 5 min / 15 min) : ' . implode(' / ', $loadAverage) . '</P>';
|
||||||
|
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'title' => helper::translate('Tableau de bord'),
|
||||||
|
'view' => 'index'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
54
core/module/dashboard/view/index/index.php
Normal file
54
core/module/dashboard/view/index/index.php
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<?php echo template::formOpen('dashboard'); ?>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col1">
|
||||||
|
<?php echo template::button('dashboardFormBack', [
|
||||||
|
'class' => 'buttonGrey',
|
||||||
|
'href' => helper::baseUrl(false),
|
||||||
|
'value' => template::ico('home')
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col12">
|
||||||
|
<div class="block">
|
||||||
|
<h4>
|
||||||
|
<?php echo helper::translate('Système'); ?>
|
||||||
|
</h4>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col6">
|
||||||
|
<p>
|
||||||
|
<?php echo helper::translate('Serveur Web'); ?>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<?php echo $module::$infos['webserver']; ?>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="col6">
|
||||||
|
<p>
|
||||||
|
<?php echo helper::translate('PHP') . ' ' . $module::$infos['php']['version']; ?>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<?php echo implode(' - ', $module::$infos['php']['extension']); ?>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col12">
|
||||||
|
<p>
|
||||||
|
<?php echo helper::translate('Mémoire'); ?>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<?php echo $module::$infos['system']['memory']; ?>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<?php echo $module::$infos['system']['charge']; ?>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<?php echo $module::$infos['system']['peek']; ?>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -8,7 +8,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
@ -30,8 +30,7 @@ class install extends common
|
|||||||
'http://' => 'HTTP'
|
'http://' => 'HTTP'
|
||||||
];
|
];
|
||||||
|
|
||||||
// Thèmes proposés à l'installation
|
public static $updateButtonText = 'Réinstaller';
|
||||||
public static $themes = [];
|
|
||||||
|
|
||||||
public static $newVersion;
|
public static $newVersion;
|
||||||
|
|
||||||
@ -52,7 +51,10 @@ class install extends common
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
//$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
|
|
||||||
$lang = $this->getInput('installLanguage');
|
$lang = $this->getInput('installLanguage');
|
||||||
// Pour la suite de l'installation
|
// Pour la suite de l'installation
|
||||||
@ -68,14 +70,14 @@ class install extends common
|
|||||||
|
|
||||||
// Liste des langues UI disponibles
|
// Liste des langues UI disponibles
|
||||||
if (is_dir(self::I18N_DIR)) {
|
if (is_dir(self::I18N_DIR)) {
|
||||||
foreach ($this->getData(['languages']) as $lang => $value) {
|
foreach ($this->getData(['language']) as $lang => $value) {
|
||||||
self::$i18nFiles[$lang] = self::$languages[$lang];
|
self::$i18nFiles[$lang] = self::$languages[$lang];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'display' => self::DISPLAY_LAYOUT_LIGHT,
|
'display' => self::DISPLAY_LAYOUT_LIGHT,
|
||||||
'title' => helper::translate('Installation'),
|
'title' => helper::translate('ZwiiCMS Installation'),
|
||||||
'view' => 'index'
|
'view' => 'index'
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@ -95,7 +97,10 @@ class install extends common
|
|||||||
// Accès autorisé
|
// Accès autorisé
|
||||||
else {
|
else {
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
//$this->getUser('permission', __CLASS__, __FUNCTION__) !== true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
|
|
||||||
$success = true;
|
$success = true;
|
||||||
|
|
||||||
@ -110,29 +115,51 @@ class install extends common
|
|||||||
$userMail = $this->getInput('installMail', helper::FILTER_MAIL, true);
|
$userMail = $this->getInput('installMail', helper::FILTER_MAIL, true);
|
||||||
$userId = $this->getInput('installId', helper::FILTER_ID, true);
|
$userId = $this->getInput('installId', helper::FILTER_ID, true);
|
||||||
|
|
||||||
|
// Validation de la langue transmise
|
||||||
|
self::$i18nUI = $_SESSION['ZWII_UI'];
|
||||||
|
self::$i18nUI = array_key_exists(self::$i18nUI, self::$languages) ? self::$i18nUI : 'fr_FR';
|
||||||
|
// par défaut le contenu est la langue d'installation
|
||||||
|
$_SESSION['ZWII_SITE_CONTENT'] = self::$i18nUI;
|
||||||
|
|
||||||
|
// Création du dossier de langue avec le marqueur de langue par défaut
|
||||||
|
if (!is_dir(self::DATA_DIR . $_SESSION['ZWII_SITE_CONTENT'])) {
|
||||||
|
mkdir(self::DATA_DIR . $_SESSION['ZWII_SITE_CONTENT']);
|
||||||
|
touch(self::DATA_DIR . $_SESSION['ZWII_SITE_CONTENT'] . '/.default');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Installation du site de test
|
||||||
|
if (
|
||||||
|
$this->getInput('installDefaultData', helper::FILTER_BOOLEAN) === false
|
||||||
|
&& $_SESSION['ZWII_SITE_CONTENT'] === 'fr_FR'
|
||||||
|
) {
|
||||||
|
$sample = true;
|
||||||
|
}
|
||||||
|
$this->initData('page', $_SESSION['ZWII_SITE_CONTENT'], $sample);
|
||||||
|
$this->initData('module', $_SESSION['ZWII_SITE_CONTENT'], $sample);
|
||||||
|
$this->initData('locale', $_SESSION['ZWII_SITE_CONTENT'], $sample);
|
||||||
|
|
||||||
// Création de l'utilisateur si les données sont complétées.
|
// Création de l'utilisateur si les données sont complétées.
|
||||||
// success retour de l'enregistrement des données
|
// success retour de l'enregistrement des données
|
||||||
$success = $this->setData([
|
$this->setData([
|
||||||
'user',
|
'user',
|
||||||
$userId,
|
$userId,
|
||||||
[
|
[
|
||||||
'firstname' => $userFirstname,
|
'firstname' => $userFirstname,
|
||||||
'forgot' => 0,
|
'forgot' => 0,
|
||||||
'group' => self::GROUP_ADMIN,
|
'group' => self::GROUP_ADMIN,
|
||||||
|
'profil' => 0,
|
||||||
'lastname' => $userLastname,
|
'lastname' => $userLastname,
|
||||||
'pseudo' => 'Admin',
|
'pseudo' => 'Admin',
|
||||||
'signature' => 1,
|
'signature' => 1,
|
||||||
'mail' => $userMail,
|
'mail' => $userMail,
|
||||||
'password' => $this->getInput('installPassword', helper::FILTER_PASSWORD, true),
|
'password' => $this->getInput('installPassword', helper::FILTER_PASSWORD, true),
|
||||||
'language' => self::$i18nUI
|
'language' => $_SESSION['ZWII_SITE_CONTENT']
|
||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// Compte créé, envoi du mail et création des données du site
|
|
||||||
if ($success) { // Formulaire complété envoi du mail
|
|
||||||
// Envoie le mail
|
// Envoie le mail
|
||||||
// Sent contient true si réussite sinon code erreur d'envoi en clair
|
// Sent contient true si réussite sinon code erreur d'envoi en clair
|
||||||
$sent = $this->sendMail(
|
$this->sendMail(
|
||||||
$userMail,
|
$userMail,
|
||||||
'Installation de votre site',
|
'Installation de votre site',
|
||||||
'Bonjour' . ' <strong>' . $userFirstname . ' ' . $userLastname . '</strong>,<br><br>' .
|
'Bonjour' . ' <strong>' . $userFirstname . ' ' . $userLastname . '</strong>,<br><br>' .
|
||||||
@ -140,47 +167,21 @@ class install extends common
|
|||||||
'<strong>URL du site :</strong> <a href="' . helper::baseUrl(false) . '" target="_blank">' . helper::baseUrl(false) . '</a><br>' .
|
'<strong>URL du site :</strong> <a href="' . helper::baseUrl(false) . '" target="_blank">' . helper::baseUrl(false) . '</a><br>' .
|
||||||
'<strong>Identifiant du compte :</strong> ' . $this->getInput('installId') . '<br>',
|
'<strong>Identifiant du compte :</strong> ' . $this->getInput('installId') . '<br>',
|
||||||
null,
|
null,
|
||||||
$this->getData(['config', 'smtp', 'from']),
|
'no-reply@localhost'
|
||||||
);
|
);
|
||||||
|
|
||||||
// Validation de la langue transmise
|
// Nettoyage fr par défaut
|
||||||
self::$i18nUI = $_SESSION['ZWII_UI'];
|
|
||||||
self::$i18nUI = array_key_exists(self::$i18nUI, self::$languages) ? self::$i18nUI : 'fr_FR';
|
|
||||||
|
|
||||||
// par défaut le contenu est la langue d'installation
|
|
||||||
self::$i18nContent = self::$i18nUI;
|
|
||||||
$_SESSION['ZWII_CONTENT'] = self::$i18nContent;
|
|
||||||
|
|
||||||
// Création du dossier de langue avec le marqueur de langue par défaut
|
|
||||||
if (!is_dir(self::DATA_DIR . self::$i18nContent)) {
|
|
||||||
mkdir(self::DATA_DIR . self::$i18nContent);
|
|
||||||
touch(self::DATA_DIR . self::$i18nContent . '/.default');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Installation du site de test
|
|
||||||
if (
|
if (
|
||||||
$this->getInput('installDefaultData', helper::FILTER_BOOLEAN) === false
|
$_SESSION['ZWII_SITE_CONTENT'] !== 'fr_FR'
|
||||||
&& self::$i18nContent === 'fr_FR'
|
|
||||||
) {
|
) {
|
||||||
$this->initData('page', self::$i18nContent, true);
|
|
||||||
$this->initData('module', self::$i18nContent, true);
|
|
||||||
$this->setData(['module', 'blog', 'posts', 'mon-premier-article', 'userId', $userId]);
|
|
||||||
$this->setData(['module', 'blog', 'posts', 'mon-deuxieme-article', 'userId', $userId]);
|
|
||||||
$this->setData(['module', 'blog', 'posts', 'mon-troisieme-article', 'userId', $userId]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Jeu réduit pour les pages étrangères
|
|
||||||
if (self::$i18nContent !== 'fr_FR') {
|
|
||||||
$this->initData('page', self::$i18nContent, false);
|
|
||||||
$this->initData('module', self::$i18nContent, false);
|
|
||||||
if (is_dir(self::DATA_DIR . 'fr_FR'))
|
if (is_dir(self::DATA_DIR . 'fr_FR'))
|
||||||
$this->removeDir(self::DATA_DIR . 'fr_FR');
|
$this->deleteDir(self::DATA_DIR . 'fr_FR');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sauvegarder la configuration du Proxy
|
// Sauvegarder la configuration du Proxy
|
||||||
$this->setData(['config', 'proxyType', $this->getInput('installProxyType')]);
|
$this->setData(['config', 'proxyType', $this->getInput('installProxyType')], false);
|
||||||
$this->setData(['config', 'proxyUrl', $this->getInput('installProxyUrl')]);
|
$this->setData(['config', 'proxyUrl', $this->getInput('installProxyUrl')], false);
|
||||||
$this->setData(['config', 'proxyPort', $this->getInput('installProxyPort', helper::FILTER_INT)]);
|
$this->setData(['config', 'proxyPort', $this->getInput('installProxyPort', helper::FILTER_INT)], false);
|
||||||
|
|
||||||
// Images exemples livrées dans tous les cas
|
// Images exemples livrées dans tous les cas
|
||||||
try {
|
try {
|
||||||
@ -205,54 +206,30 @@ class install extends common
|
|||||||
unlink(self::TEMP_DIR . 'files.tar');
|
unlink(self::TEMP_DIR . 'files.tar');
|
||||||
|
|
||||||
// Créer le dossier des fontes
|
// Créer le dossier des fontes
|
||||||
if (!is_dir(self::DATA_DIR . 'fonts')) {
|
if (!is_dir(self::DATA_DIR . 'font')) {
|
||||||
mkdir(self::DATA_DIR . 'fonts');
|
mkdir(self::DATA_DIR . 'font');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Installation du thème sélectionné
|
|
||||||
$dataThemes = json_decode(file_get_contents('core/module/install/ressource/themes/themes.json'), true);
|
|
||||||
$dataThemes = $dataThemes['themes'];
|
|
||||||
$themeFilename = $dataThemes[$this->getInput('installTheme', helper::FILTER_STRING_SHORT)]['filename'];
|
|
||||||
if ($themeFilename !== '') {
|
|
||||||
$theme = new theme;
|
|
||||||
$theme->import('core/module/install/ressource/themes/' . $themeFilename);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copie des thèmes dans les fichiers
|
|
||||||
if (!is_dir(self::FILE_DIR . 'source/theme')) {
|
|
||||||
mkdir(self::FILE_DIR . 'source/theme');
|
|
||||||
}
|
|
||||||
$this->copyDir('core/module/install/ressource/themes', self::FILE_DIR . 'source/theme');
|
|
||||||
unlink(self::FILE_DIR . 'source/theme/themes.json');
|
|
||||||
|
|
||||||
// Copie des langues de l'UI et génération de la base de données
|
// Copie des langues de l'UI et génération de la base de données
|
||||||
if (is_dir(self::I18N_DIR) === false) {
|
if (is_dir(self::I18N_DIR) === false) {
|
||||||
mkdir(self::I18N_DIR);
|
mkdir(self::I18N_DIR);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Créer la base de données des langues
|
// Créer la base de données des langues
|
||||||
copy('core/module/install/ressource/i18n/languages.json', self::DATA_DIR . 'languages.json');
|
|
||||||
$this->copyDir('core/module/install/ressource/i18n', self::I18N_DIR);
|
$this->copyDir('core/module/install/ressource/i18n', self::I18N_DIR);
|
||||||
unlink(self::I18N_DIR . 'languages.json');
|
|
||||||
|
|
||||||
// Fixe l'adresse from pour les envois d'email
|
// Fixe l'adresse from pour les envois d'email
|
||||||
$this->setData(['config', 'smtp', 'from', 'no-reply@' . str_replace('www.', '', $_SERVER['HTTP_HOST'])]);
|
$this->setData(['config', 'smtp', 'from', 'no-reply@' . str_replace('www.', '', $_SERVER['HTTP_HOST'])], false);
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl(),
|
'redirect' => helper::baseUrl(),
|
||||||
'notification' => $sent === true ? helper::translate('Installation terminée') : $sent,
|
'notification' => helper::translate('Installation terminée'),
|
||||||
'state' => ($sent === true && $success === true) ? true : null
|
'state' => true
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
// Force la sauvegarde
|
||||||
|
$this->saveDB('config');
|
||||||
// Affichage du formulaire
|
|
||||||
|
|
||||||
// Récupération de la liste des thèmes
|
|
||||||
$dataThemes = json_decode(file_get_contents('core/module/install/ressource/themes/themes.json'), true);
|
|
||||||
$dataThemes = $dataThemes['themes'];
|
|
||||||
self::$themes = helper::arrayColumn($dataThemes, 'name');
|
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
@ -268,6 +245,15 @@ class install extends common
|
|||||||
*/
|
*/
|
||||||
public function steps()
|
public function steps()
|
||||||
{
|
{
|
||||||
|
// Action interdite
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'access' => false
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
switch ($this->getInput('step', helper::FILTER_INT)) {
|
switch ($this->getInput('step', helper::FILTER_INT)) {
|
||||||
// Préparation
|
// Préparation
|
||||||
case 1:
|
case 1:
|
||||||
@ -280,46 +266,73 @@ class install extends common
|
|||||||
// Sauvegarde htaccess
|
// Sauvegarde htaccess
|
||||||
if ($this->getData(['config', 'autoUpdateHtaccess'])) {
|
if ($this->getData(['config', 'autoUpdateHtaccess'])) {
|
||||||
$success = copy('.htaccess', '.htaccess' . '.bak');
|
$success = copy('.htaccess', '.htaccess' . '.bak');
|
||||||
$message = 'Erreur de copie du fichier htaccess';
|
$message = $success ? '' : 'Erreur de copie du fichier htaccess';
|
||||||
}
|
}
|
||||||
// Nettoyage des fichiers d'installation précédents
|
// Nettoyage des fichiers d'installation précédents
|
||||||
if (file_exists(self::TEMP_DIR . 'update.tar.gz') && $success) {
|
if ($success && file_exists(self::TEMP_DIR . 'update.tar.gz')) {
|
||||||
$success = $success || unlink(self::TEMP_DIR . 'update.tar.gz');
|
$success = unlink(self::TEMP_DIR . 'update.tar.gz');
|
||||||
$message = 'Impossible d\'effacer la mise à jour précédente';
|
$message = $success ? '' : 'Impossible d\'effacer la mise à jour précédente';
|
||||||
}
|
}
|
||||||
if (file_exists(self::TEMP_DIR . 'update.tar') && $success) {
|
if ($success && file_exists(self::TEMP_DIR . 'update.tar')) {
|
||||||
$success = $success || unlink(self::TEMP_DIR . 'update.tar');
|
$success = unlink(self::TEMP_DIR . 'update.tar');
|
||||||
$message = 'Impossible d\'effacer la mise à jour précédente';
|
$message = $success ? '' : 'Impossible d\'effacer la mise à jour précédente';
|
||||||
|
}
|
||||||
|
// Sauvegarde le message dans le journal
|
||||||
|
if (!empty($message)) {
|
||||||
|
$this->saveLog($message);
|
||||||
}
|
}
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'display' => self::DISPLAY_JSON,
|
'display' => self::DISPLAY_JSON,
|
||||||
'content' => [
|
'content' => [
|
||||||
'success' => $success,
|
'success' => $success,
|
||||||
'data' => $success ? null : json_encode($message, JSON_UNESCAPED_UNICODE)
|
'data' => $message
|
||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
break;
|
break;
|
||||||
// Téléchargement
|
// Téléchargement
|
||||||
case 2:
|
case 2:
|
||||||
file_put_contents(self::TEMP_DIR . 'update.tar.gz', helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/update.tar.gz'));
|
$success = true;
|
||||||
|
$message = '';
|
||||||
|
$this->secure_file_put_contents(self::TEMP_DIR . 'update.tar.gz', helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/update.tar.gz'));
|
||||||
$md5origin = helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/update.md5');
|
$md5origin = helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/update.md5');
|
||||||
$md5origin = explode(' ', $md5origin);
|
$md5origin = explode(' ', $md5origin);
|
||||||
$md5target = md5_file(self::TEMP_DIR . 'update.tar.gz');
|
$md5target = md5_file(self::TEMP_DIR . 'update.tar.gz');
|
||||||
|
// Vérifier si les checksums correspondent
|
||||||
|
if ($md5origin[0] === $md5target) {
|
||||||
|
$success = true;
|
||||||
|
$message = "";
|
||||||
|
} else {
|
||||||
|
$success = false;
|
||||||
|
$message = 'Erreur de téléchargement ou de somme de contrôle';
|
||||||
|
if (file_exists(self::TEMP_DIR . 'update.tar.gz')) {
|
||||||
|
unlink(self::TEMP_DIR . 'update.tar.gz');
|
||||||
|
http_response_code(500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Sauvegarde le message dans le journal
|
||||||
|
if (!empty($message)) {
|
||||||
|
$this->saveLog($message);
|
||||||
|
}
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'display' => self::DISPLAY_JSON,
|
'display' => self::DISPLAY_JSON,
|
||||||
'content' => [
|
'content' => [
|
||||||
'success' => $md5origin[0] === $md5target,
|
'success' => $success,
|
||||||
'data' => $md5origin[0] === $md5target ? null : json_encode('Erreur de téléchargement ou de somme de contrôle', JSON_UNESCAPED_UNICODE)
|
'data' => $message
|
||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
break;
|
break;
|
||||||
// Installation
|
// Installation
|
||||||
case 3:
|
case 3:
|
||||||
$success = true;
|
$success = true;
|
||||||
|
$message = '';
|
||||||
|
|
||||||
// Check la réécriture d'URL avant d'écraser les fichiers
|
// Check la réécriture d'URL avant d'écraser les fichiers
|
||||||
$rewrite = helper::checkRewrite();
|
if (helper::checkRewrite()) {
|
||||||
|
touch(self::DATA_DIR . '.rewrite');
|
||||||
|
}
|
||||||
|
|
||||||
// Décompression et installation
|
// Décompression et installation
|
||||||
try {
|
try {
|
||||||
// Décompression dans le dossier de fichier temporaires
|
// Décompression dans le dossier de fichier temporaires
|
||||||
@ -328,8 +341,11 @@ class install extends common
|
|||||||
// Installation
|
// Installation
|
||||||
$pharData->extractTo(__DIR__ . '/../../../', null, true);
|
$pharData->extractTo(__DIR__ . '/../../../', null, true);
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
$success = $e->getMessage();
|
$message = $e->getMessage();
|
||||||
|
$success = false;
|
||||||
|
http_response_code(500);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Nettoyage du dossier
|
// Nettoyage du dossier
|
||||||
if (file_exists(self::TEMP_DIR . 'update.tar.gz')) {
|
if (file_exists(self::TEMP_DIR . 'update.tar.gz')) {
|
||||||
unlink(self::TEMP_DIR . 'update.tar.gz');
|
unlink(self::TEMP_DIR . 'update.tar.gz');
|
||||||
@ -337,12 +353,16 @@ class install extends common
|
|||||||
if (file_exists(self::TEMP_DIR . 'update.tar')) {
|
if (file_exists(self::TEMP_DIR . 'update.tar')) {
|
||||||
unlink(self::TEMP_DIR . 'update.tar');
|
unlink(self::TEMP_DIR . 'update.tar');
|
||||||
}
|
}
|
||||||
|
// Sauvegarde le message dans le journal
|
||||||
|
if (!empty($message)) {
|
||||||
|
$this->saveLog($message);
|
||||||
|
}
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'display' => self::DISPLAY_JSON,
|
'display' => self::DISPLAY_JSON,
|
||||||
'content' => [
|
'content' => [
|
||||||
'success' => $success,
|
'success' => $success,
|
||||||
'data' => $rewrite
|
'data' => $message,
|
||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
break;
|
break;
|
||||||
@ -350,9 +370,27 @@ class install extends common
|
|||||||
case 4:
|
case 4:
|
||||||
$success = true;
|
$success = true;
|
||||||
$message = '';
|
$message = '';
|
||||||
$rewrite = $this->getInput('data');
|
|
||||||
// Réécriture d'URL
|
/**
|
||||||
if ($rewrite === 'true') { // Ajout des lignes dans le .htaccess
|
* Restaure le fichier htaccess
|
||||||
|
*/
|
||||||
|
// Recopie htaccess
|
||||||
|
if (
|
||||||
|
$this->getData(['config', 'autoUpdateHtaccess']) === true
|
||||||
|
) {
|
||||||
|
// L'écraser avec le backup
|
||||||
|
$success = copy('.htaccess.bak', '.htaccess');
|
||||||
|
if ($success === false) {
|
||||||
|
$message = helper::translate('La copie de sauvegarde du fichier htaccess n\'a pas été restaurée !');
|
||||||
|
http_response_code(500);
|
||||||
|
}
|
||||||
|
// Effacer le backup
|
||||||
|
unlink('.htaccess.bak');
|
||||||
|
} else {
|
||||||
|
/**
|
||||||
|
* Restaure la réécriture d'URL
|
||||||
|
*/
|
||||||
|
if (file_exists(self::DATA_DIR . '.rewrite')) { // Ajout des lignes dans le .htaccess
|
||||||
$fileContent = file_get_contents('.htaccess');
|
$fileContent = file_get_contents('.htaccess');
|
||||||
$rewriteData = PHP_EOL .
|
$rewriteData = PHP_EOL .
|
||||||
'# URL rewriting' . PHP_EOL .
|
'# URL rewriting' . PHP_EOL .
|
||||||
@ -365,65 +403,80 @@ class install extends common
|
|||||||
'</IfModule>' . PHP_EOL .
|
'</IfModule>' . PHP_EOL .
|
||||||
'# URL rewriting' . PHP_EOL;
|
'# URL rewriting' . PHP_EOL;
|
||||||
$fileContent = str_replace('# URL rewriting', $rewriteData, $fileContent);
|
$fileContent = str_replace('# URL rewriting', $rewriteData, $fileContent);
|
||||||
$r = file_put_contents(
|
$success = $this->secure_file_put_contents(
|
||||||
'.htaccess',
|
'.htaccess',
|
||||||
$fileContent
|
$fileContent
|
||||||
);
|
);
|
||||||
$success = $r === false ? false : true;
|
unlink(self::DATA_DIR . '.rewrite');
|
||||||
$message = $r === false ? 'Le fichier htaccess n\'a pas été restauré' : null;
|
|
||||||
}
|
}
|
||||||
// Recopie htaccess
|
|
||||||
if (
|
|
||||||
$this->getData(['config', 'autoUpdateHtaccess']) &&
|
|
||||||
$success && file_exists('.htaccess.bak')
|
|
||||||
) {
|
|
||||||
// L'écraser avec le backup
|
|
||||||
$success = $success || copy('.htaccess.bak', '.htaccess');
|
|
||||||
// Effacer le backup
|
|
||||||
unlink('.htaccess.bak');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Met à jour les dictionnaires des langues depuis les modèles installés
|
* Met à jour les dictionnaires des langues depuis les nouveaux modèles installés
|
||||||
*/
|
*/
|
||||||
|
require_once('core/module/install/ressource/defaultdata.php');
|
||||||
|
$installedLanguages = $this->getData(['language']);
|
||||||
|
$defaultLanguages = init::$defaultData['language'];
|
||||||
|
foreach ($installedLanguages as $key => $value) {
|
||||||
|
|
||||||
// Langues installées
|
if (
|
||||||
$installedUI = $this->getData(['languages']);
|
isset($defaultLanguages[$key]['date']) &&
|
||||||
|
$defaultLanguages[$key]['date'] > $value['date'] &&
|
||||||
|
isset($defaultLanguages[$key]['version']) &&
|
||||||
|
$defaultLanguages[$key]['version'] >= $value['version']
|
||||||
|
|
||||||
// Langues disponibles avec la mise à jour
|
) {
|
||||||
$store = json_decode(file_get_contents('core/module/install/ressource/i18n/languages.json'), true);
|
copy('core/module/install/ressource/i18n/' . $key . '.json', self::I18N_DIR . $key . '.json');
|
||||||
$store = $store['languages'];
|
$this->setData(['language', $key, $defaultLanguages[$key]]);
|
||||||
|
|
||||||
foreach ($installedUI as $key => $value) {
|
|
||||||
if ($store[$key]['version'] > $value['version']) {
|
|
||||||
$this->setData(['languages', $key, $store[$key]]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Sauvegarde le message dans le journal
|
||||||
|
if (!empty($message)) {
|
||||||
|
$this->saveLog($message);
|
||||||
|
}
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'display' => self::DISPLAY_JSON,
|
'display' => self::DISPLAY_JSON,
|
||||||
'content' => [
|
'content' => [
|
||||||
'success' => $success,
|
'success' => $success,
|
||||||
'data' => json_encode($message, JSON_UNESCAPED_UNICODE)
|
'data' => $message
|
||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mise à jour
|
* Mise à jour
|
||||||
*/
|
*/
|
||||||
public function update()
|
public function update()
|
||||||
{
|
{
|
||||||
|
// Action interdite
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'access' => false
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
// Nouvelle version
|
// Nouvelle version
|
||||||
self::$newVersion = helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/version');
|
self::$newVersion = helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/version');
|
||||||
|
|
||||||
|
// Variable de version
|
||||||
|
if (helper::checkNewVersion(common::ZWII_UPDATE_CHANNEL)) {
|
||||||
|
self::$updateButtonText = helper::translate('Mise à jour');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'display' => self::DISPLAY_LAYOUT_LIGHT,
|
'display' => self::DISPLAY_LAYOUT_LIGHT,
|
||||||
'title' => helper::translate('Mise à jour'),
|
'title' => helper::translate(self::$updateButtonText),
|
||||||
'view' => 'update'
|
'view' => 'update'
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -26,10 +26,11 @@ class init extends common
|
|||||||
'proxyType' => 'tcp://',
|
'proxyType' => 'tcp://',
|
||||||
'smtp' => [
|
'smtp' => [
|
||||||
'enable' => false,
|
'enable' => false,
|
||||||
|
'from'=> 'no-reply@localhost'
|
||||||
],
|
],
|
||||||
'seo' => [
|
'seo' => [
|
||||||
'robots' => true,
|
'robots' => true,
|
||||||
'keyApi' => 'XXXXXXX-XXXXXXX-XXXXXXX-XXXXXXX'
|
'openGraphImage' => 'screenshot.png'
|
||||||
],
|
],
|
||||||
'connect' => [
|
'connect' => [
|
||||||
'timeout' => 600,
|
'timeout' => 600,
|
||||||
@ -45,34 +46,13 @@ class init extends common
|
|||||||
]
|
]
|
||||||
],
|
],
|
||||||
'core' => [
|
'core' => [
|
||||||
'dataVersion' => 12301,
|
'dataVersion' => 13000,
|
||||||
'lastBackup' => 0,
|
'lastBackup' => 0,
|
||||||
'lastClearTmp' => 0,
|
'lastClearTmp' => 0,
|
||||||
'lastAutoUpdate' => 0,
|
'lastAutoUpdate' => 0,
|
||||||
'updateAvailable' => false
|
'updateAvailable' => false
|
||||||
],
|
],
|
||||||
'locale' => [
|
'font' => [
|
||||||
'homePageId' => 'accueil',
|
|
||||||
'page302' => 'none',
|
|
||||||
'page403' => 'none',
|
|
||||||
'page404' => 'none',
|
|
||||||
'legalPageId' => 'none',
|
|
||||||
'searchPageId' => 'none',
|
|
||||||
'poweredPageLabel'=> 'Motorisé par',
|
|
||||||
'searchPageLabel' => 'Rechercher',
|
|
||||||
'sitemapPageLabel' => 'Plan du site',
|
|
||||||
'legalPageLabel' => 'Mentions légales',
|
|
||||||
'metaDescription' => 'Zwii est un CMS sans base de données qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation.',
|
|
||||||
'title' => 'Votre site en quelques clics !',
|
|
||||||
'cookies' => [
|
|
||||||
'mainLabel' => 'Ce site utilise des cookies nécessaires à son fonctionnement, ils permettent de fluidifier son fonctionnement par exemple en mémorisant les données de connexion, la langue que vous avez choisie ou la validation de ce message.',
|
|
||||||
'titleLabel' => 'Cookies essentiels',
|
|
||||||
'linkLegalLabel' => 'Consulter les mentions légales',
|
|
||||||
'cookiesFooterText' => 'Cookies',
|
|
||||||
'buttonValidLabel' => 'J\'ai compris'
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'fonts' => [
|
|
||||||
'files' => [],
|
'files' => [],
|
||||||
'imported' => [
|
'imported' => [
|
||||||
'arimo' => [
|
'arimo' => [
|
||||||
@ -177,37 +157,6 @@ class init extends common
|
|||||||
]
|
]
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'page' => [
|
|
||||||
'accueil' => [
|
|
||||||
'typeMenu' => 'text',
|
|
||||||
'iconUrl' => '',
|
|
||||||
'disable' => false,
|
|
||||||
'content' => 'accueil.html',
|
|
||||||
'hideTitle' => false,
|
|
||||||
'homePageId' => true,
|
|
||||||
'breadCrumb' => false,
|
|
||||||
'metaDescription' => '',
|
|
||||||
'metaTitle' => '',
|
|
||||||
'moduleId' => '',
|
|
||||||
'modulePosition' => 'bottom',
|
|
||||||
'parentPageId' => '',
|
|
||||||
'position' => 1,
|
|
||||||
'group' => self::GROUP_VISITOR,
|
|
||||||
'targetBlank' => false,
|
|
||||||
'title' => 'Accueil',
|
|
||||||
'shortTitle' => 'Accueil',
|
|
||||||
'block' => '12',
|
|
||||||
'barLeft' => '',
|
|
||||||
'barRight' => '',
|
|
||||||
'displayMenu' => 'none',
|
|
||||||
'hideMenuSide' => false,
|
|
||||||
'hideMenuChildren' => false,
|
|
||||||
'extraPosition' => false,
|
|
||||||
'css' => '',
|
|
||||||
'js' => ''
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'module' => [],
|
|
||||||
'user' => [],
|
'user' => [],
|
||||||
'theme' => [
|
'theme' => [
|
||||||
'body' => [
|
'body' => [
|
||||||
@ -332,13 +281,489 @@ class init extends common
|
|||||||
'backgroundColorButtonGreen' => 'rgba(100, 207, 8, 1)',
|
'backgroundColorButtonGreen' => 'rgba(100, 207, 8, 1)',
|
||||||
'backgroundColorButtonHelp' => 'rgba(255, 153, 0, 1)',
|
'backgroundColorButtonHelp' => 'rgba(255, 153, 0, 1)',
|
||||||
'backgroundBlockColor' => 'rgba(236, 239, 241, 1)',
|
'backgroundBlockColor' => 'rgba(236, 239, 241, 1)',
|
||||||
'borderBlockColor' => 'rgba(190, 202, 209, 1)'
|
'borderBlockColor' => 'rgba(190, 202, 209, 1)',
|
||||||
|
'width' => '960px'
|
||||||
],
|
],
|
||||||
'blacklist' => [],
|
'blacklist' => [],
|
||||||
'languages' => [],
|
'language' => [
|
||||||
|
"fr_FR" => [
|
||||||
|
"version" => 13007,
|
||||||
|
"date" => 1699354723
|
||||||
|
],
|
||||||
|
"es" => [
|
||||||
|
"version" => 13007,
|
||||||
|
"date" => 1699354723
|
||||||
|
],
|
||||||
|
"en_EN" => [
|
||||||
|
"version" => 13007,
|
||||||
|
"date" => 1699354723
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'profil' => [
|
||||||
|
'-1' => [
|
||||||
|
'name' => 'Banni',
|
||||||
|
'readonly' => true,
|
||||||
|
'permanent' => true,
|
||||||
|
'comment' => 'Accès désactivé',
|
||||||
|
],
|
||||||
|
'0' => [
|
||||||
|
'name' => 'Visiteur',
|
||||||
|
'readonly' => true,
|
||||||
|
'permanent' => true,
|
||||||
|
'comment' => 'Accède au site',
|
||||||
|
],
|
||||||
|
'1' => [
|
||||||
|
'1' => [
|
||||||
|
'name' => 'Membre simple',
|
||||||
|
'readonly' => false,
|
||||||
|
'permanent' => true,
|
||||||
|
'comment' => 'Accède aux pages réservées',
|
||||||
|
'filemanager' => false,
|
||||||
|
'file' => [
|
||||||
|
'download' => false,
|
||||||
|
'edit' => false,
|
||||||
|
'create' => false,
|
||||||
|
'rename' => false,
|
||||||
|
'upload' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'preview' => false,
|
||||||
|
'duplicate' => false,
|
||||||
|
'extract' => false,
|
||||||
|
'copycut' => false,
|
||||||
|
'chmod' => false
|
||||||
|
],
|
||||||
|
'folder' => [
|
||||||
|
'create' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'rename' => false,
|
||||||
|
'copycut' => false,
|
||||||
|
'chmod' => false,
|
||||||
|
'share' => false,
|
||||||
|
'path' => null,
|
||||||
|
],
|
||||||
|
'page' => [
|
||||||
|
'add' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'duplicate' => false,
|
||||||
|
'edit' => false,
|
||||||
|
'jsEditor' => false,
|
||||||
|
'cssEditor' => false,
|
||||||
|
'module' => false,
|
||||||
|
],
|
||||||
|
'blog' => [
|
||||||
|
'add' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'edit' => false,
|
||||||
|
'option' => false,
|
||||||
|
'config' => false,
|
||||||
|
'comment' => false,
|
||||||
|
'commentApprove' => false,
|
||||||
|
'commentDelete' => false,
|
||||||
|
'commentDeleteAll' => false,
|
||||||
|
],
|
||||||
|
'form' => [
|
||||||
|
'option' => false,
|
||||||
|
'config' => false,
|
||||||
|
'data' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'deleteAll' => false,
|
||||||
|
'export2csv' => false,
|
||||||
|
],
|
||||||
|
'gallery' => [
|
||||||
|
'config' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'edit' => false,
|
||||||
|
'add' => false,
|
||||||
|
'option' => false,
|
||||||
|
'theme' => false,
|
||||||
|
],
|
||||||
|
'news' => [
|
||||||
|
'add' => false,
|
||||||
|
'config' => false,
|
||||||
|
'option' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'edit' => false,
|
||||||
|
],
|
||||||
|
'redirection' => [
|
||||||
|
'config' => false,
|
||||||
|
],
|
||||||
|
'search' => [
|
||||||
|
'config' => false,
|
||||||
|
],
|
||||||
|
'user' => [
|
||||||
|
'edit' => true,
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'2' => [
|
||||||
|
'name' => 'Membre avec droit de partage',
|
||||||
|
'readonly' => false,
|
||||||
|
'permanent' => false,
|
||||||
|
'comment' => 'Accède aux pages réservées et à un dossier partagé',
|
||||||
|
'filemanager' => true,
|
||||||
|
'file' => [
|
||||||
|
'download' => false,
|
||||||
|
'edit' => false,
|
||||||
|
'create' => false,
|
||||||
|
'rename' => false,
|
||||||
|
'upload' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'preview' => false,
|
||||||
|
'duplicate' => false,
|
||||||
|
'extract' => false,
|
||||||
|
'copycut' => false,
|
||||||
|
'chmod' => false
|
||||||
|
],
|
||||||
|
'folder' => [
|
||||||
|
'create' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'rename' => false,
|
||||||
|
'copycut' => false,
|
||||||
|
'chmod' => false,
|
||||||
|
'share' => true,
|
||||||
|
'path' => '/site/file/source/partage/',
|
||||||
|
],
|
||||||
|
'page' => [
|
||||||
|
'add' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'duplicate' => false,
|
||||||
|
'edit' => false,
|
||||||
|
'jsEditor' => false,
|
||||||
|
'cssEditor' => false,
|
||||||
|
'module' => false,
|
||||||
|
],
|
||||||
|
'blog' => [
|
||||||
|
'add' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'edit' => false,
|
||||||
|
'option' => false,
|
||||||
|
'config' => false,
|
||||||
|
'comment' => false,
|
||||||
|
'commentApprove' => false,
|
||||||
|
'commentDelete' => false,
|
||||||
|
'commentDeleteAll' => false,
|
||||||
|
],
|
||||||
|
'form' => [
|
||||||
|
'option' => false,
|
||||||
|
'config' => false,
|
||||||
|
'data' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'deleteAll' => false,
|
||||||
|
'export2csv' => false,
|
||||||
|
],
|
||||||
|
'gallery' => [
|
||||||
|
'config' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'edit' => false,
|
||||||
|
'add' => false,
|
||||||
|
'option' => false,
|
||||||
|
'theme' => false,
|
||||||
|
'dirs' => false,
|
||||||
|
'sortGalleries' => false,
|
||||||
|
'sortPictures' => false,
|
||||||
|
],
|
||||||
|
'news' => [
|
||||||
|
'add' => false,
|
||||||
|
'config' => false,
|
||||||
|
'option' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'edit' => false,
|
||||||
|
],
|
||||||
|
'redirection' => [
|
||||||
|
'config' => false,
|
||||||
|
],
|
||||||
|
'search' => [
|
||||||
|
'config' => false,
|
||||||
|
],
|
||||||
|
'user' => [
|
||||||
|
'edit' => true,
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'2' => [
|
||||||
|
'1' => [
|
||||||
|
'name' => 'Éditeur simple',
|
||||||
|
'readonly' => false,
|
||||||
|
'permanent' => true,
|
||||||
|
'comment' => 'Édition des pages',
|
||||||
|
'filemanager' => true,
|
||||||
|
'file' => [
|
||||||
|
'download' => true,
|
||||||
|
'edit' => true,
|
||||||
|
'create' => true,
|
||||||
|
'rename' => true,
|
||||||
|
'upload' => true,
|
||||||
|
'delete' => false,
|
||||||
|
'preview' => true,
|
||||||
|
'duplicate' => false,
|
||||||
|
'extract' => false,
|
||||||
|
'copycut' => false,
|
||||||
|
'chmod' => false
|
||||||
|
],
|
||||||
|
'folder' => [
|
||||||
|
'create' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'rename' => false,
|
||||||
|
'copycut' => false,
|
||||||
|
'chmod' => false,
|
||||||
|
'share' => true,
|
||||||
|
'path' => '/site/file/source/partage/',
|
||||||
|
],
|
||||||
|
'page' => [
|
||||||
|
'add' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'duplicate' => false,
|
||||||
|
'edit' => true,
|
||||||
|
'jsEditor' => true,
|
||||||
|
'cssEditor' => true,
|
||||||
|
'module' => true,
|
||||||
|
],
|
||||||
|
'blog' => [
|
||||||
|
'add' => true,
|
||||||
|
'delete' => false,
|
||||||
|
'edit' => true,
|
||||||
|
'option' => false,
|
||||||
|
'config' => false,
|
||||||
|
'comment' => false,
|
||||||
|
'commentApprove' => false,
|
||||||
|
'commentDelete' => false,
|
||||||
|
'commentDeleteAll' => false,
|
||||||
|
],
|
||||||
|
'form' => [
|
||||||
|
'option' => false,
|
||||||
|
'config' => false,
|
||||||
|
'data' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'deleteAll' => false,
|
||||||
|
'export2csv' => false,
|
||||||
|
|
||||||
|
],
|
||||||
|
'gallery' => [
|
||||||
|
'config' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'edit' => false,
|
||||||
|
'add' => false,
|
||||||
|
'option' => false,
|
||||||
|
'theme' => false,
|
||||||
|
],
|
||||||
|
'news' => [
|
||||||
|
'add' => true,
|
||||||
|
'config' => false,
|
||||||
|
'option' => false,
|
||||||
|
'delete' => false,
|
||||||
|
'edit' => true,
|
||||||
|
],
|
||||||
|
'redirection' => [
|
||||||
|
'config' => false,
|
||||||
|
],
|
||||||
|
'search' => [
|
||||||
|
'config' => false,
|
||||||
|
],
|
||||||
|
'user' => [
|
||||||
|
'edit' => true,
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'2' => [
|
||||||
|
'name' => 'Rédacteur',
|
||||||
|
'readonly' => false,
|
||||||
|
'permanent' => false,
|
||||||
|
'comment' => 'Tous les droits d\'édition des contenus',
|
||||||
|
'filemanager' => true,
|
||||||
|
'file' => [
|
||||||
|
'download' => true,
|
||||||
|
'edit' => true,
|
||||||
|
'create' => true,
|
||||||
|
'rename' => true,
|
||||||
|
'upload' => true,
|
||||||
|
'delete' => true,
|
||||||
|
'preview' => true,
|
||||||
|
'duplicate' => true,
|
||||||
|
'extract' => true,
|
||||||
|
'copycut' => true,
|
||||||
|
'chmod' => true
|
||||||
|
],
|
||||||
|
'folder' => [
|
||||||
|
'create' => true,
|
||||||
|
'delete' => true,
|
||||||
|
'rename' => true,
|
||||||
|
'copycut' => true,
|
||||||
|
'chmod' => true,
|
||||||
|
'share' => true,
|
||||||
|
'path' => '/site/file/source/partage/',
|
||||||
|
],
|
||||||
|
'page' => [
|
||||||
|
'add' => true,
|
||||||
|
'delete' => true,
|
||||||
|
'duplicate' => true,
|
||||||
|
'edit' => true,
|
||||||
|
'jsEditor' => true,
|
||||||
|
'cssEditor' => true,
|
||||||
|
'module' => true,
|
||||||
|
],
|
||||||
|
'blog' => [
|
||||||
|
'add' => true,
|
||||||
|
'delete' => true,
|
||||||
|
'edit' => true,
|
||||||
|
'option' => true,
|
||||||
|
'config' => true,
|
||||||
|
'comment' => true,
|
||||||
|
'commentApprove' => true,
|
||||||
|
'commentDelete' => true,
|
||||||
|
'commentDeleteAll' => true,
|
||||||
|
],
|
||||||
|
'form' => [
|
||||||
|
'option' => true,
|
||||||
|
'config' => true,
|
||||||
|
'data' => true,
|
||||||
|
'delete' => true,
|
||||||
|
'deleteAll' => true,
|
||||||
|
'export2csv' => true,
|
||||||
|
],
|
||||||
|
'gallery' => [
|
||||||
|
'config' => true,
|
||||||
|
'delete' => true,
|
||||||
|
'edit' => true,
|
||||||
|
'add' => true,
|
||||||
|
'option' => true,
|
||||||
|
'theme' => true,
|
||||||
|
],
|
||||||
|
'news' => [
|
||||||
|
'add' => true,
|
||||||
|
'config' => true,
|
||||||
|
'option' => true,
|
||||||
|
'delete' => true,
|
||||||
|
'edit' => true,
|
||||||
|
],
|
||||||
|
'redirection' => [
|
||||||
|
'config' => true,
|
||||||
|
],
|
||||||
|
'search' => [
|
||||||
|
'config' => true,
|
||||||
|
],
|
||||||
|
'user' => [
|
||||||
|
'edit' => true,
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'3' => [
|
||||||
|
'name' => 'Administrateur',
|
||||||
|
'readonly' => true,
|
||||||
|
'permanent' => true,
|
||||||
|
'comment' => 'Contrôle total',
|
||||||
|
]
|
||||||
|
]
|
||||||
];
|
];
|
||||||
public static $defaultDataI18n = [
|
public static $defaultDataI18n = [
|
||||||
'en_EN' => [
|
'fr_FR' => [
|
||||||
|
'locale' => [
|
||||||
|
'homePageId' => 'accueil',
|
||||||
|
'page302' => 'none',
|
||||||
|
'page403' => 'none',
|
||||||
|
'page404' => 'none',
|
||||||
|
'legalPageId' => 'none',
|
||||||
|
'searchPageId' => 'none',
|
||||||
|
'searchPageLabel' => 'Rechercher',
|
||||||
|
'sitemapPageLabel' => 'Plan du site',
|
||||||
|
'legalPageLabel' => 'Mentions légales',
|
||||||
|
'metaDescription' => 'Zwii est un CMS sans base de données qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation.',
|
||||||
|
'title' => 'Votre site en quelques clics !',
|
||||||
|
'cookies' => [
|
||||||
|
'mainLabel' => 'Ce site utilise des cookies nécessaires à son fonctionnement, ils permettent de fluidifier son fonctionnement par exemple en mémorisant les données de connexion, la langue que vous avez choisie ou la validation de ce message.',
|
||||||
|
'titleLabel' => 'Cookies essentiels',
|
||||||
|
'linkLegalLabel' => 'Consulter les mentions légales',
|
||||||
|
'cookiesFooterText' => 'Cookies',
|
||||||
|
'buttonValidLabel' => 'J\'ai compris'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'page' => [
|
||||||
|
'accueil' => [
|
||||||
|
'typeMenu' => 'text',
|
||||||
|
'iconUrl' => '',
|
||||||
|
'disable' => false,
|
||||||
|
'content' => 'accueil.html',
|
||||||
|
'hideTitle' => false,
|
||||||
|
'homePageId' => true,
|
||||||
|
'breadCrumb' => false,
|
||||||
|
'metaDescription' => '',
|
||||||
|
'metaTitle' => '',
|
||||||
|
'moduleId' => '',
|
||||||
|
'modulePosition' => 'bottom',
|
||||||
|
'parentPageId' => '',
|
||||||
|
'position' => 1,
|
||||||
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
|
'targetBlank' => false,
|
||||||
|
'title' => 'Accueil',
|
||||||
|
'shortTitle' => 'Accueil',
|
||||||
|
'block' => '12',
|
||||||
|
'barLeft' => '',
|
||||||
|
'barRight' => '',
|
||||||
|
'displayMenu' => 'none',
|
||||||
|
'hideMenuSide' => false,
|
||||||
|
'hideMenuChildren' => false,
|
||||||
|
'extraPosition' => false,
|
||||||
|
'css' => '',
|
||||||
|
'js' => ''
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'module' => [],
|
||||||
|
'html' => '<h2>Bienvenue dans cette nouvelle installation de ZwiiCMS. Créez et gérez votre site facilement avec notre système convivial.</h2>'
|
||||||
|
],
|
||||||
|
'es' => [
|
||||||
|
'locale' => [
|
||||||
|
'homePageId' => 'inicio',
|
||||||
|
'page302' => 'none',
|
||||||
|
'page403' => 'none',
|
||||||
|
'page404' => 'none',
|
||||||
|
'legalPageId' => 'none',
|
||||||
|
'searchPageId' => 'none',
|
||||||
|
'searchPageLabel' => 'none',
|
||||||
|
'sitemapPageLabel' => 'none',
|
||||||
|
'legalPageLabel' => 'legales',
|
||||||
|
"metaDescription" => "Zwii es un CMS sin base de datos que facilita la creación y gestión de un sitio web sin necesidad de conocimientos de programación.",
|
||||||
|
"title" => "¡Tu sitio en unos clics!",
|
||||||
|
"cookies" => [
|
||||||
|
"mainLabel" => "Este sitio web utiliza cookies necesarias para su funcionamiento. Estas cookies permiten optimizar su funcionamiento, por ejemplo, memorizando los datos de conexión, el idioma que has elegido o la validación de este mensaje.",
|
||||||
|
"titleLabel" => "Cookies esenciales",
|
||||||
|
"linkLegalLabel" => "Consultar el aviso legal",
|
||||||
|
"cookiesFooterText" => "Cookies",
|
||||||
|
"buttonValidLabel" => "Aceptar"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'page' => [
|
||||||
|
'inicio' => [
|
||||||
|
'typeMenu' => 'text',
|
||||||
|
'iconUrl' => '',
|
||||||
|
'disable' => false,
|
||||||
|
'content' => 'inico.html',
|
||||||
|
'hideTitle' => false,
|
||||||
|
'homePageId' => true,
|
||||||
|
'breadCrumb' => false,
|
||||||
|
'metaDescription' => '',
|
||||||
|
'metaTitle' => '',
|
||||||
|
'moduleId' => '',
|
||||||
|
'modulePosition' => 'bottom',
|
||||||
|
'parentPageId' => '',
|
||||||
|
'position' => 1,
|
||||||
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
|
'targetBlank' => false,
|
||||||
|
'title' => 'Página de inicio',
|
||||||
|
'shortTitle' => 'Página de inicio',
|
||||||
|
'block' => '12',
|
||||||
|
'barLeft' => '',
|
||||||
|
'barRight' => '',
|
||||||
|
'displayMenu' => 'none',
|
||||||
|
'hideMenuSide' => false,
|
||||||
|
'hideMenuChildren' => false,
|
||||||
|
'extraPosition' => false,
|
||||||
|
'css' => '',
|
||||||
|
'js' => ''
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'module' => [],
|
||||||
|
'html' => '<h2>¡Bienvenido/a a esta nueva instalación de ZwiiCMS!</h2><p>Crea y administra tu sitio web de manera sencilla con nuestro sistema amigable.</p><p>Esta es tu primera página, inicia sesión para crear nuevas.</p>'
|
||||||
|
],
|
||||||
|
'default' => [
|
||||||
'locale' => [
|
'locale' => [
|
||||||
'homePageId' => 'home',
|
'homePageId' => 'home',
|
||||||
'page302' => 'none',
|
'page302' => 'none',
|
||||||
@ -376,6 +801,7 @@ class init extends common
|
|||||||
'parentPageId' => '',
|
'parentPageId' => '',
|
||||||
'position' => 1,
|
'position' => 1,
|
||||||
'group' => self::GROUP_VISITOR,
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
'targetBlank' => false,
|
'targetBlank' => false,
|
||||||
'title' => 'Home page',
|
'title' => 'Home page',
|
||||||
'shortTitle' => 'Home',
|
'shortTitle' => 'Home',
|
||||||
@ -390,12 +816,11 @@ class init extends common
|
|||||||
'js' => ''
|
'js' => ''
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'html' => 'Welcome in this ZwiiCMS, congratulations this is you first page !'
|
'module' => [],
|
||||||
|
'html' => '<h2>Welcome to this new installation of ZwiiCMS.</h2><p>Easily create and manage your website with our user-friendly system.</p><p>This is your first page, log in to create new ones.</p>'
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
public static $siteTemplate = [
|
||||||
|
|
||||||
public static $siteData = [
|
|
||||||
'page' => [
|
'page' => [
|
||||||
'accueil' => [
|
'accueil' => [
|
||||||
'typeMenu' => 'text',
|
'typeMenu' => 'text',
|
||||||
@ -412,6 +837,7 @@ class init extends common
|
|||||||
'parentPageId' => '',
|
'parentPageId' => '',
|
||||||
'position' => 1,
|
'position' => 1,
|
||||||
'group' => self::GROUP_VISITOR,
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
'targetBlank' => false,
|
'targetBlank' => false,
|
||||||
'title' => 'Accueil',
|
'title' => 'Accueil',
|
||||||
'shortTitle' => 'Accueil',
|
'shortTitle' => 'Accueil',
|
||||||
@ -439,6 +865,7 @@ class init extends common
|
|||||||
'parentPageId' => 'accueil',
|
'parentPageId' => 'accueil',
|
||||||
'position' => 1,
|
'position' => 1,
|
||||||
'group' => self::GROUP_VISITOR,
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
'targetBlank' => false,
|
'targetBlank' => false,
|
||||||
'title' => 'Page Enfant',
|
'title' => 'Page Enfant',
|
||||||
'shortTitle' => 'Enfant',
|
'shortTitle' => 'Enfant',
|
||||||
@ -466,6 +893,7 @@ class init extends common
|
|||||||
'modulePosition' => 'bottom',
|
'modulePosition' => 'bottom',
|
||||||
'position' => 2,
|
'position' => 2,
|
||||||
'group' => self::GROUP_MEMBER,
|
'group' => self::GROUP_MEMBER,
|
||||||
|
'profil' => 1,
|
||||||
'targetBlank' => false,
|
'targetBlank' => false,
|
||||||
'title' => 'Page privée',
|
'title' => 'Page privée',
|
||||||
'shortTitle' => 'Privée',
|
'shortTitle' => 'Privée',
|
||||||
@ -493,6 +921,7 @@ class init extends common
|
|||||||
'modulePosition' => 'bottom',
|
'modulePosition' => 'bottom',
|
||||||
'position' => 2,
|
'position' => 2,
|
||||||
'group' => self::GROUP_VISITOR,
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
'targetBlank' => false,
|
'targetBlank' => false,
|
||||||
'title' => 'Mise en page',
|
'title' => 'Mise en page',
|
||||||
'shortTitle' => 'Mise en page',
|
'shortTitle' => 'Mise en page',
|
||||||
@ -520,6 +949,7 @@ class init extends common
|
|||||||
'modulePosition' => 'bottom',
|
'modulePosition' => 'bottom',
|
||||||
'position' => 3,
|
'position' => 3,
|
||||||
'group' => self::GROUP_VISITOR,
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
'targetBlank' => false,
|
'targetBlank' => false,
|
||||||
'title' => 'Barre latérale avec menu',
|
'title' => 'Barre latérale avec menu',
|
||||||
'shortTitle' => 'Menu latéral',
|
'shortTitle' => 'Menu latéral',
|
||||||
@ -547,6 +977,7 @@ class init extends common
|
|||||||
'parentPageId' => '',
|
'parentPageId' => '',
|
||||||
'position' => 3,
|
'position' => 3,
|
||||||
'group' => self::GROUP_VISITOR,
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
'targetBlank' => false,
|
'targetBlank' => false,
|
||||||
'title' => 'Blog',
|
'title' => 'Blog',
|
||||||
'shortTitle' => 'Blog',
|
'shortTitle' => 'Blog',
|
||||||
@ -574,6 +1005,7 @@ class init extends common
|
|||||||
'parentPageId' => '',
|
'parentPageId' => '',
|
||||||
'position' => 4,
|
'position' => 4,
|
||||||
'group' => self::GROUP_VISITOR,
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
'targetBlank' => false,
|
'targetBlank' => false,
|
||||||
'title' => 'Galeries d\'images',
|
'title' => 'Galeries d\'images',
|
||||||
'shortTitle' => 'Galeries',
|
'shortTitle' => 'Galeries',
|
||||||
@ -602,6 +1034,7 @@ class init extends common
|
|||||||
'parentPageId' => '',
|
'parentPageId' => '',
|
||||||
'position' => 5,
|
'position' => 5,
|
||||||
'group' => self::GROUP_VISITOR,
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
'targetBlank' => true,
|
'targetBlank' => true,
|
||||||
'title' => 'Site de Zwii',
|
'title' => 'Site de Zwii',
|
||||||
'shortTitle' => 'Site de Zwii',
|
'shortTitle' => 'Site de Zwii',
|
||||||
@ -629,6 +1062,7 @@ class init extends common
|
|||||||
'parentPageId' => '',
|
'parentPageId' => '',
|
||||||
'position' => 6,
|
'position' => 6,
|
||||||
'group' => self::GROUP_VISITOR,
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
'targetBlank' => false,
|
'targetBlank' => false,
|
||||||
'title' => 'Contact',
|
'title' => 'Contact',
|
||||||
'shortTitle' => 'Contact',
|
'shortTitle' => 'Contact',
|
||||||
@ -656,6 +1090,7 @@ class init extends common
|
|||||||
'parentPageId' => '',
|
'parentPageId' => '',
|
||||||
'position' => 0,
|
'position' => 0,
|
||||||
'group' => self::GROUP_VISITOR,
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
'targetBlank' => false,
|
'targetBlank' => false,
|
||||||
'title' => 'Barre latérale',
|
'title' => 'Barre latérale',
|
||||||
'shortTitle' => 'Barre latérale',
|
'shortTitle' => 'Barre latérale',
|
||||||
@ -683,6 +1118,7 @@ class init extends common
|
|||||||
'parentPageId' => '',
|
'parentPageId' => '',
|
||||||
'position' => 0,
|
'position' => 0,
|
||||||
'group' => self::GROUP_VISITOR,
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
'targetBlank' => false,
|
'targetBlank' => false,
|
||||||
'title' => 'Barre latérale avec menu',
|
'title' => 'Barre latérale avec menu',
|
||||||
'shortTitle' => 'Barre latérale avec menu',
|
'shortTitle' => 'Barre latérale avec menu',
|
||||||
@ -709,7 +1145,8 @@ class init extends common
|
|||||||
'modulePosition' => 'bottom',
|
'modulePosition' => 'bottom',
|
||||||
'parentPageId' => '',
|
'parentPageId' => '',
|
||||||
'position' => 0,
|
'position' => 0,
|
||||||
'group' => 0,
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
'targetBlank' => false,
|
'targetBlank' => false,
|
||||||
'title' => 'Mentions légales',
|
'title' => 'Mentions légales',
|
||||||
'shortTitle' => 'Mentions légales',
|
'shortTitle' => 'Mentions légales',
|
||||||
@ -738,6 +1175,7 @@ class init extends common
|
|||||||
'parentPageId' => '',
|
'parentPageId' => '',
|
||||||
'position' => 0,
|
'position' => 0,
|
||||||
'group' => self::GROUP_VISITOR,
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
'targetBlank' => false,
|
'targetBlank' => false,
|
||||||
'title' => 'Maintenance en cours',
|
'title' => 'Maintenance en cours',
|
||||||
'shortTitle' => 'Maintenance en cours',
|
'shortTitle' => 'Maintenance en cours',
|
||||||
@ -766,6 +1204,7 @@ class init extends common
|
|||||||
'parentPageId' => '',
|
'parentPageId' => '',
|
||||||
'position' => 0,
|
'position' => 0,
|
||||||
'group' => self::GROUP_VISITOR,
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
'targetBlank' => false,
|
'targetBlank' => false,
|
||||||
'title' => 'Erreur 403',
|
'title' => 'Erreur 403',
|
||||||
'shortTitle' => 'Erreur 403',
|
'shortTitle' => 'Erreur 403',
|
||||||
@ -793,6 +1232,7 @@ class init extends common
|
|||||||
'parentPageId' => '',
|
'parentPageId' => '',
|
||||||
'position' => 0,
|
'position' => 0,
|
||||||
'group' => self::GROUP_VISITOR,
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
'targetBlank' => false,
|
'targetBlank' => false,
|
||||||
'title' => 'Erreur 404',
|
'title' => 'Erreur 404',
|
||||||
'shortTitle' => 'Erreur 404',
|
'shortTitle' => 'Erreur 404',
|
||||||
@ -820,6 +1260,7 @@ class init extends common
|
|||||||
'parentPageId' => '',
|
'parentPageId' => '',
|
||||||
'position' => 7,
|
'position' => 7,
|
||||||
'group' => self::GROUP_VISITOR,
|
'group' => self::GROUP_VISITOR,
|
||||||
|
'profil' => 0,
|
||||||
'targetBlank' => false,
|
'targetBlank' => false,
|
||||||
'title' => 'Recherche dans le site',
|
'title' => 'Recherche dans le site',
|
||||||
'shortTitle' => 'Rechercher',
|
'shortTitle' => 'Rechercher',
|
||||||
@ -858,7 +1299,6 @@ class init extends common
|
|||||||
'picturePosition' => 'left',
|
'picturePosition' => 'left',
|
||||||
'hidePicture' => false,
|
'hidePicture' => false,
|
||||||
'pictureSize' => 20,
|
'pictureSize' => 20,
|
||||||
'picturePosition' => 'left',
|
|
||||||
'publishedOn' => 1548790902,
|
'publishedOn' => 1548790902,
|
||||||
'state' => true,
|
'state' => true,
|
||||||
'title' => 'Mon premier article',
|
'title' => 'Mon premier article',
|
||||||
@ -879,7 +1319,6 @@ class init extends common
|
|||||||
'hidePicture' => false,
|
'hidePicture' => false,
|
||||||
'picturePosition' => 'right',
|
'picturePosition' => 'right',
|
||||||
'pictureSize' => 40,
|
'pictureSize' => 40,
|
||||||
'picturePosition' => 'right',
|
|
||||||
'publishedOn' => 1550432502,
|
'publishedOn' => 1550432502,
|
||||||
'state' => true,
|
'state' => true,
|
||||||
'title' => 'Mon deuxième article',
|
'title' => 'Mon deuxième article',
|
||||||
@ -900,7 +1339,6 @@ class init extends common
|
|||||||
'hidePicture' => false,
|
'hidePicture' => false,
|
||||||
'picturePosition' => 'left',
|
'picturePosition' => 'left',
|
||||||
'pictureSize' => 100,
|
'pictureSize' => 100,
|
||||||
'picturePosition' => 'left',
|
|
||||||
'publishedOn' => 1550864502,
|
'publishedOn' => 1550864502,
|
||||||
'state' => true,
|
'state' => true,
|
||||||
'title' => 'Mon troisième article',
|
'title' => 'Mon troisième article',
|
||||||
|
Binary file not shown.
@ -17,7 +17,11 @@
|
|||||||
"5 tentatives": "5 attempts",
|
"5 tentatives": "5 attempts",
|
||||||
"7 jours": "7 days",
|
"7 jours": "7 days",
|
||||||
"Accueil": "Homepage",
|
"Accueil": "Homepage",
|
||||||
|
"Accède au site": "Access to the site",
|
||||||
|
"Accède aux pages réservées": "Access to restricted pages",
|
||||||
|
"Accède aux pages réservées et à un dossier partagé": "Access to restricted pages and a shared folder",
|
||||||
"Accès bloqué %d minutes": "Blocked access %d minutes",
|
"Accès bloqué %d minutes": "Blocked access %d minutes",
|
||||||
|
"Accès désactivé": "Access disabled",
|
||||||
"Accès interdit, erreur 403": "Access prohibited, error 403",
|
"Accès interdit, erreur 403": "Access prohibited, error 403",
|
||||||
"Action interdite": "Prohibited action",
|
"Action interdite": "Prohibited action",
|
||||||
"Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.": "Compulsory activation according to French laws unless you use your own consent system.",
|
"Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.": "Compulsory activation according to French laws unless you use your own consent system.",
|
||||||
@ -31,10 +35,12 @@
|
|||||||
"Adresse du proxy": "Proxy address",
|
"Adresse du proxy": "Proxy address",
|
||||||
"Adresse électronique": "email address",
|
"Adresse électronique": "email address",
|
||||||
"Affectation": "Assignment",
|
"Affectation": "Assignment",
|
||||||
"Menu burger dans écran réduit": "Burger menu in reduced screen",
|
|
||||||
"Affiche le nom de la page parente suivi du nom de la page, le titre ne doit pas être masqué.": "Displays the name of the parent page followed by the page name, the title should not be hidden.",
|
"Affiche le nom de la page parente suivi du nom de la page, le titre ne doit pas être masqué.": "Displays the name of the parent page followed by the page name, the title should not be hidden.",
|
||||||
|
"Affiche les icônes de gestion du compte et de déconnexion des membres simples connectés": "Displays account management and logout icons for logged-in regular members",
|
||||||
"Afin d'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l'opération.": "In order to ensure the proper functioning of Zwii, please do not close this page before the end of the operation.",
|
"Afin d'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l'opération.": "In order to ensure the proper functioning of Zwii, please do not close this page before the end of the operation.",
|
||||||
"Aide": "Help",
|
"Aide": "Help",
|
||||||
|
"Ajouter": "Add",
|
||||||
|
"Ajouter un profil": "Add Profile",
|
||||||
"Ajouter un utilisateur": "Add a user",
|
"Ajouter un utilisateur": "Add a user",
|
||||||
"Ajouter une fonte": "Add a cast iron",
|
"Ajouter une fonte": "Add a cast iron",
|
||||||
"Alignement": "Alignment",
|
"Alignement": "Alignment",
|
||||||
@ -45,7 +51,9 @@
|
|||||||
"Apache URL intelligentes": "Intelligent Apache URL",
|
"Apache URL intelligentes": "Intelligent Apache URL",
|
||||||
"Apparence": "Appearance",
|
"Apparence": "Appearance",
|
||||||
"Appliquer": "Apply",
|
"Appliquer": "Apply",
|
||||||
|
"Approuver un commentaire": "Approve Comment",
|
||||||
"Après": "After",
|
"Après": "After",
|
||||||
|
"Après la bannière": "After the banner",
|
||||||
"Après le contenu de la page": "After the content of the page",
|
"Après le contenu de la page": "After the content of the page",
|
||||||
"Archive": "Archive",
|
"Archive": "Archive",
|
||||||
"Archive ZIP": "Zip archive",
|
"Archive ZIP": "Zip archive",
|
||||||
@ -63,20 +71,25 @@
|
|||||||
"Arrière plan des champs": "Fields background",
|
"Arrière plan des champs": "Fields background",
|
||||||
"Arrondi des angles": "Rounding of angles",
|
"Arrondi des angles": "Rounding of angles",
|
||||||
"Au centre": "Center",
|
"Au centre": "Center",
|
||||||
"Au-dessus du site": "Above the site",
|
|
||||||
"Au début": "At first",
|
"Au début": "At first",
|
||||||
"Au milieu au centre": "In the middle in the center",
|
"Au milieu au centre": "In the middle in the center",
|
||||||
"Au milieu à droite": "In the middle right",
|
"Au milieu à droite": "In the middle right",
|
||||||
"Au milieu à gauche": "In the middle on the left",
|
"Au milieu à gauche": "In the middle on the left",
|
||||||
|
"Au-dessus du site": "Above the site",
|
||||||
|
"Aucun": "None",
|
||||||
|
"Aucun dossier": "No Folder",
|
||||||
"Aucun fichier journal à télécharger": "No log file to download",
|
"Aucun fichier journal à télécharger": "No log file to download",
|
||||||
"Aucun journal à effacer": "No log file to erase",
|
"Aucun journal à effacer": "No log file to erase",
|
||||||
"Aucun menu": "No menu",
|
"Aucun menu": "No menu",
|
||||||
|
"Aucune": "None",
|
||||||
"Aucune liste noire à effacer": "No blacklist to erase",
|
"Aucune liste noire à effacer": "No blacklist to erase",
|
||||||
"Aucune liste noire à télécharger": "No blacklist to download",
|
"Aucune liste noire à télécharger": "No blacklist to download",
|
||||||
"Auteur :": "Author:",
|
"Auteur :": "Author:",
|
||||||
"Authentification": "Authentication",
|
"Authentification": "Authentication",
|
||||||
"Automatique": "Automatique",
|
"Automatique": "Automatique",
|
||||||
"Autoriser les robots à référencer le site": "Allow robots to reference the site",
|
"Autoriser les robots à référencer le site": "Allow robots to reference the site",
|
||||||
|
"Autorisé": "Allowed",
|
||||||
|
"Avant la bannière": "Before the banner",
|
||||||
"Avant le contenu de la page": "Before the content of the page",
|
"Avant le contenu de la page": "Before the content of the page",
|
||||||
"Background": "Background",
|
"Background": "Background",
|
||||||
"Banni": "Ban",
|
"Banni": "Ban",
|
||||||
@ -94,6 +107,7 @@
|
|||||||
"Barres latérales": "Side bars",
|
"Barres latérales": "Side bars",
|
||||||
"Bienvenue %s %s": "Welcome %s %s",
|
"Bienvenue %s %s": "Welcome %s %s",
|
||||||
"Blocage après échecs": "Blocking after chess",
|
"Blocage après échecs": "Blocking after chess",
|
||||||
|
"Blog": "Blog",
|
||||||
"Bords arrondis": "Rounded edges",
|
"Bords arrondis": "Rounded edges",
|
||||||
"Bordure des blocs": "Blocks border",
|
"Bordure des blocs": "Blocks border",
|
||||||
"Bordure des champs": "Fields border",
|
"Bordure des champs": "Fields border",
|
||||||
@ -105,6 +119,7 @@
|
|||||||
"Bouton standard": "Standard button",
|
"Bouton standard": "Standard button",
|
||||||
"Bouton validation": "Validation button",
|
"Bouton validation": "Validation button",
|
||||||
"Boutons": "Buttons",
|
"Boutons": "Buttons",
|
||||||
|
"Caché": "Hidden",
|
||||||
"Cachée": "Hidden",
|
"Cachée": "Hidden",
|
||||||
"Captcha complexe": "Complex captcha",
|
"Captcha complexe": "Complex captcha",
|
||||||
"Captcha à la connexion": "Captcha at connecting",
|
"Captcha à la connexion": "Captcha at connecting",
|
||||||
@ -121,13 +136,14 @@
|
|||||||
"Chiffres": "Numbers",
|
"Chiffres": "Numbers",
|
||||||
"Cible": "Target",
|
"Cible": "Target",
|
||||||
"Cliquez sur une zone afin d'accéder à ses options de personnalisation.": "Click on an area to access its customization options.",
|
"Cliquez sur une zone afin d'accéder à ses options de personnalisation.": "Click on an area to access its customization options.",
|
||||||
"Clé de l'API <a href=\"https://app.screenshotapi.net/\" target=\"_blank\">ScreenShotApi</a>": "API key <a href=\"https://app.screenshotapi.net/\" target=\"_blank\">ScreenShotApi</a>",
|
"Commentaire": "Comment",
|
||||||
"Clé de l'API <a href='https://app.screenshotapi.net/' target='_blank'>ScreenShotApi</a>": "API key <a href='https://app.screenshotapi.net/' target='_blank'>ScreenShotApi</a>",
|
|
||||||
"Complète": "Complete",
|
"Complète": "Complete",
|
||||||
"Compte administrateur": "Administrator account",
|
"Compte administrateur": "Administrator account",
|
||||||
|
"Compte de l'utilisateur": "User Account",
|
||||||
"Compte verrouillé": "Locked",
|
"Compte verrouillé": "Locked",
|
||||||
"Configuration": "Setup",
|
"Configuration": "Setup",
|
||||||
"Configuration du module": "Module setup",
|
"Configuration du module": "Module setup",
|
||||||
|
"Configurer": "Configure",
|
||||||
"Configurer mon compte": "Set up my account",
|
"Configurer mon compte": "Set up my account",
|
||||||
"Confirmation": "Confirmation",
|
"Confirmation": "Confirmation",
|
||||||
"Confirmer la suppression de cet utilisateur": "Confirm the deletion of this user",
|
"Confirmer la suppression de cet utilisateur": "Confirm the deletion of this user",
|
||||||
@ -145,6 +161,7 @@
|
|||||||
"Contenu HTML": "HTML contents",
|
"Contenu HTML": "HTML contents",
|
||||||
"Contenu avancé": "Advanced contents",
|
"Contenu avancé": "Advanced contents",
|
||||||
"Contenu du menu vertical": "Vertical menu content",
|
"Contenu du menu vertical": "Vertical menu content",
|
||||||
|
"Contrôle total": "Full control",
|
||||||
"Cookies": "Cookies",
|
"Cookies": "Cookies",
|
||||||
"Cookies Zwii": "Cookies Zwii",
|
"Cookies Zwii": "Cookies Zwii",
|
||||||
"Copie de contenus localisés": "Localized content copy",
|
"Copie de contenus localisés": "Localized content copy",
|
||||||
@ -155,38 +172,50 @@
|
|||||||
"Copier": "Copy",
|
"Copier": "Copy",
|
||||||
"Copier sauvegardes auto": "Copy auto backups",
|
"Copier sauvegardes auto": "Copy auto backups",
|
||||||
"Couleur de fond automatique": "Automatic background color",
|
"Couleur de fond automatique": "Automatic background color",
|
||||||
|
"Couleur icône haut de page": "Color of top page icon",
|
||||||
"Couleur texte page active": "Active page text color",
|
"Couleur texte page active": "Active page text color",
|
||||||
"Couleur unie ou papier-peint": "United color or wallpaper",
|
"Couleur unie ou papier-peint": "United color or wallpaper",
|
||||||
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence.": "Visible color in the absence of an image. <br /> The horizontal cursor regulates the level of transparency.",
|
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence.": "Visible color in the absence of an image. <br /> The horizontal cursor regulates the level of transparency.",
|
||||||
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.": "Visible color in the absence of an image. <br /> The horizontal cursor regulates the level of transparency. The color of the text is automatic.",
|
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.": "Visible color in the absence of an image. <br /> The horizontal cursor regulates the level of transparency. The color of the text is automatic.",
|
||||||
"Couleurs": "Colors",
|
"Couleurs": "Colors",
|
||||||
"Créez un compte gratuit, recopier la clé , puis valider le formulaire avant de cliquer sur le bouton de génération": "Create a free account, copy the key, then validate the form before clicking the generation button",
|
|
||||||
"Dans le site": "Into the site",
|
"Dans le site": "Into the site",
|
||||||
"Dans quelle langue utiliserez-vous Zwii ?": "In which language will you use Zwii?",
|
"Dans quelle langue utiliserez-vous Zwii ?": "In which language will you use Zwii?",
|
||||||
"Date": "Date",
|
"Date": "Date",
|
||||||
"Description": "Site description",
|
"Description": "Site description",
|
||||||
|
"Disponible si le consentement des cookies est activé.": "Available if cookie consent is enabled.",
|
||||||
"Disposition": "Layout",
|
"Disposition": "Layout",
|
||||||
"Données %s copiées vers %s": "Data %s copied to %s",
|
"Données %s copiées vers %s": "Data %s copied to %s",
|
||||||
"Données des modules": "Module data",
|
"Données des modules": "Module data",
|
||||||
"Données importées": "Imported data",
|
"Données importées": "Imported data",
|
||||||
|
"Dossier": "Folder",
|
||||||
|
"Droits sur les dossiers": "Folder authorizations",
|
||||||
|
"Droits sur les fichiers": "File authorizations",
|
||||||
|
"Dupliquer": "Duplicate",
|
||||||
"Dupliquer la page": "Duplicate the page",
|
"Dupliquer la page": "Duplicate the page",
|
||||||
"Déconnecte les sessions ouvertes précédemment sur d'autres navigateurs ou terminaux. Activation recommandée.": "Disconnects the previously opened sessions on other browsers or terminals. Recommended activation.",
|
"Déconnecte les sessions ouvertes précédemment sur d'autres navigateurs ou terminaux. Activation recommandée.": "Disconnects the previously opened sessions on other browsers or terminals. Recommended activation.",
|
||||||
"Déconnecter": "Disconnect",
|
"Déconnecter": "Disconnect",
|
||||||
"Déconnexion !": "Logout!",
|
"Déconnexion !": "Logout!",
|
||||||
"Déconnexion automatique": "Automatic disconnection",
|
"Déconnexion automatique": "Automatic disconnection",
|
||||||
|
"Définir par défaut": "Set as default",
|
||||||
"Dévoiler le mot de passe": "Reveal the password",
|
"Dévoiler le mot de passe": "Reveal the password",
|
||||||
"Echec de l'écriture, vérifiez les permissions": "Failure of writing, check permissions",
|
"Effacer": "Delete",
|
||||||
"Effacer la page": "Delete the page",
|
"Effacer la page": "Delete the page",
|
||||||
|
"Effacer tous les commentaires": "Delete all Comments",
|
||||||
|
"Effacer toutes les statistiques": "Delete all statistics",
|
||||||
|
"Effacer un commentaire": "Delete Comment",
|
||||||
|
"Effacer une catégorie": "Delete category",
|
||||||
"Emplacement :": "Location:",
|
"Emplacement :": "Location:",
|
||||||
"Emplacement dans le menu": "Location in the menu",
|
"Emplacement dans le menu": "Location in the menu",
|
||||||
"En bas au centre": "Down in the center",
|
"En bas au centre": "Down in the center",
|
||||||
"En bas à droite": "At the bottom right",
|
"En bas à droite": "At the bottom right",
|
||||||
"En bas à gauche": "At the bottom left",
|
"En bas à gauche": "At the bottom left",
|
||||||
"En cas de changement de module, les données du module précédent seront supprimées.": "In the event of a module change, data from the previous module will be deleted.",
|
"En cas de changement de module, les données du module précédent seront supprimées.": "In the event of a module change, data from the previous module will be deleted.",
|
||||||
|
"En dessous du site": "Below the site",
|
||||||
"En haut au centre": "Top in the center",
|
"En haut au centre": "Top in the center",
|
||||||
"En haut à droite": "Top right",
|
"En haut à droite": "Top right",
|
||||||
"En haut à gauche": "On the top corner left",
|
"En haut à gauche": "On the top corner left",
|
||||||
"En position libre ajoutez le module en plaçant [MODULE] à l'endroit voulu dans votre page.": "In free position add the module by placing [module] to the desired location in your page.",
|
"En position libre ajoutez le module en plaçant [MODULE] à l'endroit voulu dans votre page.": "In free position add the module by placing [module] to the desired location in your page.",
|
||||||
|
"En-dehors du site": "Outside the site",
|
||||||
"Enregistrer": "Save",
|
"Enregistrer": "Save",
|
||||||
"Envoyer un message de confirmation": "Send a confirmation message",
|
"Envoyer un message de confirmation": "Send a confirmation message",
|
||||||
"Erreur : sauvegarde non générée !": "Error: non-generated backup!",
|
"Erreur : sauvegarde non générée !": "Error: non-generated backup!",
|
||||||
@ -197,8 +226,10 @@
|
|||||||
"Erreur de lecture, vérifiez les permissions": "Reading error, check permissions",
|
"Erreur de lecture, vérifiez les permissions": "Reading error, check permissions",
|
||||||
"Erreur inconnue": "unknown error",
|
"Erreur inconnue": "unknown error",
|
||||||
"Erreur inconnue, le module n'est pas installé": "Unknown error, the module is not installed",
|
"Erreur inconnue, le module n'est pas installé": "Unknown error, the module is not installed",
|
||||||
|
"Export CSV": "Export CSV",
|
||||||
"Expéditeur": "From",
|
"Expéditeur": "From",
|
||||||
"Extension": "Extension",
|
"Extension": "Extension",
|
||||||
|
"Extraire": "Extract",
|
||||||
"Facebook": "Facebook",
|
"Facebook": "Facebook",
|
||||||
"Famille": "Family",
|
"Famille": "Family",
|
||||||
"Favicon thème sombre": "Dark theme favicon",
|
"Favicon thème sombre": "Dark theme favicon",
|
||||||
@ -217,26 +248,36 @@
|
|||||||
"Fonte supprimée": "Font deleted",
|
"Fonte supprimée": "Font deleted",
|
||||||
"Fontes": "Fonts",
|
"Fontes": "Fonts",
|
||||||
"Format incorrect": "Wrong format",
|
"Format incorrect": "Wrong format",
|
||||||
|
"Formulaire": "Form",
|
||||||
"Fréquence de recherche": "Search frequency",
|
"Fréquence de recherche": "Search frequency",
|
||||||
"Fuseau horaire": "Time zone",
|
"Fuseau horaire": "Time zone",
|
||||||
"Gabarits de page - Barre latérale": "Page templates - Sidebar",
|
"Gabarits de page - Barre latérale": "Page templates - Sidebar",
|
||||||
"Gestion": "Management",
|
"Gestion": "Management",
|
||||||
"Gestion des modules": "Module management",
|
"Gestion des modules": "Module management",
|
||||||
"Gestion des thèmes": "Themes management",
|
"Gestion des thèmes": "Themes management",
|
||||||
|
"Gestionnaire de fichiers": "File Manager",
|
||||||
"Github": "Github",
|
"Github": "Github",
|
||||||
|
"Grande": "Large",
|
||||||
"Grande (220%)": "Grande (220%)",
|
"Grande (220%)": "Grande (220%)",
|
||||||
"Grande (300px)": "Grande (300px)",
|
"Grande (300px)": "Grande (300px)",
|
||||||
"Gras": "Fetter",
|
"Gras": "Fetter",
|
||||||
"Groupe": "Group",
|
"Groupe": "Group",
|
||||||
|
"Groupe associé": "Associated Group",
|
||||||
"Groupe requis pour accéder à la page :": "Group required to access the page:",
|
"Groupe requis pour accéder à la page :": "Group required to access the page:",
|
||||||
"Groupes": "",
|
"Groupes": "Groups",
|
||||||
"Générer sitemap.xml et robots.txt": "Generate sitemap.xml and robots.txt",
|
"Générer sitemap.xml et robots.txt": "Generate sitemap.xml and robots.txt",
|
||||||
"Générer une capture Open Graph": "Generate an Open Graph capture",
|
"Générer une capture Open Graph": "Generate an Open Graph capture",
|
||||||
|
"Gérer les catégories": "Manage categories",
|
||||||
|
"Gérer les commentaires": "Manage comments",
|
||||||
|
"Gérer les données": "Manage Data",
|
||||||
"Hauteur": "Height:",
|
"Hauteur": "Height:",
|
||||||
|
"Hauteur de l'image": "Image Height",
|
||||||
|
"Hauteur de l'image sélectionnée": "Selected Image Height",
|
||||||
"Hauteur maximale": "Maximum height",
|
"Hauteur maximale": "Maximum height",
|
||||||
"ID de la chaîne : https://www.youtube.com/channel/[ID].": "Channel ID: https://www.youtube.com/channel/ [ID].",
|
"ID de la chaîne : https://www.youtube.com/channel/[ID].": "Channel ID: https://www.youtube.com/channel/ [ID].",
|
||||||
"Icône": "Icon",
|
"Icône": "Icon",
|
||||||
"Icône avec bulle de texte": "Icon with text bubble",
|
"Icône avec bulle de texte": "Icon with text bubble",
|
||||||
|
"Icône haut de page, couleur arrière-plan": "Top page icon, background color",
|
||||||
"Identifiant": "Identifier",
|
"Identifiant": "Identifier",
|
||||||
"Identifiant (sans espace ni majuscule)": "Identifier (without space or capital letters)",
|
"Identifiant (sans espace ni majuscule)": "Identifier (without space or capital letters)",
|
||||||
"Identité": "Identity",
|
"Identité": "Identity",
|
||||||
@ -245,6 +286,8 @@
|
|||||||
"Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.": "It appears in the title bar and sharing on social networks.",
|
"Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.": "It appears in the title bar and sharing on social networks.",
|
||||||
"Image": "Image",
|
"Image": "Image",
|
||||||
"Image étirée (100% 100%)": "Stretched image (100% 100%)",
|
"Image étirée (100% 100%)": "Stretched image (100% 100%)",
|
||||||
|
"Important": "Important",
|
||||||
|
"Importante": "Important",
|
||||||
"Importation d'utilisateurs": "Import of users",
|
"Importation d'utilisateurs": "Import of users",
|
||||||
"Importation de fichier plat CSV": "CSV flat file import",
|
"Importation de fichier plat CSV": "CSV flat file import",
|
||||||
"Importation effectuée": "Import done",
|
"Importation effectuée": "Import done",
|
||||||
@ -260,7 +303,6 @@
|
|||||||
"Incorrect": "Incorrect",
|
"Incorrect": "Incorrect",
|
||||||
"Informations": "Informations",
|
"Informations": "Informations",
|
||||||
"Instagram": "Instagram",
|
"Instagram": "Instagram",
|
||||||
"Installation": "Installation",
|
|
||||||
"Installation terminée": "Installation completed",
|
"Installation terminée": "Installation completed",
|
||||||
"Installer": "Install",
|
"Installer": "Install",
|
||||||
"Installer depuis le catalogue en ligne": "Install from the online catalog",
|
"Installer depuis le catalogue en ligne": "Install from the online catalog",
|
||||||
@ -277,13 +319,14 @@
|
|||||||
"L'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.": "The archive was deposited in the file manager. Archives below version 9 are not accepted.",
|
"L'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.": "The archive was deposited in the file manager. Archives below version 9 are not accepted.",
|
||||||
"L'identifiant est défini lors de la création du compte, il ne peut pas être modifié.": "The identifier is defined when creating the account, it cannot be changed.",
|
"L'identifiant est défini lors de la création du compte, il ne peut pas être modifié.": "The identifier is defined when creating the account, it cannot be changed.",
|
||||||
"La carte du site a été mise à jour": "The site card has been updated",
|
"La carte du site a été mise à jour": "The site card has been updated",
|
||||||
"La clé de l'API ne peut pas être vide": "The key to the API cannot be empty",
|
"La copie de sauvegarde du fichier htaccess n'a pas été restaurée !": "Backup copy of htaccess file has not been restored!",
|
||||||
"La description d'une page participe à son référencement, chaque page doit disposer d'une description différente.": "The description of a page participates in its referencing, each page must have a different description.",
|
"La description d'une page participe à son référencement, chaque page doit disposer d'une description différente.": "The description of a page participates in its referencing, each page must have a different description.",
|
||||||
"La page %s est ouverte par l'utilisateur %s": "Page %s opened by user %s",
|
"La page %s est ouverte par l'utilisateur %s": "Page %s opened by user %s",
|
||||||
"La page demandée n'existe pas ou est introuvable (erreur 404)": "This page does not exists (error 404)",
|
"La page demandée n'existe pas ou est introuvable (erreur 404)": "This page does not exists (error 404)",
|
||||||
"La page est affichée dans un menu horizontal mais pas dans le menu vertical d'une barre latérale.": "The page is displayed in a horizontal menu but not in the vertical menu of a sidebar.",
|
"La page est affichée dans un menu horizontal mais pas dans le menu vertical d'une barre latérale.": "The page is displayed in a horizontal menu but not in the vertical menu of a sidebar.",
|
||||||
"La première page que vos visiteurs verront.": "The first page that your visitors will see.",
|
"La première page que vos visiteurs verront.": "The first page that your visitors will see.",
|
||||||
"La règlementation française impose un anonymat de niveau 2": "French regulations require level 2 anonymity",
|
"La règlementation française impose un anonymat de niveau 2": "French regulations require level 2 anonymity",
|
||||||
|
"La réécriture d'URL n'a pas été restaurée !": "URL rewriting has not been restored!",
|
||||||
"La sauvegarde des fichiers peut prendre du temps. Continuer ?": "The backup of the files can take time. Continue?",
|
"La sauvegarde des fichiers peut prendre du temps. Continuer ?": "The backup of the files can take time. Continue?",
|
||||||
"La suppression a échoué": "The deletion failed",
|
"La suppression a échoué": "The deletion failed",
|
||||||
"La version installée est plus récente": "The installed version is more recent",
|
"La version installée est plus récente": "The installed version is more recent",
|
||||||
@ -295,6 +338,8 @@
|
|||||||
"Langues disponibles": "Available languages",
|
"Langues disponibles": "Available languages",
|
||||||
"Langues installées": "Installed languages",
|
"Langues installées": "Installed languages",
|
||||||
"Largeur": "Width",
|
"Largeur": "Width",
|
||||||
|
"Largeur de l'image": "Image Width",
|
||||||
|
"Largeur du site": "Site Width",
|
||||||
"Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.": "The horizontal cursor regulates the level of transparency, place it on the left for invisible highlights.",
|
"Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.": "The horizontal cursor regulates the level of transparency, place it on the left for invisible highlights.",
|
||||||
"Le curseur horizontal règle le niveau de transparence.": "The horizontal cursor regulates the level of transparency.",
|
"Le curseur horizontal règle le niveau de transparence.": "The horizontal cursor regulates the level of transparency.",
|
||||||
"Le fuseau horaire est utile au bon référencement": "The time zone is useful for the right SEO",
|
"Le fuseau horaire est utile au bon référencement": "The time zone is useful for the right SEO",
|
||||||
@ -309,6 +354,7 @@
|
|||||||
"Les langues sélectionnées sont identiques": "The selected languages are identical",
|
"Les langues sélectionnées sont identiques": "The selected languages are identical",
|
||||||
"Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.": "Legal notices are compulsory in France. An option of the footer adds a discrete link to this page.",
|
"Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.": "Legal notices are compulsory in France. An option of the footer adds a discrete link to this page.",
|
||||||
"Les modifications que vous avez apportées ne seront peut-être pas enregistrées.": "The changes you have made may not be recorded.",
|
"Les modifications que vous avez apportées ne seront peut-être pas enregistrées.": "The changes you have made may not be recorded.",
|
||||||
|
"Les tailles des polices de la bannière, de menu et de pied de page sont proportionnelles à cette taille.": "The font sizes of the banner, menu and footer are proportional to this size.",
|
||||||
"Lettres": "Letters",
|
"Lettres": "Letters",
|
||||||
"Libre": "Libre",
|
"Libre": "Libre",
|
||||||
"Licence :": "Licence:",
|
"Licence :": "Licence:",
|
||||||
@ -321,6 +367,8 @@
|
|||||||
"Liste noire": "Blacklist",
|
"Liste noire": "Blacklist",
|
||||||
"Liste noire réinitialisée avec succès": "Blacklist successfully reset",
|
"Liste noire réinitialisée avec succès": "Blacklist successfully reset",
|
||||||
"Lors d'une mise à jour automatique, conserve le fichier htaccess de la racine du site.": "During an automatic update, keeps the htaccess file of the site root.",
|
"Lors d'une mise à jour automatique, conserve le fichier htaccess de la racine du site.": "During an automatic update, keeps the htaccess file of the site root.",
|
||||||
|
"Léger": "Light",
|
||||||
|
"Légère": "Light",
|
||||||
"Maigre": "Lean",
|
"Maigre": "Lean",
|
||||||
"Maintenance": "Maintenance",
|
"Maintenance": "Maintenance",
|
||||||
"Majuscule à chaque mot": "Capper with each word",
|
"Majuscule à chaque mot": "Capper with each word",
|
||||||
@ -330,9 +378,12 @@
|
|||||||
"Masquer la page et les pages enfants dans le menu d'une barre latérale": "Hide the page and children's pages in the menu of a sidebar",
|
"Masquer la page et les pages enfants dans le menu d'une barre latérale": "Hide the page and children's pages in the menu of a sidebar",
|
||||||
"Masquer les pages enfants dans le menu horizontal": "Hide children's pages in the horizontal menu",
|
"Masquer les pages enfants dans le menu horizontal": "Hide children's pages in the horizontal menu",
|
||||||
"Membre": "Member",
|
"Membre": "Member",
|
||||||
|
"Membre avec droit de partage": "Member with sharing rights",
|
||||||
|
"Membre simple": "Simple member",
|
||||||
"Mentions légales": "Legal notice",
|
"Mentions légales": "Legal notice",
|
||||||
"Menu": "Menu",
|
"Menu": "Menu",
|
||||||
"Menu accessoire": "Accessory menu",
|
"Menu accessoire": "Accessory menu",
|
||||||
|
"Menu burger dans écran réduit": "Burger menu in reduced screen",
|
||||||
"Menu standard": "Standard menu",
|
"Menu standard": "Standard menu",
|
||||||
"Message d'acceptation des Cookies": "Cookie acceptance message",
|
"Message d'acceptation des Cookies": "Cookie acceptance message",
|
||||||
"Message de consentement aux cookies": "Cookie consent message",
|
"Message de consentement aux cookies": "Cookie consent message",
|
||||||
@ -345,12 +396,11 @@
|
|||||||
"Mise en page": "Layout",
|
"Mise en page": "Layout",
|
||||||
"Mise à jour": "Update",
|
"Mise à jour": "Update",
|
||||||
"Mise à jour automatisée": "Automated update",
|
"Mise à jour automatisée": "Automated update",
|
||||||
"Mise à jour de ZwiiCMS": "Zwiicms update",
|
|
||||||
"Mise à jour terminée avec succès.": "Successful update completed.",
|
"Mise à jour terminée avec succès.": "Successful update completed.",
|
||||||
"Modifications enregistrées": "Modifications recorded",
|
"Modifications enregistrées": "Modifications recorded",
|
||||||
"Module": "Module",
|
"Module": "Module",
|
||||||
"Module de la page": "Page module",
|
"Module de la page": "Page module",
|
||||||
"Modules": "",
|
"Modules": "Modules",
|
||||||
"Modules configurés": "Configured modules",
|
"Modules configurés": "Configured modules",
|
||||||
"Modules installés": "Installed modules",
|
"Modules installés": "Installed modules",
|
||||||
"Modules orphelins": "Orphaned modules",
|
"Modules orphelins": "Orphaned modules",
|
||||||
@ -358,20 +408,23 @@
|
|||||||
"Mot de passe oublié": "Forgot your password",
|
"Mot de passe oublié": "Forgot your password",
|
||||||
"Mot de passe perdu": "Lost password",
|
"Mot de passe perdu": "Lost password",
|
||||||
"Motorisé par": "Powered by",
|
"Motorisé par": "Powered by",
|
||||||
|
"Moyen": "Medium",
|
||||||
|
"Moyenne": "Medium",
|
||||||
"Moyenne (200%)": "Average (200%)",
|
"Moyenne (200%)": "Average (200%)",
|
||||||
"Moyenne (200px)": "Average (200px)",
|
"Moyenne (200px)": "Average (200px)",
|
||||||
"Multilingue": "Multilanguage",
|
|
||||||
"Méta-description": "Meta-description",
|
"Méta-description": "Meta-description",
|
||||||
"Méta-titre": "Meta title",
|
"Méta-titre": "Meta title",
|
||||||
"Ne pas afficher": "Do not display",
|
"Ne pas afficher": "Do not display",
|
||||||
"Ne pas charger l'exemple de site (utilisateurs avancés)": "Do not load the example of a site (advanced users)",
|
"Ne pas charger l'exemple de site (utilisateurs avancés)": "Do not load the example of a site (advanced users)",
|
||||||
"Ne pas répéter": "Do not repeat",
|
"Ne pas répéter": "Do not repeat",
|
||||||
"Ne pas saisir les balises": "Don't type tags",
|
"Ne pas saisir les balises": "Don't type tags",
|
||||||
|
"News": "",
|
||||||
"Niveau 1 (192.168.12.x)": "Level 1 (192.168.12.x)",
|
"Niveau 1 (192.168.12.x)": "Level 1 (192.168.12.x)",
|
||||||
"Niveau 2 (192.168.x.x)": "Level 2 (192.168.x.x)",
|
"Niveau 2 (192.168.x.x)": "Level 2 (192.168.x.x)",
|
||||||
"Niveau 3 (192.x.x.x)": "Level 3 (192.x.x.x)",
|
"Niveau 3 (192.x.x.x)": "Level 3 (192.x.x.x)",
|
||||||
"Nom": "Last Name",
|
"Nom": "Last Name",
|
||||||
"Nom Prénom": "Last name First Name",
|
"Nom Prénom": "Last name First Name",
|
||||||
|
"Nom du profil": "Profile Name",
|
||||||
"Nom utilisateur": "Username",
|
"Nom utilisateur": "Username",
|
||||||
"Non": "No",
|
"Non": "No",
|
||||||
"Non tronquée": "Unmanned",
|
"Non tronquée": "Unmanned",
|
||||||
@ -386,6 +439,7 @@
|
|||||||
"Ombre": "Shadow",
|
"Ombre": "Shadow",
|
||||||
"Option active en mode déconnecté uniquement, les pages enfants sont visibles et accessibles.": "Active option in disconnected mode only, children's pages are visible and accessible.",
|
"Option active en mode déconnecté uniquement, les pages enfants sont visibles et accessibles.": "Active option in disconnected mode only, children's pages are visible and accessible.",
|
||||||
"Option recommandée pour sécuriser la connexion. S'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.": "Recommended option to secure the connection. Applies to all the Captchas of the site. Simple Captcha is limited to an addition of numbers from 0 to 10. Complex Captcha uses four numbers of 0 to 20. Recommended activation.",
|
"Option recommandée pour sécuriser la connexion. S'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.": "Recommended option to secure the connection. Applies to all the Captchas of the site. Simple Captcha is limited to an addition of numbers from 0 to 10. Complex Captcha uses four numbers of 0 to 20. Recommended activation.",
|
||||||
|
"Options": "Options",
|
||||||
"Options avancées": "Advanced options",
|
"Options avancées": "Advanced options",
|
||||||
"Origine": "Origin",
|
"Origine": "Origin",
|
||||||
"Oui": "Yes",
|
"Oui": "Yes",
|
||||||
@ -410,11 +464,17 @@
|
|||||||
"Paramètres": "Settings",
|
"Paramètres": "Settings",
|
||||||
"Paramètres de la localisation": "Location parameters",
|
"Paramètres de la localisation": "Location parameters",
|
||||||
"Paramètres de la sauvegarde": "Backup settings",
|
"Paramètres de la sauvegarde": "Backup settings",
|
||||||
|
"Paramètres du profil": "Profile Settings",
|
||||||
"Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d'envoi de mail.": "Settings to use when your host does not offer the mail sending feature.",
|
"Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d'envoi de mail.": "Settings to use when your host does not offer the mail sending feature.",
|
||||||
"Pas de marge au-dessus et en dessous du site": "No margin above and below the site",
|
"Pas de marge au-dessus et en dessous du site": "No margin above and below the site",
|
||||||
"Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "Remember to delete your browser's cache if the favicon does not change.",
|
"Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "Remember to delete your browser's cache if the favicon does not change.",
|
||||||
"Permission": "Permission",
|
"Permission": "Permission",
|
||||||
"Permission et référencement": "Permission and SEO",
|
"Permission et référencement": "Permission and SEO",
|
||||||
|
"Permissions": "Permissions",
|
||||||
|
"Permissions sur les dossiers": "Folder Permissions",
|
||||||
|
"Permissions sur les fichiers": "File Permissions",
|
||||||
|
"Permissions sur les pages": "Page Permissions",
|
||||||
|
"Petite": "Small",
|
||||||
"Petite (150px)": "Small (150px)",
|
"Petite (150px)": "Small (150px)",
|
||||||
"Petite (180%)": "Petite (180%)",
|
"Petite (180%)": "Petite (180%)",
|
||||||
"Pied de page": "Footer",
|
"Pied de page": "Footer",
|
||||||
@ -427,6 +487,9 @@
|
|||||||
"Position": "Position",
|
"Position": "Position",
|
||||||
"Position du module": "Position of the module",
|
"Position du module": "Position of the module",
|
||||||
"Pour définir la page comme barre latérale, choisissez l'option dans la liste.": "To define the page as a sidebar, choose the option from the list.",
|
"Pour définir la page comme barre latérale, choisissez l'option dans la liste.": "To define the page as a sidebar, choose the option from the list.",
|
||||||
|
"Presse Papier": "Clipboard",
|
||||||
|
"Presse papier": "Clipboard",
|
||||||
|
"Profils des groupes": "Group Profiles",
|
||||||
"Proportionnelle à la taille définie dans le site.": "Proportional to that defined in the site.",
|
"Proportionnelle à la taille définie dans le site.": "Proportional to that defined in the site.",
|
||||||
"Prénom": "First name",
|
"Prénom": "First name",
|
||||||
"Prénom Nom": "Firstname name",
|
"Prénom Nom": "Firstname name",
|
||||||
@ -434,12 +497,18 @@
|
|||||||
"Préserver le fichier htaccess racine": "Preserve the root htaccess file",
|
"Préserver le fichier htaccess racine": "Preserve the root htaccess file",
|
||||||
"Préserver les comptes des utilisateurs déjà installés": "Preserve user accounts already installed",
|
"Préserver les comptes des utilisateurs déjà installés": "Preserve user accounts already installed",
|
||||||
"Prévenir l'utilisateur par mail": "Prevent the user by email",
|
"Prévenir l'utilisateur par mail": "Prevent the user by email",
|
||||||
|
"Prévisualiser": "Preview",
|
||||||
"Pseudo": "Pseudo",
|
"Pseudo": "Pseudo",
|
||||||
|
"Rang 9 > rang 1. Le profil de rang 1 n'est pas modifiable.": "Rank 9 > Rank 1. The profile of Rank 1 is not editable.",
|
||||||
|
"Ratio": "Ratio",
|
||||||
"Ratio :": "Ratio:",
|
"Ratio :": "Ratio:",
|
||||||
|
"Recherche": "Search",
|
||||||
"Recherche dans le site": "Search on the site",
|
"Recherche dans le site": "Search on the site",
|
||||||
"Rechercher": "Search",
|
"Rechercher": "Search",
|
||||||
"Rechercher une mise à jour en ligne": "Search for an online update",
|
"Rechercher une mise à jour en ligne": "Search for an online update",
|
||||||
|
"Redirection": "Redirection",
|
||||||
"Redirection vers la connexion": "Redirection to connection",
|
"Redirection vers la connexion": "Redirection to connection",
|
||||||
|
"Renommer": "Rename",
|
||||||
"Renseignez les champs ci-dessous pour finaliser l'installation.": "Fill in the fields below to finalize the installation.",
|
"Renseignez les champs ci-dessous pour finaliser l'installation.": "Fill in the fields below to finalize the installation.",
|
||||||
"Responsive (contain)": "Responsive (contain)",
|
"Responsive (contain)": "Responsive (contain)",
|
||||||
"Responsive (cover)": "Responsive (cover)",
|
"Responsive (cover)": "Responsive (cover)",
|
||||||
@ -450,6 +519,7 @@
|
|||||||
"Rester connecté sur ce navigateur": "Stay connected on this browser",
|
"Rester connecté sur ce navigateur": "Stay connected on this browser",
|
||||||
"Retour": "Return",
|
"Retour": "Return",
|
||||||
"Rien à importer, erreur de format ou fichier incorrect": "Nothing to import, format error or incorrect file",
|
"Rien à importer, erreur de format ou fichier incorrect": "Nothing to import, format error or incorrect file",
|
||||||
|
"Rédacteur": "Editor",
|
||||||
"Référencement": "SEO",
|
"Référencement": "SEO",
|
||||||
"Réinitialisation du mot de passe": "Reset password",
|
"Réinitialisation du mot de passe": "Reset password",
|
||||||
"Réinitialiser avec le thème par défaut": "Reset with the default theme",
|
"Réinitialiser avec le thème par défaut": "Reset with the default theme",
|
||||||
@ -477,7 +547,7 @@
|
|||||||
"Sauvegarde": "Backup",
|
"Sauvegarde": "Backup",
|
||||||
"Sauvegarde automatique quotidienne du site": "Daily automatic backup of the site",
|
"Sauvegarde automatique quotidienne du site": "Daily automatic backup of the site",
|
||||||
"Sauvegarde du thème dans le": "Backup of the theme in the",
|
"Sauvegarde du thème dans le": "Backup of the theme in the",
|
||||||
"Sauvegarde générée avec succès.": "Successfully generated backup.",
|
"Sauvegarde générée avec succès": "Successfully generated backup.",
|
||||||
"Sauvegarder": "Backup",
|
"Sauvegarder": "Backup",
|
||||||
"Sauvegarder et télécharger le module": "Save and download the module",
|
"Sauvegarder et télécharger le module": "Save and download the module",
|
||||||
"Sauvegarder le module dans le gestionnaire de fichiers": "Save the module in the file manager",
|
"Sauvegarder le module dans le gestionnaire de fichiers": "Save the module in the file manager",
|
||||||
@ -498,7 +568,7 @@
|
|||||||
"Standard": "Standard",
|
"Standard": "Standard",
|
||||||
"Style": "Style",
|
"Style": "Style",
|
||||||
"Suppression interdite": "Deletion prohibited",
|
"Suppression interdite": "Deletion prohibited",
|
||||||
"Suppression interdite, page active dans la configuration du site": "Deletion prohibited, active page in site configuration",
|
"Suppression interdite, page active dans la configuration de la langue du site": "Deletion not allowed, page is active in the site's language configuration",
|
||||||
"Supprime le point d'interrogation dans les URL, l'option est indisponible avec les autres serveurs Web": "Deletes the question mark in the URLs, the option is unavailable with other web servers",
|
"Supprime le point d'interrogation dans les URL, l'option est indisponible avec les autres serveurs Web": "Deletes the question mark in the URLs, the option is unavailable with other web servers",
|
||||||
"Supprimer": "Delete",
|
"Supprimer": "Delete",
|
||||||
"Supprimer la page": "Delete the page",
|
"Supprimer la page": "Delete the page",
|
||||||
@ -517,6 +587,7 @@
|
|||||||
"Sélectionnez une image ou une icône de petite dimension": "Select a small image or icon",
|
"Sélectionnez une image ou une icône de petite dimension": "Select a small image or icon",
|
||||||
"Sélectionnez une langue": "Select a language",
|
"Sélectionnez une langue": "Select a language",
|
||||||
"Sélectionnez une page contenant le module 'Recherche'. Une option du pied de page ajoute un lien discret vers cette page.": "Select a page containing the 'research' module. An option of the footer adds a discrete link to this page.",
|
"Sélectionnez une page contenant le module 'Recherche'. Une option du pied de page ajoute un lien discret vers cette page.": "Select a page containing the 'research' module. An option of the footer adds a discrete link to this page.",
|
||||||
|
"Sélectionnez une page pour activer": "Select a page to activate",
|
||||||
"Séparateur": "Separator",
|
"Séparateur": "Separator",
|
||||||
"Taille": "Size",
|
"Taille": "Size",
|
||||||
"Text": "Text",
|
"Text": "Text",
|
||||||
@ -531,9 +602,18 @@
|
|||||||
"Titre masqué": "Masked title",
|
"Titre masqué": "Masked title",
|
||||||
"Titre masqué dans la page": "Masked hidden in the page",
|
"Titre masqué dans la page": "Masked hidden in the page",
|
||||||
"Titres": "Titles",
|
"Titres": "Titles",
|
||||||
|
"Tous les dossiers": "All Folders",
|
||||||
|
"Tous les droits d'édition des contenus": "All content editing rights",
|
||||||
|
"Tout Effacer": "Clear All",
|
||||||
"Traduction supprimée": "Translation deleted",
|
"Traduction supprimée": "Translation deleted",
|
||||||
|
"Très grande": "Very large",
|
||||||
"Très grande (240%)": "Very large (240%)",
|
"Très grande (240%)": "Very large (240%)",
|
||||||
"Très grande (400px)": "Very large (400px)",
|
"Très grande (400px)": "Very large (400px)",
|
||||||
|
"Très important": "Very important",
|
||||||
|
"Très importante": "Very important",
|
||||||
|
"Très léger": "Very light",
|
||||||
|
"Très légère": "Very light",
|
||||||
|
"Très petite": "Very small",
|
||||||
"Très petite (100px) ": "Very small (100px)",
|
"Très petite (100px) ": "Very small (100px)",
|
||||||
"Très petite (160%)": "Very small (160%)",
|
"Très petite (160%)": "Very small (160%)",
|
||||||
"Twitter": "Twitter",
|
"Twitter": "Twitter",
|
||||||
@ -544,6 +624,7 @@
|
|||||||
"Télécharger la liste": "Download list",
|
"Télécharger la liste": "Download list",
|
||||||
"Télécharger le journal": "Download logs",
|
"Télécharger le journal": "Download logs",
|
||||||
"Télécharger le module dans le gestionnaire de fichiers": "Download the module in the file manager",
|
"Télécharger le module dans le gestionnaire de fichiers": "Download the module in the file manager",
|
||||||
|
"Téléverser": "Upload",
|
||||||
"URL incorrecte": "Incorrect url",
|
"URL incorrecte": "Incorrect url",
|
||||||
"Un mail a été envoyé pour confirmer la réinitialisation": "An email was sent to confirm the reset",
|
"Un mail a été envoyé pour confirmer la réinitialisation": "An email was sent to confirm the reset",
|
||||||
"Une archive du dossier /site/data est conservée pendant 30 jours. Activation recommandée": "An archive of the file /site/data is kept for 30 days. Recommended activation",
|
"Une archive du dossier /site/data est conservée pendant 30 jours. Activation recommandée": "An archive of the file /site/data is kept for 30 days. Recommended activation",
|
||||||
@ -552,12 +633,14 @@
|
|||||||
"Utilisateur inexistant": "Non-existent user",
|
"Utilisateur inexistant": "Non-existent user",
|
||||||
"Utilisateur supprimé": "User deleted",
|
"Utilisateur supprimé": "User deleted",
|
||||||
"Utilisateurs": "Users",
|
"Utilisateurs": "Users",
|
||||||
"Valider": "To validate",
|
"Valider": "Submit",
|
||||||
"Version": "Version",
|
"Version": "Version",
|
||||||
"Version n°": "Version n°",
|
"Version n°": "Version n°",
|
||||||
"Vider dossier sauvegardes auto": "Empty auto backup files",
|
"Vider dossier sauvegardes auto": "Empty auto backup files",
|
||||||
|
"Visiteur": "Visitor",
|
||||||
"Vous n'êtes pas autorisé à consulter cette page (erreur 403)": "You are not authorised to view this page (error 403)",
|
"Vous n'êtes pas autorisé à consulter cette page (erreur 403)": "You are not authorised to view this page (error 403)",
|
||||||
"Youtube": "Youtube",
|
"Youtube": "Youtube",
|
||||||
|
"ZwiiCMS - Installation": "ZwiiCMS - Installation",
|
||||||
"actualisé": "updated",
|
"actualisé": "updated",
|
||||||
"favicon.ico": "favicon.ico",
|
"favicon.ico": "favicon.ico",
|
||||||
"faviconDark.ico": "favicondark.ico",
|
"faviconDark.ico": "favicondark.ico",
|
||||||
@ -566,54 +649,45 @@
|
|||||||
"jour": "day",
|
"jour": "day",
|
||||||
"jours": "days",
|
"jours": "days",
|
||||||
"sauvegardé avec succès": "successfully saved",
|
"sauvegardé avec succès": "successfully saved",
|
||||||
"vers ZwiiCMS": "to ZwiiCMS",
|
"vers": "to",
|
||||||
"À droite": "Right",
|
"À droite": "Right",
|
||||||
"À gauche": "Left",
|
"À gauche": "Left",
|
||||||
"À l'emplacement du mot clé [MODULE] dans la page": "At the location of the keyword [MODULE] on the page",
|
"À l'emplacement du mot clé [MODULE] dans la page": "At the location of the keyword [MODULE] on the page",
|
||||||
|
"Échec de l'écriture, vérifiez les permissions": "Failure of writing, check permissions",
|
||||||
"Échecs": "Fail",
|
"Échecs": "Fail",
|
||||||
"Éditer": "Edit",
|
"Éditer": "Edit",
|
||||||
"Éditer la page": "Edit the page",
|
"Éditer la page": "Edit the page",
|
||||||
"Éditer les dialogues": "Edit dialogs",
|
"Éditer les dialogues": "Edit dialogs",
|
||||||
|
"Éditer une catégorie": "Edit category",
|
||||||
"Éditeur": "Editor",
|
"Éditeur": "Editor",
|
||||||
"Éditeur CSS": "CSS editor",
|
"Éditeur CSS": "CSS editor",
|
||||||
"Éditeur JS": "JS editor",
|
"Éditeur JS": "JS editor",
|
||||||
"Éditeur de script %s": "Script editor %s",
|
"Éditeur de script %s": "Script editor %s",
|
||||||
"Éditeur de script dans Body": "Script editor in Body",
|
"Éditeur de script dans Body": "Script editor in Body",
|
||||||
"Éditeur de script dans Head": "Script editor in Head",
|
"Éditeur de script dans Head": "Script editor in Head",
|
||||||
|
"Éditeur simple": "Simple editor",
|
||||||
|
"Édition des pages": "Page editing",
|
||||||
|
"Édition du profil %s": "Edit Profile %s",
|
||||||
"Éléments": "Items",
|
"Éléments": "Items",
|
||||||
"Étiquettes des pages spéciales": "Special pages labels",
|
|
||||||
"Largeur de l'image": "Image Width",
|
|
||||||
"Hauteur de l'image": "Image Height",
|
|
||||||
"Largeur du site": "Site Width",
|
|
||||||
"Ratio": "Ratio",
|
|
||||||
"Hauteur de l'image sélectionnée": "Selected Image Height",
|
|
||||||
"Étendu sur la page": "Spread across the page",
|
"Étendu sur la page": "Spread across the page",
|
||||||
"Très légère": "Very light",
|
"Étiquettes des pages spéciales": "Special pages labels",
|
||||||
"Légère": "Light",
|
"Dimensions minimales": "Minimum dimensions",
|
||||||
"Moyenne": "Medium",
|
"Taille maximale du fichier": "Maximum file size",
|
||||||
"Importante": "Important",
|
"5 Mo pour les images JPEG": "5 MB for JPEG images",
|
||||||
"Très importante": "Very important",
|
"1 Mo pour les images PNG": "1 MB for PNG images",
|
||||||
"Aucun": "None",
|
"Poids": "Weight",
|
||||||
"Aucune": "None",
|
"Supprimer ce profil ?": "Delete this profile?",
|
||||||
"Très léger": "Very light",
|
"Masqué": "Hidden",
|
||||||
"Léger": "Light",
|
"Haut de page": "Top of Page",
|
||||||
"Moyen": "Medium",
|
"Bas de page": "Bottom of Page",
|
||||||
"Important": "Important",
|
"Petit triangle": "Small Triangle",
|
||||||
"Très important": "Very important",
|
"Grand triangle": "Large Triangle",
|
||||||
"En-dehors du site": "Outside the site",
|
"Flèche": "Arrow",
|
||||||
"Avant la bannière": "Before the banner",
|
"Modèle": "Template",
|
||||||
"Après la bannière": "After the banner",
|
"Bouton de navigation droit": "Right Navigation Button",
|
||||||
"Caché": "Hidden",
|
"Bouton de navigation gauche": "Left Navigation Button",
|
||||||
"Très petite": "Very small",
|
"Groupes / Profils": "Groups / Profiles",
|
||||||
"Petite": "Small",
|
"Prénom commence par": "First Name starts with",
|
||||||
"Grande": "Large",
|
"Nom commence par": "Last Name starts with",
|
||||||
"Très grande": "Very large",
|
"Impossible de réinitialiser le mot de passe de ce compte !": "Impossible to reset this account password!"
|
||||||
"Les tailles des polices de la bannière, de menu et de pied de page sont proportionnelles à cette taille.": "The font sizes of the banner, menu and footer are proportional to this size.",
|
|
||||||
"En dessous du site": "Below the site",
|
|
||||||
"Sélectionnez une page pour activer": "Select a page to activate",
|
|
||||||
"Couleur icône haut de page": "Color of top page icon",
|
|
||||||
"Icône haut de page, couleur arrière-plan": "Top page icon, background color",
|
|
||||||
"Disponible si le consentement des cookies est activé.": "Available if cookie consent is enabled.",
|
|
||||||
"Affiche les icônes de gestion du compte et de déconnexion des membres simples connectés.": "Displays account management icons and logout function for logged-in users.",
|
|
||||||
"Définir par défaut": "Set as default"
|
|
||||||
}
|
}
|
@ -17,7 +17,11 @@
|
|||||||
"5 tentatives": "5 intentos",
|
"5 tentatives": "5 intentos",
|
||||||
"7 jours": "7 días",
|
"7 jours": "7 días",
|
||||||
"Accueil": "Inicio",
|
"Accueil": "Inicio",
|
||||||
|
"Accède au site": "Acceso al sitio",
|
||||||
|
"Accède aux pages réservées": "Acceso a páginas restringidas",
|
||||||
|
"Accède aux pages réservées et à un dossier partagé": "Acceso a páginas restringidas y una carpeta compartida",
|
||||||
"Accès bloqué %d minutes": "Acceso bloqueado minutos",
|
"Accès bloqué %d minutes": "Acceso bloqueado minutos",
|
||||||
|
"Accès désactivé": "Acceso desactivado",
|
||||||
"Accès interdit, erreur 403": "Acceso denegado, error 403",
|
"Accès interdit, erreur 403": "Acceso denegado, error 403",
|
||||||
"Action interdite": "Acción no permitida",
|
"Action interdite": "Acción no permitida",
|
||||||
"Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.": "Activación obligatoria según las leyes francesas a menos que utilice su propio sistema de consentimiento.",
|
"Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.": "Activación obligatoria según las leyes francesas a menos que utilice su propio sistema de consentimiento.",
|
||||||
@ -31,10 +35,12 @@
|
|||||||
"Adresse du proxy": "Dirección proxy",
|
"Adresse du proxy": "Dirección proxy",
|
||||||
"Adresse électronique": "Correo electrónico",
|
"Adresse électronique": "Correo electrónico",
|
||||||
"Affectation": "Asignación",
|
"Affectation": "Asignación",
|
||||||
"Menu burger dans écran réduit": "Menú hamburguesa en pantalla reducida",
|
|
||||||
"Affiche le nom de la page parente suivi du nom de la page, le titre ne doit pas être masqué.": "Mostrar el nombre de la página principal seguido del nombre de la página, el título no debe ocultarse.",
|
"Affiche le nom de la page parente suivi du nom de la page, le titre ne doit pas être masqué.": "Mostrar el nombre de la página principal seguido del nombre de la página, el título no debe ocultarse.",
|
||||||
|
"Affiche les icônes de gestion du compte et de déconnexion des membres simples connectés": "Muestra los iconos de gestión de cuenta y cierre de sesión para miembros regulares conectados",
|
||||||
"Afin d'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l'opération.": "Para garantizar el correcto funcionamiento de Zwii, no cierre esta página antes de que se complete la operación",
|
"Afin d'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l'opération.": "Para garantizar el correcto funcionamiento de Zwii, no cierre esta página antes de que se complete la operación",
|
||||||
"Aide": "Ayuda",
|
"Aide": "Ayuda",
|
||||||
|
"Ajouter": "Agregar",
|
||||||
|
"Ajouter un profil": "Agregar un perfil",
|
||||||
"Ajouter un utilisateur": "Agregar usuario",
|
"Ajouter un utilisateur": "Agregar usuario",
|
||||||
"Ajouter une fonte": "Añadir tipografía",
|
"Ajouter une fonte": "Añadir tipografía",
|
||||||
"Alignement": "Alineación de contenido",
|
"Alignement": "Alineación de contenido",
|
||||||
@ -45,7 +51,9 @@
|
|||||||
"Apache URL intelligentes": "URL inteligentes de Apache",
|
"Apache URL intelligentes": "URL inteligentes de Apache",
|
||||||
"Apparence": "Apariencia",
|
"Apparence": "Apariencia",
|
||||||
"Appliquer": "Aplicar",
|
"Appliquer": "Aplicar",
|
||||||
|
"Approuver un commentaire": "Aprobar comentarios",
|
||||||
"Après": "Después",
|
"Après": "Después",
|
||||||
|
"Après la bannière": "Después del banner",
|
||||||
"Après le contenu de la page": "Después del contenido de la página",
|
"Après le contenu de la page": "Después del contenido de la página",
|
||||||
"Archive": "Archivo",
|
"Archive": "Archivo",
|
||||||
"Archive ZIP": "Archivo ZIP",
|
"Archive ZIP": "Archivo ZIP",
|
||||||
@ -63,20 +71,25 @@
|
|||||||
"Arrière plan des champs": "Fondo de zona",
|
"Arrière plan des champs": "Fondo de zona",
|
||||||
"Arrondi des angles": "Redondeo de ángulos",
|
"Arrondi des angles": "Redondeo de ángulos",
|
||||||
"Au centre": "En el centro",
|
"Au centre": "En el centro",
|
||||||
"Au-dessus du site": "Por encima del sitio",
|
|
||||||
"Au début": "Al principio",
|
"Au début": "Al principio",
|
||||||
"Au milieu au centre": "En el medio en el centro",
|
"Au milieu au centre": "En el medio en el centro",
|
||||||
"Au milieu à droite": "En el medio derecho",
|
"Au milieu à droite": "En el medio derecho",
|
||||||
"Au milieu à gauche": "En el medio a la izquierda",
|
"Au milieu à gauche": "En el medio a la izquierda",
|
||||||
|
"Au-dessus du site": "Por encima del sitio",
|
||||||
|
"Aucun": "Ninguno",
|
||||||
|
"Aucun dossier": "Sin carpeta",
|
||||||
"Aucun fichier journal à télécharger": "No hay archivos de registro para descargar",
|
"Aucun fichier journal à télécharger": "No hay archivos de registro para descargar",
|
||||||
"Aucun journal à effacer": "No hay registros para borrar",
|
"Aucun journal à effacer": "No hay registros para borrar",
|
||||||
"Aucun menu": "Ningún menú",
|
"Aucun menu": "Ningún menú",
|
||||||
|
"Aucune": "Ninguna",
|
||||||
"Aucune liste noire à effacer": "No hay lista negra para borrar",
|
"Aucune liste noire à effacer": "No hay lista negra para borrar",
|
||||||
"Aucune liste noire à télécharger": "No hay lista negra para descargar",
|
"Aucune liste noire à télécharger": "No hay lista negra para descargar",
|
||||||
"Auteur :": "Autor",
|
"Auteur :": "Autor",
|
||||||
"Authentification": "Autenticación",
|
"Authentification": "Autenticación",
|
||||||
"Automatique": "Automáquica",
|
"Automatique": "Automáquica",
|
||||||
"Autoriser les robots à référencer le site": "Permitir que los robots hagan referencia al sitio",
|
"Autoriser les robots à référencer le site": "Permitir que los robots hagan referencia al sitio",
|
||||||
|
"Autorisé": "Autorizado",
|
||||||
|
"Avant la bannière": "Antes del banner",
|
||||||
"Avant le contenu de la page": "Antes del contenido de la página",
|
"Avant le contenu de la page": "Antes del contenido de la página",
|
||||||
"Background": "Fondo",
|
"Background": "Fondo",
|
||||||
"Banni": "Prohibición",
|
"Banni": "Prohibición",
|
||||||
@ -94,6 +107,7 @@
|
|||||||
"Barres latérales": "Barras laterales",
|
"Barres latérales": "Barras laterales",
|
||||||
"Bienvenue %s %s": "Bienvenido %s %s",
|
"Bienvenue %s %s": "Bienvenido %s %s",
|
||||||
"Blocage après échecs": "Bloquear después de fallar",
|
"Blocage après échecs": "Bloquear después de fallar",
|
||||||
|
"Blog": "Blog",
|
||||||
"Bords arrondis": "Bordes redondeados",
|
"Bords arrondis": "Bordes redondeados",
|
||||||
"Bordure des blocs": "Borde de bloques",
|
"Bordure des blocs": "Borde de bloques",
|
||||||
"Bordure des champs": "Borde de zona",
|
"Bordure des champs": "Borde de zona",
|
||||||
@ -105,6 +119,7 @@
|
|||||||
"Bouton standard": "Botón estándar",
|
"Bouton standard": "Botón estándar",
|
||||||
"Bouton validation": "Botón de validación",
|
"Bouton validation": "Botón de validación",
|
||||||
"Boutons": "Botones",
|
"Boutons": "Botones",
|
||||||
|
"Caché": "Oculto",
|
||||||
"Cachée": "Oculto",
|
"Cachée": "Oculto",
|
||||||
"Captcha complexe": "Captcha complejo",
|
"Captcha complexe": "Captcha complejo",
|
||||||
"Captcha à la connexion": "Captcha al iniciar sesión",
|
"Captcha à la connexion": "Captcha al iniciar sesión",
|
||||||
@ -121,13 +136,14 @@
|
|||||||
"Chiffres": "Cifras",
|
"Chiffres": "Cifras",
|
||||||
"Cible": "Objetivo",
|
"Cible": "Objetivo",
|
||||||
"Cliquez sur une zone afin d'accéder à ses options de personnalisation.": "Haga clic en un área para acceder a sus opciones de personalización.",
|
"Cliquez sur une zone afin d'accéder à ses options de personnalisation.": "Haga clic en un área para acceder a sus opciones de personalización.",
|
||||||
"Clé de l'API <a href=\"https://app.screenshotapi.net/\" target=\"_blank\">ScreenShotApi</a>": "Clave API <a href=",
|
"Commentaire": "Comentario",
|
||||||
"Clé de l'API <a href='https://app.screenshotapi.net/' target='_blank'>ScreenShotApi</a>": "Clave API <a href='https://app.screenshotapi.net/' target='_blank'>ScreenShotApi</a>",
|
|
||||||
"Complète": "sin truncar",
|
"Complète": "sin truncar",
|
||||||
"Compte administrateur": "Cuenta de administrador",
|
"Compte administrateur": "Cuenta de administrador",
|
||||||
|
"Compte de l'utilisateur": "Cuenta de usuario",
|
||||||
"Compte verrouillé": "Cuenta bloqueada",
|
"Compte verrouillé": "Cuenta bloqueada",
|
||||||
"Configuration": "Configuración",
|
"Configuration": "Configuración",
|
||||||
"Configuration du module": "Configuración del módulo",
|
"Configuration du module": "Configuración del módulo",
|
||||||
|
"Configurer": "Configurar",
|
||||||
"Configurer mon compte": "Configurar mi cuenta",
|
"Configurer mon compte": "Configurar mi cuenta",
|
||||||
"Confirmation": "Confirmación",
|
"Confirmation": "Confirmación",
|
||||||
"Confirmer la suppression de cet utilisateur": "Confirmar eliminación de este usuario",
|
"Confirmer la suppression de cet utilisateur": "Confirmar eliminación de este usuario",
|
||||||
@ -145,6 +161,7 @@
|
|||||||
"Contenu HTML": "Contenido HTML",
|
"Contenu HTML": "Contenido HTML",
|
||||||
"Contenu avancé": "Contenido avanzado",
|
"Contenu avancé": "Contenido avanzado",
|
||||||
"Contenu du menu vertical": "Contenido del menú vertical",
|
"Contenu du menu vertical": "Contenido del menú vertical",
|
||||||
|
"Contrôle total": "Control total",
|
||||||
"Cookies": "Cookies",
|
"Cookies": "Cookies",
|
||||||
"Cookies Zwii": "Cookies Zwii",
|
"Cookies Zwii": "Cookies Zwii",
|
||||||
"Copie de contenus localisés": "Copia de contenidos localizados",
|
"Copie de contenus localisés": "Copia de contenidos localizados",
|
||||||
@ -155,38 +172,50 @@
|
|||||||
"Copier": "Copiar",
|
"Copier": "Copiar",
|
||||||
"Copier sauvegardes auto": "Copiar guardados automáticos",
|
"Copier sauvegardes auto": "Copiar guardados automáticos",
|
||||||
"Couleur de fond automatique": "Color de fondo automático",
|
"Couleur de fond automatique": "Color de fondo automático",
|
||||||
|
"Couleur icône haut de page": "Color del icono superior de la página",
|
||||||
"Couleur texte page active": "Color del texto de página activa",
|
"Couleur texte page active": "Color del texto de página activa",
|
||||||
"Couleur unie ou papier-peint": "Color unido o papel tapiz",
|
"Couleur unie ou papier-peint": "Color unido o papel tapiz",
|
||||||
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence.": "Color visible en ausencia de una imagen.<br />El control deslizante horizontal ajusta el nivel de transparencia.",
|
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence.": "Color visible en ausencia de una imagen.<br />El control deslizante horizontal ajusta el nivel de transparencia.",
|
||||||
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.": "Color visible en ausencia de una imagen.<br />El control deslizante horizontal ajusta el nivel de transparencia. El color del texto es automático.",
|
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.": "Color visible en ausencia de una imagen.<br />El control deslizante horizontal ajusta el nivel de transparencia. El color del texto es automático.",
|
||||||
"Couleurs": "Colores",
|
"Couleurs": "Colores",
|
||||||
"Créez un compte gratuit, recopier la clé , puis valider le formulaire avant de cliquer sur le bouton de génération": "Cree una cuenta gratuita, copie la clave, luego valide el formulario antes de hacer clic en el botón generar",
|
|
||||||
"Dans le site": "En el sitio",
|
"Dans le site": "En el sitio",
|
||||||
"Dans quelle langue utiliserez-vous Zwii ?": "¿En qué idioma usará Zwii?",
|
"Dans quelle langue utiliserez-vous Zwii ?": "¿En qué idioma usará Zwii?",
|
||||||
"Date": "fecha",
|
"Date": "fecha",
|
||||||
"Description": "Descripción del sitio",
|
"Description": "Descripción del sitio",
|
||||||
|
"Disponible si le consentement des cookies est activé.": "Disponible si se ha otorgado el consentimiento de las cookies.",
|
||||||
"Disposition": "Arreglo",
|
"Disposition": "Arreglo",
|
||||||
"Données %s copiées vers %s": "Datos %s copiados hacia %s",
|
"Données %s copiées vers %s": "Datos %s copiados hacia %s",
|
||||||
"Données des modules": "Datos de los módulos",
|
"Données des modules": "Datos de los módulos",
|
||||||
"Données importées": "Datos importados",
|
"Données importées": "Datos importados",
|
||||||
|
"Dossier": "Carpeta",
|
||||||
|
"Droits sur les dossiers": "Derechos de las carpetas",
|
||||||
|
"Droits sur les fichiers": "Derechos de los archivos",
|
||||||
|
"Dupliquer": "Duplicar",
|
||||||
"Dupliquer la page": "Duplicar la página",
|
"Dupliquer la page": "Duplicar la página",
|
||||||
"Déconnecte les sessions ouvertes précédemment sur d'autres navigateurs ou terminaux. Activation recommandée.": "Desconecte sesiones abiertas previamente en otros navegadores o dispositivos. Activación recomendada.",
|
"Déconnecte les sessions ouvertes précédemment sur d'autres navigateurs ou terminaux. Activation recommandée.": "Desconecte sesiones abiertas previamente en otros navegadores o dispositivos. Activación recomendada.",
|
||||||
"Déconnecter": "Desconectar",
|
"Déconnecter": "Desconectar",
|
||||||
"Déconnexion !": "¡Cerrar sesión!",
|
"Déconnexion !": "¡Cerrar sesión!",
|
||||||
"Déconnexion automatique": "Cierre de sesión automático",
|
"Déconnexion automatique": "Cierre de sesión automático",
|
||||||
|
"Définir par défaut": "Establecer como predeterminado",
|
||||||
"Dévoiler le mot de passe": "Revelar la contraseña",
|
"Dévoiler le mot de passe": "Revelar la contraseña",
|
||||||
"Echec de l'écriture, vérifiez les permissions": "Escritura fallida, verifique los permisos",
|
"Effacer": "Borrar",
|
||||||
"Effacer la page": "Borrar página",
|
"Effacer la page": "Borrar página",
|
||||||
|
"Effacer tous les commentaires": "Borrar todos los comentarios",
|
||||||
|
"Effacer toutes les statistiques": "Borrar todas las estadísticas",
|
||||||
|
"Effacer un commentaire": "Borrar el comentario",
|
||||||
|
"Effacer une catégorie": "Borrar categoría",
|
||||||
"Emplacement :": "Ubicación",
|
"Emplacement :": "Ubicación",
|
||||||
"Emplacement dans le menu": "Ubicación en el menú",
|
"Emplacement dans le menu": "Ubicación en el menú",
|
||||||
"En bas au centre": "Abajo en el centro",
|
"En bas au centre": "Abajo en el centro",
|
||||||
"En bas à droite": "Abajo a la derecha",
|
"En bas à droite": "Abajo a la derecha",
|
||||||
"En bas à gauche": "Abajo a la izquierda",
|
"En bas à gauche": "Abajo a la izquierda",
|
||||||
"En cas de changement de module, les données du module précédent seront supprimées.": "Al cambiar de módulo se borrarán los datos del módulo anterior.",
|
"En cas de changement de module, les données du module précédent seront supprimées.": "Al cambiar de módulo se borrarán los datos del módulo anterior.",
|
||||||
|
"En dessous du site": "Debajo del sitio",
|
||||||
"En haut au centre": "Cubra en el centro",
|
"En haut au centre": "Cubra en el centro",
|
||||||
"En haut à droite": "Arriba a la derecha",
|
"En haut à droite": "Arriba a la derecha",
|
||||||
"En haut à gauche": "Arriba a la izquierda",
|
"En haut à gauche": "Arriba a la izquierda",
|
||||||
"En position libre ajoutez le module en plaçant [MODULE] à l'endroit voulu dans votre page.": "En posición libre agregue el módulo colocando [MODULE] en la ubicación deseada en su página.",
|
"En position libre ajoutez le module en plaçant [MODULE] à l'endroit voulu dans votre page.": "En posición libre agregue el módulo colocando [MODULE] en la ubicación deseada en su página.",
|
||||||
|
"En-dehors du site": "Fuera del sitio",
|
||||||
"Enregistrer": "Registrar",
|
"Enregistrer": "Registrar",
|
||||||
"Envoyer un message de confirmation": "Enviar mensaje de confirmación",
|
"Envoyer un message de confirmation": "Enviar mensaje de confirmación",
|
||||||
"Erreur : sauvegarde non générée !": "Error: copia de seguridad no generada!",
|
"Erreur : sauvegarde non générée !": "Error: copia de seguridad no generada!",
|
||||||
@ -197,8 +226,10 @@
|
|||||||
"Erreur de lecture, vérifiez les permissions": "Error de lectura, verifique los permisos",
|
"Erreur de lecture, vérifiez les permissions": "Error de lectura, verifique los permisos",
|
||||||
"Erreur inconnue": "error desconocido",
|
"Erreur inconnue": "error desconocido",
|
||||||
"Erreur inconnue, le module n'est pas installé": "Error desconocido, el módulo no está instalado",
|
"Erreur inconnue, le module n'est pas installé": "Error desconocido, el módulo no está instalado",
|
||||||
|
"Export CSV": "Exportar CSV",
|
||||||
"Expéditeur": "Remitente",
|
"Expéditeur": "Remitente",
|
||||||
"Extension": "Extensión",
|
"Extension": "Extensión",
|
||||||
|
"Extraire": "Extraer",
|
||||||
"Facebook": "Facebook",
|
"Facebook": "Facebook",
|
||||||
"Famille": "Vínculo",
|
"Famille": "Vínculo",
|
||||||
"Favicon thème sombre": "favicon de tema oscuro",
|
"Favicon thème sombre": "favicon de tema oscuro",
|
||||||
@ -217,26 +248,36 @@
|
|||||||
"Fonte supprimée": "Fuente eliminada",
|
"Fonte supprimée": "Fuente eliminada",
|
||||||
"Fontes": "Tipografias",
|
"Fontes": "Tipografias",
|
||||||
"Format incorrect": "Formato incorrecto",
|
"Format incorrect": "Formato incorrecto",
|
||||||
|
"Formulaire": "Formulario",
|
||||||
"Fréquence de recherche": "Frecuencia de búsqueda",
|
"Fréquence de recherche": "Frecuencia de búsqueda",
|
||||||
"Fuseau horaire": "Zona horaria",
|
"Fuseau horaire": "Zona horaria",
|
||||||
"Gabarits de page - Barre latérale": "Patrón de página - Barra lateral",
|
"Gabarits de page - Barre latérale": "Patrón de página - Barra lateral",
|
||||||
"Gestion": "Administrar",
|
"Gestion": "Administrar",
|
||||||
"Gestion des modules": "Gestión de módulos",
|
"Gestion des modules": "Gestión de módulos",
|
||||||
"Gestion des thèmes": "Gestión de temas",
|
"Gestion des thèmes": "Gestión de temas",
|
||||||
|
"Gestionnaire de fichiers": "Administrador de archivos",
|
||||||
"Github": "Github",
|
"Github": "Github",
|
||||||
|
"Grande": "Grande",
|
||||||
"Grande (220%)": "Grande (220%)",
|
"Grande (220%)": "Grande (220%)",
|
||||||
"Grande (300px)": "Grande (300px)",
|
"Grande (300px)": "Grande (300px)",
|
||||||
"Gras": "Negrita",
|
"Gras": "Negrita",
|
||||||
"Groupe": "Grupo",
|
"Groupe": "Grupo",
|
||||||
|
"Groupe associé": "Grupo asociado",
|
||||||
"Groupe requis pour accéder à la page :": "Grupo necesario para acceder a la página:",
|
"Groupe requis pour accéder à la page :": "Grupo necesario para acceder a la página:",
|
||||||
"Groupes": "",
|
"Groupes": "Grupos",
|
||||||
"Générer sitemap.xml et robots.txt": "Generar sitemap.xml y robots.txt",
|
"Générer sitemap.xml et robots.txt": "Generar sitemap.xml y robots.txt",
|
||||||
"Générer une capture Open Graph": "Generar una captura de Open Graph",
|
"Générer une capture Open Graph": "Generar una captura de Open Graph",
|
||||||
|
"Gérer les catégories": "Gestionar categorías",
|
||||||
|
"Gérer les commentaires": "Administrar comentarios",
|
||||||
|
"Gérer les données": "Administrar datos",
|
||||||
"Hauteur": "Altura",
|
"Hauteur": "Altura",
|
||||||
|
"Hauteur de l'image": "Altura de la imagen",
|
||||||
|
"Hauteur de l'image sélectionnée": "Altura de la imagen seleccionada",
|
||||||
"Hauteur maximale": "Altura máxima",
|
"Hauteur maximale": "Altura máxima",
|
||||||
"ID de la chaîne : https://www.youtube.com/channel/[ID].": "ID del canal: https://www.youtube.com/channel/[ID].",
|
"ID de la chaîne : https://www.youtube.com/channel/[ID].": "ID del canal: https://www.youtube.com/channel/[ID].",
|
||||||
"Icône": "Icono",
|
"Icône": "Icono",
|
||||||
"Icône avec bulle de texte": "Icono con burbuja de texto",
|
"Icône avec bulle de texte": "Icono con burbuja de texto",
|
||||||
|
"Icône haut de page, couleur arrière-plan": "Icono superior de la página, color de fondo",
|
||||||
"Identifiant": "Identificación",
|
"Identifiant": "Identificación",
|
||||||
"Identifiant (sans espace ni majuscule)": "Identificación (sin espacios ni mayúsculas)",
|
"Identifiant (sans espace ni majuscule)": "Identificación (sin espacios ni mayúsculas)",
|
||||||
"Identité": "Identificación",
|
"Identité": "Identificación",
|
||||||
@ -245,6 +286,8 @@
|
|||||||
"Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.": "Aparece en la barra de título y se comparte en redes sociales.",
|
"Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.": "Aparece en la barra de título y se comparte en redes sociales.",
|
||||||
"Image": "Imagen",
|
"Image": "Imagen",
|
||||||
"Image étirée (100% 100%)": "Imagen estirada (100% 100%)",
|
"Image étirée (100% 100%)": "Imagen estirada (100% 100%)",
|
||||||
|
"Important": "Importante",
|
||||||
|
"Importante": "Importante",
|
||||||
"Importation d'utilisateurs": "Importación de usuarios",
|
"Importation d'utilisateurs": "Importación de usuarios",
|
||||||
"Importation de fichier plat CSV": "Importar archivo plano CSV",
|
"Importation de fichier plat CSV": "Importar archivo plano CSV",
|
||||||
"Importation effectuée": "Importación realizada",
|
"Importation effectuée": "Importación realizada",
|
||||||
@ -260,7 +303,6 @@
|
|||||||
"Incorrect": "Incorrecto",
|
"Incorrect": "Incorrecto",
|
||||||
"Informations": "Información",
|
"Informations": "Información",
|
||||||
"Instagram": "Instagram",
|
"Instagram": "Instagram",
|
||||||
"Installation": "Instalación",
|
|
||||||
"Installation terminée": "instalación completa",
|
"Installation terminée": "instalación completa",
|
||||||
"Installer": "Instalar",
|
"Installer": "Instalar",
|
||||||
"Installer depuis le catalogue en ligne": "Instalar desde el archivo en línea",
|
"Installer depuis le catalogue en ligne": "Instalar desde el archivo en línea",
|
||||||
@ -277,13 +319,14 @@
|
|||||||
"L'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.": "El archivo ha sido depositado en el administrador de archivos. No se aceptan archivos inferiores a la versión 9.",
|
"L'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.": "El archivo ha sido depositado en el administrador de archivos. No se aceptan archivos inferiores a la versión 9.",
|
||||||
"L'identifiant est défini lors de la création du compte, il ne peut pas être modifié.": "El identificador se define al crear la cuenta, no se puede modificar.",
|
"L'identifiant est défini lors de la création du compte, il ne peut pas être modifié.": "El identificador se define al crear la cuenta, no se puede modificar.",
|
||||||
"La carte du site a été mise à jour": "El mapa del sitio ha sido actualizado.",
|
"La carte du site a été mise à jour": "El mapa del sitio ha sido actualizado.",
|
||||||
"La clé de l'API ne peut pas être vide": "La clave API no puede estar vacía",
|
"La copie de sauvegarde du fichier htaccess n'a pas été restaurée !": "¡La copia de seguridad del archivo htaccess no ha sido restaurada!",
|
||||||
"La description d'une page participe à son référencement, chaque page doit disposer d'une description différente.": "La descripción de una página participa en su referenciación, cada página debe tener una descripción diferente.",
|
"La description d'une page participe à son référencement, chaque page doit disposer d'une description différente.": "La descripción de una página participa en su referenciación, cada página debe tener una descripción diferente.",
|
||||||
"La page %s est ouverte par l'utilisateur %s": "La página %s ha sido abierta por el usuario %s",
|
"La page %s est ouverte par l'utilisateur %s": "La página %s ha sido abierta por el usuario %s",
|
||||||
"La page demandée n'existe pas ou est introuvable (erreur 404)": "La page demandée n'existe pas ou est introuvable (erreur 404)",
|
"La page demandée n'existe pas ou est introuvable (erreur 404)": "La page demandée n'existe pas ou est introuvable (erreur 404)",
|
||||||
"La page est affichée dans un menu horizontal mais pas dans le menu vertical d'une barre latérale.": "La página se muestra en un menú horizontal pero no en el menú vertical de una barra lateral.",
|
"La page est affichée dans un menu horizontal mais pas dans le menu vertical d'une barre latérale.": "La página se muestra en un menú horizontal pero no en el menú vertical de una barra lateral.",
|
||||||
"La première page que vos visiteurs verront.": "La primera página que verán tus visitantes.",
|
"La première page que vos visiteurs verront.": "La primera página que verán tus visitantes.",
|
||||||
"La règlementation française impose un anonymat de niveau 2": "La normativa francesa impone el anonimato de nivel 2",
|
"La règlementation française impose un anonymat de niveau 2": "La normativa francesa impone el anonimato de nivel 2",
|
||||||
|
"La réécriture d'URL n'a pas été restaurée !": "¡La reescritura de URL no ha sido restaurada!",
|
||||||
"La sauvegarde des fichiers peut prendre du temps. Continuer ?": "La copia de seguridad de los archivos puede tardar un poco. ¿Desea continuar?",
|
"La sauvegarde des fichiers peut prendre du temps. Continuer ?": "La copia de seguridad de los archivos puede tardar un poco. ¿Desea continuar?",
|
||||||
"La suppression a échoué": "Eliminación fallida",
|
"La suppression a échoué": "Eliminación fallida",
|
||||||
"La version installée est plus récente": "La versión instalada es más nueva.",
|
"La version installée est plus récente": "La versión instalada es más nueva.",
|
||||||
@ -295,6 +338,8 @@
|
|||||||
"Langues disponibles": "Idiomas Disponibles",
|
"Langues disponibles": "Idiomas Disponibles",
|
||||||
"Langues installées": "Idiomas instalados",
|
"Langues installées": "Idiomas instalados",
|
||||||
"Largeur": "Anchura o Ancho",
|
"Largeur": "Anchura o Ancho",
|
||||||
|
"Largeur de l'image": "Ancho de la imagen",
|
||||||
|
"Largeur du site": "Ancho del sitio",
|
||||||
"Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.": "El control deslizante horizontal establece el nivel de transparencia, colóquelo completamente hacia la izquierda para obtener un resaltado invisible.",
|
"Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.": "El control deslizante horizontal establece el nivel de transparencia, colóquelo completamente hacia la izquierda para obtener un resaltado invisible.",
|
||||||
"Le curseur horizontal règle le niveau de transparence.": "El cursor horizontal regula el nivel de transparencia.",
|
"Le curseur horizontal règle le niveau de transparence.": "El cursor horizontal regula el nivel de transparencia.",
|
||||||
"Le fuseau horaire est utile au bon référencement": "La zona horaria es útil para una buena referencia",
|
"Le fuseau horaire est utile au bon référencement": "La zona horaria es útil para una buena referencia",
|
||||||
@ -309,6 +354,7 @@
|
|||||||
"Les langues sélectionnées sont identiques": "Los idiomas seleccionados son idénticos",
|
"Les langues sélectionnées sont identiques": "Los idiomas seleccionados son idénticos",
|
||||||
"Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.": "Los avisos legales son obligatorios en Francia. Una opción en el pie de página agrega un enlace discreto a esta página.",
|
"Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.": "Los avisos legales son obligatorios en Francia. Una opción en el pie de página agrega un enlace discreto a esta página.",
|
||||||
"Les modifications que vous avez apportées ne seront peut-être pas enregistrées.": "Es posible que no se guarden los cambios realizados.",
|
"Les modifications que vous avez apportées ne seront peut-être pas enregistrées.": "Es posible que no se guarden los cambios realizados.",
|
||||||
|
"Les tailles des polices de la bannière, de menu et de pied de page sont proportionnelles à cette taille.": "Los tamaños de fuente del banner, menú y pie de página son proporcionales a este tamaño.",
|
||||||
"Lettres": "Letras",
|
"Lettres": "Letras",
|
||||||
"Libre": "Libre",
|
"Libre": "Libre",
|
||||||
"Licence :": "Licencia",
|
"Licence :": "Licencia",
|
||||||
@ -321,6 +367,8 @@
|
|||||||
"Liste noire": "Lista negra",
|
"Liste noire": "Lista negra",
|
||||||
"Liste noire réinitialisée avec succès": "Lista negra restablecida con éxito",
|
"Liste noire réinitialisée avec succès": "Lista negra restablecida con éxito",
|
||||||
"Lors d'une mise à jour automatique, conserve le fichier htaccess de la racine du site.": "Durante una actualización automática, mantenga el archivo htaccess de la raíz del sitio.",
|
"Lors d'une mise à jour automatique, conserve le fichier htaccess de la racine du site.": "Durante una actualización automática, mantenga el archivo htaccess de la raíz del sitio.",
|
||||||
|
"Léger": "Ligero",
|
||||||
|
"Légère": "Ligera",
|
||||||
"Maigre": "Delgado",
|
"Maigre": "Delgado",
|
||||||
"Maintenance": "Mantenimiento",
|
"Maintenance": "Mantenimiento",
|
||||||
"Majuscule à chaque mot": "Capper con cada palabra",
|
"Majuscule à chaque mot": "Capper con cada palabra",
|
||||||
@ -330,9 +378,12 @@
|
|||||||
"Masquer la page et les pages enfants dans le menu d'une barre latérale": "Ocultar página y páginas secundarias en un menú de la barra lateral",
|
"Masquer la page et les pages enfants dans le menu d'une barre latérale": "Ocultar página y páginas secundarias en un menú de la barra lateral",
|
||||||
"Masquer les pages enfants dans le menu horizontal": "Ocultar páginas secundarias en el menú horizontal",
|
"Masquer les pages enfants dans le menu horizontal": "Ocultar páginas secundarias en el menú horizontal",
|
||||||
"Membre": "Miembro",
|
"Membre": "Miembro",
|
||||||
|
"Membre avec droit de partage": "Miembro con derecho de compartir",
|
||||||
|
"Membre simple": "Miembro simple",
|
||||||
"Mentions légales": "Notas legales",
|
"Mentions légales": "Notas legales",
|
||||||
"Menu": "Menù",
|
"Menu": "Menù",
|
||||||
"Menu accessoire": "Menú accesorio",
|
"Menu accessoire": "Menú accesorio",
|
||||||
|
"Menu burger dans écran réduit": "Menú hamburguesa en pantalla reducida",
|
||||||
"Menu standard": "Menú estándar",
|
"Menu standard": "Menú estándar",
|
||||||
"Message d'acceptation des Cookies": "Mensaje de aceptación de cookies",
|
"Message d'acceptation des Cookies": "Mensaje de aceptación de cookies",
|
||||||
"Message de consentement aux cookies": "Mensaje de consentimiento de cookies",
|
"Message de consentement aux cookies": "Mensaje de consentimiento de cookies",
|
||||||
@ -345,12 +396,11 @@
|
|||||||
"Mise en page": "Diseño",
|
"Mise en page": "Diseño",
|
||||||
"Mise à jour": "actualización",
|
"Mise à jour": "actualización",
|
||||||
"Mise à jour automatisée": "Actualización automática",
|
"Mise à jour automatisée": "Actualización automática",
|
||||||
"Mise à jour de ZwiiCMS": "Actualización de ZwiiCMS",
|
|
||||||
"Mise à jour terminée avec succès.": "Actualización completada con éxito.",
|
"Mise à jour terminée avec succès.": "Actualización completada con éxito.",
|
||||||
"Modifications enregistrées": "Cambios guardados",
|
"Modifications enregistrées": "Cambios guardados",
|
||||||
"Module": "Módulo",
|
"Module": "Módulo",
|
||||||
"Module de la page": "Módulo de página",
|
"Module de la page": "Módulo de página",
|
||||||
"Modules": "",
|
"Modules": "Módulos",
|
||||||
"Modules configurés": "Módulos Configurados",
|
"Modules configurés": "Módulos Configurados",
|
||||||
"Modules installés": "Módulos instalados",
|
"Modules installés": "Módulos instalados",
|
||||||
"Modules orphelins": "Módulos huérfanos",
|
"Modules orphelins": "Módulos huérfanos",
|
||||||
@ -358,20 +408,23 @@
|
|||||||
"Mot de passe oublié": "Contraseña olvidada",
|
"Mot de passe oublié": "Contraseña olvidada",
|
||||||
"Mot de passe perdu": "Contraseña perdida",
|
"Mot de passe perdu": "Contraseña perdida",
|
||||||
"Motorisé par": "Motorizado por",
|
"Motorisé par": "Motorizado por",
|
||||||
|
"Moyen": "Medio",
|
||||||
|
"Moyenne": "Media",
|
||||||
"Moyenne (200%)": "Promedio (200%)",
|
"Moyenne (200%)": "Promedio (200%)",
|
||||||
"Moyenne (200px)": "Promedio (200px)",
|
"Moyenne (200px)": "Promedio (200px)",
|
||||||
"Multilingue": "Multilingüe",
|
|
||||||
"Méta-description": "Meta-descripción",
|
"Méta-description": "Meta-descripción",
|
||||||
"Méta-titre": "Meta-título",
|
"Méta-titre": "Meta-título",
|
||||||
"Ne pas afficher": "No se muestra",
|
"Ne pas afficher": "No se muestra",
|
||||||
"Ne pas charger l'exemple de site (utilisateurs avancés)": "No cargar sitio de muestra (usuarios avanzados)",
|
"Ne pas charger l'exemple de site (utilisateurs avancés)": "No cargar sitio de muestra (usuarios avanzados)",
|
||||||
"Ne pas répéter": "No repitas",
|
"Ne pas répéter": "No repitas",
|
||||||
"Ne pas saisir les balises": "No ingrese las etiquetas",
|
"Ne pas saisir les balises": "No ingrese las etiquetas",
|
||||||
|
"News": "Noticias",
|
||||||
"Niveau 1 (192.168.12.x)": "Nivel 1 (192.168.12.x)",
|
"Niveau 1 (192.168.12.x)": "Nivel 1 (192.168.12.x)",
|
||||||
"Niveau 2 (192.168.x.x)": "Nivel 2 (192.168.x.x)",
|
"Niveau 2 (192.168.x.x)": "Nivel 2 (192.168.x.x)",
|
||||||
"Niveau 3 (192.x.x.x)": "Nivel 3 (192.x.x.x)",
|
"Niveau 3 (192.x.x.x)": "Nivel 3 (192.x.x.x)",
|
||||||
"Nom": "Nombre",
|
"Nom": "Nombre",
|
||||||
"Nom Prénom": "Apellido nombre",
|
"Nom Prénom": "Apellido nombre",
|
||||||
|
"Nom du profil": "Nombre del perfil",
|
||||||
"Nom utilisateur": "Nombre de usuario",
|
"Nom utilisateur": "Nombre de usuario",
|
||||||
"Non": "No",
|
"Non": "No",
|
||||||
"Non tronquée": "Sin personal",
|
"Non tronquée": "Sin personal",
|
||||||
@ -386,6 +439,7 @@
|
|||||||
"Ombre": "Sombra",
|
"Ombre": "Sombra",
|
||||||
"Option active en mode déconnecté uniquement, les pages enfants sont visibles et accessibles.": "Opción activa solo en modo fuera de línea, las páginas secundarias son visibles y accesibles.",
|
"Option active en mode déconnecté uniquement, les pages enfants sont visibles et accessibles.": "Opción activa solo en modo fuera de línea, las páginas secundarias son visibles y accesibles.",
|
||||||
"Option recommandée pour sécuriser la connexion. S'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.": "Opción recomendada para asegurar la conexión. Se aplica a todos los captchas en el sitio. El captcha simple está limitado a una suma de números del 0 al 10. El captcha complejo usa cuatro operaciones de números del 0 al 20. Activación recomendada.",
|
"Option recommandée pour sécuriser la connexion. S'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.": "Opción recomendada para asegurar la conexión. Se aplica a todos los captchas en el sitio. El captcha simple está limitado a una suma de números del 0 al 10. El captcha complejo usa cuatro operaciones de números del 0 al 20. Activación recomendada.",
|
||||||
|
"Options": "Opciones",
|
||||||
"Options avancées": "Opciones avanzadas",
|
"Options avancées": "Opciones avanzadas",
|
||||||
"Origine": "Origen",
|
"Origine": "Origen",
|
||||||
"Oui": "Sí",
|
"Oui": "Sí",
|
||||||
@ -410,11 +464,17 @@
|
|||||||
"Paramètres": "Configuraciones",
|
"Paramètres": "Configuraciones",
|
||||||
"Paramètres de la localisation": "Configuración de la ubicación",
|
"Paramètres de la localisation": "Configuración de la ubicación",
|
||||||
"Paramètres de la sauvegarde": "Configuración de copia de seguridad",
|
"Paramètres de la sauvegarde": "Configuración de copia de seguridad",
|
||||||
|
"Paramètres du profil": "Configuración del perfil",
|
||||||
"Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d'envoi de mail.": "Configuraciones para usar cuando su host no ofrece la funcionalidad para enviar correo.",
|
"Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d'envoi de mail.": "Configuraciones para usar cuando su host no ofrece la funcionalidad para enviar correo.",
|
||||||
"Pas de marge au-dessus et en dessous du site": "Sin margen encima y debajo del sitio",
|
"Pas de marge au-dessus et en dessous du site": "Sin margen encima y debajo del sitio",
|
||||||
"Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "Recuerde eliminar el caché de su navegador si el favicon no cambia.",
|
"Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "Recuerde eliminar el caché de su navegador si el favicon no cambia.",
|
||||||
"Permission": "Permiso",
|
"Permission": "Permiso",
|
||||||
"Permission et référencement": "Permiso y referenciación",
|
"Permission et référencement": "Permiso y referenciación",
|
||||||
|
"Permissions": "Permisos",
|
||||||
|
"Permissions sur les dossiers": "Permisos de las carpetas",
|
||||||
|
"Permissions sur les fichiers": "Permisos de los archivos",
|
||||||
|
"Permissions sur les pages": "Permisos de las páginas",
|
||||||
|
"Petite": "Pequeño",
|
||||||
"Petite (150px)": "Pequeño (150px)",
|
"Petite (150px)": "Pequeño (150px)",
|
||||||
"Petite (180%)": "Petite (180%)",
|
"Petite (180%)": "Petite (180%)",
|
||||||
"Pied de page": "Pie de página",
|
"Pied de page": "Pie de página",
|
||||||
@ -427,6 +487,9 @@
|
|||||||
"Position": "Posición",
|
"Position": "Posición",
|
||||||
"Position du module": "Posición del módulo",
|
"Position du module": "Posición del módulo",
|
||||||
"Pour définir la page comme barre latérale, choisissez l'option dans la liste.": "Para configurar la página como barra lateral, elija la opción de la lista.",
|
"Pour définir la page comme barre latérale, choisissez l'option dans la liste.": "Para configurar la página como barra lateral, elija la opción de la lista.",
|
||||||
|
"Presse Papier": "Portapapeles",
|
||||||
|
"Presse papier": "Portapapeles",
|
||||||
|
"Profils des groupes": "Perfiles de grupos",
|
||||||
"Proportionnelle à la taille définie dans le site.": "Proporcional a la definida en el sitio.",
|
"Proportionnelle à la taille définie dans le site.": "Proporcional a la definida en el sitio.",
|
||||||
"Prénom": "Nombre de pila",
|
"Prénom": "Nombre de pila",
|
||||||
"Prénom Nom": "Nombre Apellido",
|
"Prénom Nom": "Nombre Apellido",
|
||||||
@ -434,12 +497,18 @@
|
|||||||
"Préserver le fichier htaccess racine": "Conservar archivo raíz htaccess",
|
"Préserver le fichier htaccess racine": "Conservar archivo raíz htaccess",
|
||||||
"Préserver les comptes des utilisateurs déjà installés": "Conservar las cuentas de usuario ya instaladas",
|
"Préserver les comptes des utilisateurs déjà installés": "Conservar las cuentas de usuario ya instaladas",
|
||||||
"Prévenir l'utilisateur par mail": "Notificar al usuario por correo electrónico",
|
"Prévenir l'utilisateur par mail": "Notificar al usuario por correo electrónico",
|
||||||
|
"Prévisualiser": "Previsualizar",
|
||||||
"Pseudo": "Apodo",
|
"Pseudo": "Apodo",
|
||||||
|
"Rang 9 > rang 1. Le profil de rang 1 n'est pas modifiable.": "Rango 9 > rango 1. El perfil del rango 1 no se puede modificar.",
|
||||||
|
"Ratio": "Proporción",
|
||||||
"Ratio :": "Relación",
|
"Ratio :": "Relación",
|
||||||
|
"Recherche": "Buscar",
|
||||||
"Recherche dans le site": "Buscar en el sitio",
|
"Recherche dans le site": "Buscar en el sitio",
|
||||||
"Rechercher": "Buscar",
|
"Rechercher": "Buscar",
|
||||||
"Rechercher une mise à jour en ligne": "Buscar una actualización en línea",
|
"Rechercher une mise à jour en ligne": "Buscar una actualización en línea",
|
||||||
|
"Redirection": "Redirección",
|
||||||
"Redirection vers la connexion": "Redirección hacia conexión",
|
"Redirection vers la connexion": "Redirección hacia conexión",
|
||||||
|
"Renommer": "Renombrar",
|
||||||
"Renseignez les champs ci-dessous pour finaliser l'installation.": "Complete las zonas a continuación para terminar la instalación.",
|
"Renseignez les champs ci-dessous pour finaliser l'installation.": "Complete las zonas a continuación para terminar la instalación.",
|
||||||
"Responsive (contain)": "Responsivo (contener)",
|
"Responsive (contain)": "Responsivo (contener)",
|
||||||
"Responsive (cover)": "Responsivo (cobertura)",
|
"Responsive (cover)": "Responsivo (cobertura)",
|
||||||
@ -450,6 +519,7 @@
|
|||||||
"Rester connecté sur ce navigateur": "Permanecer conectado en este navegador",
|
"Rester connecté sur ce navigateur": "Permanecer conectado en este navegador",
|
||||||
"Retour": "Retroceder",
|
"Retour": "Retroceder",
|
||||||
"Rien à importer, erreur de format ou fichier incorrect": "Nada que importar, error de formato o archivo incorrecto",
|
"Rien à importer, erreur de format ou fichier incorrect": "Nada que importar, error de formato o archivo incorrecto",
|
||||||
|
"Rédacteur": "Editor",
|
||||||
"Référencement": "Referenciación",
|
"Référencement": "Referenciación",
|
||||||
"Réinitialisation du mot de passe": "Restablecer la contraseña de usuario",
|
"Réinitialisation du mot de passe": "Restablecer la contraseña de usuario",
|
||||||
"Réinitialiser avec le thème par défaut": "establecer tema predeterminado",
|
"Réinitialiser avec le thème par défaut": "establecer tema predeterminado",
|
||||||
@ -477,7 +547,7 @@
|
|||||||
"Sauvegarde": "Salvaguardad",
|
"Sauvegarde": "Salvaguardad",
|
||||||
"Sauvegarde automatique quotidienne du site": "Copia de seguridad diaria automática del sitio",
|
"Sauvegarde automatique quotidienne du site": "Copia de seguridad diaria automática del sitio",
|
||||||
"Sauvegarde du thème dans le": "Guardando tema en el",
|
"Sauvegarde du thème dans le": "Guardando tema en el",
|
||||||
"Sauvegarde générée avec succès.": "Copia de seguridad generada con éxito",
|
"Sauvegarde générée avec succès": "Copia de seguridad generada con éxito",
|
||||||
"Sauvegarder": "Para salvaguardar",
|
"Sauvegarder": "Para salvaguardar",
|
||||||
"Sauvegarder et télécharger le module": "Guardar y descargar módulo",
|
"Sauvegarder et télécharger le module": "Guardar y descargar módulo",
|
||||||
"Sauvegarder le module dans le gestionnaire de fichiers": "Guardar módulo en el administrador de archivos",
|
"Sauvegarder le module dans le gestionnaire de fichiers": "Guardar módulo en el administrador de archivos",
|
||||||
@ -498,7 +568,7 @@
|
|||||||
"Standard": "Estándar",
|
"Standard": "Estándar",
|
||||||
"Style": "Estilo",
|
"Style": "Estilo",
|
||||||
"Suppression interdite": "Borrado prohibido",
|
"Suppression interdite": "Borrado prohibido",
|
||||||
"Suppression interdite, page active dans la configuration du site": "Eliminación prohibida, página activa en la configuración del sitio",
|
"Suppression interdite, page active dans la configuration de la langue du site": "Eliminación no permitida, la página está activa en la configuración de idioma del sitio",
|
||||||
"Supprime le point d'interrogation dans les URL, l'option est indisponible avec les autres serveurs Web": "Eliminar el signo de interrogación en las URL, la opción no está disponible con otros servidores web",
|
"Supprime le point d'interrogation dans les URL, l'option est indisponible avec les autres serveurs Web": "Eliminar el signo de interrogación en las URL, la opción no está disponible con otros servidores web",
|
||||||
"Supprimer": "Borrar",
|
"Supprimer": "Borrar",
|
||||||
"Supprimer la page": "Eliminar página",
|
"Supprimer la page": "Eliminar página",
|
||||||
@ -517,6 +587,7 @@
|
|||||||
"Sélectionnez une image ou une icône de petite dimension": "Seleccione una imagen o icono pequeño",
|
"Sélectionnez une image ou une icône de petite dimension": "Seleccione una imagen o icono pequeño",
|
||||||
"Sélectionnez une langue": "Seleccione un idioma",
|
"Sélectionnez une langue": "Seleccione un idioma",
|
||||||
"Sélectionnez une page contenant le module 'Recherche'. Une option du pied de page ajoute un lien discret vers cette page.": "Seleccione una página que contenga el módulo 'Buscar'. Una opción de pie de página agrega un enlace discreto a esta página.",
|
"Sélectionnez une page contenant le module 'Recherche'. Une option du pied de page ajoute un lien discret vers cette page.": "Seleccione una página que contenga el módulo 'Buscar'. Una opción de pie de página agrega un enlace discreto a esta página.",
|
||||||
|
"Sélectionnez une page pour activer": "Seleccione una página para activar",
|
||||||
"Séparateur": "Separador",
|
"Séparateur": "Separador",
|
||||||
"Taille": "Tamaño",
|
"Taille": "Tamaño",
|
||||||
"Text": "Texto",
|
"Text": "Texto",
|
||||||
@ -531,9 +602,18 @@
|
|||||||
"Titre masqué": "Título enmascarado",
|
"Titre masqué": "Título enmascarado",
|
||||||
"Titre masqué dans la page": "Título oculto en la página",
|
"Titre masqué dans la page": "Título oculto en la página",
|
||||||
"Titres": "Títulos",
|
"Titres": "Títulos",
|
||||||
|
"Tous les dossiers": "Todas las carpetas",
|
||||||
|
"Tous les droits d'édition des contenus": "Todos los derechos de edición de contenido",
|
||||||
|
"Tout Effacer": "Borrar todo",
|
||||||
"Traduction supprimée": "Traducción eliminada",
|
"Traduction supprimée": "Traducción eliminada",
|
||||||
|
"Très grande": "Muy grande",
|
||||||
"Très grande (240%)": "Muy grande (240%)",
|
"Très grande (240%)": "Muy grande (240%)",
|
||||||
"Très grande (400px)": "Muy grande (400px)",
|
"Très grande (400px)": "Muy grande (400px)",
|
||||||
|
"Très important": "Muy importante",
|
||||||
|
"Très importante": "Muy importante",
|
||||||
|
"Très léger": "Muy ligero",
|
||||||
|
"Très légère": "Muy ligera",
|
||||||
|
"Très petite": "Muy pequeño",
|
||||||
"Très petite (100px) ": "Muy pequeño (100px)",
|
"Très petite (100px) ": "Muy pequeño (100px)",
|
||||||
"Très petite (160%)": "Muy pequeño (160%)",
|
"Très petite (160%)": "Muy pequeño (160%)",
|
||||||
"Twitter": "Twitter",
|
"Twitter": "Twitter",
|
||||||
@ -544,6 +624,7 @@
|
|||||||
"Télécharger la liste": "Descargar la revista",
|
"Télécharger la liste": "Descargar la revista",
|
||||||
"Télécharger le journal": "Descargar la revista",
|
"Télécharger le journal": "Descargar la revista",
|
||||||
"Télécharger le module dans le gestionnaire de fichiers": "Descargar módulo al administrador de archivos",
|
"Télécharger le module dans le gestionnaire de fichiers": "Descargar módulo al administrador de archivos",
|
||||||
|
"Téléverser": "Subir",
|
||||||
"URL incorrecte": "URL incorrecta",
|
"URL incorrecte": "URL incorrecta",
|
||||||
"Un mail a été envoyé pour confirmer la réinitialisation": "Se ha enviado un correo electrónico para confirmar el restablecimiento.",
|
"Un mail a été envoyé pour confirmer la réinitialisation": "Se ha enviado un correo electrónico para confirmar el restablecimiento.",
|
||||||
"Une archive du dossier /site/data est conservée pendant 30 jours. Activation recommandée": "Un archivo que contiene la carpeta /site/data se conserva durante 30 días. Activación recomendada .",
|
"Une archive du dossier /site/data est conservée pendant 30 jours. Activation recommandée": "Un archivo que contiene la carpeta /site/data se conserva durante 30 días. Activación recomendada .",
|
||||||
@ -556,8 +637,10 @@
|
|||||||
"Version": "Versión",
|
"Version": "Versión",
|
||||||
"Version n°": "Número de versión",
|
"Version n°": "Número de versión",
|
||||||
"Vider dossier sauvegardes auto": "Carpeta de autoguardado vacía",
|
"Vider dossier sauvegardes auto": "Carpeta de autoguardado vacía",
|
||||||
|
"Visiteur": "Visitante",
|
||||||
"Vous n'êtes pas autorisé à consulter cette page (erreur 403)": "No está autorizado para ver esta página (error 403)",
|
"Vous n'êtes pas autorisé à consulter cette page (erreur 403)": "No está autorizado para ver esta página (error 403)",
|
||||||
"Youtube": "YouTube",
|
"Youtube": "YouTube",
|
||||||
|
"ZwiiCMS - Installation": "ZwiiCMS - Instalación",
|
||||||
"actualisé": "actualizado",
|
"actualisé": "actualizado",
|
||||||
"favicon.ico": "Recuerde borrar el caché de su navegador si el favicon no cambia.",
|
"favicon.ico": "Recuerde borrar el caché de su navegador si el favicon no cambia.",
|
||||||
"faviconDark.ico": "faviconDark.ico",
|
"faviconDark.ico": "faviconDark.ico",
|
||||||
@ -566,54 +649,45 @@
|
|||||||
"jour": "día",
|
"jour": "día",
|
||||||
"jours": "días",
|
"jours": "días",
|
||||||
"sauvegardé avec succès": "Guardado exitosamente",
|
"sauvegardé avec succès": "Guardado exitosamente",
|
||||||
"vers ZwiiCMS": "Hacia ZwiiCMS",
|
"vers": "hacia",
|
||||||
"À droite": "A la derecha",
|
"À droite": "A la derecha",
|
||||||
"À gauche": "A la izquierda",
|
"À gauche": "A la izquierda",
|
||||||
"À l'emplacement du mot clé [MODULE] dans la page": "En la ubicación de la palabra clave [MODULE] en la página",
|
"À l'emplacement du mot clé [MODULE] dans la page": "En la ubicación de la palabra clave [MODULE] en la página",
|
||||||
|
"Échec de l'écriture, vérifiez les permissions": "Escritura fallida, verifique los permisos",
|
||||||
"Échecs": "Fracasos",
|
"Échecs": "Fracasos",
|
||||||
"Éditer": "Editar",
|
"Éditer": "Editar",
|
||||||
"Éditer la page": "Editar página",
|
"Éditer la page": "Editar página",
|
||||||
"Éditer les dialogues": "Editar los diálogos",
|
"Éditer les dialogues": "Editar los diálogos",
|
||||||
|
"Éditer une catégorie": "Editar categoría",
|
||||||
"Éditeur": "Editor",
|
"Éditeur": "Editor",
|
||||||
"Éditeur CSS": "Editor de CSS",
|
"Éditeur CSS": "Editor de CSS",
|
||||||
"Éditeur JS": "Editor de JS",
|
"Éditeur JS": "Editor de JS",
|
||||||
"Éditeur de script %s": "Editor de script %s",
|
"Éditeur de script %s": "Editor de script %s",
|
||||||
"Éditeur de script dans Body": "Éditor del script en el Body",
|
"Éditeur de script dans Body": "Éditor del script en el Body",
|
||||||
"Éditeur de script dans Head": "Éditor del script en el Head",
|
"Éditeur de script dans Head": "Éditor del script en el Head",
|
||||||
|
"Éditeur simple": "Editor simple",
|
||||||
|
"Édition des pages": "Edición de páginas",
|
||||||
|
"Édition du profil %s": "Edición del perfil %s",
|
||||||
"Éléments": "Elementos",
|
"Éléments": "Elementos",
|
||||||
"Étiquettes des pages spéciales": "Etiquetas de páginas especiales",
|
|
||||||
"Largeur de l'image": "Ancho de la imagen",
|
|
||||||
"Hauteur de l'image": "Altura de la imagen",
|
|
||||||
"Largeur du site": "Ancho del sitio",
|
|
||||||
"Ratio": "Proporción",
|
|
||||||
"Hauteur de l'image sélectionnée": "Altura de la imagen seleccionada",
|
|
||||||
"Étendu sur la page": "Extendido en la página",
|
"Étendu sur la page": "Extendido en la página",
|
||||||
"Très légère": "Muy ligera",
|
"Étiquettes des pages spéciales": "Etiquetas de páginas especiales",
|
||||||
"Légère": "Ligera",
|
"Dimensions minimales": "Dimensiones mínimas",
|
||||||
"Moyenne": "Media",
|
"Taille maximale du fichier": "Tamaño máximo de archivo",
|
||||||
"Importante": "Importante",
|
"5 Mo pour les images JPEG": "5 MB para imágenes JPEG",
|
||||||
"Très importante": "Muy importante",
|
"1 Mo pour les images PNG": "1 MB para imágenes PNG",
|
||||||
"Aucun": "Ninguno",
|
"Poids": "Peso",
|
||||||
"Aucune": "Ninguna",
|
"Supprimer ce profil ?": "¿Eliminar este perfil?",
|
||||||
"Très léger": "Muy ligero",
|
"Masqué": "Oculto",
|
||||||
"Léger": "Ligero",
|
"Haut de page": "Parte superior de la página",
|
||||||
"Moyen": "Medio",
|
"Bas de page": "Parte inferior de la página",
|
||||||
"Important": "Importante",
|
"Petit triangle": "Triángulo pequeño",
|
||||||
"Très important": "Muy importante",
|
"Grand triangle": "Triángulo grande",
|
||||||
"En-dehors du site": "Fuera del sitio",
|
"Flèche": "Flecha",
|
||||||
"Avant la bannière": "Antes del banner",
|
"Modèle": "Plantilla",
|
||||||
"Après la bannière": "Después del banner",
|
"Bouton de navigation droit": "Botón de navegación derecha",
|
||||||
"Caché": "Oculto",
|
"Bouton de navigation gauche": "Botón de navegación izquierda",
|
||||||
"Très petite": "Muy pequeño",
|
"Groupes / Profils": "Grupos / Perfiles",
|
||||||
"Petite": "Pequeño",
|
"Prénom commence par": "El nombre comienza con",
|
||||||
"Grande": "Grande",
|
"Nom commence par": "El apellido comienza con",
|
||||||
"Très grande": "Muy grande",
|
"Impossible de réinitialiser le mot de passe de ce compte !": "No puedo restablecer la contraseña de esta cuenta."
|
||||||
"Les tailles des polices de la bannière, de menu et de pied de page sont proportionnelles à cette taille.": "Los tamaños de fuente del banner, menú y pie de página son proporcionales a este tamaño.",
|
|
||||||
"En dessous du site": "Debajo del sitio",
|
|
||||||
"Sélectionnez une page pour activer": "Seleccione una página para activar",
|
|
||||||
"Couleur icône haut de page":"Color del icono superior de la página",
|
|
||||||
"Icône haut de page, couleur arrière-plan":"Icono superior de la página, color de fondo",
|
|
||||||
"Disponible si le consentement des cookies est activé.": "Disponible si se ha otorgado el consentimiento de las cookies.",
|
|
||||||
"Affiche les icônes de gestion du compte et de déconnexion des membres simples connectés.": "Muestra los iconos de gestión de cuenta y de cierre de sesión para los miembros simples conectados.",
|
|
||||||
"Définir par défaut": "Establecer como predeterminado"
|
|
||||||
}
|
}
|
@ -17,7 +17,11 @@
|
|||||||
"5 tentatives": "",
|
"5 tentatives": "",
|
||||||
"7 jours": "",
|
"7 jours": "",
|
||||||
"Accueil": "",
|
"Accueil": "",
|
||||||
|
"Accède au site": "",
|
||||||
|
"Accède aux pages réservées": "",
|
||||||
|
"Accède aux pages réservées et à un dossier partagé": "",
|
||||||
"Accès bloqué %d minutes": "",
|
"Accès bloqué %d minutes": "",
|
||||||
|
"Accès désactivé": "",
|
||||||
"Accès interdit, erreur 403": "",
|
"Accès interdit, erreur 403": "",
|
||||||
"Action interdite": "",
|
"Action interdite": "",
|
||||||
"Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.": "",
|
"Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.": "",
|
||||||
@ -31,10 +35,12 @@
|
|||||||
"Adresse du proxy": "",
|
"Adresse du proxy": "",
|
||||||
"Adresse électronique": "",
|
"Adresse électronique": "",
|
||||||
"Affectation": "",
|
"Affectation": "",
|
||||||
"Menu burger dans écran réduit": "",
|
|
||||||
"Affiche le nom de la page parente suivi du nom de la page, le titre ne doit pas être masqué.": "",
|
"Affiche le nom de la page parente suivi du nom de la page, le titre ne doit pas être masqué.": "",
|
||||||
|
"Affiche les icônes de gestion du compte et de déconnexion des membres simples connectés": "",
|
||||||
"Afin d'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l'opération.": "",
|
"Afin d'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l'opération.": "",
|
||||||
"Aide": "",
|
"Aide": "",
|
||||||
|
"Ajouter": "",
|
||||||
|
"Ajouter un profil": "",
|
||||||
"Ajouter un utilisateur": "",
|
"Ajouter un utilisateur": "",
|
||||||
"Ajouter une fonte": "",
|
"Ajouter une fonte": "",
|
||||||
"Alignement": "",
|
"Alignement": "",
|
||||||
@ -45,7 +51,9 @@
|
|||||||
"Apache URL intelligentes": "",
|
"Apache URL intelligentes": "",
|
||||||
"Apparence": "",
|
"Apparence": "",
|
||||||
"Appliquer": "",
|
"Appliquer": "",
|
||||||
|
"Approuver un commentaire": "",
|
||||||
"Après": "",
|
"Après": "",
|
||||||
|
"Après la bannière": "",
|
||||||
"Après le contenu de la page": "",
|
"Après le contenu de la page": "",
|
||||||
"Archive": "",
|
"Archive": "",
|
||||||
"Archive ZIP": "",
|
"Archive ZIP": "",
|
||||||
@ -63,20 +71,25 @@
|
|||||||
"Arrière plan des champs": "",
|
"Arrière plan des champs": "",
|
||||||
"Arrondi des angles": "",
|
"Arrondi des angles": "",
|
||||||
"Au centre": "",
|
"Au centre": "",
|
||||||
"Au-dessus du site": "",
|
|
||||||
"Au début": "",
|
"Au début": "",
|
||||||
"Au milieu au centre": "",
|
"Au milieu au centre": "",
|
||||||
"Au milieu à droite": "",
|
"Au milieu à droite": "",
|
||||||
"Au milieu à gauche": "",
|
"Au milieu à gauche": "",
|
||||||
|
"Au-dessus du site": "",
|
||||||
|
"Aucun": "",
|
||||||
|
"Aucun dossier": "",
|
||||||
"Aucun fichier journal à télécharger": "",
|
"Aucun fichier journal à télécharger": "",
|
||||||
"Aucun journal à effacer": "",
|
"Aucun journal à effacer": "",
|
||||||
"Aucun menu": "",
|
"Aucun menu": "",
|
||||||
|
"Aucune": "",
|
||||||
"Aucune liste noire à effacer": "",
|
"Aucune liste noire à effacer": "",
|
||||||
"Aucune liste noire à télécharger": "",
|
"Aucune liste noire à télécharger": "",
|
||||||
"Auteur :": "",
|
"Auteur :": "",
|
||||||
"Authentification": "",
|
"Authentification": "",
|
||||||
"Automatique": "",
|
"Automatique": "",
|
||||||
"Autoriser les robots à référencer le site": "",
|
"Autoriser les robots à référencer le site": "",
|
||||||
|
"Autorisé": "",
|
||||||
|
"Avant la bannière": "",
|
||||||
"Avant le contenu de la page": "",
|
"Avant le contenu de la page": "",
|
||||||
"Background": "",
|
"Background": "",
|
||||||
"Banni": "",
|
"Banni": "",
|
||||||
@ -94,6 +107,7 @@
|
|||||||
"Barres latérales": "",
|
"Barres latérales": "",
|
||||||
"Bienvenue %s %s": "",
|
"Bienvenue %s %s": "",
|
||||||
"Blocage après échecs": "",
|
"Blocage après échecs": "",
|
||||||
|
"Blog": "",
|
||||||
"Bords arrondis": "",
|
"Bords arrondis": "",
|
||||||
"Bordure des blocs": "",
|
"Bordure des blocs": "",
|
||||||
"Bordure des champs": "",
|
"Bordure des champs": "",
|
||||||
@ -105,6 +119,7 @@
|
|||||||
"Bouton standard": "",
|
"Bouton standard": "",
|
||||||
"Bouton validation": "",
|
"Bouton validation": "",
|
||||||
"Boutons": "",
|
"Boutons": "",
|
||||||
|
"Caché": "",
|
||||||
"Cachée": "",
|
"Cachée": "",
|
||||||
"Captcha complexe": "",
|
"Captcha complexe": "",
|
||||||
"Captcha à la connexion": "",
|
"Captcha à la connexion": "",
|
||||||
@ -121,13 +136,14 @@
|
|||||||
"Chiffres": "",
|
"Chiffres": "",
|
||||||
"Cible": "",
|
"Cible": "",
|
||||||
"Cliquez sur une zone afin d'accéder à ses options de personnalisation.": "",
|
"Cliquez sur une zone afin d'accéder à ses options de personnalisation.": "",
|
||||||
"Clé de l'API <a href=\"https://app.screenshotapi.net/\" target=\"_blank\">ScreenShotApi</a>": "",
|
"Commentaire": "",
|
||||||
"Clé de l'API <a href='https://app.screenshotapi.net/' target='_blank'>ScreenShotApi</a>": "",
|
|
||||||
"Complète": "",
|
"Complète": "",
|
||||||
"Compte administrateur": "",
|
"Compte administrateur": "",
|
||||||
|
"Compte de l'utilisateur": "",
|
||||||
"Compte verrouillé": "",
|
"Compte verrouillé": "",
|
||||||
"Configuration": "",
|
"Configuration": "",
|
||||||
"Configuration du module": "",
|
"Configuration du module": "",
|
||||||
|
"Configurer": "",
|
||||||
"Configurer mon compte": "",
|
"Configurer mon compte": "",
|
||||||
"Confirmation": "",
|
"Confirmation": "",
|
||||||
"Confirmer la suppression de cet utilisateur": "",
|
"Confirmer la suppression de cet utilisateur": "",
|
||||||
@ -145,6 +161,7 @@
|
|||||||
"Contenu HTML": "",
|
"Contenu HTML": "",
|
||||||
"Contenu avancé": "",
|
"Contenu avancé": "",
|
||||||
"Contenu du menu vertical": "",
|
"Contenu du menu vertical": "",
|
||||||
|
"Contrôle total": "",
|
||||||
"Cookies": "",
|
"Cookies": "",
|
||||||
"Cookies Zwii": "",
|
"Cookies Zwii": "",
|
||||||
"Copie de contenus localisés": "",
|
"Copie de contenus localisés": "",
|
||||||
@ -155,38 +172,50 @@
|
|||||||
"Copier": "",
|
"Copier": "",
|
||||||
"Copier sauvegardes auto": "",
|
"Copier sauvegardes auto": "",
|
||||||
"Couleur de fond automatique": "",
|
"Couleur de fond automatique": "",
|
||||||
|
"Couleur icône haut de page": "",
|
||||||
"Couleur texte page active": "",
|
"Couleur texte page active": "",
|
||||||
"Couleur unie ou papier-peint": "",
|
"Couleur unie ou papier-peint": "",
|
||||||
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence.": "",
|
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence.": "",
|
||||||
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.": "",
|
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.": "",
|
||||||
"Couleurs": "",
|
"Couleurs": "",
|
||||||
"Créez un compte gratuit, recopier la clé , puis valider le formulaire avant de cliquer sur le bouton de génération": "",
|
|
||||||
"Dans le site": "",
|
"Dans le site": "",
|
||||||
"Dans quelle langue utiliserez-vous Zwii ?": "",
|
"Dans quelle langue utiliserez-vous Zwii ?": "",
|
||||||
"Date": "",
|
"Date": "",
|
||||||
"Description": "",
|
"Description": "",
|
||||||
|
"Disponible si le consentement des cookies est activé.": "",
|
||||||
"Disposition": "",
|
"Disposition": "",
|
||||||
"Données %s copiées vers %s": "",
|
"Données %s copiées vers %s": "",
|
||||||
"Données des modules": "",
|
"Données des modules": "",
|
||||||
"Données importées": "",
|
"Données importées": "",
|
||||||
|
"Dossier": "",
|
||||||
|
"Droits sur les dossiers": "",
|
||||||
|
"Droits sur les fichiers": "",
|
||||||
|
"Dupliquer": "",
|
||||||
"Dupliquer la page": "",
|
"Dupliquer la page": "",
|
||||||
"Déconnecte les sessions ouvertes précédemment sur d'autres navigateurs ou terminaux. Activation recommandée.": "",
|
"Déconnecte les sessions ouvertes précédemment sur d'autres navigateurs ou terminaux. Activation recommandée.": "",
|
||||||
"Déconnecter": "",
|
"Déconnecter": "",
|
||||||
"Déconnexion !": "",
|
"Déconnexion !": "",
|
||||||
"Déconnexion automatique": "",
|
"Déconnexion automatique": "",
|
||||||
|
"Définir par défaut": "",
|
||||||
"Dévoiler le mot de passe": "",
|
"Dévoiler le mot de passe": "",
|
||||||
"Echec de l'écriture, vérifiez les permissions": "",
|
"Effacer": "",
|
||||||
"Effacer la page": "",
|
"Effacer la page": "",
|
||||||
|
"Effacer tous les commentaires": "",
|
||||||
|
"Effacer toutes les statistiques": "",
|
||||||
|
"Effacer un commentaire": "",
|
||||||
|
"Effacer une catégorie": "",
|
||||||
"Emplacement :": "",
|
"Emplacement :": "",
|
||||||
"Emplacement dans le menu": "",
|
"Emplacement dans le menu": "",
|
||||||
"En bas au centre": "",
|
"En bas au centre": "",
|
||||||
"En bas à droite": "",
|
"En bas à droite": "",
|
||||||
"En bas à gauche": "",
|
"En bas à gauche": "",
|
||||||
"En cas de changement de module, les données du module précédent seront supprimées.": "",
|
"En cas de changement de module, les données du module précédent seront supprimées.": "",
|
||||||
|
"En dessous du site": "",
|
||||||
"En haut au centre": "",
|
"En haut au centre": "",
|
||||||
"En haut à droite": "",
|
"En haut à droite": "",
|
||||||
"En haut à gauche": "",
|
"En haut à gauche": "",
|
||||||
"En position libre ajoutez le module en plaçant [MODULE] à l'endroit voulu dans votre page.": "",
|
"En position libre ajoutez le module en plaçant [MODULE] à l'endroit voulu dans votre page.": "",
|
||||||
|
"En-dehors du site": "",
|
||||||
"Enregistrer": "",
|
"Enregistrer": "",
|
||||||
"Envoyer un message de confirmation": "",
|
"Envoyer un message de confirmation": "",
|
||||||
"Erreur : sauvegarde non générée !": "",
|
"Erreur : sauvegarde non générée !": "",
|
||||||
@ -197,8 +226,10 @@
|
|||||||
"Erreur de lecture, vérifiez les permissions": "",
|
"Erreur de lecture, vérifiez les permissions": "",
|
||||||
"Erreur inconnue": "",
|
"Erreur inconnue": "",
|
||||||
"Erreur inconnue, le module n'est pas installé": "",
|
"Erreur inconnue, le module n'est pas installé": "",
|
||||||
|
"Export CSV": "",
|
||||||
"Expéditeur": "",
|
"Expéditeur": "",
|
||||||
"Extension": "",
|
"Extension": "",
|
||||||
|
"Extraire": "",
|
||||||
"Facebook": "",
|
"Facebook": "",
|
||||||
"Famille": "",
|
"Famille": "",
|
||||||
"Favicon thème sombre": "",
|
"Favicon thème sombre": "",
|
||||||
@ -217,26 +248,36 @@
|
|||||||
"Fonte supprimée": "",
|
"Fonte supprimée": "",
|
||||||
"Fontes": "",
|
"Fontes": "",
|
||||||
"Format incorrect": "",
|
"Format incorrect": "",
|
||||||
|
"Formulaire": "",
|
||||||
"Fréquence de recherche": "",
|
"Fréquence de recherche": "",
|
||||||
"Fuseau horaire": "",
|
"Fuseau horaire": "",
|
||||||
"Gabarits de page - Barre latérale": "",
|
"Gabarits de page - Barre latérale": "",
|
||||||
"Gestion": "",
|
"Gestion": "",
|
||||||
"Gestion des modules": "",
|
"Gestion des modules": "",
|
||||||
"Gestion des thèmes": "",
|
"Gestion des thèmes": "",
|
||||||
|
"Gestionnaire de fichiers": "",
|
||||||
"Github": "",
|
"Github": "",
|
||||||
|
"Grande": "",
|
||||||
"Grande (220%)": "",
|
"Grande (220%)": "",
|
||||||
"Grande (300px)": "",
|
"Grande (300px)": "",
|
||||||
"Gras": "",
|
"Gras": "",
|
||||||
"Groupe": "",
|
"Groupe": "",
|
||||||
|
"Groupe associé": "",
|
||||||
"Groupe requis pour accéder à la page :": "",
|
"Groupe requis pour accéder à la page :": "",
|
||||||
"Groupes": "",
|
"Groupes": "",
|
||||||
"Générer sitemap.xml et robots.txt": "",
|
"Générer sitemap.xml et robots.txt": "",
|
||||||
"Générer une capture Open Graph": "",
|
"Générer une capture Open Graph": "",
|
||||||
|
"Gérer les catégories": "",
|
||||||
|
"Gérer les commentaires": "",
|
||||||
|
"Gérer les données": "",
|
||||||
"Hauteur": "",
|
"Hauteur": "",
|
||||||
|
"Hauteur de l'image": "",
|
||||||
|
"Hauteur de l'image sélectionnée": "",
|
||||||
"Hauteur maximale": "",
|
"Hauteur maximale": "",
|
||||||
"ID de la chaîne : https://www.youtube.com/channel/[ID].": "",
|
"ID de la chaîne : https://www.youtube.com/channel/[ID].": "",
|
||||||
"Icône": "",
|
"Icône": "",
|
||||||
"Icône avec bulle de texte": "",
|
"Icône avec bulle de texte": "",
|
||||||
|
"Icône haut de page, couleur arrière-plan": "",
|
||||||
"Identifiant": "",
|
"Identifiant": "",
|
||||||
"Identifiant (sans espace ni majuscule)": "",
|
"Identifiant (sans espace ni majuscule)": "",
|
||||||
"Identité": "",
|
"Identité": "",
|
||||||
@ -245,6 +286,8 @@
|
|||||||
"Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.": "",
|
"Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.": "",
|
||||||
"Image": "",
|
"Image": "",
|
||||||
"Image étirée (100% 100%)": "",
|
"Image étirée (100% 100%)": "",
|
||||||
|
"Important": "",
|
||||||
|
"Importante": "",
|
||||||
"Importation d'utilisateurs": "",
|
"Importation d'utilisateurs": "",
|
||||||
"Importation de fichier plat CSV": "",
|
"Importation de fichier plat CSV": "",
|
||||||
"Importation effectuée": "",
|
"Importation effectuée": "",
|
||||||
@ -260,7 +303,6 @@
|
|||||||
"Incorrect": "",
|
"Incorrect": "",
|
||||||
"Informations": "",
|
"Informations": "",
|
||||||
"Instagram": "",
|
"Instagram": "",
|
||||||
"Installation": "",
|
|
||||||
"Installation terminée": "",
|
"Installation terminée": "",
|
||||||
"Installer": "",
|
"Installer": "",
|
||||||
"Installer depuis le catalogue en ligne": "",
|
"Installer depuis le catalogue en ligne": "",
|
||||||
@ -277,13 +319,14 @@
|
|||||||
"L'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.": "",
|
"L'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.": "",
|
||||||
"L'identifiant est défini lors de la création du compte, il ne peut pas être modifié.": "",
|
"L'identifiant est défini lors de la création du compte, il ne peut pas être modifié.": "",
|
||||||
"La carte du site a été mise à jour": "",
|
"La carte du site a été mise à jour": "",
|
||||||
"La clé de l'API ne peut pas être vide": "",
|
"La copie de sauvegarde du fichier htaccess n'a pas été restaurée !": "",
|
||||||
"La description d'une page participe à son référencement, chaque page doit disposer d'une description différente.": "",
|
"La description d'une page participe à son référencement, chaque page doit disposer d'une description différente.": "",
|
||||||
"La page %s est ouverte par l'utilisateur %s": "",
|
"La page %s est ouverte par l'utilisateur %s": "",
|
||||||
"La page demandée n'existe pas ou est introuvable (erreur 404)": "",
|
"La page demandée n'existe pas ou est introuvable (erreur 404)": "",
|
||||||
"La page est affichée dans un menu horizontal mais pas dans le menu vertical d'une barre latérale.": "",
|
"La page est affichée dans un menu horizontal mais pas dans le menu vertical d'une barre latérale.": "",
|
||||||
"La première page que vos visiteurs verront.": "",
|
"La première page que vos visiteurs verront.": "",
|
||||||
"La règlementation française impose un anonymat de niveau 2": "",
|
"La règlementation française impose un anonymat de niveau 2": "",
|
||||||
|
"La réécriture d'URL n'a pas été restaurée !": "",
|
||||||
"La sauvegarde des fichiers peut prendre du temps. Continuer ?": "",
|
"La sauvegarde des fichiers peut prendre du temps. Continuer ?": "",
|
||||||
"La suppression a échoué": "",
|
"La suppression a échoué": "",
|
||||||
"La version installée est plus récente": "",
|
"La version installée est plus récente": "",
|
||||||
@ -295,6 +338,8 @@
|
|||||||
"Langues disponibles": "",
|
"Langues disponibles": "",
|
||||||
"Langues installées": "",
|
"Langues installées": "",
|
||||||
"Largeur": "",
|
"Largeur": "",
|
||||||
|
"Largeur de l'image": "",
|
||||||
|
"Largeur du site": "",
|
||||||
"Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.": "",
|
"Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.": "",
|
||||||
"Le curseur horizontal règle le niveau de transparence.": "",
|
"Le curseur horizontal règle le niveau de transparence.": "",
|
||||||
"Le fuseau horaire est utile au bon référencement": "",
|
"Le fuseau horaire est utile au bon référencement": "",
|
||||||
@ -309,6 +354,7 @@
|
|||||||
"Les langues sélectionnées sont identiques": "",
|
"Les langues sélectionnées sont identiques": "",
|
||||||
"Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.": "",
|
"Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.": "",
|
||||||
"Les modifications que vous avez apportées ne seront peut-être pas enregistrées.": "",
|
"Les modifications que vous avez apportées ne seront peut-être pas enregistrées.": "",
|
||||||
|
"Les tailles des polices de la bannière, de menu et de pied de page sont proportionnelles à cette taille.": "",
|
||||||
"Lettres": "",
|
"Lettres": "",
|
||||||
"Libre": "",
|
"Libre": "",
|
||||||
"Licence :": "",
|
"Licence :": "",
|
||||||
@ -321,6 +367,8 @@
|
|||||||
"Liste noire": "",
|
"Liste noire": "",
|
||||||
"Liste noire réinitialisée avec succès": "",
|
"Liste noire réinitialisée avec succès": "",
|
||||||
"Lors d'une mise à jour automatique, conserve le fichier htaccess de la racine du site.": "",
|
"Lors d'une mise à jour automatique, conserve le fichier htaccess de la racine du site.": "",
|
||||||
|
"Léger": "",
|
||||||
|
"Légère": "",
|
||||||
"Maigre": "",
|
"Maigre": "",
|
||||||
"Maintenance": "",
|
"Maintenance": "",
|
||||||
"Majuscule à chaque mot": "",
|
"Majuscule à chaque mot": "",
|
||||||
@ -330,9 +378,12 @@
|
|||||||
"Masquer la page et les pages enfants dans le menu d'une barre latérale": "",
|
"Masquer la page et les pages enfants dans le menu d'une barre latérale": "",
|
||||||
"Masquer les pages enfants dans le menu horizontal": "",
|
"Masquer les pages enfants dans le menu horizontal": "",
|
||||||
"Membre": "",
|
"Membre": "",
|
||||||
|
"Membre avec droit de partage": "",
|
||||||
|
"Membre simple": "",
|
||||||
"Mentions légales": "",
|
"Mentions légales": "",
|
||||||
"Menu": "",
|
"Menu": "",
|
||||||
"Menu accessoire": "",
|
"Menu accessoire": "",
|
||||||
|
"Menu burger dans écran réduit": "",
|
||||||
"Menu standard": "",
|
"Menu standard": "",
|
||||||
"Message d'acceptation des Cookies": "",
|
"Message d'acceptation des Cookies": "",
|
||||||
"Message de consentement aux cookies": "",
|
"Message de consentement aux cookies": "",
|
||||||
@ -345,7 +396,6 @@
|
|||||||
"Mise en page": "",
|
"Mise en page": "",
|
||||||
"Mise à jour": "",
|
"Mise à jour": "",
|
||||||
"Mise à jour automatisée": "",
|
"Mise à jour automatisée": "",
|
||||||
"Mise à jour de ZwiiCMS": "",
|
|
||||||
"Mise à jour terminée avec succès.": "",
|
"Mise à jour terminée avec succès.": "",
|
||||||
"Modifications enregistrées": "",
|
"Modifications enregistrées": "",
|
||||||
"Module": "",
|
"Module": "",
|
||||||
@ -358,20 +408,23 @@
|
|||||||
"Mot de passe oublié": "",
|
"Mot de passe oublié": "",
|
||||||
"Mot de passe perdu": "",
|
"Mot de passe perdu": "",
|
||||||
"Motorisé par": "",
|
"Motorisé par": "",
|
||||||
|
"Moyen": "",
|
||||||
|
"Moyenne": "",
|
||||||
"Moyenne (200%)": "",
|
"Moyenne (200%)": "",
|
||||||
"Moyenne (200px)": "",
|
"Moyenne (200px)": "",
|
||||||
"Multilingue": "",
|
|
||||||
"Méta-description": "",
|
"Méta-description": "",
|
||||||
"Méta-titre": "",
|
"Méta-titre": "",
|
||||||
"Ne pas afficher": "",
|
"Ne pas afficher": "",
|
||||||
"Ne pas charger l'exemple de site (utilisateurs avancés)": "",
|
"Ne pas charger l'exemple de site (utilisateurs avancés)": "",
|
||||||
"Ne pas répéter": "",
|
"Ne pas répéter": "",
|
||||||
"Ne pas saisir les balises": "",
|
"Ne pas saisir les balises": "",
|
||||||
|
"News": "",
|
||||||
"Niveau 1 (192.168.12.x)": "",
|
"Niveau 1 (192.168.12.x)": "",
|
||||||
"Niveau 2 (192.168.x.x)": "",
|
"Niveau 2 (192.168.x.x)": "",
|
||||||
"Niveau 3 (192.x.x.x)": "",
|
"Niveau 3 (192.x.x.x)": "",
|
||||||
"Nom": "",
|
"Nom": "",
|
||||||
"Nom Prénom": "",
|
"Nom Prénom": "",
|
||||||
|
"Nom du profil": "",
|
||||||
"Nom utilisateur": "",
|
"Nom utilisateur": "",
|
||||||
"Non": "",
|
"Non": "",
|
||||||
"Non tronquée": "",
|
"Non tronquée": "",
|
||||||
@ -386,6 +439,7 @@
|
|||||||
"Ombre": "",
|
"Ombre": "",
|
||||||
"Option active en mode déconnecté uniquement, les pages enfants sont visibles et accessibles.": "",
|
"Option active en mode déconnecté uniquement, les pages enfants sont visibles et accessibles.": "",
|
||||||
"Option recommandée pour sécuriser la connexion. S'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.": "",
|
"Option recommandée pour sécuriser la connexion. S'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.": "",
|
||||||
|
"Options": "",
|
||||||
"Options avancées": "",
|
"Options avancées": "",
|
||||||
"Origine": "",
|
"Origine": "",
|
||||||
"Oui": "",
|
"Oui": "",
|
||||||
@ -410,11 +464,17 @@
|
|||||||
"Paramètres": "",
|
"Paramètres": "",
|
||||||
"Paramètres de la localisation": "",
|
"Paramètres de la localisation": "",
|
||||||
"Paramètres de la sauvegarde": "",
|
"Paramètres de la sauvegarde": "",
|
||||||
|
"Paramètres du profil": "",
|
||||||
"Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d'envoi de mail.": "",
|
"Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d'envoi de mail.": "",
|
||||||
"Pas de marge au-dessus et en dessous du site": "",
|
"Pas de marge au-dessus et en dessous du site": "",
|
||||||
"Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "",
|
"Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "",
|
||||||
"Permission": "",
|
"Permission": "",
|
||||||
"Permission et référencement": "",
|
"Permission et référencement": "",
|
||||||
|
"Permissions": "",
|
||||||
|
"Permissions sur les dossiers": "",
|
||||||
|
"Permissions sur les fichiers": "",
|
||||||
|
"Permissions sur les pages": "",
|
||||||
|
"Petite": "",
|
||||||
"Petite (150px)": "",
|
"Petite (150px)": "",
|
||||||
"Petite (180%)": "",
|
"Petite (180%)": "",
|
||||||
"Pied de page": "",
|
"Pied de page": "",
|
||||||
@ -427,6 +487,9 @@
|
|||||||
"Position": "",
|
"Position": "",
|
||||||
"Position du module": "",
|
"Position du module": "",
|
||||||
"Pour définir la page comme barre latérale, choisissez l'option dans la liste.": "",
|
"Pour définir la page comme barre latérale, choisissez l'option dans la liste.": "",
|
||||||
|
"Presse Papier": "",
|
||||||
|
"Presse papier": "",
|
||||||
|
"Profils des groupes": "",
|
||||||
"Proportionnelle à la taille définie dans le site.": "",
|
"Proportionnelle à la taille définie dans le site.": "",
|
||||||
"Prénom": "",
|
"Prénom": "",
|
||||||
"Prénom Nom": "",
|
"Prénom Nom": "",
|
||||||
@ -434,12 +497,18 @@
|
|||||||
"Préserver le fichier htaccess racine": "",
|
"Préserver le fichier htaccess racine": "",
|
||||||
"Préserver les comptes des utilisateurs déjà installés": "",
|
"Préserver les comptes des utilisateurs déjà installés": "",
|
||||||
"Prévenir l'utilisateur par mail": "",
|
"Prévenir l'utilisateur par mail": "",
|
||||||
|
"Prévisualiser": "",
|
||||||
"Pseudo": "",
|
"Pseudo": "",
|
||||||
|
"Rang 9 > rang 1. Le profil de rang 1 n'est pas modifiable.": "",
|
||||||
|
"Ratio": "",
|
||||||
"Ratio :": "",
|
"Ratio :": "",
|
||||||
|
"Recherche": "",
|
||||||
"Recherche dans le site": "",
|
"Recherche dans le site": "",
|
||||||
"Rechercher": "",
|
"Rechercher": "",
|
||||||
"Rechercher une mise à jour en ligne": "",
|
"Rechercher une mise à jour en ligne": "",
|
||||||
|
"Redirection": "",
|
||||||
"Redirection vers la connexion": "",
|
"Redirection vers la connexion": "",
|
||||||
|
"Renommer": "",
|
||||||
"Renseignez les champs ci-dessous pour finaliser l'installation.": "",
|
"Renseignez les champs ci-dessous pour finaliser l'installation.": "",
|
||||||
"Responsive (contain)": "",
|
"Responsive (contain)": "",
|
||||||
"Responsive (cover)": "",
|
"Responsive (cover)": "",
|
||||||
@ -450,6 +519,7 @@
|
|||||||
"Rester connecté sur ce navigateur": "",
|
"Rester connecté sur ce navigateur": "",
|
||||||
"Retour": "",
|
"Retour": "",
|
||||||
"Rien à importer, erreur de format ou fichier incorrect": "",
|
"Rien à importer, erreur de format ou fichier incorrect": "",
|
||||||
|
"Rédacteur": "",
|
||||||
"Référencement": "",
|
"Référencement": "",
|
||||||
"Réinitialisation du mot de passe": "",
|
"Réinitialisation du mot de passe": "",
|
||||||
"Réinitialiser avec le thème par défaut": "",
|
"Réinitialiser avec le thème par défaut": "",
|
||||||
@ -477,7 +547,7 @@
|
|||||||
"Sauvegarde": "",
|
"Sauvegarde": "",
|
||||||
"Sauvegarde automatique quotidienne du site": "",
|
"Sauvegarde automatique quotidienne du site": "",
|
||||||
"Sauvegarde du thème dans le": "",
|
"Sauvegarde du thème dans le": "",
|
||||||
"Sauvegarde générée avec succès.": "",
|
"Sauvegarde générée avec succès": "",
|
||||||
"Sauvegarder": "",
|
"Sauvegarder": "",
|
||||||
"Sauvegarder et télécharger le module": "",
|
"Sauvegarder et télécharger le module": "",
|
||||||
"Sauvegarder le module dans le gestionnaire de fichiers": "",
|
"Sauvegarder le module dans le gestionnaire de fichiers": "",
|
||||||
@ -498,7 +568,7 @@
|
|||||||
"Standard": "",
|
"Standard": "",
|
||||||
"Style": "",
|
"Style": "",
|
||||||
"Suppression interdite": "",
|
"Suppression interdite": "",
|
||||||
"Suppression interdite, page active dans la configuration du site": "",
|
"Suppression interdite, page active dans la configuration de la langue du site": "",
|
||||||
"Supprime le point d'interrogation dans les URL, l'option est indisponible avec les autres serveurs Web": "",
|
"Supprime le point d'interrogation dans les URL, l'option est indisponible avec les autres serveurs Web": "",
|
||||||
"Supprimer": "",
|
"Supprimer": "",
|
||||||
"Supprimer la page": "",
|
"Supprimer la page": "",
|
||||||
@ -517,6 +587,7 @@
|
|||||||
"Sélectionnez une image ou une icône de petite dimension": "",
|
"Sélectionnez une image ou une icône de petite dimension": "",
|
||||||
"Sélectionnez une langue": "",
|
"Sélectionnez une langue": "",
|
||||||
"Sélectionnez une page contenant le module 'Recherche'. Une option du pied de page ajoute un lien discret vers cette page.": "",
|
"Sélectionnez une page contenant le module 'Recherche'. Une option du pied de page ajoute un lien discret vers cette page.": "",
|
||||||
|
"Sélectionnez une page pour activer": "",
|
||||||
"Séparateur": "",
|
"Séparateur": "",
|
||||||
"Taille": "",
|
"Taille": "",
|
||||||
"Text": "",
|
"Text": "",
|
||||||
@ -531,9 +602,18 @@
|
|||||||
"Titre masqué": "",
|
"Titre masqué": "",
|
||||||
"Titre masqué dans la page": "",
|
"Titre masqué dans la page": "",
|
||||||
"Titres": "",
|
"Titres": "",
|
||||||
|
"Tous les dossiers": "",
|
||||||
|
"Tous les droits d'édition des contenus": "",
|
||||||
|
"Tout Effacer": "",
|
||||||
"Traduction supprimée": "",
|
"Traduction supprimée": "",
|
||||||
|
"Très grande": "",
|
||||||
"Très grande (240%)": "",
|
"Très grande (240%)": "",
|
||||||
"Très grande (400px)": "",
|
"Très grande (400px)": "",
|
||||||
|
"Très important": "",
|
||||||
|
"Très importante": "",
|
||||||
|
"Très léger": "",
|
||||||
|
"Très légère": "",
|
||||||
|
"Très petite": "",
|
||||||
"Très petite (100px) ": "",
|
"Très petite (100px) ": "",
|
||||||
"Très petite (160%)": "",
|
"Très petite (160%)": "",
|
||||||
"Twitter": "",
|
"Twitter": "",
|
||||||
@ -544,6 +624,7 @@
|
|||||||
"Télécharger la liste": "",
|
"Télécharger la liste": "",
|
||||||
"Télécharger le journal": "",
|
"Télécharger le journal": "",
|
||||||
"Télécharger le module dans le gestionnaire de fichiers": "",
|
"Télécharger le module dans le gestionnaire de fichiers": "",
|
||||||
|
"Téléverser": "",
|
||||||
"URL incorrecte": "",
|
"URL incorrecte": "",
|
||||||
"Un mail a été envoyé pour confirmer la réinitialisation": "",
|
"Un mail a été envoyé pour confirmer la réinitialisation": "",
|
||||||
"Une archive du dossier /site/data est conservée pendant 30 jours. Activation recommandée": "",
|
"Une archive du dossier /site/data est conservée pendant 30 jours. Activation recommandée": "",
|
||||||
@ -556,8 +637,10 @@
|
|||||||
"Version": "",
|
"Version": "",
|
||||||
"Version n°": "",
|
"Version n°": "",
|
||||||
"Vider dossier sauvegardes auto": "",
|
"Vider dossier sauvegardes auto": "",
|
||||||
|
"Visiteur": "",
|
||||||
"Vous n'êtes pas autorisé à consulter cette page (erreur 403)": "",
|
"Vous n'êtes pas autorisé à consulter cette page (erreur 403)": "",
|
||||||
"Youtube": "",
|
"Youtube": "",
|
||||||
|
"ZwiiCMS - Installation": "",
|
||||||
"actualisé": "",
|
"actualisé": "",
|
||||||
"favicon.ico": "",
|
"favicon.ico": "",
|
||||||
"faviconDark.ico": "",
|
"faviconDark.ico": "",
|
||||||
@ -566,54 +649,45 @@
|
|||||||
"jour": "",
|
"jour": "",
|
||||||
"jours": "",
|
"jours": "",
|
||||||
"sauvegardé avec succès": "",
|
"sauvegardé avec succès": "",
|
||||||
"vers ZwiiCMS": "",
|
"vers": "",
|
||||||
"À droite": "",
|
"À droite": "",
|
||||||
"À gauche": "",
|
"À gauche": "",
|
||||||
"À l'emplacement du mot clé [MODULE] dans la page": "",
|
"À l'emplacement du mot clé [MODULE] dans la page": "",
|
||||||
|
"Échec de l'écriture, vérifiez les permissions": "",
|
||||||
"Échecs": "",
|
"Échecs": "",
|
||||||
"Éditer": "",
|
"Éditer": "",
|
||||||
"Éditer la page": "",
|
"Éditer la page": "",
|
||||||
"Éditer les dialogues": "",
|
"Éditer les dialogues": "",
|
||||||
|
"Éditer une catégorie": "",
|
||||||
"Éditeur": "",
|
"Éditeur": "",
|
||||||
"Éditeur CSS": "",
|
"Éditeur CSS": "",
|
||||||
"Éditeur JS": "",
|
"Éditeur JS": "",
|
||||||
"Éditeur de script %s": "",
|
"Éditeur de script %s": "",
|
||||||
"Éditeur de script dans Body": "",
|
"Éditeur de script dans Body": "",
|
||||||
"Éditeur de script dans Head": "",
|
"Éditeur de script dans Head": "",
|
||||||
|
"Éditeur simple": "",
|
||||||
|
"Édition des pages": "",
|
||||||
|
"Édition du profil %s": "",
|
||||||
"Éléments": "",
|
"Éléments": "",
|
||||||
"Étiquettes des pages spéciales": "",
|
|
||||||
"Largeur de l'image": "",
|
|
||||||
"Hauteur de l'image": "",
|
|
||||||
"Largeur du site": "",
|
|
||||||
"Ratio": "",
|
|
||||||
"Hauteur de l'image sélectionnée": "",
|
|
||||||
"Étendu sur la page": "",
|
"Étendu sur la page": "",
|
||||||
"Très légère": "",
|
"Étiquettes des pages spéciales": "",
|
||||||
"Légère": "",
|
"Dimensions minimales": "",
|
||||||
"Moyenne": "",
|
"Taille maximale du fichier": "",
|
||||||
"Importante": "",
|
"5 Mo pour les images JPEG": "",
|
||||||
"Très importante": "",
|
"1 Mo pour les images PNG": "",
|
||||||
"Aucun": "",
|
"Poids": "",
|
||||||
"Aucune": "",
|
"Supprimer ce profil ?": "",
|
||||||
"Très léger": "",
|
"Masqué": "",
|
||||||
"Léger": "",
|
"Haut de page": "",
|
||||||
"Moyen": "",
|
"Bas de page": "",
|
||||||
"Important": "",
|
"Petit triangle": "",
|
||||||
"Très important": "",
|
"Grand triangle": "",
|
||||||
"En-dehors du site": "",
|
"Flèche": "",
|
||||||
"Avant la bannière": "",
|
"Modèle": "",
|
||||||
"Après la bannière": "",
|
"Bouton de navigation droit": "",
|
||||||
"Caché": "",
|
"Bouton de navigation gauche": "",
|
||||||
"Très petite": "",
|
"Groupes / Profils": "",
|
||||||
"Petite": "",
|
"Prénom commence par": "",
|
||||||
"Grande": "",
|
"Nom commence par": "",
|
||||||
"Très grande": "",
|
"Impossible de réinitialiser le mot de passe de ce compte !": ""
|
||||||
"Les tailles des polices de la bannière, de menu et de pied de page sont proportionnelles à cette taille.": "",
|
|
||||||
"En dessous du site": "",
|
|
||||||
"Sélectionnez une page pour activer": "",
|
|
||||||
"Couleur icône haut de page": "",
|
|
||||||
"Icône haut de page, couleur arrière-plan": "",
|
|
||||||
"Disponible si le consentement des cookies est activé.": "",
|
|
||||||
"Affiche les icônes de gestion du compte et de déconnexion des membres simples connectés.:": "",
|
|
||||||
"Définir par défaut": ""
|
|
||||||
}
|
}
|
@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"languages": {
|
|
||||||
"fr_FR": {
|
|
||||||
"version": 12309,
|
|
||||||
"date": 1682538594
|
|
||||||
},
|
|
||||||
"es": {
|
|
||||||
"version": 12309,
|
|
||||||
"date": 1682538594
|
|
||||||
},
|
|
||||||
"en_EN": {
|
|
||||||
"version": 12309,
|
|
||||||
"date": 1682538594
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,24 +0,0 @@
|
|||||||
{
|
|
||||||
"themes": {
|
|
||||||
"defaut": {
|
|
||||||
"name": "Le thème par défaut, ambiance bleu et montagne",
|
|
||||||
"filename": ""
|
|
||||||
},
|
|
||||||
"moderne": {
|
|
||||||
"name": "Thème avec la nouvelle bannière personnalisable",
|
|
||||||
"filename": "theme_moderne.zip"
|
|
||||||
},
|
|
||||||
"affaire": {
|
|
||||||
"name": "Thème affaire, bannière centre d'appel, ambiance prune",
|
|
||||||
"filename": "theme_affaire.zip"
|
|
||||||
},
|
|
||||||
"black": {
|
|
||||||
"name": "Thème de nuit, ambiance nocturne",
|
|
||||||
"filename": "theme_orange_black.zip"
|
|
||||||
},
|
|
||||||
"facebook": {
|
|
||||||
"name": "Thème Facebook ancienne génération, pas de bannière, menu fixe fond bleu",
|
|
||||||
"filename": "theme_old_facebook.zip"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* This file is part of Zwii.
|
||||||
|
*
|
||||||
|
* For full copyright and license information, please see the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*
|
||||||
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
|
* @link http://zwiicms.fr/
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** NE PAS EFFACER
|
||||||
|
* admin.css
|
||||||
|
*/
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
@ -11,12 +11,32 @@
|
|||||||
</span>
|
</span>
|
||||||
</summary>
|
</summary>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col12">
|
<div class="col6">
|
||||||
|
<?php echo template::text('installFirstname', [
|
||||||
|
'autocomplete' => 'off',
|
||||||
|
'label' => 'Prénom'
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
|
<div class="col6">
|
||||||
|
<?php echo template::text('installLastname', [
|
||||||
|
'autocomplete' => 'off',
|
||||||
|
'label' => 'Nom'
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col6">
|
||||||
<?php echo template::text('installId', [
|
<?php echo template::text('installId', [
|
||||||
'autocomplete' => 'off',
|
'autocomplete' => 'off',
|
||||||
'label' => 'Identifiant'
|
'label' => 'Identifiant'
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col6">
|
||||||
|
<?php echo template::mail('installMail', [
|
||||||
|
'autocomplete' => 'off',
|
||||||
|
'label' => 'Adresse électronique'
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col6">
|
<div class="col6">
|
||||||
@ -32,28 +52,6 @@
|
|||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
|
||||||
<div class="col12">
|
|
||||||
<?php echo template::mail('installMail', [
|
|
||||||
'autocomplete' => 'off',
|
|
||||||
'label' => 'Adresse électronique'
|
|
||||||
]); ?>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col6">
|
|
||||||
<?php echo template::text('installFirstname', [
|
|
||||||
'autocomplete' => 'off',
|
|
||||||
'label' => 'Prénom'
|
|
||||||
]); ?>
|
|
||||||
</div>
|
|
||||||
<div class="col6">
|
|
||||||
<?php echo template::text('installLastname', [
|
|
||||||
'autocomplete' => 'off',
|
|
||||||
'label' => 'Nom'
|
|
||||||
]); ?>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</details>
|
</details>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -65,7 +63,7 @@
|
|||||||
<?php echo helper::translate('Options avancées'); ?>
|
<?php echo helper::translate('Options avancées'); ?>
|
||||||
</span>
|
</span>
|
||||||
</summary>
|
</summary>
|
||||||
<?php if ($this->getUrl(2) === 'fr_FR'): ?>
|
<?php if ($_SESSION['ZWII_UI'] === 'fr_FR'): ?>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col12">
|
<div class="col12">
|
||||||
<?php echo template::checkbox('installDefaultData', true, 'Ne pas charger l\'exemple de site (utilisateurs avancés)', [
|
<?php echo template::checkbox('installDefaultData', true, 'Ne pas charger l\'exemple de site (utilisateurs avancés)', [
|
||||||
@ -96,9 +94,6 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col12">
|
<div class="col12">
|
||||||
<?php echo template::select('installTheme', $module::$themes, [
|
|
||||||
'label' => 'Thème'
|
|
||||||
]); ?>
|
|
||||||
<?php echo template::hidden('installLanguage', [
|
<?php echo template::hidden('installLanguage', [
|
||||||
'value' => $this->getUrl(2)
|
'value' => $this->getUrl(2)
|
||||||
]); ?>
|
]); ?>
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
@ -1,6 +1,15 @@
|
|||||||
function step(i, data) {
|
function step(i, data) {
|
||||||
var errors = ["<?php echo helper::translate('Préparation de la mise à jour'); ?>", "<?php echo helper::translate('Téléchargement et validation de l\'archive'); ?>", "<?php echo helper::translate('Installation'); ?>", "<?php echo helper::translate('Configuration'); ?>"];
|
var errors = [
|
||||||
$(".installUpdateProgressText").hide(), $(".installUpdateProgressText[data-id=" + i + "]").show();
|
"<?php echo helper::translate('Préparation de la mise à jour'); ?>",
|
||||||
|
"<?php echo helper::translate('Téléchargement et validation de l\'archive'); ?>",
|
||||||
|
"<?php echo helper::translate('Installation'); ?>",
|
||||||
|
"<?php echo helper::translate('Configuration'); ?>"
|
||||||
|
];
|
||||||
|
$(".installUpdateProgressText").hide();
|
||||||
|
$(".installUpdateProgressText[data-id=" + i + "]").show();
|
||||||
|
|
||||||
|
$("body").css("cursor", "wait");
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
url: "<?php echo helper::baseUrl(false); ?>?install/steps",
|
url: "<?php echo helper::baseUrl(false); ?>?install/steps",
|
||||||
@ -9,39 +18,75 @@ function step(i, data) {
|
|||||||
data: data
|
data: data
|
||||||
},
|
},
|
||||||
success: function (result) {
|
success: function (result) {
|
||||||
console.log(result.success);
|
setTimeout(function () {
|
||||||
if (result.success != "1") { // Vérification de la propriété "success"
|
|
||||||
// Appel de la fonction de gestion d'erreur
|
|
||||||
showError(i, result, errors);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setTimeout((function () {
|
|
||||||
if (4 === i) {
|
if (4 === i) {
|
||||||
$("#installUpdateSuccess").show();
|
$("#installUpdateSuccess").show();
|
||||||
|
$("body").css("cursor", "default");
|
||||||
$("#installUpdateEnd").removeClass("disabled");
|
$("#installUpdateEnd").removeClass("disabled");
|
||||||
$("#installUpdateProgress").hide();
|
$("#installUpdateProgress").hide();
|
||||||
} else {
|
} else {
|
||||||
step(i + 1, result.data);
|
step(i + 1, result.data);
|
||||||
}
|
}
|
||||||
}), 2e3)
|
}, 2000);
|
||||||
},
|
},
|
||||||
error: function (xhr) {
|
error: function (xhr) {
|
||||||
|
console.log(i);
|
||||||
|
console.log(xhr.responseText);
|
||||||
|
console.log(errors);
|
||||||
|
|
||||||
|
// Vérification du code d'erreur HTTP pour gérer la déconnexion
|
||||||
|
if (xhr.status === 401 || xhr.status === 403) {
|
||||||
|
alert("Votre session a expiré. Veuillez vous reconnecter.");
|
||||||
|
window.location.href = "?user/login"; // Redirige vers la page de connexion
|
||||||
|
} else {
|
||||||
// Appel de la fonction de gestion d'erreur
|
// Appel de la fonction de gestion d'erreur
|
||||||
showError(1, xhr.responseText, errors);
|
showError(i, xhr.responseText, errors);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function showError(step, message, errors) {
|
function showError(step, message, errors) {
|
||||||
$("#installUpdateErrorStep").text(errors[step]);
|
$("body").css("cursor", "default");
|
||||||
|
$("#installUpdateErrorStep").text(errors[step] + " (étape n°" + step + ")");
|
||||||
$("#installUpdateError").show();
|
$("#installUpdateError").show();
|
||||||
$("#installUpdateEnd").removeClass("disabled");
|
$("#installUpdateEnd").removeClass("disabled");
|
||||||
$("#installUpdateProgress").hide();
|
$("#installUpdateProgress").hide();
|
||||||
if (typeof message === 'object' && message.data) {
|
|
||||||
var errorMessage = message.data.replace(/"/g, "");
|
// Vérifier si l'accolade ouvrante est trouvée et qu'elle n'est pas en première position
|
||||||
$("#installUpdateErrorMessage").text(errorMessage);
|
if (typeof message !== 'object') {
|
||||||
|
|
||||||
|
// Trouver la position du premier "{" pour repérer le début du tableau
|
||||||
|
const startOfArray = message.indexOf('{');
|
||||||
|
|
||||||
|
if (startOfArray !== -1 && startOfArray > 0) {
|
||||||
|
// Extraire le message du warning jusqu'au début du tableau
|
||||||
|
const warningMessage = message.substring(0, startOfArray).trim();
|
||||||
|
|
||||||
|
// Extraire le tableau JSON entre les accolades
|
||||||
|
const jsonString = message.substring(startOfArray);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const jsonData = JSON.parse(jsonString);
|
||||||
|
|
||||||
|
// Afficher les résultats si le parsing JSON est réussi
|
||||||
|
if (jsonData) {
|
||||||
|
$("#installUpdateErrorMessage").html("<strong>Détails de l'erreur :</strong><br> " +
|
||||||
|
jsonData.data.replace(/^"(.*)"$/, '$1') +
|
||||||
|
"<br>" +
|
||||||
|
warningMessage.replace(/<[^p].*?>/g, ""));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
// Afficher un message générique en cas d'erreur de parsing
|
||||||
|
console.error("Erreur de parsing JSON : ", e);
|
||||||
|
$("#installUpdateErrorMessage").html("Une erreur inattendue est survenue lors du traitement des détails de l'erreur.");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
$("#installUpdateErrorMessage").text(message.replace(/<[^p].*?>/g, ""));
|
// Si pas de JSON détecté, afficher le message brut
|
||||||
|
$("#installUpdateErrorMessage").html("Message d'erreur : " + message);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$("#installUpdateErrorMessage").html(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
|
<div id="updateContainer">
|
||||||
<p><strong>
|
<p><strong>
|
||||||
<?php echo helper::translate('Mise à jour de ZwiiCMS'); ?>
|
<?php echo helper::translate('Version'); ?>
|
||||||
|
|
||||||
<?php echo self::ZWII_VERSION; ?>
|
<?php echo self::ZWII_VERSION; ?>
|
||||||
<?php echo helper::translate('vers ZwiiCMS'); ?>
|
<?php echo helper::translate('vers'); ?>
|
||||||
|
|
||||||
<?php echo $module::$newVersion; ?>.
|
<?php echo $module::$newVersion; ?>
|
||||||
</strong></p>
|
</strong></p>
|
||||||
<p>
|
<p>
|
||||||
<?php echo helper::translate('Afin d\'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l\'opération.'); ?>
|
<?php echo helper::translate('Afin d\'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l\'opération.'); ?>
|
||||||
@ -26,15 +27,14 @@
|
|||||||
<?php echo helper::translate('4/4 : Configuration...'); ?>
|
<?php echo helper::translate('4/4 : Configuration...'); ?>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div id="installUpdateError" class="colorRed displayNone">
|
<div id="installUpdateError" class="message colorRed displayNone">
|
||||||
<?php echo template::ico('cancel'); ?>
|
<?php echo template::ico('cancel'); ?>
|
||||||
<strong>
|
<strong>
|
||||||
<?php echo helper::translate('Une erreur est survenue lors de l\'étape :'); ?>
|
<?php echo helper::translate('Une erreur est survenue lors de l\'étape :') . '<br>'; ?>
|
||||||
|
|
||||||
<span id="installUpdateErrorStep"> </span>.
|
<span id="installUpdateErrorStep"> </span>.
|
||||||
</strong>
|
</strong>
|
||||||
</div>
|
</div>
|
||||||
<div id="installUpdateSuccess" class="colorGreen displayNone">
|
<div id="installUpdateSuccess" class="message colorGreen displayNone">
|
||||||
<?php echo template::ico('check'); ?>
|
<?php echo template::ico('check'); ?>
|
||||||
<?php echo helper::translate('Mise à jour terminée avec succès.'); ?>
|
<?php echo helper::translate('Mise à jour terminée avec succès.'); ?>
|
||||||
</div>
|
</div>
|
||||||
@ -52,4 +52,5 @@
|
|||||||
<div class="col12">
|
<div class="col12">
|
||||||
<p><em><span class="colorRed" id="installUpdateErrorMessage"></span></em></p>
|
<p><em><span class="colorRed" id="installUpdateErrorMessage"></span></em></p>
|
||||||
</div>
|
</div>
|
||||||
</div
|
</div>
|
||||||
|
</div>
|
@ -8,14 +8,17 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class translate extends common
|
class language extends common
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// URL langues de l'UI en ligne
|
||||||
|
const ZWII_UI_URL = 'https://forge.chapril.org/ZwiiCMS-Team/zwiicms-translations/raw/branch/master/v13/';
|
||||||
|
|
||||||
public static $actions = [
|
public static $actions = [
|
||||||
'index' => self::GROUP_ADMIN,
|
'index' => self::GROUP_ADMIN,
|
||||||
'copy' => self::GROUP_ADMIN,
|
'copy' => self::GROUP_ADMIN,
|
||||||
@ -66,49 +69,60 @@ class translate extends common
|
|||||||
*/
|
*/
|
||||||
public function update()
|
public function update()
|
||||||
{
|
{
|
||||||
$lang = $this->getUrl(2);
|
|
||||||
// Jeton incorrect ou URl avec le code langue incorrecte
|
|
||||||
if (
|
if (
|
||||||
$this->getUrl(3) !== $_SESSION['csrf'] &&
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'access' => false
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
$lang = $this->getUrl(2);
|
||||||
|
// Action interdite ou URl avec le code langue incorrecte
|
||||||
|
if (
|
||||||
array_key_exists($lang, self::$languages) === false
|
array_key_exists($lang, self::$languages) === false
|
||||||
) {
|
) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'translate',
|
'redirect' => helper::baseUrl() . 'language',
|
||||||
'state' => false,
|
'state' => false,
|
||||||
'notification' => helper::translate('Action interdite')
|
'notification' => helper::translate('Action interdite')
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Upload et sauver le fichier de langue
|
// Télécharger le descripteur en ligne
|
||||||
$response = json_decode(helper::getUrlContents(common::ZWII_UI_URL . $lang . '.json'), true);
|
$languageData = json_decode(helper::getUrlContents(self::ZWII_UI_URL . $lang . '.json'), true);
|
||||||
if ($response !== false) {
|
$descripteur = json_decode(helper::getUrlContents(self::ZWII_UI_URL . 'language.json'), true);
|
||||||
$response = file_put_contents(self::I18N_DIR . $lang . '.json', json_encode($response, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
|
$success = false;
|
||||||
// Mettre à jour le descripteur
|
if (
|
||||||
$enumsStore = json_decode(helper::getUrlContents(common::ZWII_UI_URL . 'languages.json'), true);
|
is_array($languageData) &&
|
||||||
$enums = $this->getData(['languages']);
|
is_array($descripteur['language'][$lang])
|
||||||
$enums = array_merge($enums, [
|
) {
|
||||||
$lang => $enumsStore['languages'][$lang]
|
if ($this->setData(['language', $lang, $descripteur['language'][$lang]])) {
|
||||||
]);
|
$success = $this->secure_file_put_contents(self::I18N_DIR . $lang . '.json', $languageData);
|
||||||
$response = (bool) $response && $this->setData(['languages', $enums]);
|
$success = is_int($success) ? true : false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'translate',
|
'redirect' => helper::baseUrl() . 'language',
|
||||||
'notification' => $response ? helper::translate('Copie terminée avec succès') : 'Copie terminée avec des erreurs',
|
'notification' => $success ? helper::translate('Copie terminée avec succès') : 'Copie terminée avec des erreurs',
|
||||||
'state' => $response
|
'state' => $success
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configuration avancée des langues
|
* Configuration avancée des langues
|
||||||
*/
|
*/
|
||||||
public function copy()
|
public function copy()
|
||||||
{
|
{
|
||||||
|
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
// Initialisation
|
// Initialisation
|
||||||
$success = false;
|
$success = false;
|
||||||
$copyFrom = $this->getInput('translateFormCopySource');
|
$copyFrom = $this->getInput('translateFormCopySource');
|
||||||
@ -169,50 +183,24 @@ class translate extends common
|
|||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
// --------------------------------------------------------------------------------------------------
|
||||||
* Met à jour les dictionnaires des langues depuis les modèles installés
|
// Langues du site
|
||||||
*/
|
// --------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Langues installées
|
|
||||||
$installedUI = $this->getData(['languages']);
|
|
||||||
|
|
||||||
// Check si la langue est bien disponible sinon la supprime de la BDD
|
|
||||||
if ($installedUI) {
|
|
||||||
foreach ($installedUI as $key => $value)
|
|
||||||
if (file_exists(self::I18N_DIR . $key . '.json') === false) {
|
|
||||||
$this->deleteData(['languages', $key]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Langues disponibles avec la mise à jour
|
|
||||||
$store = json_decode(file_get_contents('core/module/install/ressource/i18n/languages.json'), true);
|
|
||||||
$store = $store['languages'];
|
|
||||||
|
|
||||||
foreach ($installedUI as $key => $value) {
|
|
||||||
if (isset($store[$key]) && $store[$key]['version'] > $value['version']) {
|
|
||||||
$this->setData(['languages', $key, $store[$key]]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Préparation du formulaire
|
|
||||||
// -------------------------
|
|
||||||
|
|
||||||
// Onglet des langues de contenu
|
|
||||||
foreach (self::$languages as $key => $value) {
|
foreach (self::$languages as $key => $value) {
|
||||||
// tableau des langues installées
|
// tableau des langues installées
|
||||||
|
|
||||||
if (is_dir(self::DATA_DIR . $key)) {
|
if (is_dir(self::DATA_DIR . $key)) {
|
||||||
// Ne pas importer dans 12.4.00
|
if (
|
||||||
//if (file_exists(self::DATA_DIR . $key . '/page.json') &&
|
file_exists(self::DATA_DIR . $key . '/page.json') &&
|
||||||
// file_exists(self::DATA_DIR . $key . '/module.json') &&
|
file_exists(self::DATA_DIR . $key . '/module.json') &&
|
||||||
// file_exists(self::DATA_DIR . $key . '/locale.json')
|
file_exists(self::DATA_DIR . $key . '/locale.json')
|
||||||
// ) {
|
) {
|
||||||
if (file_exists(self::DATA_DIR . $key . '/.default')) {
|
if (file_exists(self::DATA_DIR . $key . '/.default')) {
|
||||||
$messageLocale = helper::translate('Langue du site par défaut');
|
$messageLocale = helper::translate('Langue par défaut');
|
||||||
|
} elseif (isset($_SESSION['ZWII_SITE_CONTENT']) && $_SESSION['ZWII_SITE_CONTENT'] === $key) {
|
||||||
|
$messageLocale = helper::translate('Langue du site sélectionnée');
|
||||||
} else {
|
} else {
|
||||||
$messageLocale = '<a href="'
|
$messageLocale = '';
|
||||||
. helper::baseUrl() . $this->getUrl(0) . '/default/' . $key . '/' . $_SESSION['csrf']
|
|
||||||
. '">' . helper::translate('Définir par défaut') . '</a>';
|
|
||||||
}
|
}
|
||||||
self::$languagesInstalled[] = [
|
self::$languagesInstalled[] = [
|
||||||
template::flag($key, '20 %') . ' ' . $value . ' (' . $key . ')',
|
template::flag($key, '20 %') . ' ' . $value . ' (' . $key . ')',
|
||||||
@ -224,13 +212,13 @@ class translate extends common
|
|||||||
'help' => 'Éditer'
|
'help' => 'Éditer'
|
||||||
]),
|
]),
|
||||||
template::button('translateContentLanguageLocaleDelete' . $key, [
|
template::button('translateContentLanguageLocaleDelete' . $key, [
|
||||||
'class' => 'translateDelete buttonRed' . ($messageLocale === 'Langue du site par défaut' ? ' disabled' : ''),
|
'class' => 'translateDelete buttonRed' . ($messageLocale ? ' disabled' : ''),
|
||||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/locale/' . $key . '/' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/locale/' . $key,
|
||||||
'value' => template::ico('trash'),
|
'value' => template::ico('trash'),
|
||||||
'help' => 'Supprimer',
|
'help' => 'Supprimer',
|
||||||
])
|
])
|
||||||
];
|
];
|
||||||
//}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -238,7 +226,8 @@ class translate extends common
|
|||||||
self::$siteCopy = count(self::$languagesInstalled) > 1 ? false : true;
|
self::$siteCopy = count(self::$languagesInstalled) > 1 ? false : true;
|
||||||
|
|
||||||
// --------------------------------------------------------------------------------------------------
|
// --------------------------------------------------------------------------------------------------
|
||||||
// Onglet des langues de l'interface
|
// Langues de l'UI
|
||||||
|
// --------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Langues attachées à des utilisateurs non effaçables
|
// Langues attachées à des utilisateurs non effaçables
|
||||||
$usersUI = [];
|
$usersUI = [];
|
||||||
@ -248,11 +237,15 @@ class translate extends common
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Langues installées
|
// Langues installées
|
||||||
$installedUI = $this->getData(['languages']);
|
$installedUI = $this->getData(['language']);
|
||||||
|
|
||||||
|
if (array_key_exists('language', $installedUI)) {
|
||||||
|
$installedUI = $installedUI['language'];
|
||||||
|
}
|
||||||
|
|
||||||
// Langues disponibles en ligne
|
// Langues disponibles en ligne
|
||||||
$storeUI = json_decode(helper::getUrlContents(common::ZWII_UI_URL . 'languages.json'), true);
|
$storeUI = json_decode(helper::getUrlContents(self::ZWII_UI_URL . 'language.json'), true);
|
||||||
$storeUI = $storeUI['languages'];
|
$storeUI = $storeUI ? $storeUI['language'] : null;
|
||||||
|
|
||||||
// Construction du tableau à partir des langues disponibles dans le store
|
// Construction du tableau à partir des langues disponibles dans le store
|
||||||
foreach ($installedUI as $file => $value) {
|
foreach ($installedUI as $file => $value) {
|
||||||
@ -262,7 +255,7 @@ class translate extends common
|
|||||||
self::$languagesUiInstalled[$file] = [
|
self::$languagesUiInstalled[$file] = [
|
||||||
template::flag($file, '20 %') . ' ' . self::$languages[$file],
|
template::flag($file, '20 %') . ' ' . self::$languages[$file],
|
||||||
$value['version'],
|
$value['version'],
|
||||||
helper::dateUTF8('%d/%m/%Y', $value['date']),
|
helper::dateUTF8('%d/%m/%Y', $value['date'], self::$i18nUI),
|
||||||
//self::$i18nUI === $file ? helper::translate('Interface') : '',
|
//self::$i18nUI === $file ? helper::translate('Interface') : '',
|
||||||
'',
|
'',
|
||||||
/*
|
/*
|
||||||
@ -273,15 +266,16 @@ class translate extends common
|
|||||||
'disabled' => 'fr_FR' === $file
|
'disabled' => 'fr_FR' === $file
|
||||||
]),
|
]),
|
||||||
*/
|
*/
|
||||||
|
|
||||||
template::button('translateContentLanguageUIDownload' . $file, [
|
template::button('translateContentLanguageUIDownload' . $file, [
|
||||||
'class' => version_compare($installedUI[$file]['version'], $storeUI[$file]['version']) < 0 ? 'buttonGreen' : '',
|
'class' => isset($storeUI[$file]['version']) && version_compare($installedUI[$file]['version'], $storeUI[$file]['version']) < 0 ? 'buttonGreen' : '',
|
||||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/update/' . $file . '/' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . $this->getUrl(0) . '/update/' . $file,
|
||||||
'value' => template::ico('update'),
|
'value' => template::ico('update'),
|
||||||
'help' => 'Mettre à jour',
|
'help' => 'Mise à jour',
|
||||||
]),
|
]),
|
||||||
template::button('translateContentLanguageUIDelete' . $file, [
|
template::button('translateContentLanguageUIDelete' . $file, [
|
||||||
'class' => 'translateDelete buttonRed' . (in_array($file, $usersUI) ? ' disabled' : ''),
|
'class' => 'translateDelete buttonRed' . (in_array($file, $usersUI) ? ' disabled' : ''),
|
||||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/ui/' . $file . '/' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/ui/' . $file,
|
||||||
'value' => template::ico('trash'),
|
'value' => template::ico('trash'),
|
||||||
'help' => 'Supprimer',
|
'help' => 'Supprimer',
|
||||||
]),
|
]),
|
||||||
@ -289,6 +283,7 @@ class translate extends common
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Construction du tableau à partir des langues disponibles dans le store
|
// Construction du tableau à partir des langues disponibles dans le store
|
||||||
|
if ($storeUI) {
|
||||||
foreach ($storeUI as $file => $value) {
|
foreach ($storeUI as $file => $value) {
|
||||||
|
|
||||||
// La langue est-elle installée ?
|
// La langue est-elle installée ?
|
||||||
@ -296,22 +291,34 @@ class translate extends common
|
|||||||
self::$languagesStore[$file] = [
|
self::$languagesStore[$file] = [
|
||||||
template::flag($file, '20 %') . ' ' . self::$languages[$file],
|
template::flag($file, '20 %') . ' ' . self::$languages[$file],
|
||||||
$value['version'],
|
$value['version'],
|
||||||
helper::dateUTF8('%d/%m/%Y', $value['date']),
|
helper::dateUTF8('%d/%m/%Y', $value['date'], self::$i18nUI),
|
||||||
'',
|
'',
|
||||||
template::button('translateContentLanguageUIDownload' . $file, [
|
template::button('translateContentLanguageUIDownload' . $file, [
|
||||||
'class' => 'buttonGreen',
|
'class' => 'buttonGreen',
|
||||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/update/' . $file . '/' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . $this->getUrl(0) . '/update/' . $file,
|
||||||
'value' => template::ico('shopping-basket'),
|
'value' => template::ico('shopping-basket'),
|
||||||
'help' => 'Installer',
|
'help' => 'Installer',
|
||||||
])
|
])
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pointer vers la fenêtre
|
||||||
|
switch ($this->getUrl(1)) {
|
||||||
|
case 'interface':
|
||||||
|
setcookie('translateLayout', 'ui', time() + 3600, '/', '', false, false);
|
||||||
|
break;
|
||||||
|
case 'site':
|
||||||
|
setcookie('translateLayout', 'content', time() + 3600, '/', '', false, false);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'title' => helper::translate('Multilingue'),
|
'title' => helper::translate('Langues'),
|
||||||
'view' => 'index'
|
'view' => 'index'
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@ -325,18 +332,25 @@ class translate extends common
|
|||||||
{
|
{
|
||||||
|
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
|
|
||||||
// Création du contenu
|
|
||||||
$lang = $this->getInput('translateAddContent');
|
$lang = $this->getInput('translateAddContent');
|
||||||
|
|
||||||
// Stockage dans un sous-dossier localisé
|
// Constructeur pour cette langue
|
||||||
if (!file_exists(self::DATA_DIR . $lang)) {
|
$this->jsonDB($lang);
|
||||||
mkdir(self::DATA_DIR . $lang, 0755);
|
|
||||||
}
|
// Création du contenu
|
||||||
|
$this->initData('page', $lang);
|
||||||
|
$this->initData('module', $lang);
|
||||||
|
$this->initData('locale', $lang);
|
||||||
|
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'translate',
|
'redirect' => helper::baseUrl() . 'language',
|
||||||
'notification' => helper::translate('Modifications enregistrées'),
|
'notification' => helper::translate('Modifications enregistrées'),
|
||||||
'state' => true
|
'state' => true
|
||||||
]);
|
]);
|
||||||
@ -365,21 +379,24 @@ class translate extends common
|
|||||||
*/
|
*/
|
||||||
public function locale()
|
public function locale()
|
||||||
{
|
{
|
||||||
// Jeton incorrect ou URl avec le code langue incorrecte
|
// Action interdite ou URl avec le code langue incorrecte
|
||||||
$lang = $this->getUrl(2);
|
$lang = $this->getUrl(2);
|
||||||
if (
|
if (
|
||||||
array_key_exists($lang, self::$languages) === false
|
array_key_exists($lang, self::$languages) === false
|
||||||
) {
|
) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'translate',
|
'redirect' => helper::baseUrl() . 'language',
|
||||||
'state' => false,
|
'state' => false,
|
||||||
'notification' => helper::translate('Action interdite')
|
'notification' => helper::translate('Action interdite')
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
|
|
||||||
// Sauvegarder les locales
|
// Sauvegarder les locales
|
||||||
$data = [
|
$data = [
|
||||||
@ -408,12 +425,12 @@ class translate extends common
|
|||||||
];
|
];
|
||||||
|
|
||||||
// Sauvegarde hors méthodes si la langue n'est pas celle de l'UI
|
// Sauvegarde hors méthodes si la langue n'est pas celle de l'UI
|
||||||
if ($lang === self::$i18nContent) {
|
if ($lang === self::$siteContent) {
|
||||||
// Enregistrer les données par lecture directe du formulaire
|
// Enregistrer les données par lecture directe du formulaire
|
||||||
$this->setData(['locale', $data['locale']]);
|
$this->setData(['locale', $data['locale']]);
|
||||||
} else {
|
} else {
|
||||||
// Sauver sur le disque
|
// Sauver sur le disque
|
||||||
file_put_contents(self::DATA_DIR . $lang . '/locale.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT), LOCK_EX);
|
$this->secure_file_put_contents(self::DATA_DIR . $lang . '/locale.json', $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
@ -428,7 +445,7 @@ class translate extends common
|
|||||||
//-----------------------------------------
|
//-----------------------------------------
|
||||||
|
|
||||||
// La locale est-elle celle de la langue de l'UI ?
|
// La locale est-elle celle de la langue de l'UI ?
|
||||||
if ($lang === self::$i18nContent) {
|
if ($lang === self::$siteContent) {
|
||||||
self::$locales[$lang]['locale'] = $this->getData(['locale']);
|
self::$locales[$lang]['locale'] = $this->getData(['locale']);
|
||||||
} else {
|
} else {
|
||||||
// Lire les locales sans passer par les méthodes
|
// Lire les locales sans passer par les méthodes
|
||||||
@ -470,19 +487,22 @@ class translate extends common
|
|||||||
public function edit()
|
public function edit()
|
||||||
{
|
{
|
||||||
$lang = $this->getUrl(2);
|
$lang = $this->getUrl(2);
|
||||||
// Jeton incorrect ou URl avec le code langue incorrecte
|
// Action interdite ou URl avec le code langue incorrecte
|
||||||
if (
|
if (
|
||||||
array_key_exists($lang, self::$languages) === false
|
array_key_exists($lang, self::$languages) === false
|
||||||
) {
|
) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'translate',
|
'redirect' => helper::baseUrl() . 'language',
|
||||||
'state' => false,
|
'state' => false,
|
||||||
'notification' => helper::translate('Action interdite')
|
'notification' => helper::translate('Action interdite')
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
|
|
||||||
// Sauvegarder les champs de la langue
|
// Sauvegarder les champs de la langue
|
||||||
$data = json_decode(file_get_contents(self::I18N_DIR . $lang . '.json'), true);
|
$data = json_decode(file_get_contents(self::I18N_DIR . $lang . '.json'), true);
|
||||||
@ -492,11 +512,11 @@ class translate extends common
|
|||||||
$data[$key] = $target;
|
$data[$key] = $target;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_put_contents(self::I18N_DIR . $lang . '.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT), LOCK_EX);
|
$this->secure_file_put_contents(self::I18N_DIR . $lang . '.json', $data);
|
||||||
|
|
||||||
// Mettre à jour le descripteur
|
// Mettre à jour le descripteur
|
||||||
$this->setData([
|
$this->setData([
|
||||||
'languages',
|
'language',
|
||||||
$lang,
|
$lang,
|
||||||
[
|
[
|
||||||
'version' => $this->getInput('translateEditVersion'),
|
'version' => $this->getInput('translateEditVersion'),
|
||||||
@ -507,7 +527,7 @@ class translate extends common
|
|||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'notification' => helper::translate('Modifications enregistrées'),
|
'notification' => helper::translate('Modifications enregistrées'),
|
||||||
'redirect' => helper::baseUrl() . 'translate',
|
'redirect' => helper::baseUrl() . 'language',
|
||||||
'state' => true,
|
'state' => true,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@ -526,7 +546,7 @@ class translate extends common
|
|||||||
$data[$key] = '';
|
$data[$key] = '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_put_contents(self::I18N_DIR . $lang . '.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT), LOCK_EX);
|
$this->secure_file_put_contents(self::I18N_DIR . $lang . '.json', $data);
|
||||||
|
|
||||||
// Tableau des chaines à traduire dans la langue sélectionnée
|
// Tableau des chaines à traduire dans la langue sélectionnée
|
||||||
foreach ($data as $key => $value) {
|
foreach ($data as $key => $value) {
|
||||||
@ -559,16 +579,23 @@ class translate extends common
|
|||||||
*/
|
*/
|
||||||
public function delete()
|
public function delete()
|
||||||
{
|
{
|
||||||
// Jeton incorrect ou URl avec le code langue incorrecte
|
|
||||||
$target = $this->getUrl(2);
|
|
||||||
$lang = $this->getUrl(3);
|
|
||||||
if (
|
if (
|
||||||
$this->getUrl(4) !== $_SESSION['csrf']
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
|| array_key_exists($lang, self::$languages) === false
|
|
||||||
) {
|
) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'translate',
|
'access' => false
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
// Action interdite ou URl avec le code langue incorrecte
|
||||||
|
$target = $this->getUrl(2);
|
||||||
|
$lang = $this->getUrl(3);
|
||||||
|
if (
|
||||||
|
array_key_exists($lang, self::$languages) === false
|
||||||
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'redirect' => helper::baseUrl() . 'language',
|
||||||
'state' => false,
|
'state' => false,
|
||||||
'notification' => helper::translate('Action interdite')
|
'notification' => helper::translate('Action interdite')
|
||||||
]);
|
]);
|
||||||
@ -578,11 +605,11 @@ class translate extends common
|
|||||||
$success = false;
|
$success = false;
|
||||||
// Effacement d'une site dans une langue
|
// Effacement d'une site dans une langue
|
||||||
if (is_dir(self::DATA_DIR . $lang) === true) {
|
if (is_dir(self::DATA_DIR . $lang) === true) {
|
||||||
$success = $this->removeDir(self::DATA_DIR . $lang);
|
$success = $this->deleteDir(self::DATA_DIR . $lang);
|
||||||
}
|
}
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'translate',
|
'redirect' => helper::baseUrl() . 'language',
|
||||||
'notification' => $success ? helper::translate('Traduction supprimée') : helper::translate('Erreur inconnue'),
|
'notification' => $success ? helper::translate('Traduction supprimée') : helper::translate('Erreur inconnue'),
|
||||||
'state' => $success
|
'state' => $success
|
||||||
]);
|
]);
|
||||||
@ -592,13 +619,12 @@ class translate extends common
|
|||||||
$success = false;
|
$success = false;
|
||||||
// Effacement d'une langue de l'interface
|
// Effacement d'une langue de l'interface
|
||||||
if (file_exists(self::I18N_DIR . $lang . '.json') === true) {
|
if (file_exists(self::I18N_DIR . $lang . '.json') === true) {
|
||||||
$this->deleteData(['languages', $lang]);
|
$this->deleteData(['language', $lang]);
|
||||||
$success = unlink(self::I18N_DIR . $lang . '.json');
|
$success = unlink(self::I18N_DIR . $lang . '.json');
|
||||||
}
|
}
|
||||||
// Effacer la langue dans la base
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'translate',
|
'redirect' => helper::baseUrl() . 'language',
|
||||||
'notification' => $success ? helper::translate('Traduction supprimée') : helper::translate('Erreur inconnue'),
|
'notification' => $success ? helper::translate('Traduction supprimée') : helper::translate('Erreur inconnue'),
|
||||||
'state' => $success
|
'state' => $success
|
||||||
]);
|
]);
|
||||||
@ -608,6 +634,7 @@ class translate extends common
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Modifie la langue du site par défaut
|
* Modifie la langue du site par défaut
|
||||||
@ -615,15 +642,22 @@ class translate extends common
|
|||||||
*/
|
*/
|
||||||
public function default()
|
public function default()
|
||||||
{
|
{
|
||||||
// Jeton incorrect ou URl avec le code langue incorrecte
|
|
||||||
$lang = $this->getUrl(2);
|
|
||||||
if (
|
if (
|
||||||
$this->getUrl(3) !== $_SESSION['csrf']
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
|| array_key_exists($lang, self::$languages) === false
|
|
||||||
) {
|
) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'translate',
|
'access' => false
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
// Action interdite ou URl avec le code langue incorrecte
|
||||||
|
$lang = $this->getUrl(2);
|
||||||
|
if (
|
||||||
|
array_key_exists($lang, self::$languages) === false
|
||||||
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'redirect' => helper::baseUrl() . 'language',
|
||||||
'state' => false,
|
'state' => false,
|
||||||
'notification' => helper::translate('Action interdite')
|
'notification' => helper::translate('Action interdite')
|
||||||
]);
|
]);
|
||||||
@ -639,10 +673,11 @@ class translate extends common
|
|||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'notification' => helper::translate('Modifications enregistrées'),
|
'notification' => helper::translate('Modifications enregistrées'),
|
||||||
'redirect' => helper::baseUrl() . 'translate',
|
'redirect' => helper::baseUrl() . 'language',
|
||||||
'state' => true,
|
'state' => true,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Traitement du changement de langue
|
* Traitement du changement de langue
|
||||||
@ -660,13 +695,12 @@ class translate extends common
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if (
|
if (
|
||||||
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') &&
|
is_dir(self::DATA_DIR . $lang) &&
|
||||||
$this->getUser('group') > self::GROUP_MODERATOR &&
|
|
||||||
array_key_exists($lang, self::$languages) === true
|
array_key_exists($lang, self::$languages) === true
|
||||||
) {
|
) {
|
||||||
|
|
||||||
// Stocker la sélection
|
// Stocker la sélection
|
||||||
$_SESSION['ZWII_CONTENT'] = $lang;
|
$_SESSION['ZWII_SITE_CONTENT'] = $lang;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
@ -3,7 +3,7 @@
|
|||||||
<div class="col1">
|
<div class="col1">
|
||||||
<?php echo template::button('translateFormBack', [
|
<?php echo template::button('translateFormBack', [
|
||||||
'class' => 'buttonGrey',
|
'class' => 'buttonGrey',
|
||||||
'href' => helper::baseUrl() . 'translate',
|
'href' => helper::baseUrl() . 'language',
|
||||||
'value' => template::ico('left')
|
'value' => template::ico('left')
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
@ -3,7 +3,7 @@
|
|||||||
<div class="col1">
|
<div class="col1">
|
||||||
<?php echo template::button('translateFormCopyBack', [
|
<?php echo template::button('translateFormCopyBack', [
|
||||||
'class' => 'buttonGrey',
|
'class' => 'buttonGrey',
|
||||||
'href' => helper::baseUrl() . 'translate',
|
'href' => helper::baseUrl() . 'language',
|
||||||
'value' => template::ico('left')
|
'value' => template::ico('left')
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
@ -3,7 +3,7 @@
|
|||||||
<div class="col1">
|
<div class="col1">
|
||||||
<?php echo template::button('translateUIFormBack', [
|
<?php echo template::button('translateUIFormBack', [
|
||||||
'class' => 'buttonGrey',
|
'class' => 'buttonGrey',
|
||||||
'href' => helper::baseUrl() . 'translate',
|
'href' => helper::baseUrl() . 'language',
|
||||||
'value' => template::ico('left')
|
'value' => template::ico('left')
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
@ -21,14 +21,14 @@
|
|||||||
<div class="col6">
|
<div class="col6">
|
||||||
<?php echo template::text('translateEditVersion', [
|
<?php echo template::text('translateEditVersion', [
|
||||||
'label' => 'Version n°',
|
'label' => 'Version n°',
|
||||||
'value' => $this->getData(['languages', $this->getUrl(2), 'version'])
|
'value' => $this->getData(['language', $this->getUrl(2), 'version'])
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col6">
|
<div class="col6">
|
||||||
<?php echo template::date('translateEditDate', [
|
<?php echo template::date('translateEditDate', [
|
||||||
'label' => 'Date de publication',
|
'label' => 'Date de publication',
|
||||||
'type' => 'datetime-local',
|
'type' => 'datetime-local',
|
||||||
'value' => $this->getData(['languages', $this->getUrl(2), 'date'])
|
'value' => $this->getData(['language', $this->getUrl(2), 'date'])
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
2
core/module/translate/view/index/index.css → core/module/language/view/index/index.css
Executable file → Normal file
2
core/module/translate/view/index/index.css → core/module/language/view/index/index.css
Executable file → Normal file
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
@ -6,7 +6,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
@ -4,7 +4,7 @@
|
|||||||
<?php echo template::button('translateFormBack', [
|
<?php echo template::button('translateFormBack', [
|
||||||
'class' => 'buttonGrey',
|
'class' => 'buttonGrey',
|
||||||
'href' => helper::baseUrl(),
|
'href' => helper::baseUrl(),
|
||||||
'value' => template::ico('left')
|
'value' => template::ico('home')
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col1">
|
<div class="col1">
|
||||||
@ -16,7 +16,6 @@
|
|||||||
'help' => 'Consulter l\'aide en ligne'
|
'help' => 'Consulter l\'aide en ligne'
|
||||||
]);*/?>
|
]);*/?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="tab">
|
<div class="tab">
|
||||||
@ -65,7 +64,7 @@
|
|||||||
</h4>
|
</h4>
|
||||||
<div class="col4 offset2">
|
<div class="col4 offset2">
|
||||||
<?php echo template::button('translateButtonCopyContent', [
|
<?php echo template::button('translateButtonCopyContent', [
|
||||||
'href' => helper::baseUrl() . 'translate/copy',
|
'href' => helper::baseUrl() . 'language/copy',
|
||||||
'ico' => 'docs',
|
'ico' => 'docs',
|
||||||
'disabled' => $module::$siteCopy,
|
'disabled' => $module::$siteCopy,
|
||||||
'value' => 'Copie de contenus localisés'
|
'value' => 'Copie de contenus localisés'
|
||||||
@ -73,7 +72,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col4">
|
<div class="col4">
|
||||||
<?php echo template::button('translateButtonAddContent', [
|
<?php echo template::button('translateButtonAddContent', [
|
||||||
'href' => helper::baseUrl() . 'translate/add',
|
'href' => helper::baseUrl() . 'language/add',
|
||||||
'ico' => 'plus',
|
'ico' => 'plus',
|
||||||
'class' => 'buttonGreen',
|
'class' => 'buttonGreen',
|
||||||
'value' => 'Nouveau contenu localisé'
|
'value' => 'Nouveau contenu localisé'
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
@ -3,7 +3,7 @@
|
|||||||
<div class="col1">
|
<div class="col1">
|
||||||
<?php echo template::button('translateFormBack', [
|
<?php echo template::button('translateFormBack', [
|
||||||
'class' => 'buttonGrey',
|
'class' => 'buttonGrey',
|
||||||
'href' => helper::baseUrl() . 'translate',
|
'href' => helper::baseUrl() . 'language',
|
||||||
'value' => template::ico('left')
|
'value' => template::ico('left')
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
@ -107,7 +107,7 @@
|
|||||||
<div class="block">
|
<div class="block">
|
||||||
<h4><?php echo helper::translate('Étiquettes des pages spéciales'); ?>
|
<h4><?php echo helper::translate('Étiquettes des pages spéciales'); ?>
|
||||||
<!--<span id="labelHelpButton" class="helpDisplayButton" title="Cliquer pour consulter l'aide en ligne">
|
<!--<span id="labelHelpButton" class="helpDisplayButton" title="Cliquer pour consulter l'aide en ligne">
|
||||||
<a href="https://doc.zwiicms.fr/etiquettes-des-pages-speciales" target="_blank">
|
<a href="https://doc.zwiicms.fr/Étiquettes-des-pages-speciales" target="_blank">
|
||||||
<?php //echo template::ico('help', ['margin' => 'left']); ?>
|
<?php //echo template::ico('help', ['margin' => 'left']); ?>
|
||||||
</a>
|
</a>
|
||||||
</span>-->
|
</span>-->
|
@ -8,7 +8,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
@ -41,7 +41,7 @@ class maintenance extends common
|
|||||||
? ''
|
? ''
|
||||||
: $this->getData(['page', $this->getData(['locale', 'page302']), 'title']),
|
: $this->getData(['page', $this->getData(['locale', 'page302']), 'title']),
|
||||||
//'content' => $this->getdata(['page',$this->getData(['locale','page302']),'content']),
|
//'content' => $this->getdata(['page',$this->getData(['locale','page302']),'content']),
|
||||||
'content' => $this->getPage($this->getData(['locale', 'page302']), self::$i18nContent),
|
'content' => $this->getPage($this->getData(['locale', 'page302']), self::$siteContent),
|
||||||
'view' => 'index'
|
'view' => 'index'
|
||||||
]);
|
]);
|
||||||
} else {
|
} else {
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
@ -18,12 +18,13 @@ class page extends common
|
|||||||
{
|
{
|
||||||
|
|
||||||
public static $actions = [
|
public static $actions = [
|
||||||
'add' => self::GROUP_MODERATOR,
|
'add' => self::GROUP_EDITOR,
|
||||||
'delete' => self::GROUP_MODERATOR,
|
'delete' => self::GROUP_EDITOR,
|
||||||
'edit' => self::GROUP_MODERATOR,
|
'edit' => self::GROUP_EDITOR,
|
||||||
'duplicate' => self::GROUP_MODERATOR,
|
'duplicate' => self::GROUP_EDITOR,
|
||||||
'jsEditor' => self::GROUP_MODERATOR,
|
'jsEditor' => self::GROUP_EDITOR,
|
||||||
'cssEditor' => self::GROUP_MODERATOR
|
'cssEditor' => self::GROUP_EDITOR,
|
||||||
|
'register' => self::GROUP_EDITOR,
|
||||||
];
|
];
|
||||||
public static $pagesNoParentId = [
|
public static $pagesNoParentId = [
|
||||||
'' => 'Aucune'
|
'' => 'Aucune'
|
||||||
@ -65,63 +66,78 @@ class page extends common
|
|||||||
true => 'Menu accessoire'
|
true => 'Menu accessoire'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public static $userProfils = [];
|
||||||
|
|
||||||
|
public static $navIconTemplate = [
|
||||||
|
'dir' => 'Petit triangle',
|
||||||
|
'open' => 'Grand triangle',
|
||||||
|
'big' => 'Flèche',
|
||||||
|
];
|
||||||
|
|
||||||
|
public static $navIconPosition = [
|
||||||
|
'none' => 'Masqué',
|
||||||
|
'top' => 'Haut de page',
|
||||||
|
'bottom' => 'Bas de page',
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Duplication
|
* Duplication
|
||||||
*/
|
*/
|
||||||
public function duplicate()
|
public function duplicate()
|
||||||
{
|
{
|
||||||
|
// La session ne correspond pas au site ouvert dans cet onglet
|
||||||
|
if (
|
||||||
|
// Contrôle la présence de l'id de langue uniquement si l'id est fourni afin de ne pas bloquer les modules non mis à jour
|
||||||
|
$this->getUrl(3) && $this->getUrl(3) != self::$siteContent
|
||||||
|
) {
|
||||||
|
$_SESSION['ZWII_SITE_CONTENT'] = $this->getUrl(3);
|
||||||
|
header('Refresh:0; url=' . helper::baseUrl() . $this->getUrl());
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
// Adresse sans le token
|
// Adresse sans le token
|
||||||
$url = explode('&', $this->getUrl(2));
|
$page = $this->getUrl(2);
|
||||||
|
|
||||||
// La page n'existe pas
|
// La page n'existe pas
|
||||||
if ($this->getData(['page', $url[0]]) === null) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true ||
|
||||||
|
$this->getData(['page', $page]) === null
|
||||||
|
) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'access' => false
|
'access' => false
|
||||||
]);
|
]);
|
||||||
} // Jeton incorrect
|
} else {
|
||||||
elseif (!isset($_GET['csrf'])) {
|
|
||||||
// Valeurs en sortie
|
|
||||||
$this->addOutput([
|
|
||||||
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
|
|
||||||
'notification' => helper::translate('Jeton invalide')
|
|
||||||
]);
|
|
||||||
} elseif ($_GET['csrf'] !== $_SESSION['csrf']) {
|
|
||||||
// Valeurs en sortie
|
|
||||||
$this->addOutput([
|
|
||||||
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
|
|
||||||
'notification' => helper::translate('Suppression interdite')
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
// Duplication de la page
|
// Duplication de la page
|
||||||
$pageTitle = $this->getData(['page', $url[0], 'title']);
|
$pageTitle = $this->getData(['page', $page, 'title']);
|
||||||
$pageId = helper::increment(helper::filter($pageTitle, helper::FILTER_ID), $this->getData(['page']));
|
$pageId = helper::increment(helper::filter($pageTitle, helper::FILTER_ID), $this->getData(['page']));
|
||||||
$pageId = helper::increment($pageId, self::$coreModuleIds);
|
$pageId = helper::increment($pageId, self::$coreModuleIds);
|
||||||
$pageId = helper::increment($pageId, self::$moduleIds);
|
$pageId = helper::increment($pageId, self::$moduleIds);
|
||||||
$data = $this->getData([
|
$data = $this->getData([
|
||||||
'page',
|
'page',
|
||||||
$url[0]
|
$page
|
||||||
]);
|
]);
|
||||||
// Ecriture
|
// Ecriture
|
||||||
$this->setData(['page', $pageId, $data]);
|
$this->setData(['page', $pageId, $data], false);
|
||||||
$notification = helper::translate('Page dupliquée');
|
$notification = helper::translate('Page dupliquée');
|
||||||
// Duplication du module présent
|
// Duplication du module présent
|
||||||
if ($this->getData(['page', $url[0], 'moduleId'])) {
|
if ($this->getData(['page', $page, 'moduleId'])) {
|
||||||
$data = $this->getData([
|
$data = $this->getData(['module', $page]);
|
||||||
'module',
|
$this->setData(['module', $pageId, $data], false);
|
||||||
$url[0]
|
|
||||||
]);
|
|
||||||
// Ecriture
|
|
||||||
$this->setData(['module', $pageId, $data]);
|
|
||||||
$notification = helper::translate('Page et module dupliqués');
|
$notification = helper::translate('Page et module dupliqués');
|
||||||
}
|
}
|
||||||
|
// Force la sauvegarde
|
||||||
|
$this->saveDB('page');
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'page/edit/' . $pageId,
|
'redirect' => helper::baseUrl() . 'page/edit/' . $pageId . '/' . self::$siteContent,
|
||||||
'notification' => $notification,
|
'notification' => $notification,
|
||||||
'state' => true
|
'state' => true
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -129,6 +145,22 @@ class page extends common
|
|||||||
*/
|
*/
|
||||||
public function add()
|
public function add()
|
||||||
{
|
{
|
||||||
|
// La session ne correspond pas au site ouvert dans cet onglet
|
||||||
|
if (
|
||||||
|
// Contrôle la présence de l'id de langue uniquement si l'id est fourni afin de ne pas bloquer les modules non mis à jour
|
||||||
|
$this->getUrl(3) && $this->getUrl(3) != self::$siteContent
|
||||||
|
) {
|
||||||
|
$_SESSION['ZWII_SITE_CONTENT'] = $this->getUrl(3);
|
||||||
|
header('Refresh:0; url=' . helper::baseUrl() . $this->getUrl());
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->getUser('permission', __CLASS__, __FUNCTION__) !== true) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'access' => false
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
$pageTitle = 'Nouvelle page';
|
$pageTitle = 'Nouvelle page';
|
||||||
$pageId = helper::increment(helper::filter($pageTitle, helper::FILTER_ID), $this->getData(['page']));
|
$pageId = helper::increment(helper::filter($pageTitle, helper::FILTER_ID), $this->getData(['page']));
|
||||||
$this->setData([
|
$this->setData([
|
||||||
@ -154,6 +186,9 @@ class page extends common
|
|||||||
'block' => '12',
|
'block' => '12',
|
||||||
'barLeft' => '',
|
'barLeft' => '',
|
||||||
'barRight' => '',
|
'barRight' => '',
|
||||||
|
'navLeft' => 'none',
|
||||||
|
'navRight' => 'none',
|
||||||
|
'navTemplate' => 'dir',
|
||||||
'displayMenu' => '0',
|
'displayMenu' => '0',
|
||||||
'hideMenuSide' => false,
|
'hideMenuSide' => false,
|
||||||
'hideMenuHead' => false,
|
'hideMenuHead' => false,
|
||||||
@ -163,14 +198,14 @@ class page extends common
|
|||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
// Creation du contenu de la page
|
// Creation du contenu de la page
|
||||||
if (!is_dir(self::DATA_DIR . self::$i18nContent . '/content')) {
|
if (!is_dir(self::DATA_DIR . self::$siteContent . '/content')) {
|
||||||
mkdir(self::DATA_DIR . self::$i18nContent . '/content', 0755);
|
mkdir(self::DATA_DIR . self::$siteContent . '/content', 0755);
|
||||||
}
|
}
|
||||||
//file_put_contents(self::DATA_DIR . self::$i18nContent . '/content/' . $pageId . '.html', '<p>Contenu de votre nouvelle page.</p>');
|
//$this->secure_file_put_contents(self::DATA_DIR . self::$siteContent . '/content/' . $pageId . '.html', '<p>Contenu de votre nouvelle page.</p>');
|
||||||
$this->setPage($pageId, '<p>Contenu de votre nouvelle page.</p>', self::$i18nContent);
|
$this->setPage($pageId, '<p>Contenu de votre nouvelle page.</p>', self::$siteContent);
|
||||||
|
|
||||||
// Met à jour le sitemap
|
// Ne met à jour le sitemap pour éviter un warning, de toute manière la nouvelle page doit être éditée.
|
||||||
$this->updateSitemap();
|
// $this->updateSitemap();
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
@ -180,121 +215,108 @@ class page extends common
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Suppression
|
* Suppression
|
||||||
*/
|
*/
|
||||||
public function delete()
|
public function delete()
|
||||||
{
|
{
|
||||||
|
// La session ne correspond pas au site ouvert dans cet onglet
|
||||||
|
if (
|
||||||
|
// Contrôle la présence de l'id de langue uniquement si l'id est fourni afin de ne pas bloquer les modules non mis à jour
|
||||||
|
$this->getUrl(3) && $this->getUrl(3) != self::$siteContent
|
||||||
|
) {
|
||||||
|
$_SESSION['ZWII_SITE_CONTENT'] = $this->getUrl(3);
|
||||||
|
header('Refresh:0; url=' . helper::baseUrl() . $this->getUrl());
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
// $url prend l'adresse sans le token
|
// $url prend l'adresse sans le token
|
||||||
$url = explode('&', $this->getUrl(2));
|
$page = $this->getUrl(2);
|
||||||
// La page n'existe pas
|
// La page n'existe pas
|
||||||
if ($this->getData(['page', $url[0]]) === null) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true ||
|
||||||
|
$this->getData(['page', $page]) === null
|
||||||
|
) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'access' => false
|
'access' => false
|
||||||
]);
|
]);
|
||||||
} // Jeton incorrect
|
|
||||||
elseif (!isset($_GET['csrf'])) {
|
|
||||||
// Valeurs en sortie
|
|
||||||
$this->addOutput([
|
|
||||||
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
|
|
||||||
'notification' => helper::translate('Jeton invalide')
|
|
||||||
]);
|
|
||||||
} elseif ($_GET['csrf'] !== $_SESSION['csrf']) {
|
|
||||||
// Valeurs en sortie
|
|
||||||
$this->addOutput([
|
|
||||||
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
|
|
||||||
'notification' => helper::translate('Suppression interdite')
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
// Impossible de supprimer la page d'accueil
|
// Impossible de supprimer la page d'accueil
|
||||||
elseif ($url[0] === $this->getData(['locale', 'homePageId'])) {
|
elseif ($page === $this->getData(['locale', 'homePageId'])) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'config',
|
'redirect' => helper::baseUrl() . 'config',
|
||||||
'notification' => helper::translate('Suppression interdite, page active dans la configuration du site')
|
'notification' => helper::translate('Suppression interdite, page active dans la configuration de la langue du site')
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
// Impossible de supprimer la page de recherche affectée
|
// Impossible de supprimer la page affectée
|
||||||
elseif ($url[0] === $this->getData(['locale', 'searchPageId'])) {
|
elseif ($page === $this->getData(['locale', 'searchPageId'])) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'config',
|
'redirect' => helper::baseUrl() . 'config',
|
||||||
'notification' => helper::translate('Suppression interdite, page active dans la configuration du site')
|
'notification' => helper::translate('Suppression interdite, page active dans la configuration de la langue du site')
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
// Impossible de supprimer la page des mentions légales affectée
|
// Impossible de supprimer la page affectée
|
||||||
elseif ($url[0] === $this->getData(['locale', 'legalPageId'])) {
|
elseif ($page === $this->getData(['locale', 'legalPageId'])) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'config',
|
'redirect' => helper::baseUrl() . 'config',
|
||||||
'notification' => helper::translate('Suppression interdite, page active dans la configuration du site')
|
'notification' => helper::translate('Suppression interdite, page active dans la configuration de la langue du site')
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
// Impossible de supprimer la page des mentions légales affectée
|
// Impossible de supprimer la page affectée
|
||||||
elseif ($url[0] === $this->getData(['locale', 'page404'])) {
|
elseif ($page === $this->getData(['locale', 'page404'])) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'config',
|
'redirect' => helper::baseUrl() . 'config',
|
||||||
'notification' => helper::translate('Suppression interdite, page active dans la configuration du site')
|
'notification' => helper::translate('Suppression interdite, page active dans la configuration de la langue du site')
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
// Impossible de supprimer la page des mentions légales affectée
|
// Impossible de supprimer la page affectée
|
||||||
elseif ($url[0] === $this->getData(['locale', 'page403'])) {
|
elseif ($page === $this->getData(['locale', 'page403'])) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'config',
|
'redirect' => helper::baseUrl() . 'config',
|
||||||
'notification' => helper::translate('Suppression interdite, page active dans la configuration du site')
|
'notification' => helper::translate('Suppression interdite, page active dans la configuration de la langue du site')
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
// Impossible de supprimer la page des mentions légales affectée
|
// Impossible de supprimer la page affectée
|
||||||
elseif ($url[0] === $this->getData(['locale', 'page302'])) {
|
elseif ($page === $this->getData(['locale', 'page302'])) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'config',
|
'redirect' => helper::baseUrl() . 'config',
|
||||||
'notification' => helper::translate('Suppression interdite, page active dans la configuration du site')
|
'notification' => helper::translate('Suppression interdite, page active dans la configuration de la langue du site')
|
||||||
]);
|
|
||||||
}
|
|
||||||
// Jeton incorrect
|
|
||||||
elseif (!isset($_GET['csrf'])) {
|
|
||||||
// Valeurs en sortie
|
|
||||||
$this->addOutput([
|
|
||||||
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
|
|
||||||
'notification' => helper::translate('Jeton invalide')
|
|
||||||
]);
|
|
||||||
} elseif ($_GET['csrf'] !== $_SESSION['csrf']) {
|
|
||||||
// Valeurs en sortie
|
|
||||||
$this->addOutput([
|
|
||||||
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
|
|
||||||
'notification' => helper::translate('Suppression interdite')
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
// Impossible de supprimer une page contenant des enfants
|
// Impossible de supprimer une page contenant des enfants
|
||||||
elseif ($this->getHierarchy($url[0], null)) {
|
elseif ($this->getHierarchy($page, null)) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
|
'redirect' => helper::baseUrl() . 'page/edit/' . $page . '/' . self::$siteContent,
|
||||||
'notification' => helper::translate('Impossible de supprimer une page contenant des pages enfants')
|
'notification' => helper::translate('Impossible de supprimer une page contenant des pages enfants')
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
// Suppression
|
// Suppression
|
||||||
else {
|
else {
|
||||||
|
|
||||||
// Effacer le dossier du module
|
// Effacer le dossier du module
|
||||||
$moduleId = $this->getData(['page', $url[0], 'moduleId']);
|
$moduleId = $this->getData(['page', $page, 'moduleId']);
|
||||||
$modulesData = helper::getModules();
|
$modulesData = helper::getModules();
|
||||||
if (
|
if (
|
||||||
array_key_exists($moduleId, $modulesData)
|
array_key_exists($moduleId, $modulesData)
|
||||||
&& is_dir($modulesData[$moduleId]['dataDirectory'] . $url[0])
|
&& is_dir($modulesData[$moduleId]['dataDirectory'] . $page)
|
||||||
) {
|
) {
|
||||||
$this->removeDir($modulesData[$moduleId]['dataDirectory'] . $url[0]);
|
$this->deleteDir($modulesData[$moduleId]['dataDirectory'] . $page);
|
||||||
}
|
}
|
||||||
// Effacer la page
|
// Effacer la page
|
||||||
$this->deleteData(['page', $url[0]]);
|
$this->deleteData(['page', $page]);
|
||||||
if (file_exists(self::DATA_DIR . self::$i18nContent . '/content/' . $url[0] . '.html')) {
|
if (file_exists(self::DATA_DIR . self::$siteContent . '/content/' . $page . '.html')) {
|
||||||
unlink(self::DATA_DIR . self::$i18nContent . '/content/' . $url[0] . '.html');
|
unlink(self::DATA_DIR . self::$siteContent . '/content/' . $page . '.html');
|
||||||
}
|
}
|
||||||
$this->deleteData(['module', $url[0]]);
|
$this->deleteData(['module', $page]);
|
||||||
|
|
||||||
// Met à jour le sitemap
|
// Met à jour le sitemap
|
||||||
$this->updateSitemap();
|
$this->updateSitemap();
|
||||||
@ -314,8 +336,22 @@ class page extends common
|
|||||||
*/
|
*/
|
||||||
public function edit()
|
public function edit()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// La session ne correspond pas au site ouvert dans cet onglet
|
||||||
|
if (
|
||||||
|
// Contrôle la présence de l'id de langue uniquement si l'id est fourni afin de ne pas bloquer les modules non mis à jour
|
||||||
|
$this->getUrl(3) && $this->getUrl(3) != self::$siteContent
|
||||||
|
) {
|
||||||
|
$_SESSION['ZWII_SITE_CONTENT'] = $this->getUrl(3);
|
||||||
|
header('Refresh:0; url=' . helper::baseUrl() . $this->getUrl());
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
// La page n'existe pas
|
// La page n'existe pas
|
||||||
if ($this->getData(['page', $this->getUrl(2)]) === null) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true ||
|
||||||
|
$this->getData(['page', $this->getUrl(2)]) === null
|
||||||
|
) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'access' => false
|
'access' => false
|
||||||
@ -324,7 +360,10 @@ class page extends common
|
|||||||
// La page existe
|
// La page existe
|
||||||
else {
|
else {
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
// Si le Title n'est pas vide, premier test pour positionner la notification du champ obligatoire
|
// Si le Title n'est pas vide, premier test pour positionner la notification du champ obligatoire
|
||||||
if ($this->getInput('pageEditTitle', helper::FILTER_ID, true) !== null && $this->getInput('pageEditTitle') !== '') {
|
if ($this->getInput('pageEditTitle', helper::FILTER_ID, true) !== null && $this->getInput('pageEditTitle') !== '') {
|
||||||
// Génére l'ID si le titre de la page a changé
|
// Génére l'ID si le titre de la page a changé
|
||||||
@ -345,11 +384,13 @@ class page extends common
|
|||||||
$pageId = helper::increment($pageId, self::$moduleIds);
|
$pageId = helper::increment($pageId, self::$moduleIds);
|
||||||
// Met à jour les enfants
|
// Met à jour les enfants
|
||||||
foreach ($this->getHierarchy($this->getUrl(2), null) as $childrenPageId) {
|
foreach ($this->getHierarchy($this->getUrl(2), null) as $childrenPageId) {
|
||||||
$this->setData(['page', $childrenPageId, 'parentPageId', $pageId]);
|
$this->setData(['page', $childrenPageId, 'parentPageId', $pageId], false);
|
||||||
}
|
}
|
||||||
|
// Force la sauvegarde
|
||||||
|
$this->saveDB('page');
|
||||||
// Change l'id de page dans les données des modules
|
// Change l'id de page dans les données des modules
|
||||||
if ($this->getData(['module', $this->getUrl(2)]) !== null) {
|
if ($this->getData(['module', $this->getUrl(2)]) !== null) {
|
||||||
$this->setData(['module', $pageId, $this->getData(['module', $this->getUrl(2)])]);
|
$this->setData(['module', $pageId, $this->getData(['module', $this->getUrl(2)])], false);
|
||||||
$this->deleteData(['module', $this->getUrl(2)]);
|
$this->deleteData(['module', $this->getUrl(2)]);
|
||||||
// Renommer le dossier du module
|
// Renommer le dossier du module
|
||||||
$moduleId = $this->getData(['page', $this->getUrl(2), 'moduleId']);
|
$moduleId = $this->getData(['page', $this->getUrl(2), 'moduleId']);
|
||||||
@ -358,10 +399,12 @@ class page extends common
|
|||||||
// Placer la feuille de style dans un dossier au nom de la nouvelle instance
|
// Placer la feuille de style dans un dossier au nom de la nouvelle instance
|
||||||
mkdir($modulesData[$moduleId]['dataDirectory'] . $pageId, 0755);
|
mkdir($modulesData[$moduleId]['dataDirectory'] . $pageId, 0755);
|
||||||
copy($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2), $modulesData[$moduleId]['dataDirectory'] . $pageId);
|
copy($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2), $modulesData[$moduleId]['dataDirectory'] . $pageId);
|
||||||
$this->removeDir($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2));
|
$this->deleteDir($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2));
|
||||||
// Mettre à jour le nom de la feuille de style
|
// Mettre à jour le nom de la feuille de style
|
||||||
$this->setData(['module', $pageId, 'theme', 'style', $modulesData[$moduleId]['dataDirectory'] . $pageId]);
|
$this->setData(['module', $pageId, 'theme', 'style', $modulesData[$moduleId]['dataDirectory'] . $pageId], false);
|
||||||
}
|
}
|
||||||
|
// Force la sauvegarde
|
||||||
|
$this->saveDB('module');
|
||||||
}
|
}
|
||||||
// Si la page correspond à la page d'accueil, change l'id dans la configuration du site
|
// Si la page correspond à la page d'accueil, change l'id dans la configuration du site
|
||||||
if ($this->getData(['locale', 'homePageId']) === $this->getUrl(2)) {
|
if ($this->getData(['locale', 'homePageId']) === $this->getUrl(2)) {
|
||||||
@ -375,26 +418,28 @@ class page extends common
|
|||||||
// Supprime l'ancienne page si l'id a changée
|
// Supprime l'ancienne page si l'id a changée
|
||||||
if ($pageId !== $this->getUrl(2)) {
|
if ($pageId !== $this->getUrl(2)) {
|
||||||
$this->deleteData(['page', $this->getUrl(2)]);
|
$this->deleteData(['page', $this->getUrl(2)]);
|
||||||
if (file_exists(self::DATA_DIR . self::$i18nContent . '/content/' . $this->getUrl(2) . '.html')) {
|
if (file_exists(self::DATA_DIR . self::$siteContent . '/content/' . $this->getUrl(2) . '.html')) {
|
||||||
unlink(self::DATA_DIR . self::$i18nContent . '/content/' . $this->getUrl(2) . '.html');
|
unlink(self::DATA_DIR . self::$siteContent . '/content/' . $this->getUrl(2) . '.html');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Traitement des pages spéciales affectées dans la config :
|
// Traitement des pages spéciales affectées dans la config :
|
||||||
if ($this->getUrl(2) === $this->getData(['locale', 'legalPageId'])) {
|
if ($this->getUrl(2) === $this->getData(['locale', 'legalPageId'])) {
|
||||||
$this->setData(['locale', 'legalPageId', $pageId]);
|
$this->setData(['locale', 'legalPageId', $pageId], false);
|
||||||
}
|
}
|
||||||
if ($this->getUrl(2) === $this->getData(['locale', 'searchPageId'])) {
|
if ($this->getUrl(2) === $this->getData(['locale', 'searchPageId'])) {
|
||||||
$this->setData(['locale', 'searchPageId', $pageId]);
|
$this->setData(['locale', 'searchPageId', $pageId], false);
|
||||||
}
|
}
|
||||||
if ($this->getUrl(2) === $this->getData(['locale', 'page404'])) {
|
if ($this->getUrl(2) === $this->getData(['locale', 'page404'])) {
|
||||||
$this->setData(['locale', 'page404', $pageId]);
|
$this->setData(['locale', 'page404', $pageId], false);
|
||||||
}
|
}
|
||||||
if ($this->getUrl(2) === $this->getData(['locale', 'page403'])) {
|
if ($this->getUrl(2) === $this->getData(['locale', 'page403'])) {
|
||||||
$this->setData(['locale', 'page403', $pageId]);
|
$this->setData(['locale', 'page403', $pageId], false);
|
||||||
}
|
}
|
||||||
if ($this->getUrl(2) === $this->getData(['locale', 'page302'])) {
|
if ($this->getUrl(2) === $this->getData(['locale', 'page302'])) {
|
||||||
$this->setData(['locale', 'page302', $pageId]);
|
$this->setData(['locale', 'page302', $pageId], false);
|
||||||
}
|
}
|
||||||
|
// Force la sauvegarde
|
||||||
|
$this->saveDB('locale');
|
||||||
// Si la page est une page enfant, actualise les positions des autres enfants du parent, sinon actualise les pages sans parents
|
// Si la page est une page enfant, actualise les positions des autres enfants du parent, sinon actualise les pages sans parents
|
||||||
$lastPosition = 1;
|
$lastPosition = 1;
|
||||||
$hierarchy = $this->getInput('pageEditParentPageId') ? $this->getHierarchy($this->getInput('pageEditParentPageId')) : array_keys($this->getHierarchy());
|
$hierarchy = $this->getInput('pageEditParentPageId') ? $this->getHierarchy($this->getInput('pageEditParentPageId')) : array_keys($this->getHierarchy());
|
||||||
@ -413,7 +458,7 @@ class page extends common
|
|||||||
$lastPosition++;
|
$lastPosition++;
|
||||||
}
|
}
|
||||||
// Change la position
|
// Change la position
|
||||||
$this->setData(['page', $hierarchyPageId, 'position', $lastPosition]);
|
$this->setData(['page', $hierarchyPageId, 'position', $lastPosition], false);
|
||||||
// Incrémente pour la prochaine position
|
// Incrémente pour la prochaine position
|
||||||
$lastPosition++;
|
$lastPosition++;
|
||||||
}
|
}
|
||||||
@ -438,30 +483,44 @@ class page extends common
|
|||||||
) {
|
) {
|
||||||
foreach ($this->getHierarchy($pageId) as $parentId => $childId) {
|
foreach ($this->getHierarchy($pageId) as $parentId => $childId) {
|
||||||
if ($this->getData(['page', $childId, 'parentPageId']) === $pageId) {
|
if ($this->getData(['page', $childId, 'parentPageId']) === $pageId) {
|
||||||
$this->setData(['page', $childId, 'position', 0]);
|
$this->setData(['page', $childId, 'position', 0], false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Force la sauvegarde
|
||||||
|
$this->saveDB('page');
|
||||||
}
|
}
|
||||||
|
|
||||||
// La page est une barre latérale qui a été renommée : changer le nom de la barre dans les pages qui l'utilisent
|
// La page est une barre latérale qui a été renommée : changer le nom de la barre dans les pages qui l'utilisent
|
||||||
if ($this->getinput('pageEditBlock') === 'bar') {
|
if ($this->getinput('pageEditBlock') === 'bar') {
|
||||||
foreach ($this->getHierarchy() as $eachPageId => $parentId) {
|
foreach ($this->getHierarchy() as $eachPageId => $parentId) {
|
||||||
if ($this->getData(['page', $eachPageId, 'barRight']) === $this->getUrl(2)) {
|
if ($this->getData(['page', $eachPageId, 'barRight']) === $this->getUrl(2)) {
|
||||||
$this->setData(['page', $eachPageId, 'barRight', $pageId]);
|
$this->setData(['page', $eachPageId, 'barRight', $pageId], false);
|
||||||
}
|
}
|
||||||
if ($this->getData(['page', $eachPageId, 'barLeft']) === $this->getUrl(2)) {
|
if ($this->getData(['page', $eachPageId, 'barLeft']) === $this->getUrl(2)) {
|
||||||
$this->setData(['page', $eachPageId, 'barLeft', $pageId]);
|
$this->setData(['page', $eachPageId, 'barLeft', $pageId], false);
|
||||||
}
|
}
|
||||||
foreach ($parentId as $childId) {
|
foreach ($parentId as $childId) {
|
||||||
if ($this->getData(['page', $childId, 'barRight']) === $this->getUrl(2)) {
|
if ($this->getData(['page', $childId, 'barRight']) === $this->getUrl(2)) {
|
||||||
$this->setData(['page', $childId, 'barRight', $pageId]);
|
$this->setData(['page', $childId, 'barRight', $pageId], false);
|
||||||
}
|
}
|
||||||
if ($this->getData(['page', $childId, 'barLeft']) === $this->getUrl(2)) {
|
if ($this->getData(['page', $childId, 'barLeft']) === $this->getUrl(2)) {
|
||||||
$this->setData(['page', $childId, 'barLeft', $pageId]);
|
$this->setData(['page', $childId, 'barLeft', $pageId], false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Détermine le groupe selon que la page est une barre ou une page standard
|
||||||
|
$group = $this->getinput('pageEditBlock') !== 'bar' ? $this->getInput('pageEditGroup', helper::FILTER_INT) : 0;
|
||||||
|
|
||||||
|
//Détermine le profil d'utilisateur en fonction du groupe sinon le groupe vaut 0
|
||||||
|
$profil = 0;
|
||||||
|
if (
|
||||||
|
$this->getinput('pageEditBlock') !== 'bar' ||
|
||||||
|
$group === 1 ||
|
||||||
|
$group === 2
|
||||||
|
) {
|
||||||
|
$profil = $this->getInput('pageEditProfil' . $group, helper::FILTER_INT);
|
||||||
|
}
|
||||||
|
|
||||||
// Modifie la page ou en crée une nouvelle si l'id a changé
|
// Modifie la page ou en crée une nouvelle si l'id a changé
|
||||||
$this->setData([
|
$this->setData([
|
||||||
@ -480,13 +539,17 @@ class page extends common
|
|||||||
'modulePosition' => $this->getInput('pageModulePosition'),
|
'modulePosition' => $this->getInput('pageModulePosition'),
|
||||||
'parentPageId' => $this->getInput('pageEditParentPageId'),
|
'parentPageId' => $this->getInput('pageEditParentPageId'),
|
||||||
'position' => $position,
|
'position' => $position,
|
||||||
'group' => $this->getinput('pageEditBlock') !== 'bar' ? $this->getInput('pageEditGroup', helper::FILTER_INT) : 0,
|
'group' => $group,
|
||||||
|
'profil' => $profil,
|
||||||
'targetBlank' => $this->getInput('pageEditTargetBlank', helper::FILTER_BOOLEAN),
|
'targetBlank' => $this->getInput('pageEditTargetBlank', helper::FILTER_BOOLEAN),
|
||||||
'title' => $this->getInput('pageEditTitle', helper::FILTER_STRING_SHORT),
|
'title' => $this->getInput('pageEditTitle', helper::FILTER_STRING_SHORT),
|
||||||
'shortTitle' => $this->getInput('pageEditShortTitle', helper::FILTER_STRING_SHORT, true),
|
'shortTitle' => $this->getInput('pageEditShortTitle', helper::FILTER_STRING_SHORT, true),
|
||||||
'block' => $this->getinput('pageEditBlock'),
|
'block' => $this->getinput('pageEditBlock'),
|
||||||
'barLeft' => $barLeft,
|
'barLeft' => $barLeft,
|
||||||
'barRight' => $barRight,
|
'barRight' => $barRight,
|
||||||
|
'navLeft' => $this->getInput('pageEditNavLeft'),
|
||||||
|
'navRight' => $this->getInput('pageEditNavRight'),
|
||||||
|
'navTemplate' => $this->getInput('pageEditNavTemplate'),
|
||||||
'displayMenu' => $this->getinput('pageEditDisplayMenu'),
|
'displayMenu' => $this->getinput('pageEditDisplayMenu'),
|
||||||
'hideMenuSide' => $this->getinput('pageEditHideMenuSide', helper::FILTER_BOOLEAN),
|
'hideMenuSide' => $this->getinput('pageEditHideMenuSide', helper::FILTER_BOOLEAN),
|
||||||
'hideMenuHead' => $this->getinput('pageEditHideMenuHead', helper::FILTER_BOOLEAN),
|
'hideMenuHead' => $this->getinput('pageEditHideMenuHead', helper::FILTER_BOOLEAN),
|
||||||
@ -498,11 +561,11 @@ class page extends common
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
// Creation du contenu de la page
|
// Creation du contenu de la page
|
||||||
if (!is_dir(self::DATA_DIR . self::$i18nContent . '/content')) {
|
if (!is_dir(self::DATA_DIR . self::$siteContent . '/content')) {
|
||||||
mkdir(self::DATA_DIR . self::$i18nContent . '/content', 0755);
|
mkdir(self::DATA_DIR . self::$siteContent . '/content', 0755);
|
||||||
}
|
}
|
||||||
$content = empty($this->getInput('pageEditContent', null)) ? '<p></p>' : str_replace('<p></p>', '<p> </p>', $this->getInput('pageEditContent', null));
|
$content = empty($this->getInput('pageEditContent', null)) ? '<p></p>' : str_replace('<p></p>', '<p> </p>', $this->getInput('pageEditContent', null));
|
||||||
$this->setPage($pageId, $content, self::$i18nContent);
|
$this->setPage($pageId, $content, self::$siteContent);
|
||||||
|
|
||||||
// Met à jour le sitemap
|
// Met à jour le sitemap
|
||||||
$this->updateSitemap();
|
$this->updateSitemap();
|
||||||
@ -529,6 +592,9 @@ class page extends common
|
|||||||
}
|
}
|
||||||
// Construction du formulaire
|
// Construction du formulaire
|
||||||
|
|
||||||
|
// Met à jour le sitemap
|
||||||
|
$this->updateSitemap();
|
||||||
|
|
||||||
// Création du sélecteur de modules
|
// Création du sélecteur de modules
|
||||||
self::$moduleIds = [];
|
self::$moduleIds = [];
|
||||||
foreach (helper::getModules() as $key => $values) {
|
foreach (helper::getModules() as $key => $values) {
|
||||||
@ -551,7 +617,20 @@ class page extends common
|
|||||||
self::$pagesBarId[$parentPageId] = $this->getData(['page', $parentPageId, 'title']);
|
self::$pagesBarId[$parentPageId] = $this->getData(['page', $parentPageId, 'title']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Profils installés
|
||||||
|
// Profils disponibles
|
||||||
|
foreach ($this->getData(['profil']) as $profilId => $profilData) {
|
||||||
|
if ($profilId < self::GROUP_MEMBER) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ($profilId === self::GROUP_ADMIN) {
|
||||||
|
self::$userProfils[$profilId][self::GROUP_ADMIN] = $profilData['name'];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
foreach ($profilData as $key => $value) {
|
||||||
|
self::$userProfils[$profilId][$key] = $profilData[$key]['name'];
|
||||||
|
}
|
||||||
|
}
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'title' => $this->getData(['page', $this->getUrl(2), 'title']),
|
'title' => $this->getData(['page', $this->getUrl(2), 'title']),
|
||||||
@ -569,18 +648,22 @@ class page extends common
|
|||||||
public function cssEditor()
|
public function cssEditor()
|
||||||
{
|
{
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
$css = $this->getInput('pageCssEditorContent', helper::FILTER_STRING_LONG) === null ? '' : $this->getInput('pageCssEditorContent', helper::FILTER_STRING_LONG);
|
$css = $this->getInput('pageCssEditorContent', helper::FILTER_STRING_LONG) === null ? '' : $this->getInput('pageCssEditorContent', helper::FILTER_STRING_LONG);
|
||||||
// Enregistre le CSS
|
// Enregistre le CSS
|
||||||
$this->setData([
|
$this->setData([
|
||||||
'page', $this->getUrl(2),
|
'page',
|
||||||
|
$this->getUrl(2),
|
||||||
'css',
|
'css',
|
||||||
$css
|
$css
|
||||||
]);
|
]);
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'notification' => helper::translate('Modifications enregistrées'),
|
'notification' => helper::translate('Modifications enregistrées'),
|
||||||
'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2),
|
'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent,
|
||||||
'state' => true
|
'state' => true
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@ -600,18 +683,22 @@ class page extends common
|
|||||||
public function jsEditor()
|
public function jsEditor()
|
||||||
{
|
{
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
$js = $this->getInput('pageJsEditorContent', helper::FILTER_STRING_LONG) === null ? '' : $this->getInput('pageJsEditorContent', helper::FILTER_STRING_LONG);
|
$js = $this->getInput('pageJsEditorContent', helper::FILTER_STRING_LONG) === null ? '' : $this->getInput('pageJsEditorContent', helper::FILTER_STRING_LONG);
|
||||||
// Enregistre le JS
|
// Enregistre le JS
|
||||||
$this->setData([
|
$this->setData([
|
||||||
'page', $this->getUrl(2),
|
'page',
|
||||||
|
$this->getUrl(2),
|
||||||
'js',
|
'js',
|
||||||
$js
|
$js
|
||||||
]);
|
]);
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'notification' => helper::translate('Modifications enregistrées'),
|
'notification' => helper::translate('Modifications enregistrées'),
|
||||||
'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2),
|
'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent,
|
||||||
'state' => true
|
'state' => true
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@ -627,15 +714,36 @@ class page extends common
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Retourne les informations sur les pages en omettant les clés CSS et JS qui occasionnent des bugs d'affichage dans l'éditeur de page
|
* Retourne les informations sur les pages en omettant les clés CSS et JS qui occasionnent des bugs d'affichage dans l'éditeur de page
|
||||||
* @return array tableau associatif des pages dans le menu
|
* @return string tableau associatif des pages dans le menu
|
||||||
*/
|
*/
|
||||||
public function getPageInfo() {
|
public function getPageInfo()
|
||||||
|
{
|
||||||
$p = $this->getData(['page']);
|
$p = $this->getData(['page']);
|
||||||
$d = array_map(function ($d) {
|
$d = array_map(function ($d) {
|
||||||
unset($d["css"], $d["js"]);
|
unset($d["css"], $d["js"]);
|
||||||
return $d;
|
return $d;
|
||||||
}, $p);
|
}, $p);
|
||||||
return json_encode($d);
|
return json_encode($d);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stocke la variable dans les paramètres de l'utilisateur pour activer la tab à sa prochaine visite
|
||||||
|
* @return never
|
||||||
|
*/
|
||||||
|
public function register(): void
|
||||||
|
{
|
||||||
|
$this->setData([
|
||||||
|
'user',
|
||||||
|
$this->getUser('id'),
|
||||||
|
'view',
|
||||||
|
[
|
||||||
|
'page' => $this->getUrl(2),
|
||||||
|
'config' => $this->getData(['user', $this->getUser('id'), 'view', 'config']),
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(3) . '/' . self::$siteContent,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<div class="col1">
|
<div class="col1">
|
||||||
<?php echo template::button('pageCssEditorBack', [
|
<?php echo template::button('pageCssEditorBack', [
|
||||||
'class' => 'buttonGrey',
|
'class' => 'buttonGrey',
|
||||||
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2),
|
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent,
|
||||||
'value' => template::ico('left')
|
'value' => template::ico('left')
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
@ -44,3 +44,7 @@
|
|||||||
background-color: #00BFFF;
|
background-color: #00BFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pageEditProfil1Wrapper,
|
||||||
|
#pageEditProfil2Wrapper {
|
||||||
|
padding: 0;
|
||||||
|
}
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @authorFrédéric Tempez <frederic.tempez@outlook.com>
|
* @authorFrédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
@ -54,19 +54,32 @@ function protectModule() {
|
|||||||
*/
|
*/
|
||||||
$( document ).ready(function() {
|
$( document ).ready(function() {
|
||||||
|
|
||||||
|
// Changement de profil
|
||||||
|
$(".pageEditGroupProfil").hide();
|
||||||
|
$("#pageEditGroupProfil" + $("#pageEditGroup").val()).show();
|
||||||
|
|
||||||
|
$("#pageEditGroup").on("change", function () {
|
||||||
|
$(".pageEditGroupProfil").hide();
|
||||||
|
$("#pageEditGroupProfil" + $(this).val()).show();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sélection des onglets
|
* Sélection des onglets
|
||||||
*/
|
*/
|
||||||
var pageLayout = getCookie("pageLayout");
|
var pageLayout = "<?php echo $this->getData(['user', $this->getUser('id'), 'view', 'page']);?>";
|
||||||
if (pageLayout == null) {
|
|
||||||
|
// Non défini, valeur par défaut
|
||||||
|
if (pageLayout == "") {
|
||||||
pageLayout = "content";
|
pageLayout = "content";
|
||||||
setCookie("pageLayout", "content");
|
|
||||||
}
|
}
|
||||||
|
// Tout cacher
|
||||||
$("#pageEditContentContainer").hide();
|
$("#pageEditContentContainer").hide();
|
||||||
$("#pageEditExtensionContainer").hide();
|
$("#pageEditExtensionContainer").hide();
|
||||||
$("#pageEditPositionContainer").hide();
|
$("#pageEditPositionContainer").hide();
|
||||||
$("#pageEditLayoutContainer").hide();
|
$("#pageEditLayoutContainer").hide();
|
||||||
$("#pageEditPermissionContainer").hide();
|
$("#pageEditPermissionContainer").hide();
|
||||||
|
// Afficher la bonne tab
|
||||||
$("#pageEdit" + capitalizeFirstLetter(pageLayout) + "Container").show();
|
$("#pageEdit" + capitalizeFirstLetter(pageLayout) + "Container").show();
|
||||||
$("#pageEdit" + capitalizeFirstLetter(pageLayout) + "Button").addClass("activeButton");
|
$("#pageEdit" + capitalizeFirstLetter(pageLayout) + "Button").addClass("activeButton");
|
||||||
|
|
||||||
@ -183,6 +196,7 @@ $( document ).ready(function() {
|
|||||||
$("#pageEditSeoWrapper").slideUp();
|
$("#pageEditSeoWrapper").slideUp();
|
||||||
$("#pageEditAdvancedWrapper").removeClass("disabled");
|
$("#pageEditAdvancedWrapper").removeClass("disabled");
|
||||||
$("#pageEditAdvancedWrapper").slideUp();
|
$("#pageEditAdvancedWrapper").slideUp();
|
||||||
|
$(".navSelect").slideUp();
|
||||||
/*
|
/*
|
||||||
$("#pageEditBlockLayout").removeClass("col6");
|
$("#pageEditBlockLayout").removeClass("col6");
|
||||||
$("#pageEditBlockLayout").addClass("col12");
|
$("#pageEditBlockLayout").addClass("col12");
|
||||||
@ -284,7 +298,6 @@ $( document ).ready(function() {
|
|||||||
$("#PageEditPositionButton").removeClass("activeButton");
|
$("#PageEditPositionButton").removeClass("activeButton");
|
||||||
$("#pageEditLayoutButton").removeClass("activeButton");
|
$("#pageEditLayoutButton").removeClass("activeButton");
|
||||||
$("#pageEditPermissionButton").removeClass("activeButton");
|
$("#pageEditPermissionButton").removeClass("activeButton");
|
||||||
setCookie("pageLayout", "content");
|
|
||||||
});
|
});
|
||||||
$("#pageEditExtensionButton").on("click", function () {
|
$("#pageEditExtensionButton").on("click", function () {
|
||||||
$("#pageEditContentContainer").hide();
|
$("#pageEditContentContainer").hide();
|
||||||
@ -297,7 +310,6 @@ $( document ).ready(function() {
|
|||||||
$("#PageEditPositionButton").removeClass("activeButton");
|
$("#PageEditPositionButton").removeClass("activeButton");
|
||||||
$("#pageEditLayoutButton").removeClass("activeButton");
|
$("#pageEditLayoutButton").removeClass("activeButton");
|
||||||
$("#pageEditPermissionButton").removeClass("activeButton");
|
$("#pageEditPermissionButton").removeClass("activeButton");
|
||||||
setCookie("pageLayout", "extension");
|
|
||||||
});
|
});
|
||||||
$("#PageEditPositionButton").on("click", function () {
|
$("#PageEditPositionButton").on("click", function () {
|
||||||
$("#pageEditContentContainer").hide();
|
$("#pageEditContentContainer").hide();
|
||||||
@ -310,7 +322,6 @@ $( document ).ready(function() {
|
|||||||
$("#PageEditPositionButton").addClass("activeButton");
|
$("#PageEditPositionButton").addClass("activeButton");
|
||||||
$("#pageEditLayoutButton").removeClass("activeButton");
|
$("#pageEditLayoutButton").removeClass("activeButton");
|
||||||
$("#pageEditPermissionButton").removeClass("activeButton");
|
$("#pageEditPermissionButton").removeClass("activeButton");
|
||||||
setCookie("pageLayout", "position");
|
|
||||||
});
|
});
|
||||||
$("#pageEditLayoutButton").on("click", function () {
|
$("#pageEditLayoutButton").on("click", function () {
|
||||||
$("#pageEditContentContainer").hide();
|
$("#pageEditContentContainer").hide();
|
||||||
@ -323,7 +334,6 @@ $( document ).ready(function() {
|
|||||||
$("#PageEditPositionButton").removeClass("activeButton");
|
$("#PageEditPositionButton").removeClass("activeButton");
|
||||||
$("#pageEditLayoutButton").addClass("activeButton");
|
$("#pageEditLayoutButton").addClass("activeButton");
|
||||||
$("#pageEditPermissionButton").removeClass("activeButton");
|
$("#pageEditPermissionButton").removeClass("activeButton");
|
||||||
setCookie("pageLayout", "layout");
|
|
||||||
});
|
});
|
||||||
$("#pageEditPermissionButton").on("click", function () {
|
$("#pageEditPermissionButton").on("click", function () {
|
||||||
$("#pageEditContentContainer").hide();
|
$("#pageEditContentContainer").hide();
|
||||||
@ -336,7 +346,6 @@ $( document ).ready(function() {
|
|||||||
$("#pageEditPositionButton").removeClass("activeButton");
|
$("#pageEditPositionButton").removeClass("activeButton");
|
||||||
$("#pageEditLayoutButton").removeClass("activeButton");
|
$("#pageEditLayoutButton").removeClass("activeButton");
|
||||||
$("#pageEditPermissionButton").addClass("activeButton");
|
$("#pageEditPermissionButton").addClass("activeButton");
|
||||||
setCookie("pageLayout", "permission");
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -499,6 +508,7 @@ pageEditBlockDOM.on("change", function() {
|
|||||||
$("#pageEditModuleConfig").slideUp();
|
$("#pageEditModuleConfig").slideUp();
|
||||||
$("#pageEditDisplayMenuWrapper").addClass("disabled");
|
$("#pageEditDisplayMenuWrapper").addClass("disabled");
|
||||||
$("#pageEditDisplayMenuWrapper").slideDown();
|
$("#pageEditDisplayMenuWrapper").slideDown();
|
||||||
|
$(".navSelect").slideUp();
|
||||||
/*
|
/*
|
||||||
$("#pageEditBlockLayout").removeClass("col6");
|
$("#pageEditBlockLayout").removeClass("col6");
|
||||||
$("#pageEditBlockLayout").addClass("col12");
|
$("#pageEditBlockLayout").addClass("col12");
|
||||||
@ -519,6 +529,7 @@ pageEditBlockDOM.on("change", function() {
|
|||||||
$("#pageEditModuleConfig").slideDown();
|
$("#pageEditModuleConfig").slideDown();
|
||||||
$("#pageEditDisplayMenuWrapper").removeClass("disabled");
|
$("#pageEditDisplayMenuWrapper").removeClass("disabled");
|
||||||
$("#pageEditDisplayMenuWrapper").slideUp();
|
$("#pageEditDisplayMenuWrapper").slideUp();
|
||||||
|
$(".navSelect").slideDown();
|
||||||
if ($("#pageEditParentPageId").val() !== "") {
|
if ($("#pageEditParentPageId").val() !== "") {
|
||||||
$("#pageEditbreadCrumbWrapper").addClass("disabled");
|
$("#pageEditbreadCrumbWrapper").addClass("disabled");
|
||||||
$("#pageEditbreadCrumbWrapper").slideDown();
|
$("#pageEditbreadCrumbWrapper").slideDown();
|
||||||
@ -709,30 +720,6 @@ function buildPagesList(extraPosition) {
|
|||||||
positionDOM.val(positionSelected);
|
positionDOM.val(positionSelected);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Cookies
|
|
||||||
*/
|
|
||||||
function setCookie(name, value, days) {
|
|
||||||
var expires = "";
|
|
||||||
if (days) {
|
|
||||||
var date = new Date();
|
|
||||||
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
|
|
||||||
expires = "; expires=" + date.toUTCString();
|
|
||||||
}
|
|
||||||
document.cookie = name + "=" + (value || "") + expires + "; path=/; samesite=lax";
|
|
||||||
}
|
|
||||||
|
|
||||||
function getCookie(name) {
|
|
||||||
var nameEQ = name + "=";
|
|
||||||
var ca = document.cookie.split(';');
|
|
||||||
for (var i = 0; i < ca.length; i++) {
|
|
||||||
var c = ca[i];
|
|
||||||
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
|
|
||||||
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Define function to capitalize the first letter of a string
|
// Define function to capitalize the first letter of a string
|
||||||
function capitalizeFirstLetter(string) {
|
function capitalizeFirstLetter(string) {
|
||||||
return string.charAt(0).toUpperCase() + string.slice(1);
|
return string.charAt(0).toUpperCase() + string.slice(1);
|
||||||
|
@ -1,34 +1,23 @@
|
|||||||
<?php echo template::formOpen('pageEditForm'); ?>
|
<?php echo template::formOpen('pageEditForm'); ?>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col1">
|
<div class="col1">
|
||||||
<?php $href = helper::baseUrl() . $this->getUrl(2); ?>
|
<?php echo template::button('configModulesBack', [
|
||||||
<?php if ($this->getData(['page', $this->getUrl(2), 'moduleId']) === 'redirection' || 'code') $href = helper::baseUrl(); ?>
|
|
||||||
<?php echo template::button('pageEditBack', [
|
|
||||||
'class' => 'buttonGrey',
|
'class' => 'buttonGrey',
|
||||||
'href' => $href,
|
'href' => helper::baseUrl() . $this->getUrl(2),
|
||||||
'value' => template::ico('home')
|
'value' => template::ico('left')
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col1">
|
<div class="col1 offset7">
|
||||||
<?php /**echo template::button('pageEditHelp', [
|
|
||||||
'href' => 'https://doc.zwiicms.fr/edition-des-pages',
|
|
||||||
'target' => '_blank',
|
|
||||||
'value' => template::ico('help'),
|
|
||||||
'class' => 'buttonHelp',
|
|
||||||
'help' => 'Consulter l\'aide en ligne'
|
|
||||||
]); */ ?>
|
|
||||||
</div>
|
|
||||||
<div class="col1 offset6">
|
|
||||||
<?php echo template::button('pageEditDelete', [
|
<?php echo template::button('pageEditDelete', [
|
||||||
'class' => 'buttonRed',
|
'class' => 'buttonRed',
|
||||||
'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(2) . '/' . self::$siteContent,
|
||||||
'value' => template::ico('trash'),
|
'value' => template::ico('trash'),
|
||||||
'help' => 'Effacer la page'
|
'help' => 'Effacer la page'
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col1">
|
<div class="col1">
|
||||||
<?php echo template::button('pageEditDuplicate', [
|
<?php echo template::button('pageEditDuplicate', [
|
||||||
'href' => helper::baseUrl() . 'page/duplicate/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . 'page/duplicate/' . $this->getUrl(2) . '/' . self::$siteContent,
|
||||||
'value' => template::ico('clone'),
|
'value' => template::ico('clone'),
|
||||||
'help' => 'Dupliquer la page'
|
'help' => 'Dupliquer la page'
|
||||||
]); ?>
|
]); ?>
|
||||||
@ -39,27 +28,31 @@
|
|||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="tab">
|
<div class="tab">
|
||||||
<?php echo template::button('pageEditContentButton', [
|
<?php echo template::button('pageEditContentButton', [
|
||||||
'value' => 'Contenu',
|
'value' => 'Contenu',
|
||||||
'class' => 'buttonTab'
|
'class' => 'buttonTab',
|
||||||
|
'href' => helper::baseUrl() . 'page/register/content/' . $this->geturl(2)
|
||||||
]); ?>
|
]); ?>
|
||||||
<?php echo template::button('PageEditPositionButton', [
|
<?php echo template::button('pageEditPositionButton', [
|
||||||
'value' => 'Menu',
|
'value' => 'Menu',
|
||||||
'class' => 'buttonTab'
|
'class' => 'buttonTab',
|
||||||
|
'href' => helper::baseUrl() . 'page/register/position/' . $this->geturl(2)
|
||||||
]); ?>
|
]); ?>
|
||||||
<?php echo template::button('pageEditExtensionButton', [
|
<?php echo template::button('pageEditExtensionButton', [
|
||||||
'value' => 'Extension',
|
'value' => 'Extension',
|
||||||
'class' => 'buttonTab'
|
'class' => 'buttonTab',
|
||||||
|
'href' => helper::baseUrl() . 'page/register/extension/' . $this->geturl(2)
|
||||||
]); ?>
|
]); ?>
|
||||||
<?php echo template::button('pageEditLayoutButton', [
|
<?php echo template::button('pageEditLayoutButton', [
|
||||||
'value' => 'Mise en page',
|
'value' => 'Mise en page',
|
||||||
'class' => 'buttonTab'
|
'class' => 'buttonTab',
|
||||||
|
'href' => helper::baseUrl() . 'page/register/layout/' . $this->geturl(2)
|
||||||
]); ?>
|
]); ?>
|
||||||
<?php echo template::button('pageEditPermissionButton', [
|
<?php echo template::button('pageEditPermissionButton', [
|
||||||
'value' => 'Permission',
|
'value' => 'Permission',
|
||||||
'class' => 'buttonTab'
|
'class' => 'buttonTab',
|
||||||
|
'href' => helper::baseUrl() . 'page/register/permission/' . $this->geturl(2)
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -67,12 +60,8 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col12">
|
<div class="col12">
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<h4><?php echo helper::translate('Titres'); ?>
|
<h4>
|
||||||
<!--<span id="infoHelpButton" class="helpDisplayButton">
|
<?php echo helper::translate('Titres'); ?>
|
||||||
<a href="https://doc.zwiicms.fr/informations-generales" target="_blank" title="Cliquer pour consulter l'aide en ligne">
|
|
||||||
<?php //echo template::ico('help', ['margin' => 'left']); ?>
|
|
||||||
</a>
|
|
||||||
</span>-->
|
|
||||||
</h4>
|
</h4>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col8">
|
<div class="col8">
|
||||||
@ -109,7 +98,7 @@
|
|||||||
<div class="col12">
|
<div class="col12">
|
||||||
<?php echo template::textarea('pageEditContent', [
|
<?php echo template::textarea('pageEditContent', [
|
||||||
'class' => 'editorWysiwyg',
|
'class' => 'editorWysiwyg',
|
||||||
'value' => $this->getPage($this->getUrl(2), self::$i18nContent)
|
'value' => $this->getPage($this->getUrl(2), self::$siteContent)
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -119,12 +108,8 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col12">
|
<div class="col12">
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<h4><?php echo helper::translate('Emplacement dans le menu'); ?>
|
<h4>
|
||||||
<!--<span id="positionHelpButton" class="helpDisplayButton">
|
<?php echo helper::translate('Emplacement dans le menu'); ?>
|
||||||
<a href="https://doc.zwiicms.fr/emplacement-dans-le-menu" target="_blank" title="Cliquer pour consulter l'aide en ligne">
|
|
||||||
<?php //echo template::ico('help', ['margin' => 'left']); ?>
|
|
||||||
</a>
|
|
||||||
</span>-->
|
|
||||||
</h4>
|
</h4>
|
||||||
<div class="blockContainer">
|
<div class="blockContainer">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@ -174,12 +159,8 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col12">
|
<div class="col12">
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<h4><?php echo helper::translate('Options avancées'); ?>
|
<h4>
|
||||||
<!--<span id="advancedHelpButton" class="helpDisplayButton">
|
<?php echo helper::translate('Options avancées'); ?>
|
||||||
<a href="https://doc.zwiicms.fr/options-d-emplacement-avancee" target="_blank" title="Cliquer pour consulter l'aide en ligne">
|
|
||||||
<?php //echo template::ico('help', ['margin' => 'left']); ?>
|
|
||||||
</a>
|
|
||||||
</span>-->
|
|
||||||
</h4>
|
</h4>
|
||||||
<div class="blockContainer">
|
<div class="blockContainer">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@ -194,7 +175,8 @@
|
|||||||
'help' => 'Sélectionnez une image ou une icône de petite dimension',
|
'help' => 'Sélectionnez une image ou une icône de petite dimension',
|
||||||
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
|
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
|
||||||
'label' => 'Icône',
|
'label' => 'Icône',
|
||||||
'value' => $this->getData(['page', $this->getUrl(2), 'iconUrl'])
|
'value' => $this->getData(['page', $this->getUrl(2), 'iconUrl']),
|
||||||
|
'folder' => $this->getData(['page', $this->getUrl(2), 'iconUrl']) ? dirname($this->getData(['page', $this->getUrl(2), 'iconUrl'])) : '',
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -221,7 +203,8 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col6">
|
<div class="col6">
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<h4><?php echo helper::translate('Module'); ?>
|
<h4>
|
||||||
|
<?php echo helper::translate('Module'); ?>
|
||||||
</h4>
|
</h4>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col10">
|
<div class="col10">
|
||||||
@ -258,7 +241,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col6">
|
<div class="col6">
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<h4><?php echo helper::translate('Contenu avancé');?></h4>
|
<h4>
|
||||||
|
<?php echo helper::translate('Contenu avancé'); ?>
|
||||||
|
</h4>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col6 offset3">
|
<div class="col6 offset3">
|
||||||
<?php echo template::button('pageEditCssEditor', [
|
<?php echo template::button('pageEditCssEditor', [
|
||||||
@ -286,12 +271,8 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col12">
|
<div class="col12">
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<h4><?php echo helper::translate('Mise en page'); ?>
|
<h4>
|
||||||
<!--<span id="layoutHelpButton" class="helpDisplayButton">
|
<?php echo helper::translate('Mise en page'); ?>
|
||||||
<a href="https://doc.zwiicms.fr/mise-en-page-2" target="_blank" title="Cliquer pour consulter l'aide en ligne">
|
|
||||||
<?php //echo template::ico('help', ['margin' => 'left']); ?>
|
|
||||||
</a>
|
|
||||||
</span>-->
|
|
||||||
</h4>
|
</h4>
|
||||||
<div class="blockContainer">
|
<div class="blockContainer">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@ -335,6 +316,26 @@
|
|||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row navSelect">
|
||||||
|
<div class="col4">
|
||||||
|
<?php echo template::select('pageEditNavLeft', $module::$navIconPosition, [
|
||||||
|
'label' => 'Bouton de navigation gauche',
|
||||||
|
'selected' => $this->getData(['page', $this->getUrl(2), 'navLeft']),
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
|
<div class="col4">
|
||||||
|
<?php echo template::select('pageEditNavTemplate', $module::$navIconTemplate, [
|
||||||
|
'label' => 'Modèle',
|
||||||
|
'selected' => $this->getData(['page', $this->getUrl(2), 'navTemplate']),
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
|
<div class="col4">
|
||||||
|
<?php echo template::select('pageEditNavRight', $module::$navIconPosition, [
|
||||||
|
'label' => 'Bouton de navigation droit',
|
||||||
|
'selected' => $this->getData(['page', $this->getUrl(2), 'navRight']),
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -345,21 +346,38 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col12">
|
<div class="col12">
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<h4><?php echo helper::translate('Permission et référencement');?>
|
<h4>
|
||||||
<!--<span id="seoHelpButton" class="helpDisplayButton">
|
<?php echo helper::translate('Permission et référencement'); ?>
|
||||||
<a href="https://doc.zwiicms.fr/permission-et-referencement" target="_blank" title="Cliquer pour consulter l'aide en ligne">
|
|
||||||
<?php //echo template::ico('help', ['margin' => 'left']); ?>
|
|
||||||
</a>
|
|
||||||
</span>-->
|
|
||||||
</h4>
|
</h4>
|
||||||
<div class="blockContainer">
|
<div class="blockContainer">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class='col6'>
|
<div class='col6'>
|
||||||
<?php echo template::select('pageEditGroup', self::$groupPublics, [
|
<?php echo template::select('pageEditGroup', self::$groupPublics, [
|
||||||
'label' => 'Groupe requis pour accéder à la page :',
|
'label' => 'Groupe minimal pour accéder à la page',
|
||||||
'selected' => $this->getData(['page', $this->getUrl(2), 'group'])
|
'selected' => $this->getData(['page', $this->getUrl(2), 'group']),
|
||||||
|
'help' => 'Les groupes de niveau supérieur accèdent à la page.'
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col6">
|
||||||
|
<div class="pageEditGroupProfil displayNone"
|
||||||
|
id="pageEditGroupProfil<?php echo self::GROUP_MEMBER; ?>">
|
||||||
|
<?php echo template::select('pageEditProfil' . self::GROUP_MEMBER, $module::$userProfils[self::GROUP_MEMBER], [
|
||||||
|
'label' => 'Profil minimal pour accéder à la page',
|
||||||
|
'selected' => $this->getData(['page', $this->getUrl(2), 'profil']),
|
||||||
|
'help' => 'Les profils de niveau supérieur accèdent à la page.',
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
|
<div class="pageEditGroupProfil displayNone"
|
||||||
|
id="pageEditGroupProfil<?php echo self::GROUP_EDITOR; ?>">
|
||||||
|
<?php echo template::select('pageEditProfil' . self::GROUP_EDITOR, $module::$userProfils[self::GROUP_EDITOR], [
|
||||||
|
'label' => 'Profil minimal pour accéder à la page',
|
||||||
|
'selected' => $this->getData(['page', $this->getUrl(2), 'profil']),
|
||||||
|
'help' => 'Les profils de niveau supérieur accèdent à la page.',
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
<div class='col12'>
|
<div class='col12'>
|
||||||
<?php echo template::text('pageEditMetaTitle', [
|
<?php echo template::text('pageEditMetaTitle', [
|
||||||
'label' => 'Méta-titre',
|
'label' => 'Méta-titre',
|
||||||
@ -377,5 +395,4 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<?php echo template::formClose(); ?>
|
<?php echo template::formClose(); ?>
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<div class="col1">
|
<div class="col1">
|
||||||
<?php echo template::button('pageJsEditorBack', [
|
<?php echo template::button('pageJsEditorBack', [
|
||||||
'class' => 'buttonGrey',
|
'class' => 'buttonGrey',
|
||||||
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2),
|
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent,
|
||||||
'value' => template::ico('left')
|
'value' => template::ico('left')
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
@ -21,14 +21,8 @@ class plugin extends common
|
|||||||
'index' => self::GROUP_ADMIN,
|
'index' => self::GROUP_ADMIN,
|
||||||
'delete' => self::GROUP_ADMIN,
|
'delete' => self::GROUP_ADMIN,
|
||||||
'save' => self::GROUP_ADMIN,
|
'save' => self::GROUP_ADMIN,
|
||||||
// Sauvegarde le module dans un fichier ZIP ou dans le gestionnaire
|
|
||||||
'dataExport' => self::GROUP_ADMIN,
|
|
||||||
// Fonction muette d'exportation
|
|
||||||
'dataImport' => self::GROUP_ADMIN,
|
|
||||||
// les données d'un module
|
|
||||||
'dataDelete' => self::GROUP_ADMIN,
|
|
||||||
'store' => self::GROUP_ADMIN,
|
'store' => self::GROUP_ADMIN,
|
||||||
'item' => self::GROUP_ADMIN,
|
//'item' => self::GROUP_ADMIN,
|
||||||
// détail d'un objet
|
// détail d'un objet
|
||||||
'upload' => self::GROUP_ADMIN,
|
'upload' => self::GROUP_ADMIN,
|
||||||
// Téléverser catalogue
|
// Téléverser catalogue
|
||||||
@ -62,28 +56,29 @@ class plugin extends common
|
|||||||
public function delete()
|
public function delete()
|
||||||
{
|
{
|
||||||
|
|
||||||
// Jeton incorrect
|
// Action interdite
|
||||||
if ($this->getUrl(3) !== $_SESSION['csrf']) {
|
if ($this->getUser('permission', __CLASS__, __FUNCTION__) !== true) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'plugin',
|
'access' => false
|
||||||
'state' => false,
|
|
||||||
'notification' => helper::translate('Action interdite')
|
|
||||||
]);
|
]);
|
||||||
} else {
|
} else {
|
||||||
// Suppression des dossiers
|
// Suppression des dossiers
|
||||||
$infoModules = helper::getModules();
|
$infoModules = helper::getModules();
|
||||||
$module = $this->getUrl(2);
|
$module = $this->getUrl(2);
|
||||||
//Liste des dossiers associés au module non effacés
|
//Liste des dossiers associés au module non effacés
|
||||||
if ($this->removeDir('./module/' . $module) === true) {
|
if (
|
||||||
|
is_dir('./module/' . $module) &&
|
||||||
|
$this->deleteDir('./module/' . $module) === true
|
||||||
|
) {
|
||||||
$success = true;
|
$success = true;
|
||||||
$notification = 'Module ' . $module . ' désinstallé';
|
$notification = 'Module ' . $module . ' désinstallé';
|
||||||
if (($infoModules[$this->getUrl(2)]['dataDirectory'])) {
|
if (($infoModules[$this->getUrl(2)]['dataDirectory'])) {
|
||||||
if (
|
if (
|
||||||
is_dir($infoModules[$this->getUrl(2)]['dataDirectory'])
|
is_dir($infoModules[$this->getUrl(2)]['dataDirectory'])
|
||||||
|| !$this->removeDir($infoModules[$this->getUrl(2)]['dataDirectory'])
|
|
||||||
) {
|
) {
|
||||||
$notification = sprintf(helper::translate('Le module %s est désinstallé, il reste peut-être des données dans %s'), $module, $infoModules[$this->getUrl(2)]['dataDirectory']);
|
$s = $this->deleteDir($infoModules[$this->getUrl(2)]['dataDirectory']);
|
||||||
|
$notification = $s === false ? sprintf(helper::translate('Le module %s est désinstallé, il reste peut-être des données dans %s'), $module, $infoModules[$this->getUrl(2)]['dataDirectory']) : $notification;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -136,7 +131,7 @@ class plugin extends common
|
|||||||
$module = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . 'enum.json'), true);
|
$module = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . 'enum.json'), true);
|
||||||
} else {
|
} else {
|
||||||
// Message de retour
|
// Message de retour
|
||||||
$this->removeDir(self::TEMP_DIR . $tempFolder);
|
$this->deleteDir(self::TEMP_DIR . $tempFolder);
|
||||||
$zip->close();
|
$zip->close();
|
||||||
return ([
|
return ([
|
||||||
'success' => false,
|
'success' => false,
|
||||||
@ -151,7 +146,7 @@ class plugin extends common
|
|||||||
// Vérification de la présence des dossier décrits
|
// Vérification de la présence des dossier décrits
|
||||||
if (!is_dir(self::TEMP_DIR . $tempFolder . $src)) {
|
if (!is_dir(self::TEMP_DIR . $tempFolder . $src)) {
|
||||||
// Message de retour
|
// Message de retour
|
||||||
$this->removeDir(self::TEMP_DIR . $tempFolder);
|
$this->deleteDir(self::TEMP_DIR . $tempFolder);
|
||||||
$zip->close();
|
$zip->close();
|
||||||
return ([
|
return ([
|
||||||
'success' => false,
|
'success' => false,
|
||||||
@ -161,7 +156,7 @@ class plugin extends common
|
|||||||
// Interdire l'écriture dans le dossier core
|
// Interdire l'écriture dans le dossier core
|
||||||
if (strstr($dest, 'core') !== false) {
|
if (strstr($dest, 'core') !== false) {
|
||||||
// Message de retour
|
// Message de retour
|
||||||
$this->removeDir(self::TEMP_DIR . $tempFolder);
|
$this->deleteDir(self::TEMP_DIR . $tempFolder);
|
||||||
$zip->close();
|
$zip->close();
|
||||||
return ([
|
return ([
|
||||||
'success' => false,
|
'success' => false,
|
||||||
@ -176,7 +171,7 @@ class plugin extends common
|
|||||||
*/
|
*/
|
||||||
if (!file_exists(self::TEMP_DIR . $tempFolder . $module['name'] . '.php')) {
|
if (!file_exists(self::TEMP_DIR . $tempFolder . $module['name'] . '.php')) {
|
||||||
// Message de retour
|
// Message de retour
|
||||||
$this->removeDir(self::TEMP_DIR . $tempFolder);
|
$this->deleteDir(self::TEMP_DIR . $tempFolder);
|
||||||
$zip->close();
|
$zip->close();
|
||||||
return ([
|
return ([
|
||||||
'success' => false,
|
'success' => false,
|
||||||
@ -209,7 +204,7 @@ class plugin extends common
|
|||||||
$installOk = true;
|
$installOk = true;
|
||||||
} else {
|
} else {
|
||||||
// Message de retour
|
// Message de retour
|
||||||
$this->removeDir(self::TEMP_DIR . $tempFolder);
|
$this->deleteDir(self::TEMP_DIR . $tempFolder);
|
||||||
$zip->close();
|
$zip->close();
|
||||||
return ([
|
return ([
|
||||||
'success' => false,
|
'success' => false,
|
||||||
@ -234,7 +229,7 @@ class plugin extends common
|
|||||||
}
|
}
|
||||||
// Message de retour
|
// Message de retour
|
||||||
$t = isset($versionInstalled) ? helper::translate('actualisé') : helper::translate('installé');
|
$t = isset($versionInstalled) ? helper::translate('actualisé') : helper::translate('installé');
|
||||||
$this->removeDir(self::TEMP_DIR . $tempFolder);
|
$this->deleteDir(self::TEMP_DIR . $tempFolder);
|
||||||
$zip->close();
|
$zip->close();
|
||||||
return ([
|
return ([
|
||||||
'success' => $success,
|
'success' => $success,
|
||||||
@ -243,13 +238,14 @@ class plugin extends common
|
|||||||
: helper::translate('Erreur inconnue, le module n\'est pas installé')
|
: helper::translate('Erreur inconnue, le module n\'est pas installé')
|
||||||
]);
|
]);
|
||||||
} else {
|
} else {
|
||||||
|
// Supprimer le dossier temporaire
|
||||||
|
$this->deleteDir(self::TEMP_DIR . $tempFolder);
|
||||||
|
$zip->close();
|
||||||
return ([
|
return ([
|
||||||
'success' => false,
|
'success' => false,
|
||||||
'notification' => helper::translate('Erreur inconnue, le module n\'est pas installé')
|
'notification' => helper::translate('Erreur inconnue, le module n\'est pas installé')
|
||||||
]);
|
]);
|
||||||
// Supprimer le dossier temporaire
|
|
||||||
$this->removeDir(self::TEMP_DIR . $tempFolder);
|
|
||||||
$zip->close();
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Message de retour
|
// Message de retour
|
||||||
@ -266,7 +262,11 @@ class plugin extends common
|
|||||||
public function upload()
|
public function upload()
|
||||||
{
|
{
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
// Installation d'un module
|
// Installation d'un module
|
||||||
$checkValidMaj = $this->getInput('configModulesCheck', helper::FILTER_BOOLEAN);
|
$checkValidMaj = $this->getInput('configModulesCheck', helper::FILTER_BOOLEAN);
|
||||||
$zipFilename = $this->getInput('configModulesInstallation', helper::FILTER_STRING_SHORT);
|
$zipFilename = $this->getInput('configModulesInstallation', helper::FILTER_STRING_SHORT);
|
||||||
@ -291,13 +291,11 @@ class plugin extends common
|
|||||||
*/
|
*/
|
||||||
public function uploadItem()
|
public function uploadItem()
|
||||||
{
|
{
|
||||||
// Jeton incorrect
|
// Action interdite
|
||||||
if ($this->getUrl(3) !== $_SESSION['csrf']) {
|
if ($this->getUser('permission', __CLASS__, __FUNCTION__) !== true) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'store',
|
'access' => false
|
||||||
'state' => false,
|
|
||||||
'notification' => helper::translate('Action interdite')
|
|
||||||
]);
|
]);
|
||||||
} else {
|
} else {
|
||||||
// Récupérer le module en ligne
|
// Récupérer le module en ligne
|
||||||
@ -316,7 +314,7 @@ class plugin extends common
|
|||||||
mkdir(self::FILE_DIR . 'source/modules', 0755);
|
mkdir(self::FILE_DIR . 'source/modules', 0755);
|
||||||
}
|
}
|
||||||
// Sauver les données du fichiers
|
// Sauver les données du fichiers
|
||||||
file_put_contents(self::FILE_DIR . 'source/modules/' . $moduleFile, $moduleData);
|
$this->secure_file_put_contents(self::FILE_DIR . 'source/modules/' . $moduleFile, $moduleData);
|
||||||
|
|
||||||
// Installation directe
|
// Installation directe
|
||||||
if (file_exists(self::FILE_DIR . 'source/modules/' . $moduleFile)) {
|
if (file_exists(self::FILE_DIR . 'source/modules/' . $moduleFile)) {
|
||||||
@ -332,6 +330,7 @@ class plugin extends common
|
|||||||
'state' => $r['success']
|
'state' => $r['success']
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'title' => helper::translate('Catalogue de modules'),
|
'title' => helper::translate('Catalogue de modules'),
|
||||||
@ -379,11 +378,11 @@ class plugin extends common
|
|||||||
$store[$key]['category'],
|
$store[$key]['category'],
|
||||||
'<a href="' . self::BASEURL_STORE . self::MODULE_STORE . $key . '" target="_blank" >' . $store[$key]['title'] . '</a>',
|
'<a href="' . self::BASEURL_STORE . self::MODULE_STORE . $key . '" target="_blank" >' . $store[$key]['title'] . '</a>',
|
||||||
$store[$key]['version'],
|
$store[$key]['version'],
|
||||||
helper::dateUTF8('%d %B %Y', $store[$key]['versionDate']),
|
helper::dateUTF8('%d %B %Y', $store[$key]['versionDate'], self::$i18nUI),
|
||||||
implode(' - ', $pageInfos),
|
implode(' - ', $pageInfos),
|
||||||
template::button('moduleExport' . $key, [
|
template::button('moduleExport' . $key, [
|
||||||
'class' => $class,
|
'class' => $class,
|
||||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/uploadItem/' . $key . '/' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . $this->getUrl(0) . '/uploadItem/' . $key,
|
||||||
'value' => $ico,
|
'value' => $ico,
|
||||||
'help' => $help
|
'help' => $help
|
||||||
])
|
])
|
||||||
@ -405,7 +404,7 @@ class plugin extends common
|
|||||||
{
|
{
|
||||||
$store = json_decode(helper::getUrlContents(self::BASEURL_STORE . self::MODULE_STORE . 'list'), true);
|
$store = json_decode(helper::getUrlContents(self::BASEURL_STORE . self::MODULE_STORE . 'list'), true);
|
||||||
self::$storeItem = $store[$this->getUrl(2)];
|
self::$storeItem = $store[$this->getUrl(2)];
|
||||||
self::$storeItem['fileDate'] = helper::dateUTF8('%d %B %Y', self::$storeItem['fileDate']);
|
self::$storeItem['fileDate'] = helper::dateUTF8('%d %B %Y', self::$storeItem['fileDate'], self::$i18nUI);
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'title' => helper::translate('Module ' . self::$storeItem['title']),
|
'title' => helper::translate('Module ' . self::$storeItem['title']),
|
||||||
@ -413,6 +412,15 @@ class plugin extends common
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retourne le contenu du store en ligne
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public static function getStore() {
|
||||||
|
$store = json_decode(helper::getUrlContents(self::BASEURL_STORE . self::MODULE_STORE . 'list'), true);
|
||||||
|
return $store;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gestion des modules
|
* Gestion des modules
|
||||||
*/
|
*/
|
||||||
@ -454,7 +462,6 @@ class plugin extends common
|
|||||||
$pagesInfos[$keyi18n][$key]['moduleId'] = $value;
|
$pagesInfos[$keyi18n][$key]['moduleId'] = $value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recherche des modules orphelins dans toutes les langues
|
// Recherche des modules orphelins dans toutes les langues
|
||||||
@ -482,7 +489,7 @@ class plugin extends common
|
|||||||
$infoModules[$key]['delete'] === true
|
$infoModules[$key]['delete'] === true
|
||||||
? template::button('moduleDelete' . $key, [
|
? template::button('moduleDelete' . $key, [
|
||||||
'class' => 'moduleDelete buttonRed',
|
'class' => 'moduleDelete buttonRed',
|
||||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $key . '/' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $key,
|
||||||
'value' => template::ico('trash'),
|
'value' => template::ico('trash'),
|
||||||
'help' => 'Supprimer le module'
|
'help' => 'Supprimer le module'
|
||||||
])
|
])
|
||||||
@ -503,12 +510,12 @@ class plugin extends common
|
|||||||
$infoModules[$key]['version'],
|
$infoModules[$key]['version'],
|
||||||
'',
|
'',
|
||||||
template::button('moduleSave' . $key, [
|
template::button('moduleSave' . $key, [
|
||||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/save/filemanager/' . $key . '/' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . $this->getUrl(0) . '/save/filemanager/' . $key,
|
||||||
'value' => template::ico('download-cloud'),
|
'value' => template::ico('download-cloud'),
|
||||||
'help' => 'Sauvegarder le module dans le gestionnaire de fichiers'
|
'help' => 'Sauvegarder le module dans le gestionnaire de fichiers'
|
||||||
]),
|
]),
|
||||||
template::button('moduleDownload' . $key, [
|
template::button('moduleDownload' . $key, [
|
||||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/save/download/' . $key . '/' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . $this->getUrl(0) . '/save/download/' . $key,
|
||||||
'value' => template::ico('download'),
|
'value' => template::ico('download'),
|
||||||
'help' => 'Sauvegarder et télécharger le module'
|
'help' => 'Sauvegarder et télécharger le module'
|
||||||
])
|
])
|
||||||
@ -534,19 +541,19 @@ class plugin extends common
|
|||||||
$infoModules[$pagesInfos[$keyi18n][$keyPage]['moduleId']]['version'],
|
$infoModules[$pagesInfos[$keyi18n][$keyPage]['moduleId']]['version'],
|
||||||
template::flag($keyi18n, '20px') . ' <a href ="' . helper::baseUrl() . $keyPage . '" target="_blank">' . $pagesInfos[$keyi18n][$keyPage]['title'] . ' (' . $keyPage . ')</a>',
|
template::flag($keyi18n, '20px') . ' <a href ="' . helper::baseUrl() . $keyPage . '" target="_blank">' . $pagesInfos[$keyi18n][$keyPage]['title'] . ' (' . $keyPage . ')</a>',
|
||||||
template::button('dataExport' . $keyPage, [
|
template::button('dataExport' . $keyPage, [
|
||||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/dataExport/filemanager/' . self::$i18nContent . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . $this->getUrl(0) . '/dataExport/filemanager/' . self::$siteContent . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage,
|
||||||
// appel de fonction vaut exécution, utiliser un paramètre
|
// appel de fonction vaut exécution, utiliser un paramètre
|
||||||
'value' => template::ico('download-cloud'),
|
'value' => template::ico('download-cloud'),
|
||||||
'help' => 'Sauvegarder les données du module dans le gestionnaire de fichiers'
|
'help' => 'Sauvegarder les données du module dans le gestionnaire de fichiers'
|
||||||
]),
|
]),
|
||||||
template::button('dataExport' . $keyPage, [
|
template::button('dataExport' . $keyPage, [
|
||||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/dataExport/download/' . self::$i18nContent . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . $this->getUrl(0) . '/dataExport/download/' . self::$siteContent . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage,
|
||||||
// appel de fonction vaut exécution, utiliser un paramètre
|
// appel de fonction vaut exécution, utiliser un paramètre
|
||||||
'value' => template::ico('download'),
|
'value' => template::ico('download'),
|
||||||
'help' => 'Sauvegarder et télécharger les données du module'
|
'help' => 'Sauvegarder et télécharger les données du module'
|
||||||
]),
|
]),
|
||||||
template::button('dataDelete' . $keyPage, [
|
template::button('dataDelete' . $keyPage, [
|
||||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/dataDelete/' . self::$i18nContent . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . $this->getUrl(0) . '/dataDelete/' . self::$siteContent . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage,
|
||||||
// appel de fonction vaut exécution, utiliser un paramètre
|
// appel de fonction vaut exécution, utiliser un paramètre
|
||||||
'value' => template::ico('trash'),
|
'value' => template::ico('trash'),
|
||||||
'class' => 'buttonRed dataDelete',
|
'class' => 'buttonRed dataDelete',
|
||||||
@ -559,6 +566,9 @@ class plugin extends common
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Désactive l'icône rouge
|
||||||
|
$this->setData(['core', 'updateModuleAvailable', false]);
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'title' => helper::translate('Gestion des modules'),
|
'title' => helper::translate('Gestion des modules'),
|
||||||
@ -572,18 +582,15 @@ class plugin extends common
|
|||||||
*/
|
*/
|
||||||
public function save()
|
public function save()
|
||||||
{
|
{
|
||||||
// Jeton incorrect
|
// Action interdite
|
||||||
if ($this->getUrl(4) !== $_SESSION['csrf']) {
|
if ($this->getUser('permission', __CLASS__, __FUNCTION__) !== true) {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'plugin',
|
'access' => false
|
||||||
'state' => false,
|
|
||||||
'notification' => helper::translate('Action interdite')
|
|
||||||
]);
|
]);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// Créer un dossier temporaire
|
// Créer un dossier temporaire
|
||||||
$tmpFolder = self::TEMP_DIR . uniqid();
|
$tmpFolder = self::TEMP_DIR . uniqid() . '/';
|
||||||
if (!is_dir($tmpFolder)) {
|
if (!is_dir($tmpFolder)) {
|
||||||
mkdir($tmpFolder, 0755);
|
mkdir($tmpFolder, 0755);
|
||||||
}
|
}
|
||||||
@ -593,273 +600,43 @@ class plugin extends common
|
|||||||
|
|
||||||
// Descripteur de l'archive
|
// Descripteur de l'archive
|
||||||
$infoModule = helper::getModules();
|
$infoModule = helper::getModules();
|
||||||
//Nom de l'archive
|
|
||||||
$fileName = $moduleId . $infoModule[$moduleId]['version'] . '.zip';
|
|
||||||
|
|
||||||
// Régénération du module
|
//Nom de l'archive
|
||||||
$success = file_put_contents(self::MODULE_DIR . $moduleId . '/enum.json', json_encode($infoModule[$moduleId], JSON_UNESCAPED_UNICODE));
|
$fileName = $moduleId . str_replace('.', '-', $infoModule[$moduleId]['version']) . '.zip';
|
||||||
|
|
||||||
|
// Régénération du descripteur du module
|
||||||
|
file_put_contents(self::MODULE_DIR . $moduleId . '/enum.json', json_encode($infoModule[$moduleId], JSON_UNESCAPED_UNICODE));
|
||||||
|
|
||||||
// Construire l'archive
|
// Construire l'archive
|
||||||
$this->makeZip(self::TEMP_DIR . $fileName, self::MODULE_DIR . $moduleId);
|
$this->makeZip($tmpFolder . $fileName, self::MODULE_DIR . $moduleId);
|
||||||
|
|
||||||
switch ($action) {
|
switch ($action) {
|
||||||
case 'filemanager':
|
case 'filemanager':
|
||||||
if (!file_exists(self::FILE_DIR . 'source/modules')) {
|
if (is_dir(self::FILE_DIR . 'source/modules') === false) {
|
||||||
mkdir(self::FILE_DIR . 'source/modules');
|
mkdir(self::FILE_DIR . 'source/modules');
|
||||||
}
|
}
|
||||||
$success = $success || copy(self::TEMP_DIR . $fileName, self::FILE_DIR . 'source/modules/' . $moduleId . '.zip');
|
$success = copy($tmpFolder . $fileName, self::FILE_DIR . 'source/modules/' . $fileName);
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'plugin',
|
'redirect' => helper::baseUrl() . 'plugin',
|
||||||
'notification' => $success ? helper::translate('Archive copiée dans le dossier Modules du gestionnaire de fichier') : helper::translate('Erreur de copie'),
|
'notification' => $success ? helper::translate('Archive copiée dans le dossier Modules du gestionnaire de fichier') : helper::translate('Erreur de copie'),
|
||||||
'state' => $success
|
'state' => $success
|
||||||
]);
|
]);
|
||||||
// Nettoyage
|
|
||||||
unlink(self::TEMP_DIR . $fileName);
|
|
||||||
$this->removeDir($tmpFolder);
|
|
||||||
break;
|
break;
|
||||||
case 'download':
|
case 'download':
|
||||||
default:
|
|
||||||
|
|
||||||
// Téléchargement du ZIP
|
// Téléchargement du ZIP
|
||||||
header('Content-Description: File Transfer');
|
header('Content-Description: File Transfer');
|
||||||
header('Content-Type: application/octet-stream');
|
header('Content-Type: application/octet-stream');
|
||||||
header('Content-Transfer-Encoding: binary');
|
header('Content-Transfer-Encoding: binary');
|
||||||
header('Content-Disposition: attachment; filename="' . $fileName . '"');
|
header('Content-Disposition: attachment; filename="' . $fileName . '"');
|
||||||
header('Content-Length: ' . filesize(self::TEMP_DIR . $fileName));
|
header('Content-Length: ' . filesize($tmpFolder . $fileName));
|
||||||
readfile(self::TEMP_DIR . $fileName);
|
readfile($tmpFolder . $fileName);
|
||||||
// Nettoyage du dossier
|
|
||||||
unlink(self::TEMP_DIR . $fileName);
|
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Détacher un module d'une page en supprimant les données du module
|
|
||||||
* 2 : i18n id
|
|
||||||
* 3 : moduleId
|
|
||||||
* 4 : pageId
|
|
||||||
* 5 : CSRF
|
|
||||||
*/
|
|
||||||
public function dataDelete()
|
|
||||||
{
|
|
||||||
// Jeton incorrect
|
|
||||||
if ($this->getUrl(5) !== $_SESSION['csrf']) {
|
|
||||||
// Valeurs en sortie
|
|
||||||
$this->addOutput([
|
|
||||||
'redirect' => helper::baseUrl() . 'plugin',
|
|
||||||
'state' => false,
|
|
||||||
'notification' => helper::translate('Action interdite')
|
|
||||||
]);
|
|
||||||
} else {
|
|
||||||
$this->setData(['page', $this->getUrl(4), 'moduleId', '']);
|
|
||||||
$this->deleteData(['module', $this->getUrl(4)]);
|
|
||||||
// Valeurs en sortie
|
|
||||||
$this->addOutput([
|
|
||||||
'redirect' => helper::baseUrl() . 'plugin',
|
|
||||||
'notification' => sprintf(helper::translate('Le module %s de la page %s a été supprimé'), $this->getUrl(3), $this->getUrl(4)),
|
|
||||||
'state' => true
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Export des données d'un module
|
|
||||||
* Structure de l'adresse reçue
|
|
||||||
* 2 : i18n id
|
|
||||||
* 3 : moduleId
|
|
||||||
* 4 : pageId
|
|
||||||
* 5 : CSRF
|
|
||||||
*/
|
|
||||||
public function dataExport()
|
|
||||||
{
|
|
||||||
// Jeton incorrect
|
|
||||||
if ($this->getUrl(6) !== $_SESSION['csrf']) {
|
|
||||||
// Valeurs en sortie
|
|
||||||
$this->addOutput([
|
|
||||||
'redirect' => helper::baseUrl() . 'plugin',
|
|
||||||
'state' => false,
|
|
||||||
'notification' => helper::translate('Action interdite')
|
|
||||||
]);
|
|
||||||
} else {
|
|
||||||
|
|
||||||
// Créer un dossier temporaire
|
|
||||||
$tmpFolder = self::TEMP_DIR . uniqid();
|
|
||||||
if (!is_dir($tmpFolder)) {
|
|
||||||
mkdir($tmpFolder, 0755);
|
|
||||||
}
|
|
||||||
|
|
||||||
$action = $this->getUrl(2);
|
|
||||||
$lang = $this->getUrl(3);
|
|
||||||
$moduleId = $this->getUrl(4);
|
|
||||||
$pageId = $this->getUrl(5);
|
|
||||||
|
|
||||||
// DOnnèes du module de la page sélectionnée
|
|
||||||
$moduleData = $this->getData(['module', $pageId]);
|
|
||||||
|
|
||||||
// Descripteur du module
|
|
||||||
$infoModules = helper::getModules();
|
|
||||||
$infoModule = $infoModules[$moduleId];
|
|
||||||
|
|
||||||
// Copier les données et le descripteur
|
|
||||||
$success = file_put_contents($tmpFolder . '/module.json', json_encode($moduleData, JSON_UNESCAPED_UNICODE)) === false ? false : true;
|
|
||||||
|
|
||||||
$success = $success || is_int(file_put_contents($tmpFolder . '/enum.json', json_encode([$moduleId => $infoModule], JSON_UNESCAPED_UNICODE)));
|
|
||||||
// Le dossier du module s'il existe
|
|
||||||
if (is_dir(self::DATA_DIR . $moduleId . '/' . $pageId)) {
|
|
||||||
// Copier le dossier des données
|
|
||||||
$success = $success || $this->copyDir(self::DATA_DIR . '/' . $moduleId . '/' . $pageId, $tmpFolder . '/dataDirectory');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Création du zip
|
|
||||||
$fileName = $lang . '-' . $moduleId . '-' . $pageId . '.zip';
|
|
||||||
$this->makeZip(self::TEMP_DIR . $fileName, $tmpFolder);
|
|
||||||
|
|
||||||
// Gestion de l'action
|
|
||||||
if ($success) {
|
|
||||||
switch ($action) {
|
|
||||||
case 'filemanager':
|
|
||||||
if (!file_exists(self::FILE_DIR . 'source/modules')) {
|
|
||||||
mkdir(self::FILE_DIR . 'source/modules');
|
|
||||||
}
|
|
||||||
if (file_exists(self::TEMP_DIR . $fileName)) {
|
|
||||||
$success = $success || copy(self::TEMP_DIR . $fileName, self::FILE_DIR . 'source/modules/data' . $moduleId . '.zip');
|
|
||||||
// Valeurs en sortie
|
|
||||||
$this->addOutput([
|
|
||||||
'redirect' => helper::baseUrl() . 'plugin',
|
|
||||||
'notification' => $success ? helper::translate('Données copiées dans le dossier Module du gestionnaire de fichier') : helper::translate('Erreur de copie'),
|
|
||||||
'state' => $success
|
|
||||||
]);
|
|
||||||
// Nettoyage
|
// Nettoyage
|
||||||
unlink(self::TEMP_DIR . $fileName);
|
unlink(self::TEMP_DIR . $fileName);
|
||||||
$this->removeDir($tmpFolder);
|
$this->deleteDir($tmpFolder);
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'download':
|
|
||||||
default:
|
|
||||||
if (file_exists(self::TEMP_DIR . $fileName)) {
|
|
||||||
// Téléchargement du ZIP
|
|
||||||
header('Content-Description: File Transfer');
|
|
||||||
header('Content-Type: application/octet-stream');
|
|
||||||
header('Content-Transfer-Encoding: binary');
|
|
||||||
header('Content-Disposition: attachment; filename="' . $fileName . '"');
|
|
||||||
header('Content-Length: ' . filesize(self::TEMP_DIR . $fileName));
|
|
||||||
readfile(self::TEMP_DIR . $fileName);
|
|
||||||
// Nettoyage du dossier
|
|
||||||
unlink(self::TEMP_DIR . $fileName);
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Valeurs en sortie
|
|
||||||
$this->addOutput([
|
|
||||||
'redirect' => helper::baseUrl() . 'plugin',
|
|
||||||
'notification' => helper::translate('Erreur inconnue'),
|
|
||||||
'state' => false
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Importer des données d'un module externes ou interne à module.json
|
|
||||||
*/
|
|
||||||
public function dataImport()
|
|
||||||
{
|
|
||||||
|
|
||||||
// Soumission du formulaire d'importation du module dans une page libre
|
|
||||||
if ($this->isPost()) {
|
|
||||||
// Récupérer le fichier et le décompacter
|
|
||||||
$zipFilename = $this->getInput('pluginImportFile', helper::FILTER_STRING_SHORT, true);
|
|
||||||
$pageId = $this->getInput('pluginImportPage', null, true);
|
|
||||||
$tmpFolder = uniqid();
|
|
||||||
|
|
||||||
// Extraction dans un dossier temporaire
|
|
||||||
mkdir(self::TEMP_DIR . $tmpFolder, 0755);
|
|
||||||
$zip = new ZipArchive();
|
|
||||||
if ($zip->open(self::FILE_DIR . 'source/' . $zipFilename) === TRUE) {
|
|
||||||
$zip->extractTo(self::TEMP_DIR . $tmpFolder);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lire le descripteur
|
|
||||||
$descripteur = json_decode(file_get_contents(self::TEMP_DIR . $tmpFolder . '/enum.json'), true);
|
|
||||||
$moduleId = array_key_first($descripteur);
|
|
||||||
|
|
||||||
// Lecture des données du module
|
|
||||||
$moduleData = json_decode(file_get_contents(self::TEMP_DIR . $tmpFolder . '/module.json'), true);
|
|
||||||
|
|
||||||
// Chargement des données du module importé
|
|
||||||
$this->setData(['module', $pageId, $moduleData]);
|
|
||||||
|
|
||||||
// Intégration des données du module importé dans la page
|
|
||||||
$this->setData(['page', $pageId, 'moduleId', $moduleId]);
|
|
||||||
|
|
||||||
// Copie des fichiers d'accompagnement
|
|
||||||
// Le dossier du module s'il existe
|
|
||||||
if (is_dir($tmpFolder . '/dataDirectory')) {
|
|
||||||
// Copier le dossier des données
|
|
||||||
$this->copyDir($tmpFolder . '/dataDirectory', self::DATA_DIR . '/' . $moduleId . '/' . $pageId);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Supprimer le dossier temporaire
|
|
||||||
$this->removeDir(self::TEMP_DIR . $tmpFolder);
|
|
||||||
$zip->close();
|
|
||||||
|
|
||||||
// Valeurs en sortie
|
|
||||||
$this->addOutput([
|
|
||||||
'redirect' => helper::baseUrl() . 'plugin',
|
|
||||||
'state' => true,
|
|
||||||
'notification' => helper::translate('Données importées')
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
// Bouton d'importation des données d'un module spécifique
|
|
||||||
if (count(explode('/', $this->getUrl())) === 6) {
|
|
||||||
// Jeton incorrect
|
|
||||||
if ($this->getUrl(3) !== $_SESSION['csrf']) {
|
|
||||||
// Valeurs en sortie
|
|
||||||
$this->addOutput([
|
|
||||||
'redirect' => helper::baseUrl() . 'plugin',
|
|
||||||
'state' => false,
|
|
||||||
'notification' => helper::translate('Action interdite')
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Traitement
|
|
||||||
|
|
||||||
// Valeurs en sortie
|
|
||||||
$this->addOutput([
|
|
||||||
'redirect' => helper::baseUrl() . 'plugin',
|
|
||||||
'state' => true,
|
|
||||||
'notification' => helper::translate('Données importées')
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Liste des pages sans module
|
|
||||||
* et ne sont pas des barres latérales
|
|
||||||
*/
|
|
||||||
self::$pagesList = $this->getHierarchy(null, null, null);
|
|
||||||
foreach (self::$pagesList as $page => $value) {
|
|
||||||
if (
|
|
||||||
$this->getData(['page', $page, 'block']) === 'bar' ||
|
|
||||||
//$this->getData(['page',$page,'disable']) === true ||
|
|
||||||
$this->getData(['page', $page, 'moduleId']) !== ''
|
|
||||||
) {
|
|
||||||
unset(self::$pagesList[$page]);
|
|
||||||
} else {
|
|
||||||
self::$pagesList[$page] = $page;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Valeurs en sortie
|
|
||||||
$this->addOutput([
|
|
||||||
'title' => helper::translate('Importer des données de module'),
|
|
||||||
'view' => 'dataImport'
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -1,37 +0,0 @@
|
|||||||
<?php echo template::formOpen('pluginImportForm'); ?>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col1">
|
|
||||||
<?php echo template::button('pluginImportBack', [
|
|
||||||
'class' => 'buttonGrey',
|
|
||||||
'href' => helper::baseUrl() . 'plugin',
|
|
||||||
'value' => template::ico('left')
|
|
||||||
]); ?>
|
|
||||||
</div>
|
|
||||||
<div class="col2 offset9">
|
|
||||||
<?php echo template::submit('pluginImportSubmit', [
|
|
||||||
'value' => 'Appliquer'
|
|
||||||
]); ?>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col12">
|
|
||||||
<div class="block">
|
|
||||||
<h4><?php echo helper::translate('Installer les données d\'un module'); ?>
|
|
||||||
</h4>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col6">
|
|
||||||
<?php echo template::file('pluginImportFile', [
|
|
||||||
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
|
|
||||||
'label' => 'Archive ZIP',
|
|
||||||
'type' => 2
|
|
||||||
]); ?>
|
|
||||||
</div>
|
|
||||||
<div class="col6">
|
|
||||||
<?php echo template::select('pluginImportPage', $module::$pagesList, [
|
|
||||||
'label' => 'Importer dans' . template::flag('selected', '20px')
|
|
||||||
]); ?>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
@ -17,31 +17,3 @@
|
|||||||
* admin.css
|
* admin.css
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/* Style the tab */
|
|
||||||
.tab {
|
|
||||||
margin-top: 1.8em;
|
|
||||||
overflow: hidden;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tab ~ .tabContent {
|
|
||||||
margin-top: -10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.buttonTab {
|
|
||||||
display: inline-block;
|
|
||||||
transition: 0.3s;
|
|
||||||
border-radius: 10px 10px 0px 0px;
|
|
||||||
width: 200px;
|
|
||||||
margin: 0 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.buttonTab:hover {
|
|
||||||
filter: saturate(200%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.activeButton {
|
|
||||||
background-color: #00BFFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
/**
|
|
||||||
* This file is part of Zwii.
|
|
||||||
* For full copyright and license information, please see the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*
|
|
||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
|
||||||
* @link http://zwiicms.fr/
|
|
||||||
*/
|
|
||||||
function setCookie(name,value,days){var expires="";if(days){var date=new Date;date.setTime(date.getTime()+24*days*60*60*1e3),expires="; expires="+date.toUTCString()}document.cookie=name+"="+(value||"")+expires+"; path=/; samesite=lax"}function getCookie(name){for(var nameEQ=name+"=",ca=document.cookie.split(";"),i=0;i<ca.length;i++){for(var c=ca[i];" "==c.charAt(0);)c=c.substring(1,c.length);if(0==c.indexOf(nameEQ))return c.substring(nameEQ.length,c.length)}return null}function capitalizeFirstLetter(string){return string.charAt(0).toUpperCase()+string.slice(1)}$(document).ready((function(){var pluginLayout=getCookie("pluginLayout");null==pluginLayout&&(pluginLayout="module",setCookie("pluginLayout","module")),console.log(pluginLayout),$("#moduleContainer").hide(),$("#dataContainer").hide(),$("#"+pluginLayout+"Container").show(),$("#plugin"+capitalizeFirstLetter(pluginLayout)+"Button").addClass("activeButton")})),$(".moduleDelete").on("click",(function(){var _this=$(this),message_delete="<?php echo helper::translate('Confirmer la désinstallation du module'); ?>";return core.confirm(message_delete,(function(){$(location).attr("href",_this.attr("href"))}))})),$(".dataDelete").on("click",(function(){var _this=$(this),message_unlink="<?php echo helper::translate('Confirmer la dissociation du module de cette page'); ?>";return core.confirm(message_unlink,(function(){$(location).attr("href",_this.attr("href"))}))})),$("#pluginModuleButton").on("click",(function(){$("#dataContainer").hide(),$("#moduleContainer").show(),$("#pluginModuleButton").addClass("activeButton"),$("#pluginDataButton").removeClass("activeButton"),setCookie("pluginLayout","module")})),$("#pluginDataButton").on("click",(function(){$("#moduleContainer").hide(),$("#dataContainer").show(),$("#pluginModuleButton").removeClass("activeButton"),$("#pluginDataButton").addClass("activeButton"),setCookie("pluginLayout","data")}));
|
|
@ -3,7 +3,7 @@
|
|||||||
<?php echo template::button('configModulesBack', [
|
<?php echo template::button('configModulesBack', [
|
||||||
'class' => 'buttonGrey',
|
'class' => 'buttonGrey',
|
||||||
'href' => helper::baseUrl(),
|
'href' => helper::baseUrl(),
|
||||||
'value' => template::ico('left')
|
'value' => template::ico('home')
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col1">
|
<div class="col1">
|
||||||
@ -30,22 +30,12 @@
|
|||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="tab">
|
|
||||||
<?php echo template::button('pluginModuleButton', [
|
|
||||||
'value' => 'Modules installés',
|
|
||||||
'class' => ' buttonTab'
|
|
||||||
]); ?>
|
|
||||||
<?php echo template::button('pluginDataButton', [
|
|
||||||
'value' => 'Données des modules',
|
|
||||||
'class' => 'buttonTab'
|
|
||||||
]); ?>
|
|
||||||
</div>
|
|
||||||
<div class="tabContent" id="moduleContainer">
|
|
||||||
<?php if ($module::$modulesInstalled): ?>
|
<?php if ($module::$modulesInstalled): ?>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col12">
|
<div class="col12">
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<h4><?php echo helper::translate('Sauvegarde'); ?>
|
<h4>
|
||||||
|
<?php echo helper::translate('Sauvegarde'); ?>
|
||||||
</h4>
|
</h4>
|
||||||
<?php echo template::table([2, 2, 1, 5, 1, 1], $module::$modulesInstalled, ['Module', 'Identifiant', 'Version', '', '', '']); ?>
|
<?php echo template::table([2, 2, 1, 5, 1, 1], $module::$modulesInstalled, ['Module', 'Identifiant', 'Version', '', '', '']); ?>
|
||||||
</div>
|
</div>
|
||||||
@ -58,7 +48,8 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col12">
|
<div class="col12">
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<h4><?php echo helper::translate('Modules orphelins'); ?>
|
<h4>
|
||||||
|
<?php echo helper::translate('Modules orphelins'); ?>
|
||||||
</h4>
|
</h4>
|
||||||
<?php echo template::table([2, 2, 1, 6, 1], $module::$modulesOrphan, ['Module', 'Identifiant', 'Version', '', '']); ?>
|
<?php echo template::table([2, 2, 1, 6, 1], $module::$modulesOrphan, ['Module', 'Identifiant', 'Version', '', '']); ?>
|
||||||
</div>
|
</div>
|
||||||
@ -67,33 +58,3 @@
|
|||||||
<?php else: ?>
|
<?php else: ?>
|
||||||
<?php echo template::speech('Aucun module orphelin.'); ?>
|
<?php echo template::speech('Aucun module orphelin.'); ?>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</div>
|
|
||||||
<div class="tabContent displayNone" id="dataContainer">
|
|
||||||
<?php if ($module::$modulesData) : ?>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col12">
|
|
||||||
<div class="block">
|
|
||||||
<h4>
|
|
||||||
<?php echo helper::translate('Modules configurés'); ?>
|
|
||||||
</h4>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col1 offset11">
|
|
||||||
<?php echo template::button('configModuledataImport', [
|
|
||||||
'href' => helper::baseUrl() . 'plugin/dataImport',
|
|
||||||
'value' => template::ico('upload'),
|
|
||||||
"help" => 'Importer des données de module dans une page libre'
|
|
||||||
]); ?>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col12">
|
|
||||||
<?php echo template::table([4, 1, 4, 1, 1, 1], $module::$modulesData, ['Module', 'Version', 'Page associée', '', '', '']); ?>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<?php else : ?>
|
|
||||||
<?php echo template::speech('Aucune donnée de module.'); ?>
|
|
||||||
<?php endif; ?>
|
|
||||||
</div>
|
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
* @copyright : Frédéric Tempez <frederic.tempez@outlook.com>
|
* @copyright : Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class theme extends common
|
class theme extends common
|
||||||
@ -31,7 +31,7 @@ class theme extends common
|
|||||||
'export' => self::GROUP_ADMIN,
|
'export' => self::GROUP_ADMIN,
|
||||||
'import' => self::GROUP_ADMIN,
|
'import' => self::GROUP_ADMIN,
|
||||||
'save' => self::GROUP_ADMIN,
|
'save' => self::GROUP_ADMIN,
|
||||||
'fonts' => self::GROUP_ADMIN,
|
'font' => self::GROUP_ADMIN,
|
||||||
'fontAdd' => self::GROUP_ADMIN,
|
'fontAdd' => self::GROUP_ADMIN,
|
||||||
'fontEdit' => self::GROUP_ADMIN,
|
'fontEdit' => self::GROUP_ADMIN,
|
||||||
'fontDelete' => self::GROUP_ADMIN
|
'fontDelete' => self::GROUP_ADMIN
|
||||||
@ -105,7 +105,8 @@ class theme extends common
|
|||||||
'2.4vmax' => '240%'
|
'2.4vmax' => '240%'
|
||||||
];
|
];
|
||||||
public static $headerHeights = [
|
public static $headerHeights = [
|
||||||
'unset' => 'Libre', // texte dynamique cf header.js.php
|
'unset' => 'Libre',
|
||||||
|
// texte dynamique cf header.js.php
|
||||||
'100px' => '100px',
|
'100px' => '100px',
|
||||||
'150px' => '150px',
|
'150px' => '150px',
|
||||||
'200px' => '200px',
|
'200px' => '200px',
|
||||||
@ -213,7 +214,7 @@ class theme extends common
|
|||||||
'750px' => '750 pixels',
|
'750px' => '750 pixels',
|
||||||
'960px' => '960 pixels',
|
'960px' => '960 pixels',
|
||||||
'1170px' => '1170 pixels',
|
'1170px' => '1170 pixels',
|
||||||
'100%' => '100%'
|
'100%' => '100%',
|
||||||
];
|
];
|
||||||
public static $headerWide = [
|
public static $headerWide = [
|
||||||
'auto auto' => 'Automatique',
|
'auto auto' => 'Automatique',
|
||||||
@ -248,8 +249,13 @@ class theme extends common
|
|||||||
public function admin()
|
public function admin()
|
||||||
{
|
{
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
$this->setData(['admin', [
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
|
$this->setData([
|
||||||
|
'admin',
|
||||||
|
[
|
||||||
'backgroundColor' => $this->getInput('adminBackgroundColor'),
|
'backgroundColor' => $this->getInput('adminBackgroundColor'),
|
||||||
'colorTitle' => $this->getInput('adminColorTitle'),
|
'colorTitle' => $this->getInput('adminColorTitle'),
|
||||||
'colorText' => $this->getInput('adminColorText'),
|
'colorText' => $this->getInput('adminColorText'),
|
||||||
@ -263,7 +269,9 @@ class theme extends common
|
|||||||
'fontTitle' => $this->getInput('adminFontTitle'),
|
'fontTitle' => $this->getInput('adminFontTitle'),
|
||||||
'backgroundBlockColor' => $this->getInput('adminBackGroundBlockColor'),
|
'backgroundBlockColor' => $this->getInput('adminBackGroundBlockColor'),
|
||||||
'borderBlockColor' => $this->getInput('adminBorderBlockColor'),
|
'borderBlockColor' => $this->getInput('adminBorderBlockColor'),
|
||||||
]]);
|
'width' => $this->getInput('adminSiteWidth'),
|
||||||
|
]
|
||||||
|
]);
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'notification' => helper::translate('Modifications enregistrées'),
|
'notification' => helper::translate('Modifications enregistrées'),
|
||||||
@ -291,9 +299,12 @@ class theme extends common
|
|||||||
public function advanced()
|
public function advanced()
|
||||||
{
|
{
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
// Enregistre le CSS
|
// Enregistre le CSS
|
||||||
file_put_contents(self::DATA_DIR . 'custom.css', $this->getInput('themeAdvancedCss', null));
|
$this->secure_file_put_contents(self::DATA_DIR . 'custom.css', $this->getInput('themeAdvancedCss', null));
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'notification' => helper::translate('Modifications enregistrées'),
|
'notification' => helper::translate('Modifications enregistrées'),
|
||||||
@ -317,8 +328,14 @@ class theme extends common
|
|||||||
public function body()
|
public function body()
|
||||||
{
|
{
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
$this->setData(['theme', 'body', [
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
|
$this->setData([
|
||||||
|
'theme',
|
||||||
|
'body',
|
||||||
|
[
|
||||||
'backgroundColor' => $this->getInput('themeBodyBackgroundColor'),
|
'backgroundColor' => $this->getInput('themeBodyBackgroundColor'),
|
||||||
'image' => $this->getInput('themeBodyImage'),
|
'image' => $this->getInput('themeBodyImage'),
|
||||||
'imageAttachment' => $this->getInput('themeBodyImageAttachment'),
|
'imageAttachment' => $this->getInput('themeBodyImageAttachment'),
|
||||||
@ -327,7 +344,8 @@ class theme extends common
|
|||||||
'imageSize' => $this->getInput('themeBodyImageSize'),
|
'imageSize' => $this->getInput('themeBodyImageSize'),
|
||||||
'toTopbackgroundColor' => $this->getInput('themeBodyToTopBackground'),
|
'toTopbackgroundColor' => $this->getInput('themeBodyToTopBackground'),
|
||||||
'toTopColor' => $this->getInput('themeBodyToTopColor')
|
'toTopColor' => $this->getInput('themeBodyToTopColor')
|
||||||
]]);
|
]
|
||||||
|
]);
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'notification' => helper::translate('Modifications enregistrées'),
|
'notification' => helper::translate('Modifications enregistrées'),
|
||||||
@ -351,7 +369,10 @@ class theme extends common
|
|||||||
public function footer()
|
public function footer()
|
||||||
{
|
{
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
if (
|
if (
|
||||||
$this->getInput('themeFooterCopyrightPosition') === 'hide' &&
|
$this->getInput('themeFooterCopyrightPosition') === 'hide' &&
|
||||||
$this->getInput('themeFooterSocialsPosition') === 'hide' &&
|
$this->getInput('themeFooterSocialsPosition') === 'hide' &&
|
||||||
@ -364,7 +385,10 @@ class theme extends common
|
|||||||
'state' => false
|
'state' => false
|
||||||
]);
|
]);
|
||||||
} else {
|
} else {
|
||||||
$this->setData(['theme', 'footer', [
|
$this->setData([
|
||||||
|
'theme',
|
||||||
|
'footer',
|
||||||
|
[
|
||||||
'backgroundColor' => $this->getInput('themeFooterBackgroundColor'),
|
'backgroundColor' => $this->getInput('themeFooterBackgroundColor'),
|
||||||
'copyrightAlign' => $this->getInput('themeFooterCopyrightAlign'),
|
'copyrightAlign' => $this->getInput('themeFooterCopyrightAlign'),
|
||||||
'height' => $this->getInput('themeFooterHeight'),
|
'height' => $this->getInput('themeFooterHeight'),
|
||||||
@ -391,10 +415,11 @@ class theme extends common
|
|||||||
'displaySearch' => $this->getInput('themeFooterDisplaySearch', helper::FILTER_BOOLEAN),
|
'displaySearch' => $this->getInput('themeFooterDisplaySearch', helper::FILTER_BOOLEAN),
|
||||||
'memberBar' => $this->getInput('themeFooterMemberBar', helper::FILTER_BOOLEAN),
|
'memberBar' => $this->getInput('themeFooterMemberBar', helper::FILTER_BOOLEAN),
|
||||||
'template' => $this->getInput('themeFooterTemplate')
|
'template' => $this->getInput('themeFooterTemplate')
|
||||||
]]);
|
]
|
||||||
|
]);
|
||||||
|
|
||||||
// Sauvegarder la configuration localisée
|
// Sauvegarder la configuration localisée
|
||||||
$this->setData(['locale', 'legalPageId', $this->getInput('configLegalPageId')]);
|
$this->setData(['locale', 'legalPageId', $this->getInput('configLegalPageId')], false);
|
||||||
$this->setData(['locale', 'searchPageId', $this->getInput('configSearchPageId')]);
|
$this->setData(['locale', 'searchPageId', $this->getInput('configSearchPageId')]);
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
@ -437,7 +462,10 @@ class theme extends common
|
|||||||
public function header()
|
public function header()
|
||||||
{
|
{
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
// Modification des URL des images dans la bannière perso
|
// Modification des URL des images dans la bannière perso
|
||||||
$featureContent = $this->getInput('themeHeaderText', null);
|
$featureContent = $this->getInput('themeHeaderText', null);
|
||||||
/**
|
/**
|
||||||
@ -453,7 +481,10 @@ class theme extends common
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Sauvegarder
|
// Sauvegarder
|
||||||
$this->setData(['theme', 'header', [
|
$this->setData([
|
||||||
|
'theme',
|
||||||
|
'header',
|
||||||
|
[
|
||||||
'backgroundColor' => $this->getInput('themeHeaderBackgroundColor'),
|
'backgroundColor' => $this->getInput('themeHeaderBackgroundColor'),
|
||||||
'font' => $this->getInput('themeHeaderFont'),
|
'font' => $this->getInput('themeHeaderFont'),
|
||||||
'fontSize' => $this->getInput('themeHeaderFontSize'),
|
'fontSize' => $this->getInput('themeHeaderFontSize'),
|
||||||
@ -475,21 +506,24 @@ class theme extends common
|
|||||||
'feature' => $this->getInput('themeHeaderFeature'),
|
'feature' => $this->getInput('themeHeaderFeature'),
|
||||||
'featureContent' => $featureContent,
|
'featureContent' => $featureContent,
|
||||||
'featureFiles' => $files
|
'featureFiles' => $files
|
||||||
]]);
|
]
|
||||||
|
], false);
|
||||||
// Modification de la position du menu selon la position de la bannière
|
// Modification de la position du menu selon la position de la bannière
|
||||||
if ($this->getData(['theme', 'header', 'position']) == 'site') {
|
if ($this->getData(['theme', 'header', 'position']) == 'site') {
|
||||||
$this->setData(['theme', 'menu', 'position', str_replace('body-', 'site-', $this->getData(['theme', 'menu', 'position']))]);
|
$this->setData(['theme', 'menu', 'position', str_replace('body-', 'site-', $this->getData(['theme', 'menu', 'position']))], false);
|
||||||
}
|
}
|
||||||
if ($this->getData(['theme', 'header', 'position']) == 'body') {
|
if ($this->getData(['theme', 'header', 'position']) == 'body') {
|
||||||
$this->setData(['theme', 'menu', 'position', str_replace('site-', 'body-', $this->getData(['theme', 'menu', 'position']))]);
|
$this->setData(['theme', 'menu', 'position', str_replace('site-', 'body-', $this->getData(['theme', 'menu', 'position']))], false);
|
||||||
}
|
}
|
||||||
// Menu accroché à la bannière qui devient cachée
|
// Menu accroché à la bannière qui devient cachée
|
||||||
if (
|
if (
|
||||||
$this->getData(['theme', 'header', 'position']) == 'hide' &&
|
$this->getData(['theme', 'header', 'position']) == 'hide' &&
|
||||||
in_array($this->getData(['theme', 'menu', 'position']), ['body-first', 'site-first', 'body-first', 'site-second'])
|
in_array($this->getData(['theme', 'menu', 'position']), ['body-first', 'site-first', 'body-first', 'site-second'])
|
||||||
) {
|
) {
|
||||||
$this->setData(['theme', 'menu', 'position', 'site']);
|
$this->setData(['theme', 'menu', 'position', 'site'], false);
|
||||||
}
|
}
|
||||||
|
// Force la sauvegarde
|
||||||
|
$this->saveDB('theme');
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'notification' => helper::translate('Modifications enregistrées'),
|
'notification' => helper::translate('Modifications enregistrées'),
|
||||||
@ -534,8 +568,14 @@ class theme extends common
|
|||||||
public function menu()
|
public function menu()
|
||||||
{
|
{
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
$this->setData(['theme', 'menu', [
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
|
$this->setData([
|
||||||
|
'theme',
|
||||||
|
'menu',
|
||||||
|
[
|
||||||
'backgroundColor' => $this->getInput('themeMenuBackgroundColor'),
|
'backgroundColor' => $this->getInput('themeMenuBackgroundColor'),
|
||||||
'backgroundColorSub' => $this->getInput('themeMenuBackgroundColorSub'),
|
'backgroundColorSub' => $this->getInput('themeMenuBackgroundColorSub'),
|
||||||
'font' => $this->getInput('themeMenuFont'),
|
'font' => $this->getInput('themeMenuFont'),
|
||||||
@ -558,7 +598,8 @@ class theme extends common
|
|||||||
'memberBar' => $this->getInput('themeMenuMemberBar', helper::FILTER_BOOLEAN),
|
'memberBar' => $this->getInput('themeMenuMemberBar', helper::FILTER_BOOLEAN),
|
||||||
'burgerLogo' => $this->getInput('themeMenuBurgerLogo'),
|
'burgerLogo' => $this->getInput('themeMenuBurgerLogo'),
|
||||||
'burgerContent' => $this->getInput('themeMenuBurgerContent')
|
'burgerContent' => $this->getInput('themeMenuBurgerContent')
|
||||||
]]);
|
]
|
||||||
|
]);
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'notification' => helper::translate('Modifications enregistrées'),
|
'notification' => helper::translate('Modifications enregistrées'),
|
||||||
@ -583,56 +624,55 @@ class theme extends common
|
|||||||
/**
|
/**
|
||||||
* Options des fontes
|
* Options des fontes
|
||||||
*/
|
*/
|
||||||
public function fonts()
|
public function font()
|
||||||
{
|
{
|
||||||
|
|
||||||
// Toutes les fontes installées sont chargées
|
// Toutes les fontes installées sont chargées
|
||||||
$this->setFonts('all');
|
$this->setFonts('all');
|
||||||
|
|
||||||
|
// Polices liées au thème admin
|
||||||
|
$fonts['Titre (admin)'] = $this->getData(['admin', 'fontTitle']);
|
||||||
|
$fonts['Texte (admin)'] = $this->getData(['admin', 'fontText']);
|
||||||
|
|
||||||
// Polices liées au thème
|
// Polices liées au thème
|
||||||
$used = [
|
$fonts['Bannière'] = $this->getData(['theme', 'header', 'font']);
|
||||||
'Bannière' => $this->getData(['theme', 'header', 'font']),
|
$fonts['Menu'] = $this->getData(['theme', 'menu', 'font']);
|
||||||
'Menu' => $this->getData(['theme', 'menu', 'font']),
|
$fonts['Titre'] = $this->getData(['theme', 'title', 'font']);
|
||||||
'Titre ' => $this->getData(['theme', 'title', 'font']),
|
$fonts['Texte'] = $this->getData(['theme', 'text', 'font']);
|
||||||
'Texte' => $this->getData(['theme', 'text', 'font']),
|
$fonts['Pied de page'] = $this->getData(['theme', 'footer', 'font']);
|
||||||
'Pied de page' => $this->getData(['theme', 'footer', 'font']),
|
|
||||||
'Titre (admin)' => $this->getData(['admin', 'fontTitle']),
|
|
||||||
'Admin (texte)' => $this->getData(['admin', 'fontText'])
|
|
||||||
];
|
|
||||||
|
|
||||||
// Récupérer le détail des fontes installées
|
// Récupérer le détail des fontes installées
|
||||||
//$f = $this->getFonts();
|
//$f = $this->getFonts();
|
||||||
$f['files'] = $this->getData(['fonts', 'files']);
|
$f['files'] = $this->getData(['font', 'files']);
|
||||||
$f['imported'] = $this->getData(['fonts', 'imported']);
|
$f['imported'] = $this->getData(['font', 'imported']);
|
||||||
$f['websafe'] = self::$fontsWebSafe;
|
$f['websafe'] = self::$fontsWebSafe;
|
||||||
|
|
||||||
// Parcourir les fontes disponibles et construire le tableau pour le formulaire
|
// Parcourir les fontes disponibles et construire le tableau pour le formulaire
|
||||||
foreach ($f as $type => $typeValue) {
|
foreach ($f as $type => $typeValue) {
|
||||||
if (is_array($typeValue)) {
|
if (is_array($typeValue)) {
|
||||||
foreach ($typeValue as $fontId => $fontValue) {
|
foreach ($typeValue as $fontId => $fontValue) {
|
||||||
// Fontes utilisées par les thèmes
|
// Recherche les correspondances
|
||||||
$fontUsed[$fontId] = '';
|
$result = array_filter($fonts, function ($value) use ($fontId) {
|
||||||
foreach ($used as $key => $value) {
|
return $value == $fontId;
|
||||||
if ($value === $fontId) {
|
});
|
||||||
$fontUsed[$fontId] .= $key . '<br/>';
|
$keyResults = array_keys($result);
|
||||||
}
|
// Préparation du tableau
|
||||||
}
|
|
||||||
self::$fontsDetail[] = [
|
self::$fontsDetail[] = [
|
||||||
$fontId,
|
$fontId,
|
||||||
'<span style="font-family:' . $f[$type][$fontId]['font-family'] . '">' . $f[$type][$fontId]['name'] . '</span>',
|
'<span style="font-family:' . $f[$type][$fontId]['font-family'] . '">' . $f[$type][$fontId]['name'] . '</span>',
|
||||||
$f[$type][$fontId]['font-family'],
|
$f[$type][$fontId]['font-family'],
|
||||||
$fontUsed[$fontId],
|
empty($keyResults) ? '' : '<span class="fontsList">' . implode('<br />', $keyResults) . '</span>',
|
||||||
$type,
|
$type,
|
||||||
$type !== 'websafe' ? template::button('themeFontEdit' . $fontId, [
|
$type !== 'websafe' ? template::button('themeFontEdit' . $fontId, [
|
||||||
'class' => 'themeFontEdit',
|
'class' => 'themeFontEdit',
|
||||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/fontEdit/' . $type . '/' . $fontId . '/' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . $this->getUrl(0) . '/fontEdit/' . $type . '/' . $fontId,
|
||||||
'value' => template::ico('pencil'),
|
'value' => template::ico('pencil'),
|
||||||
'disabled' => !empty($fontUsed[$fontId])
|
//'disabled' => !empty($fontUsed[$fontId])
|
||||||
])
|
])
|
||||||
: '',
|
: '',
|
||||||
$type !== 'websafe' ? template::button('themeFontDelete' . $fontId, [
|
$type !== 'websafe' ? template::button('themeFontDelete' . $fontId, [
|
||||||
'class' => 'themeFontDelete buttonRed',
|
'class' => 'themeFontDelete buttonRed',
|
||||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/fontDelete/' . $type . '/' . $fontId . '/' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . $this->getUrl(0) . '/fontDelete/' . $type . '/' . $fontId,
|
||||||
'value' => template::ico('cancel'),
|
'value' => template::ico('cancel'),
|
||||||
'disabled' => !empty($fontUsed[$fontId])
|
'disabled' => !empty($fontUsed[$fontId])
|
||||||
])
|
])
|
||||||
@ -645,7 +685,10 @@ class theme extends common
|
|||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'title' => helper::translate('Fontes'),
|
'title' => helper::translate('Fontes'),
|
||||||
'view' => 'fonts'
|
'view' => 'font',
|
||||||
|
'vendor' => [
|
||||||
|
'datatables'
|
||||||
|
]
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -655,12 +698,15 @@ class theme extends common
|
|||||||
public function fontAdd()
|
public function fontAdd()
|
||||||
{
|
{
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
// Type d'import en ligne ou local
|
// Type d'import en ligne ou local
|
||||||
$type = $this->getInput('fontAddUrl', helper::FILTER_BOOLEAN) ? 'imported' : 'files';
|
$type = $this->getInput('fontAddUrl', helper::FILTER_BOOLEAN) ? 'imported' : 'files';
|
||||||
$type === 'files' ? 'imported' : 'files';
|
$type === 'files' ? 'imported' : 'files';
|
||||||
$ressource = $type === 'imported' ? $this->getInput('fontAddUrl', null) : $this->getInput('fontAddFile', null);
|
$resource = $type === 'imported' ? $this->getInput('fontAddUrl', null) : $this->getInput('fontAddFile', null);
|
||||||
if (!empty($ressource)) {
|
if (!empty($resource)) {
|
||||||
$fontId = $this->getInput('fontAddFontId', null, true);
|
$fontId = $this->getInput('fontAddFontId', null, true);
|
||||||
$fontName = $this->getInput('fontAddFontName', null, true);
|
$fontName = $this->getInput('fontAddFontName', null, true);
|
||||||
$fontFamilyName = $this->getInput('fontAddFontFamilyName', null, true);
|
$fontFamilyName = $this->getInput('fontAddFontFamilyName', null, true);
|
||||||
@ -669,34 +715,42 @@ class theme extends common
|
|||||||
$fontFamilyName = str_replace('"', '\'', $fontFamilyName);
|
$fontFamilyName = str_replace('"', '\'', $fontFamilyName);
|
||||||
|
|
||||||
// Supprime la fonte si elle existe dans le type inverse
|
// Supprime la fonte si elle existe dans le type inverse
|
||||||
if (is_array($this->getData(['fonts', $type, $fontId]))) {
|
if (is_array($this->getData(['font', $type, $fontId]))) {
|
||||||
$this->deleteData(['fonts', $type, $fontId]);
|
$this->deleteData(['font', $type, $fontId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Paramètres de la sortie vrai par défaut, c'est une fonte en ligne
|
||||||
|
$success = true;
|
||||||
|
|
||||||
|
// Copier la fonte si le nom du fichier est fourni
|
||||||
|
if (!is_dir(self::DATA_DIR . 'font/')) {
|
||||||
|
mkdir(self::DATA_DIR . 'font/');
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
$type === 'files' &&
|
||||||
|
file_exists(self::FILE_DIR . 'source/' . $resource)
|
||||||
|
) {
|
||||||
|
$success = copy(self::FILE_DIR . 'source/' . $resource, self::DATA_DIR . 'font/' . basename($resource));
|
||||||
|
}
|
||||||
|
|
||||||
// Stocker la fonte
|
// Stocker la fonte
|
||||||
$this->setData([
|
$this->setData([
|
||||||
'fonts',
|
'font',
|
||||||
$type,
|
$type,
|
||||||
$fontId, [
|
$fontId,
|
||||||
|
[
|
||||||
'name' => $fontName,
|
'name' => $fontName,
|
||||||
'font-family' => $fontFamilyName,
|
'font-family' => $fontFamilyName,
|
||||||
'resource' => $ressource
|
// Stocke l'URL our lien vers la fonte dans data
|
||||||
|
'resource' => $type === 'imported' ? $resource : self::DATA_DIR . 'font/' . basename($resource),
|
||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
||||||
// Copier la fonte si le nom du fichier est fourni
|
|
||||||
if (
|
|
||||||
$type === 'files' &&
|
|
||||||
file_exists(self::FILE_DIR . 'source/' . $ressource)
|
|
||||||
) {
|
|
||||||
copy(self::FILE_DIR . 'source/' . $ressource, self::DATA_DIR . 'fonts/' . $ressource);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'notification' => helper::translate('Fonte créée'),
|
'notification' => $success ? helper::translate('Fonte actualisée') : helper::translate('Fonte non créée, ressource absente !'),
|
||||||
'redirect' => helper::baseUrl() . 'theme/fonts',
|
'redirect' => helper::baseUrl() . 'theme/font',
|
||||||
'state' => true
|
'state' => $success
|
||||||
]);
|
]);
|
||||||
} else {
|
} else {
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
@ -721,11 +775,14 @@ class theme extends common
|
|||||||
public function fontEdit()
|
public function fontEdit()
|
||||||
{
|
{
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
// Type d'import en ligne ou local
|
// Type d'import en ligne ou local
|
||||||
$type = $this->getInput('fontEditUrl', helper::FILTER_BOOLEAN) ? 'imported' : 'files';
|
$type = $this->getInput('fontEditUrl', helper::FILTER_BOOLEAN) ? 'imported' : 'files';
|
||||||
$ressource = $type === 'imported' ? $this->getInput('fontEditUrl', null) : $this->getInput('fontEditFile', null);
|
|
||||||
$fontId = $this->getInput('fontEditFontId', null, true);
|
$fontId = $this->getInput('fontEditFontId', null, true);
|
||||||
|
$resource = $this->getData(['font', $type, $fontId, 'resource']);
|
||||||
$fontName = $this->getInput('fontEditFontName', null, true);
|
$fontName = $this->getInput('fontEditFontName', null, true);
|
||||||
$fontFamilyName = $this->getInput('fontEditFontFamilyName', null, true);
|
$fontFamilyName = $this->getInput('fontEditFontFamilyName', null, true);
|
||||||
|
|
||||||
@ -733,32 +790,27 @@ class theme extends common
|
|||||||
$fontFamilyName = str_replace('"', '\'', $fontFamilyName);
|
$fontFamilyName = str_replace('"', '\'', $fontFamilyName);
|
||||||
|
|
||||||
// Supprime la fonte si elle existe dans le type inverse
|
// Supprime la fonte si elle existe dans le type inverse
|
||||||
if (is_array($this->getData(['fonts', $type, $fontId]))) {
|
if (is_array($this->getData(['font', $type, $fontId]))) {
|
||||||
$this->deleteData(['fonts', $type, $fontId]);
|
$this->deleteData(['font', $type, $fontId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Stocker les fontes
|
// Stocker les fontes
|
||||||
$this->setData([
|
$this->setData([
|
||||||
'fonts',
|
'font',
|
||||||
$type,
|
$type,
|
||||||
$fontId, [
|
$fontId,
|
||||||
|
[
|
||||||
'name' => $fontName,
|
'name' => $fontName,
|
||||||
'font-family' => $fontFamilyName,
|
'font-family' => $fontFamilyName,
|
||||||
'resource' => $ressource
|
'resource' => $resource
|
||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
// Copier la fonte si le nom du fichier est fourni
|
|
||||||
if (
|
|
||||||
$type === 'files' &&
|
|
||||||
file_exists(self::FILE_DIR . 'source/' . $ressource)
|
|
||||||
) {
|
|
||||||
copy(self::FILE_DIR . 'source/' . $ressource, self::DATA_DIR . 'fonts/' . $ressource);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'notification' => helper::translate('Fonte actualisée'),
|
'notification' => helper::translate('Fonte actualisée'),
|
||||||
'redirect' => helper::baseUrl() . 'theme/fonts',
|
'redirect' => helper::baseUrl() . 'theme/font',
|
||||||
'state' => true
|
'state' => true
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@ -774,31 +826,34 @@ class theme extends common
|
|||||||
*/
|
*/
|
||||||
public function fontDelete()
|
public function fontDelete()
|
||||||
{
|
{
|
||||||
// Jeton incorrect
|
// Action interdite
|
||||||
if ($this->getUrl(4) !== $_SESSION['csrf']) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'theme/fonts',
|
'access' => false
|
||||||
'notification' => helper::translate('Action interdite')
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
// Suppression
|
// Suppression
|
||||||
else {
|
else {
|
||||||
|
|
||||||
// Effacer la fonte de la base
|
// Effacer la fonte de la base
|
||||||
$this->deleteData(['fonts', $this->getUrl(2), $this->getUrl(3)]);
|
$this->deleteData(['font', $this->getUrl(2), $this->getUrl(3)]);
|
||||||
|
|
||||||
// Effacer le fichier existant
|
// Effacer le fichier existant
|
||||||
if (
|
if (
|
||||||
$this->getUrl(2) === 'file' &&
|
$this->getUrl(2) === 'files' &&
|
||||||
file_exists(self::DATA_DIR . $this->getUrl(2))
|
file_exists($this->getData(['font', 'files', $this->getUrl(3), 'resource']))
|
||||||
) {
|
) {
|
||||||
unlink(self::DATA_DIR . $this->getUrl(2));
|
|
||||||
|
unlink($this->getData(['font', 'files', $this->getUrl(3), 'resource']));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . 'theme/fonts',
|
'redirect' => helper::baseUrl() . 'theme/font',
|
||||||
'notification' => helper::translate('Fonte supprimée'),
|
'notification' => helper::translate('Fonte supprimée'),
|
||||||
'state' => true
|
'state' => true
|
||||||
]);
|
]);
|
||||||
@ -811,16 +866,18 @@ class theme extends common
|
|||||||
*/
|
*/
|
||||||
public function reset()
|
public function reset()
|
||||||
{
|
{
|
||||||
// $url prend l'adresse sans le token
|
// Action interdite
|
||||||
$url = explode('&', $this->getUrl(2));
|
|
||||||
|
|
||||||
if (
|
if (
|
||||||
isset($_GET['csrf'])
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
and $_GET['csrf'] === $_SESSION['csrf']
|
|
||||||
) {
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'access' => false
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
// Réinitialisation
|
// Réinitialisation
|
||||||
$redirect = '';
|
$redirect = '';
|
||||||
switch ($url[0]) {
|
switch ($this->getUrl(2)) {
|
||||||
case 'admin':
|
case 'admin':
|
||||||
$this->initData('admin', self::$i18nUI);
|
$this->initData('admin', self::$i18nUI);
|
||||||
$redirect = helper::baseUrl() . 'theme/admin';
|
$redirect = helper::baseUrl() . 'theme/admin';
|
||||||
@ -843,11 +900,6 @@ class theme extends common
|
|||||||
'redirect' => $redirect,
|
'redirect' => $redirect,
|
||||||
'state' => true
|
'state' => true
|
||||||
]);
|
]);
|
||||||
} else {
|
|
||||||
// Valeurs en sortie
|
|
||||||
$this->addOutput([
|
|
||||||
'notification' => helper::translate('Jeton incorrect')
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -858,33 +910,58 @@ class theme extends common
|
|||||||
public function site()
|
public function site()
|
||||||
{
|
{
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
$this->setData(['theme', 'title', [
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
|
$this->setData([
|
||||||
|
'theme',
|
||||||
|
'title',
|
||||||
|
[
|
||||||
'font' => $this->getInput('themeTitleFont'),
|
'font' => $this->getInput('themeTitleFont'),
|
||||||
'textColor' => $this->getInput('themeTitleTextColor'),
|
'textColor' => $this->getInput('themeTitleTextColor'),
|
||||||
'fontWeight' => $this->getInput('themeTitleFontWeight'),
|
'fontWeight' => $this->getInput('themeTitleFontWeight'),
|
||||||
'textTransform' => $this->getInput('themeTitleTextTransform')
|
'textTransform' => $this->getInput('themeTitleTextTransform')
|
||||||
]]);
|
]
|
||||||
$this->setData(['theme', 'text', [
|
], false);
|
||||||
|
$this->setData([
|
||||||
|
'theme',
|
||||||
|
'text',
|
||||||
|
[
|
||||||
'font' => $this->getInput('themeTextFont'),
|
'font' => $this->getInput('themeTextFont'),
|
||||||
'fontSize' => $this->getInput('themeTextFontSize'),
|
'fontSize' => $this->getInput('themeTextFontSize'),
|
||||||
'textColor' => $this->getInput('themeTextTextColor'),
|
'textColor' => $this->getInput('themeTextTextColor'),
|
||||||
'linkColor' => $this->getInput('themeTextLinkColor')
|
'linkColor' => $this->getInput('themeTextLinkColor')
|
||||||
]]);
|
]
|
||||||
$this->setData(['theme', 'site', [
|
], false);
|
||||||
|
$this->setData([
|
||||||
|
'theme',
|
||||||
|
'site',
|
||||||
|
[
|
||||||
'backgroundColor' => $this->getInput('themeSiteBackgroundColor'),
|
'backgroundColor' => $this->getInput('themeSiteBackgroundColor'),
|
||||||
'radius' => $this->getInput('themeSiteRadius'),
|
'radius' => $this->getInput('themeSiteRadius'),
|
||||||
'shadow' => $this->getInput('themeSiteShadow'),
|
'shadow' => $this->getInput('themeSiteShadow'),
|
||||||
'width' => $this->getInput('themeSiteWidth'),
|
'width' => $this->getInput('themeSiteWidth'),
|
||||||
'margin' => $this->getInput('themeSiteMargin', helper::FILTER_BOOLEAN)
|
'margin' => $this->getInput('themeSiteMargin', helper::FILTER_BOOLEAN)
|
||||||
]]);
|
]
|
||||||
$this->setData(['theme', 'button', [
|
], false);
|
||||||
|
$this->setData([
|
||||||
|
'theme',
|
||||||
|
'button',
|
||||||
|
[
|
||||||
'backgroundColor' => $this->getInput('themeButtonBackgroundColor')
|
'backgroundColor' => $this->getInput('themeButtonBackgroundColor')
|
||||||
]]);
|
]
|
||||||
$this->setData(['theme', 'block', [
|
], false);
|
||||||
|
$this->setData([
|
||||||
|
'theme',
|
||||||
|
'block',
|
||||||
|
[
|
||||||
'backgroundColor' => $this->getInput('themeBlockBackgroundColor'),
|
'backgroundColor' => $this->getInput('themeBlockBackgroundColor'),
|
||||||
'borderColor' => $this->getInput('themeBlockBorderColor')
|
'borderColor' => $this->getInput('themeBlockBorderColor')
|
||||||
]]);
|
]
|
||||||
|
], false);
|
||||||
|
// Force la sauvegarde
|
||||||
|
$this->saveDB('theme');
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'notification' => helper::translate('Modifications enregistrées'),
|
'notification' => helper::translate('Modifications enregistrées'),
|
||||||
@ -912,7 +989,10 @@ class theme extends common
|
|||||||
*/
|
*/
|
||||||
public function manage()
|
public function manage()
|
||||||
{
|
{
|
||||||
if ($this->isPost()) {
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||||
|
$this->isPost()
|
||||||
|
) {
|
||||||
|
|
||||||
$zipFilename = $this->getInput('themeManageImport', helper::FILTER_STRING_SHORT, true);
|
$zipFilename = $this->getInput('themeManageImport', helper::FILTER_STRING_SHORT, true);
|
||||||
$data = $this->import(self::FILE_DIR . 'source/' . $zipFilename);
|
$data = $this->import(self::FILE_DIR . 'source/' . $zipFilename);
|
||||||
@ -925,7 +1005,8 @@ class theme extends common
|
|||||||
'notification' => $data['notification'],
|
'notification' => $data['notification'],
|
||||||
'state' => $data['success'],
|
'state' => $data['success'],
|
||||||
'view' => 'manage'
|
'view' => 'manage'
|
||||||
]);;
|
]);
|
||||||
|
;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Valeurs en sortie
|
// Valeurs en sortie
|
||||||
@ -943,6 +1024,15 @@ class theme extends common
|
|||||||
|
|
||||||
public function import($zipName = '')
|
public function import($zipName = '')
|
||||||
{
|
{
|
||||||
|
// Action interdite
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'access' => false
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
|
||||||
if (
|
if (
|
||||||
$zipName !== '' &&
|
$zipName !== '' &&
|
||||||
@ -979,7 +1069,7 @@ class theme extends common
|
|||||||
|
|
||||||
// Substitution des fontes Google
|
// Substitution des fontes Google
|
||||||
if ($modele = 'theme') {
|
if ($modele = 'theme') {
|
||||||
$c = $this->subFonts(self::DATA_DIR . 'theme.json');
|
$c = $this->subFont(self::DATA_DIR . 'theme.json');
|
||||||
// Un remplacement nécessite la régénération de la feuille de style
|
// Un remplacement nécessite la régénération de la feuille de style
|
||||||
if (
|
if (
|
||||||
$c > 0
|
$c > 0
|
||||||
@ -989,7 +1079,7 @@ class theme extends common
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($modele = 'admin') {
|
if ($modele = 'admin') {
|
||||||
$c = $this->subFonts(self::DATA_DIR . 'admin.json');
|
$c = $this->subFont(self::DATA_DIR . 'admin.json');
|
||||||
// Un remplacement nécessite la régénération de la feuille de style
|
// Un remplacement nécessite la régénération de la feuille de style
|
||||||
if (
|
if (
|
||||||
$c > 0
|
$c > 0
|
||||||
@ -1007,7 +1097,7 @@ class theme extends common
|
|||||||
$notification = helper::translate('Archive de thème invalide');
|
$notification = helper::translate('Archive de thème invalide');
|
||||||
}
|
}
|
||||||
// Supprimer le dossier temporaire même si le thème est invalide
|
// Supprimer le dossier temporaire même si le thème est invalide
|
||||||
$this->removeDir(self::TEMP_DIR . $tempFolder);
|
$this->deleteDir(self::TEMP_DIR . $tempFolder);
|
||||||
$zip->close();
|
$zip->close();
|
||||||
} else {
|
} else {
|
||||||
// erreur à l'ouverture
|
// erreur à l'ouverture
|
||||||
@ -1019,6 +1109,7 @@ class theme extends common
|
|||||||
|
|
||||||
return (['success' => false, 'notification' => helper::translate('Archive non spécifiée ou introuvable')]);
|
return (['success' => false, 'notification' => helper::translate('Archive non spécifiée ou introuvable')]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1027,6 +1118,15 @@ class theme extends common
|
|||||||
*/
|
*/
|
||||||
public function export()
|
public function export()
|
||||||
{
|
{
|
||||||
|
// Action interdite
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'access' => false
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
// Make zip
|
// Make zip
|
||||||
$zipFilename = $this->zipTheme($this->getUrl(2));
|
$zipFilename = $this->zipTheme($this->getUrl(2));
|
||||||
// Téléchargement du ZIP
|
// Téléchargement du ZIP
|
||||||
@ -1040,12 +1140,22 @@ class theme extends common
|
|||||||
unlink(self::TEMP_DIR . $zipFilename);
|
unlink(self::TEMP_DIR . $zipFilename);
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Export du thème
|
* Export du thème
|
||||||
*/
|
*/
|
||||||
public function save()
|
public function save()
|
||||||
{
|
{
|
||||||
|
// Action interdite
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'access' => false
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
// Make zip
|
// Make zip
|
||||||
$zipFilename = $this->zipTheme($this->getUrl(2));
|
$zipFilename = $this->zipTheme($this->getUrl(2));
|
||||||
// Téléchargement du ZIP
|
// Téléchargement du ZIP
|
||||||
@ -1062,6 +1172,7 @@ class theme extends common
|
|||||||
'state' => true
|
'state' => true
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* construction du zip Fonction appelée par export() et save()
|
* construction du zip Fonction appelée par export() et save()
|
||||||
@ -1078,14 +1189,14 @@ class theme extends common
|
|||||||
$zip->addFile(self::DATA_DIR . 'admin.json', self::DATA_DIR . 'admin.json');
|
$zip->addFile(self::DATA_DIR . 'admin.json', self::DATA_DIR . 'admin.json');
|
||||||
$zip->addFile(self::DATA_DIR . 'admin.css', self::DATA_DIR . 'admin.css');
|
$zip->addFile(self::DATA_DIR . 'admin.css', self::DATA_DIR . 'admin.css');
|
||||||
// Ajoute les fontes
|
// Ajoute les fontes
|
||||||
$zip->addEmptyDir(self::DATA_DIR . 'fonts');
|
$zip->addEmptyDir(self::DATA_DIR . 'font');
|
||||||
$fonts = $this->getData(['fonts', 'files']);
|
$fonts = $this->getData(['font', 'files']);
|
||||||
foreach ($fonts as $fontId => $fontName) {
|
foreach ($fonts as $fontId => $fontName) {
|
||||||
$zip->addFile(self::DATA_DIR . 'fonts/' . $fontName, self::DATA_DIR . 'fonts/' . $fontName);
|
$zip->addFile(self::DATA_DIR . 'font/' . $fontName, self::DATA_DIR . 'font/' . $fontName);
|
||||||
}
|
}
|
||||||
if (file_exists(self::DATA_DIR . 'fonts/fonts.html')) {
|
if (file_exists(self::DATA_DIR . 'font/font.html')) {
|
||||||
|
|
||||||
$zip->addFile(self::DATA_DIR . 'fonts/fonts.html', self::DATA_DIR . 'fonts/fonts.html');
|
$zip->addFile(self::DATA_DIR . 'font/font.html', self::DATA_DIR . 'font/font.html');
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'theme':
|
case 'theme':
|
||||||
@ -1116,14 +1227,16 @@ class theme extends common
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Ajoute les fontes
|
// Ajoute les fontes
|
||||||
$zip->addEmptyDir(self::DATA_DIR . 'fonts');
|
$zip->addEmptyDir(self::DATA_DIR . 'font');
|
||||||
$fonts = $this->getData(['fonts', 'files']);
|
$fonts = $this->getData(['font', 'files']);
|
||||||
foreach ($fonts as $fontId => $fontName) {
|
foreach ($fonts as $fontId => $fontInfo) {
|
||||||
$zip->addFile(self::DATA_DIR . 'fonts/' . $fontName, self::DATA_DIR . 'fonts/' . $fontName);
|
$zip->addFile($fontInfo['resource'], $fontInfo['resource']);
|
||||||
}
|
}
|
||||||
if (file_exists(self::DATA_DIR . 'fonts/fonts.html')) {
|
if (file_exists(self::DATA_DIR . 'font/font.html')) {
|
||||||
|
$zip->addFile(self::DATA_DIR . 'font/font.html', self::DATA_DIR . 'font/font.html');
|
||||||
$zip->addFile(self::DATA_DIR . 'fonts/fonts.html', self::DATA_DIR . 'fonts/fonts.html');
|
}
|
||||||
|
if (file_exists(self::DATA_DIR . 'font/font.css')) {
|
||||||
|
$zip->addFile(self::DATA_DIR . 'font/font.css', self::DATA_DIR . 'font/font.css');
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1138,7 +1251,7 @@ class theme extends common
|
|||||||
* @param string $file, nom du fichier json à convertir
|
* @param string $file, nom du fichier json à convertir
|
||||||
* @return int nombre de substitution effectuées
|
* @return int nombre de substitution effectuées
|
||||||
*/
|
*/
|
||||||
private function subFonts($file)
|
private function subFont($file)
|
||||||
{
|
{
|
||||||
// Tableau de substitution des fontes
|
// Tableau de substitution des fontes
|
||||||
$fonts = [
|
$fonts = [
|
||||||
@ -1181,7 +1294,7 @@ class theme extends common
|
|||||||
}
|
}
|
||||||
// Sauvegarder la chaîne modifiée
|
// Sauvegarder la chaîne modifiée
|
||||||
if ($count > 0) {
|
if ($count > 0) {
|
||||||
file_put_contents($file, $data);
|
$this->secure_file_put_contents($file, $data);
|
||||||
}
|
}
|
||||||
// Retourner le nombre d'occurrences
|
// Retourner le nombre d'occurrences
|
||||||
return ($count);
|
return ($count);
|
||||||
@ -1197,8 +1310,8 @@ class theme extends common
|
|||||||
* id - nom
|
* id - nom
|
||||||
* id - font-family - resource
|
* id - font-family - resource
|
||||||
*/
|
*/
|
||||||
$f['files'] = $this->getData(['fonts', 'files']);
|
$f['files'] = $this->getData(['font', 'files']);
|
||||||
$f['imported'] = $this->getData(['fonts', 'imported']);
|
$f['imported'] = $this->getData(['font', 'imported']);
|
||||||
$f['websafe'] = self::$fontsWebSafe;
|
$f['websafe'] = self::$fontsWebSafe;
|
||||||
// Construit un tableau avec leur ID et leur famille
|
// Construit un tableau avec leur ID et leur famille
|
||||||
foreach (['websafe', 'imported', 'files'] as $type) {
|
foreach (['websafe', 'imported', 'files'] as $type) {
|
||||||
@ -1236,12 +1349,12 @@ class theme extends common
|
|||||||
$fontsInstalled = array_unique($fontsInstalled);
|
$fontsInstalled = array_unique($fontsInstalled);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Chargement des polices en ligne dans un fichier fonts.html inclus dans main.php
|
* Chargement des polices en ligne dans un fichier font.html inclus dans main.php
|
||||||
*/
|
*/
|
||||||
$gf = false;
|
$gf = false;
|
||||||
$fileContent = '<!-- Fontes personnalisées -->';
|
$fileContent = '<!-- Fontes personnalisées -->';
|
||||||
if (!empty($this->getData(['fonts', 'imported']))) {
|
if (!empty($this->getData(['font', 'imported']))) {
|
||||||
foreach ($this->getData(['fonts', 'imported']) as $fontId => $fontValue) {
|
foreach ($this->getData(['font', 'imported']) as $fontId => $fontValue) {
|
||||||
if (
|
if (
|
||||||
($scope === 'user' && in_array($fontId, $fontsInstalled))
|
($scope === 'user' && in_array($fontId, $fontsInstalled))
|
||||||
|| $scope === 'all'
|
|| $scope === 'all'
|
||||||
@ -1265,30 +1378,30 @@ class theme extends common
|
|||||||
* Fontes installées localement
|
* Fontes installées localement
|
||||||
*/
|
*/
|
||||||
$fileContentCss = '';
|
$fileContentCss = '';
|
||||||
if (!empty($this->getData(['fonts', 'files']))) {
|
if (!empty($this->getData(['font', 'files']))) {
|
||||||
foreach ($this->getData(['fonts', 'files']) as $fontId => $fontValue) {
|
foreach ($this->getData(['font', 'files']) as $fontId => $fontValue) {
|
||||||
if (
|
if (
|
||||||
($scope === 'user' && in_array($fontId, $fontsInstalled))
|
($scope === 'user' && in_array($fontId, $fontsInstalled))
|
||||||
|| $scope === 'all'
|
|| $scope === 'all'
|
||||||
) {
|
) {
|
||||||
if (file_exists(self::DATA_DIR . 'fonts/' . $fontValue['resource'])) {
|
if (file_exists($fontValue['resource'])) {
|
||||||
// Extension
|
// Extension
|
||||||
$path_parts = pathinfo(helper::baseUrl(false) . self::DATA_DIR . 'fonts/' . $fontValue['resource']);
|
$path_parts = pathinfo(helper::baseUrl(false) . self::DATA_DIR . 'font/' . $fontValue['resource']);
|
||||||
// Chargement de la police
|
// Chargement de la police
|
||||||
$fileContentCss .= '@font-face {';
|
$fileContentCss .= '@font-face {';
|
||||||
$fileContentCss .= 'font-family:"' . $fontValue['name'] . '";';
|
$fileContentCss .= 'font-family:"' . $fontValue['name'] . '";';
|
||||||
$fileContentCss .= 'src: url("' . $fontValue['resource'] . '") format("' . $path_parts['extension'] . '");';
|
$fileContentCss .= 'src: url("' . helper::baseUrl(false) . $fontValue['resource'] . '") format("' . $path_parts['extension'] . '");';
|
||||||
$fileContentCss .= '}';
|
$fileContentCss .= '}';
|
||||||
// Préchargement
|
// Préchargement
|
||||||
//$fileContent = '<link rel="preload" href="' . self::DATA_DIR . 'fonts/' . $fontValue['resource'] . '" type="font/woff" crossorigin="anonymous" as="font">' . $fileContent;
|
//$fileContent = '<link rel="preload" href="' . self::DATA_DIR . 'font/' . $fontValue['resource'] . '" type="font/woff" crossorigin="anonymous" as="font">' . $fileContent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enregistre la personnalisation
|
// Enregistre la personnalisation
|
||||||
file_put_contents(self::DATA_DIR . 'fonts/fonts.html', $fileContent);
|
$this->secure_file_put_contents(self::DATA_DIR . 'font/font.html', $fileContent);
|
||||||
// Enregistre la personnalisation
|
// Enregistre la personnalisation
|
||||||
file_put_contents(self::DATA_DIR . 'fonts/fonts.css', $fileContentCss);
|
$this->secure_file_put_contents(self::DATA_DIR . 'font/font.css', $fileContentCss);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
<div class="col1 offset8">
|
<div class="col1 offset8">
|
||||||
<?php echo template::button('configAdminReset', [
|
<?php echo template::button('configAdminReset', [
|
||||||
'class' => 'buttonRed',
|
'class' => 'buttonRed',
|
||||||
'href' => helper::baseUrl() . 'theme/reset/admin' . '&csrf=' . $_SESSION['csrf'],
|
'href' => helper::baseUrl() . 'theme/reset/admin',
|
||||||
'value' => template::ico('cancel'),
|
'value' => template::ico('cancel'),
|
||||||
'help' => 'Réinitialiser avec le thème par défaut'
|
'help' => 'Réinitialiser avec le thème par défaut'
|
||||||
]); ?>
|
]); ?>
|
||||||
@ -32,10 +32,16 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col12">
|
<div class="col12">
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<h4><?php echo helper::translate('Couleurs'); ?>
|
<h4><?php echo helper::translate('Paramètres'); ?>
|
||||||
</h4>
|
</h4>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col4">
|
<div class="col3">
|
||||||
|
<?php echo template::select('adminSiteWidth', $module::$siteWidths, [
|
||||||
|
'label' => 'Largeur',
|
||||||
|
'selected' => $this->getData(['admin', 'width'])
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
|
<div class="col3">
|
||||||
<?php echo template::text('adminBackgroundColor', [
|
<?php echo template::text('adminBackgroundColor', [
|
||||||
'class' => 'colorPicker',
|
'class' => 'colorPicker',
|
||||||
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
|
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
|
||||||
@ -43,7 +49,7 @@
|
|||||||
'value' => $this->getData(['admin', 'backgroundColor'])
|
'value' => $this->getData(['admin', 'backgroundColor'])
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col4">
|
<div class="col3">
|
||||||
<?php echo template::text('adminColorTitle', [
|
<?php echo template::text('adminColorTitle', [
|
||||||
'class' => 'colorPicker',
|
'class' => 'colorPicker',
|
||||||
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
|
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
|
||||||
@ -51,7 +57,7 @@
|
|||||||
'value' => $this->getData(['admin', 'colorTitle'])
|
'value' => $this->getData(['admin', 'colorTitle'])
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col4">
|
<div class="col3">
|
||||||
<?php echo template::text('adminColorText', [
|
<?php echo template::text('adminColorText', [
|
||||||
'class' => 'colorPicker',
|
'class' => 'colorPicker',
|
||||||
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
|
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
|
||||||
@ -77,7 +83,7 @@
|
|||||||
'value' => $this->getData(['admin', 'borderBlockColor'])
|
'value' => $this->getData(['admin', 'borderBlockColor'])
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col3 offset1">
|
<div class="col4">
|
||||||
<?php echo template::text('adminColorHelp', [
|
<?php echo template::text('adminColorHelp', [
|
||||||
'class' => 'colorPicker',
|
'class' => 'colorPicker',
|
||||||
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
|
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
|
||||||
@ -133,7 +139,7 @@
|
|||||||
<?php echo template::select('adminFontText', $module::$fonts['name'], [
|
<?php echo template::select('adminFontText', $module::$fonts['name'], [
|
||||||
'label' => 'Police du texte',
|
'label' => 'Police du texte',
|
||||||
'selected' => $this->getData(['admin', 'fontText']),
|
'selected' => $this->getData(['admin', 'fontText']),
|
||||||
'fonts' => $module::$fonts['family']
|
'font' => $module::$fonts['family']
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col4">
|
<div class="col4">
|
||||||
@ -146,7 +152,7 @@
|
|||||||
<?php echo template::select('adminFontTitle', $module::$fonts['name'], [
|
<?php echo template::select('adminFontTitle', $module::$fonts['name'], [
|
||||||
'label' => 'Police des titres',
|
'label' => 'Police des titres',
|
||||||
'selected' => $this->getData(['admin', 'fontTitle']),
|
'selected' => $this->getData(['admin', 'fontTitle']),
|
||||||
'fonts' => $module::$fonts['family']
|
'font' => $module::$fonts['family']
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
* @link http://zwiicms.fr/
|
* @link http://zwiicms.fr/
|
||||||
*/
|
*/
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user