Compare commits
1093 Commits
Author | SHA1 | Date | |
---|---|---|---|
d9cc10e109 | |||
041c23ed2a | |||
e0fb90d207 | |||
3af3dcd681 | |||
dfc0ff7cd0 | |||
71bc687ad6 | |||
3ef6d5b1e7 | |||
a1c7457a1d | |||
d2d390d75c | |||
1205065ddc | |||
a7cc18230b | |||
0caf5ba9fd | |||
d19814f220 | |||
c977608f0d | |||
13e0a09e70 | |||
020e72931b | |||
8ee10b4d9a | |||
6d59524517 | |||
d2cd0ec203 | |||
0015e151d0 | |||
3d2bd2140c | |||
8a54453636 | |||
0deaed7a4b | |||
14b65767fc | |||
6507172bae | |||
3895f8357e | |||
f0951d4a60 | |||
173d7f779c | |||
6515f21350 | |||
1f71dc768f | |||
7c4bd0baba | |||
bd576a06c2 | |||
7ddaefee57 | |||
150f1b7cae | |||
3de997b93e | |||
a37d587281 | |||
85940755cb | |||
ee4a27982d | |||
4980b7048f | |||
abcad7ea77 | |||
2d2bca5e23 | |||
114dcad072 | |||
d6b04a0bb2 | |||
7840b56dbd | |||
fd6ceed527 | |||
5c0b6baf95 | |||
d81ccb81e7 | |||
fb30c6495a | |||
550259e8ea | |||
e736057533 | |||
4ecace2b42 | |||
bad1c108ab | |||
2ba03c2453 | |||
fb439395e7 | |||
34475f945d | |||
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 | |||
50a8b3a712 | |||
650fd20e0c | |||
23709679f2 | |||
d7069c8da8 | |||
19f1685d8a | |||
71fd25f02c | |||
fde15d6946 | |||
857fa447a1 | |||
4b34c1664d | |||
35a74f02b6 | |||
c71d68aae6 | |||
02fb491f9b | |||
9baf47f86c | |||
2048562006 | |||
b408c9d192 | |||
2ce3efb4fb | |||
da2c0b6440 | |||
2a87b98d9a | |||
aa2d5f0f06 | |||
8d5e8ccbd3 | |||
21a903b1e5 | |||
ef8c10fae7 | |||
2842005297 | |||
3bcff4b86f | |||
6c877ed334 | |||
b7f7c3d1db | |||
d98d986d4f | |||
85789361f2 | |||
05c9e7aa9a | |||
b54e5815ee | |||
367e43d773 | |||
329c7a3ad4 | |||
dde705805a | |||
9977fb8c3e | |||
465a9c5e03 | |||
4decb9b5d7 | |||
f235a65fe7 | |||
c4b2ebeea7 | |||
760907a67a | |||
c775d71642 | |||
bab9b3d9bc | |||
1a0f6b1721 | |||
4d0a1fd80b | |||
c332460074 | |||
d47290df01 | |||
24550749b7 | |||
63bb78a0fd | |||
7111fdb532 | |||
cfac4034a3 | |||
fb43aed601 | |||
ce0faaf556 | |||
7dfae68bb9 | |||
5fdb0c8ff5 | |||
87024d284a | |||
28e8af3f1f | |||
e6ae059bfb | |||
35bba82fb0 | |||
6a4fc3154b | |||
d39d8e7979 | |||
b05ced6f0a | |||
18058ed8ce | |||
eacb278566 | |||
735057f4dd | |||
5685fde159 | |||
08fd9894c6 | |||
d97fe3316b | |||
b9998df747 | |||
1544b07132 | |||
388395f5e4 | |||
0895e51a0a | |||
fde15d4ae2 | |||
41070f809c | |||
73556a40bb | |||
820cc6c0b0 | |||
d2be706829 | |||
d417ee0ce5 | |||
a90f616423 | |||
fc6729acfa | |||
cac0c14ecd | |||
2b804a01dc | |||
48b5e2e63f | |||
8a2faec55a | |||
02e8b77498 | |||
8ecaeaf4e7 | |||
e18aa2c49c | |||
575f0ec2b3 | |||
5b7fcb7b3d | |||
6e94dd9cd9 | |||
e985817582 | |||
8f61c40e13 | |||
aaf35147b9 | |||
ee295cf7dc | |||
0d6d43381c | |||
a66bc7d948 | |||
c405994451 | |||
9ede4c38f2 | |||
d98963fe9c | |||
6a85cae5ad | |||
090f367da0 | |||
96f027d310 | |||
aded5d5192 | |||
eea007a037 | |||
314db3505c | |||
095cab701a | |||
b30a0037fc | |||
5ee34dded5 | |||
be6649038e | |||
0e5f77daa5 | |||
17d4e7f3be | |||
52f25fe231 | |||
714396cbad | |||
cd2755dd5d | |||
fb97570b96 | |||
25b9844197 | |||
a5ab6b772a | |||
b0f064dac4 | |||
c5fad6075c | |||
12e885796c | |||
45eb9de2fc | |||
6eb9c37cad | |||
b5911f609a | |||
4e6f05fd29 | |||
0b7ae77cfe | |||
e718ff69f4 | |||
0c5f14b8d8 | |||
ca8ad39143 | |||
7531973551 | |||
6c008363cd | |||
0a566df789 | |||
525250f39a | |||
8d8d35a540 | |||
63d02f358c | |||
d364b11012 | |||
a5743ca323 | |||
a87431fc9c | |||
5cd61d8d1a | |||
3aa5cd285b | |||
9d1fcbfd20 | |||
f32d318cf6 | |||
70b500443f | |||
a65e8dcd63 | |||
8ac66696cb | |||
3d579cb689 | |||
bb779bdb97 | |||
dbd9d2bf34 | |||
937c36ca6d | |||
b57a83e9cf | |||
2e7931970d | |||
e0fe61ccc7 | |||
6ee961f618 | |||
c13f01899b | |||
8194ef7c67 | |||
c4fd214e04 | |||
4845ef0074 | |||
862ae313f4 | |||
cdc2594bba | |||
b255d0fddf | |||
83ecbdb75b | |||
aef19a9e9c | |||
0cd7a54904 | |||
53b78bf61d | |||
ca87ee2d3b | |||
91112037e9 | |||
74684864f0 | |||
471d28e4fe | |||
85de808044 | |||
ae494b8d66 | |||
d4d88cfdeb | |||
c85f208837 | |||
65a12d0e25 | |||
169a30f449 | |||
f6ec7dccd5 | |||
39e27d5082 | |||
95c8b7a975 | |||
162bf27617 | |||
832e0b535f | |||
84aa2b719c | |||
47c98e25e4 | |||
f9c866dadb | |||
3a74afcb18 | |||
cffbdc2928 | |||
a5bd94fe6e | |||
afcccc2354 | |||
19c6c403d7 | |||
df88e5a195 | |||
0bf76c3778 | |||
c8ea16040e | |||
653f9a6842 | |||
6973442e4a | |||
a451421ecd | |||
61379d2db1 | |||
3da3bf63fc | |||
4b7611f830 | |||
41e654c142 | |||
dc5484aa0a | |||
cc990de539 | |||
5d81b3d244 | |||
e8075dbbc8 | |||
7e426cfb5d | |||
abcf4c3a70 | |||
903c4e703c | |||
9f8f9fd786 | |||
ac13356737 | |||
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 |
4
.gitignore
vendored
4
.gitignore
vendored
@ -4,8 +4,10 @@ site/data/*
|
||||
site/tmp/*
|
||||
site/backup/*
|
||||
site/file/*
|
||||
site/i18n/*.json
|
||||
.DS_Store
|
||||
core/vendor/tinymce/link_list.json
|
||||
robots.txt
|
||||
sitemap.xml
|
||||
.gitignore
|
||||
core/module/config/tool/data.key
|
||||
site/i18n/*.json
|
11
.htaccess
11
.htaccess
@ -32,5 +32,16 @@ Options -Indexes
|
||||
Options -MultiViews
|
||||
</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 !
|
||||
# URL rewriting
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
1314
CHANGES.md
1314
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.02
|
||||
# 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.
|
||||
|
||||
@ -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.
|
||||
|
||||
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
|
||||
|
||||
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)
|
||||
- ou sur [la page de téléchargement du site](https://zwiicms.fr/telechargement)
|
||||
|
||||
* 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)
|
||||
|
||||
## 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.
|
||||
|
||||
|
||||
## 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.
|
||||
@ -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.
|
||||
* Transférez son contenu sur votre serveur en activant le remplacement des fichiers.
|
||||
|
||||
|
||||
## Arborescence générale
|
||||
|
||||
*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] module.json Données des modules de pages
|
||||
[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
|
||||
[F] accueil.html Exemple contenu de la page d'accueil
|
||||
[R] fonts Dossier contenant les fontes installées
|
||||
[F] fonts.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
|
||||
[R] font Dossier contenant les fontes installées
|
||||
[F] font.html Fichier contenant les appels des fontes à charger sur cdnFonts
|
||||
[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..)
|
||||
[R] modules Personnalisation des modules ou données propres
|
||||
[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] core.json Configuration du noyau
|
||||
[F] custom.css Feuille de style de la personnalisation avancée
|
||||
[F] fonts.json Descripteur des fontes personnalisées
|
||||
[F] journal.log Journalisation des actions
|
||||
[F] languages.json Configuration des langues de l'interface
|
||||
[F] font.json Descripteur des fontes personnalisées
|
||||
[F] journal.log Journalisation des activités
|
||||
[F] language.json Langues de l'interface
|
||||
[F] profil.json Profils des utilisateurs
|
||||
[F] theme.css Thème du site
|
||||
[F] theme.json Données du site
|
||||
[F] user.json Données des utilisateurs
|
||||
|
23
README.md
23
README.md
@ -1,4 +1,4 @@
|
||||
# ZwiiCMS 12.3.02
|
||||
# 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.
|
||||
|
||||
@ -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.
|
||||
|
||||
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
|
||||
|
||||
To download the latest released version, go to :
|
||||
- [the Updates page](https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS/releases)
|
||||
- or at [the site download page](https://zwiicms.fr/telechargement)
|
||||
|
||||
* [the Updates page](https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS/releases)
|
||||
* or at [the site download page](https://zwiicms.fr/download)
|
||||
|
||||
## 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.
|
||||
|
||||
|
||||
## Update procedures
|
||||
|
||||
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.
|
||||
* Transfer its content to your server by activating the file replacement.
|
||||
|
||||
|
||||
## General tree structure
|
||||
|
||||
*Legend: [D] Directory - [FILE] File
|
||||
@ -77,6 +74,7 @@ text
|
||||
[FILE] page.json Page data
|
||||
[FILE] module.json Page module data
|
||||
[FILE] local.json Language-specific site data
|
||||
[FILE] .default Unique file of default site language
|
||||
[DIR] content Folder of page contents
|
||||
[FILE] home.html Sample home page content
|
||||
[DIR] fonts Folder containing the installed fonts
|
||||
@ -90,12 +88,13 @@ text
|
||||
[FILE] config.json Site configuration
|
||||
[FILE] core.json Core configuration
|
||||
[FILE] custom.css Advanced customization stylesheet
|
||||
[FILE] fonts.json Custom font descriptor
|
||||
[FILE] journal.log Action logging
|
||||
[FILE] languages.json Interface database languages
|
||||
[FILE] font.json Custom font descriptor
|
||||
[FILE] journal.log Activities logging
|
||||
[FILE] language.json Interface languages database
|
||||
[FILE] profil.json Users profiles database
|
||||
[FILE] theme.css Site theme
|
||||
[FILE] theme.json Site data
|
||||
[FILE] user.json User data
|
||||
[FILE] theme.json Site database
|
||||
[FILE] user.json User database
|
||||
[FILE] .backup Marker for file backup if present
|
||||
[DIR] file File manager upload directory
|
||||
[DIR] source Various resources
|
||||
|
@ -2,8 +2,11 @@
|
||||
|
||||
class autoload {
|
||||
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/template.class.php';
|
||||
require_once 'core/class/layout.class.php';
|
||||
require_once 'core/class/sitemap/Runtime.class.php';
|
||||
require_once 'core/class/sitemap/FileSystem.class.php';
|
||||
require_once 'core/class/sitemap/SitemapGenerator.class.php';
|
||||
|
@ -8,7 +8,7 @@ class helper
|
||||
|
||||
/** Filtres personnalisés */
|
||||
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_ID = 4;
|
||||
const FILTER_INT = 5;
|
||||
@ -16,8 +16,14 @@ class helper
|
||||
const FILTER_PASSWORD = 7;
|
||||
const FILTER_STRING_LONG = 8;
|
||||
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_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,31 +32,15 @@ class helper
|
||||
|
||||
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
|
||||
/*
|
||||
if (array_key_exists($text, core::$dialog) === false && !empty($text)) {
|
||||
$dialogues = json_decode(file_get_contents('core/module/install/ressource/i18n/fr_FR.json' ), true);
|
||||
$data = array_merge($dialogues,[$text => '']);
|
||||
file_put_contents ('core/module/install/ressource/i18n/fr_FR.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT), LOCK_EX);
|
||||
}
|
||||
*/
|
||||
if (array_key_exists($text, core::$dialog) === false && !empty($text)) {
|
||||
$dialogues = json_decode(file_get_contents('core/module/install/ressource/i18n/fr_FR.json' ), true);
|
||||
$data = array_merge($dialogues,[$text => '']);
|
||||
file_put_contents ('core/module/install/ressource/i18n/fr_FR.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT), LOCK_EX);
|
||||
}
|
||||
*/
|
||||
return (array_key_exists($text, core::$dialog) && !empty(core::$dialog[$text]) ? core::$dialog[$text] : $text);
|
||||
}
|
||||
|
||||
@ -59,40 +49,41 @@ class helper
|
||||
* Date au format time()
|
||||
* $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';
|
||||
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
|
||||
*/
|
||||
public static function googleTranslate($to, $text){
|
||||
public static function googleTranslate($to, $text)
|
||||
{
|
||||
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([]));
|
||||
}
|
||||
if (!empty($text)) {
|
||||
//Lecture des données en ligne
|
||||
$data = json_decode(file_get_contents('site/i18n/' . $to . '.json'), true);
|
||||
// Mode traduction
|
||||
if ($to !== 'fr_FR') {
|
||||
$arrayjson = json_decode(file_get_contents('https://clients5.google.com/translate_a/t?client=dict-chrome-ex&sl=auto&tl=' . $to . '&q=' . rawurlencode($text)),true);
|
||||
$response = $arrayjson[0][0];
|
||||
$arrayjson = json_decode(file_get_contents('https://clients5.google.com/translate_a/t?client=dict-chrome-ex&sl=auto&tl=' . $to . '&q=' . rawurlencode($text)), true);
|
||||
$response = $arrayjson[0][0];
|
||||
// Captation
|
||||
if ($data !== '') {
|
||||
if (array_key_exists($text, $data) ) {
|
||||
if (array_key_exists($text, $data)) {
|
||||
$data[$text] = $response;
|
||||
} else {
|
||||
$data = array_merge($data,[$text => $response]);
|
||||
$data = array_merge($data, [$text => $response]);
|
||||
}
|
||||
}
|
||||
// Mode alimentation des chaines
|
||||
// Mode alimentation des chaines
|
||||
} else {
|
||||
// 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));
|
||||
|
||||
}
|
||||
}
|
||||
@ -206,44 +197,57 @@ class helper
|
||||
|
||||
public static function autoBackup($folder, $filter = ['backup', 'tmp'])
|
||||
{
|
||||
// Creation du ZIP
|
||||
// Création du nom de fichier ZIP
|
||||
$baseName = str_replace('/', '', helper::baseUrl(false, false));
|
||||
$baseName = empty($baseName) ? 'ZwiiCMS' : $baseName;
|
||||
$fileName = $baseName . '-backup-' . date('Y-m-d-H-i-s', time()) . '.zip';
|
||||
$fileName = $baseName . '-backup-' . date('Y-m-d-H-i-s') . '.zip';
|
||||
|
||||
// Initialisation de l'archive ZIP
|
||||
$zip = new ZipArchive();
|
||||
$zip->open($folder . $fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE);
|
||||
if ($zip->open($folder . $fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) {
|
||||
return false; // Retourne false si l'ouverture échoue
|
||||
}
|
||||
|
||||
$directory = 'site/';
|
||||
//$filter = array('backup','tmp','file');
|
||||
$files = new RecursiveIteratorIterator(
|
||||
|
||||
// Récupération des fichiers et des dossiers
|
||||
$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);
|
||||
// Inclure les fichiers ou les répertoires non filtrés
|
||||
return $fileInfo->isFile() || ($fileInfo->isDir() && !in_array($fileInfo->getBaseName(), $filter));
|
||||
}
|
||||
)
|
||||
);
|
||||
foreach ($files as $name => $file) {
|
||||
|
||||
// Ajout des fichiers à l'archive
|
||||
foreach ($files as $file) {
|
||||
if (!$file->isDir()) {
|
||||
$filePath = $file->getRealPath();
|
||||
$relativePath = substr($filePath, strlen(realpath($directory)) + 1);
|
||||
$relativePath = str_replace(DIRECTORY_SEPARATOR, '/', substr($filePath, strlen(realpath($directory)) + 1));
|
||||
$zip->addFile($filePath, $relativePath);
|
||||
}
|
||||
}
|
||||
|
||||
// Fermeture de l'archive ZIP
|
||||
$zip->close();
|
||||
return ($fileName);
|
||||
|
||||
return $fileName;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Retourne la liste des modules installés dans un tableau composé
|
||||
* du nom réel
|
||||
* du numéro de version
|
||||
*/
|
||||
public static function getModules()
|
||||
public static function getModules()
|
||||
{
|
||||
$modules = array();
|
||||
$dirs = array_diff(scandir('module'), array('..', '.'));
|
||||
@ -285,7 +289,7 @@ class helper
|
||||
$dataDirectory = '';
|
||||
}
|
||||
// Affection
|
||||
$modules[$value] = [
|
||||
$modules[$value] = [
|
||||
'name' => $value,
|
||||
'realName' => $realName,
|
||||
'version' => $version,
|
||||
@ -352,18 +356,25 @@ class helper
|
||||
public static function checkRewrite()
|
||||
{
|
||||
// N'interroge que le serveur Apache
|
||||
if (strpos($_SERVER["SERVER_SOFTWARE"], 'Apache') > 0) {
|
||||
self::$rewriteStatus === false;
|
||||
} elseif (self::$rewriteStatus === null) {
|
||||
if ((helper::checkServerSoftware() === false)) {
|
||||
self::$rewriteStatus = false;
|
||||
} else {
|
||||
// Ouvre et scinde le fichier .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
|
||||
//self::$rewriteStatus = (empty($htaccess[1]) === false);
|
||||
self::$rewriteStatus = (strpos($htaccess[1], 'RewriteEngine on') > 0) ? true : false;
|
||||
self::$rewriteStatus = (strpos($htaccess[1], 'RewriteEngine on') !== false);
|
||||
}
|
||||
return self::$rewriteStatus;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retourne vrai ou faux selon que le serveur est comptatible avec htaccess
|
||||
* @return bool
|
||||
*/
|
||||
public static function checkServerSoftware() {
|
||||
return (stripos($_SERVER['SERVER_SOFTWARE'], 'Apache') !== false || stripos($_SERVER['SERVER_SOFTWARE'], 'LiteSpeed') !== false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Renvoie le numéro de version de Zwii est en ligne
|
||||
* @return string
|
||||
@ -381,11 +392,11 @@ class helper
|
||||
public static function checkNewVersion($channel)
|
||||
{
|
||||
$version = helper::getOnlineVersion($channel);
|
||||
$update = false;
|
||||
if (!empty($version)) {
|
||||
return ((version_compare(common::ZWII_VERSION, $version)) === -1);
|
||||
} else {
|
||||
return false;
|
||||
$update = version_compare(common::ZWII_VERSION, $version) == -1;
|
||||
}
|
||||
return $update;
|
||||
}
|
||||
|
||||
|
||||
@ -403,12 +414,12 @@ class helper
|
||||
'darken' => 'rgba(' . max(0, $rgba[0] - 15) . ',' . max(0, $rgba[1] - 15) . ',' . max(0, $rgba[2] - 15) . ',' . $rgba[3] . ')',
|
||||
'veryDarken' => 'rgba(' . max(0, $rgba[0] - 20) . ',' . max(0, $rgba[1] - 20) . ',' . max(0, $rgba[2] - 20) . ',' . $rgba[3] . ')',
|
||||
'text' => self::relativeLuminanceW3C($rgba) > .22 ? "#222" : "#DDD",
|
||||
'rgb' => 'rgb(' . $rgba[0] . ',' . $rgba[1] . ',' . $rgba[2] . ')',
|
||||
'rgb' => 'rgb(' . $rgba[0] . ',' . $rgba[1] . ',' . $rgba[2] . ')',
|
||||
'invert' => 'rgba (' .
|
||||
($rgba[0] < 128 ? 255 : 0) . ',' .
|
||||
($rgba[1] < 128 ? 255 : 0) . ',' .
|
||||
($rgba[1] < 128 ? 255 : 0) . ',' .
|
||||
($rgba[0] < 128 ? 255 : 0) . ')'
|
||||
($rgba[0] < 128 ? 255 : 0) . ',' .
|
||||
($rgba[1] < 128 ? 255 : 0) . ',' .
|
||||
($rgba[1] < 128 ? 255 : 0) . ',' .
|
||||
($rgba[0] < 128 ? 255 : 0) . ')'
|
||||
];
|
||||
}
|
||||
|
||||
@ -418,8 +429,8 @@ class helper
|
||||
*/
|
||||
public static function deleteCookie($cookieKey)
|
||||
{
|
||||
unset($_COOKIE[$cookieKey]);
|
||||
setcookie($cookieKey, '', time() - 3600, helper::baseUrl(false, false), '', false, true);
|
||||
unset($_COOKIE[$cookieKey]);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -442,16 +453,19 @@ class helper
|
||||
$text = (int) $date->format('U');
|
||||
break;
|
||||
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;
|
||||
break;
|
||||
case self::FILTER_ID:
|
||||
$text = mb_strtolower($text, 'UTF-8');
|
||||
$text = strip_tags(str_replace(
|
||||
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,-,-,-'),
|
||||
$text
|
||||
));
|
||||
$text = strip_tags(
|
||||
str_replace(
|
||||
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,-,-,-'),
|
||||
$text
|
||||
)
|
||||
);
|
||||
$text = preg_replace('/([^a-z0-9-])/', '', $text);
|
||||
// Supprime les emoji
|
||||
$text = preg_replace('/[[:^print:]]/', '', $text);
|
||||
@ -487,6 +501,11 @@ class helper
|
||||
case self::FILTER_URL:
|
||||
$text = filter_var($text, FILTER_SANITIZE_URL);
|
||||
break;
|
||||
case self::FILTER_DATE:
|
||||
$text = date('Y-m-d', $text);
|
||||
break;
|
||||
case self::FILTER_TIME:
|
||||
$text = date('H:i', $text);
|
||||
}
|
||||
return $text;
|
||||
}
|
||||
@ -539,6 +558,10 @@ class helper
|
||||
$css = preg_replace(['(( )+{)', '({( )+)'], '{', $css);
|
||||
$css = preg_replace(['(( )+})', '(}( )+)', '(;( )*})'], '}', $css);
|
||||
$css = preg_replace(['(;( )+)', '(( )+;)'], ';', $css);
|
||||
// Convertir les codes entités
|
||||
$css = htmlspecialchars_decode($css);
|
||||
// Supprime les balises HTML
|
||||
$css = strip_tags($css);
|
||||
// Retourne le css minifié
|
||||
return $css;
|
||||
}
|
||||
@ -567,7 +590,7 @@ class helper
|
||||
* @param null|int $sufix Suffixe de l'url
|
||||
* @return array
|
||||
*/
|
||||
public static function pagination($array, $url, $item, $sufix = null)
|
||||
public static function pagination($array, $url, $item, $suffix = null)
|
||||
{
|
||||
// Scinde l'url
|
||||
$url = explode('/', $url);
|
||||
@ -591,7 +614,7 @@ class helper
|
||||
if ($nbPage > 1) {
|
||||
for ($i = 1; $i <= $nbPage; $i++) {
|
||||
$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>';
|
||||
}
|
||||
@ -671,35 +694,57 @@ class helper
|
||||
public static function subword($text, $start, $length)
|
||||
{
|
||||
$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, 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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Cryptage
|
||||
* @param string $key la clé d'encryptage
|
||||
* @param string $payload la chaine à coder
|
||||
* @param string $string la chaine à coder
|
||||
* @return string
|
||||
*/
|
||||
public static function encrypt($key, $payload)
|
||||
public static function encrypt($string, $key)
|
||||
{
|
||||
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
|
||||
$encrypted = openssl_encrypt($payload, 'aes-256-cbc', $key, 0, $iv);
|
||||
return base64_encode($encrypted . '::' . $iv);
|
||||
$encrypted = openssl_encrypt($string, "AES-256-CBC", $key, 0, substr(md5($key), 0, 16));
|
||||
return base64_encode($encrypted);
|
||||
}
|
||||
|
||||
/**
|
||||
* Décryptage
|
||||
* @param string $key la clé d'encryptage
|
||||
* @param string $garble la chaine à décoder
|
||||
* @param string $string la chaine à décoder
|
||||
* @return string
|
||||
*/
|
||||
public static function decrypt($key, $garble)
|
||||
public static function decrypt($string, $key)
|
||||
{
|
||||
list($encrypted_data, $iv) = explode('::', base64_decode($garble), 2);
|
||||
return openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv);
|
||||
$decrypted = openssl_decrypt(base64_decode($string), "AES-256-CBC", $key, 0, substr(md5($key), 0, 16));
|
||||
return $decrypted;
|
||||
}
|
||||
|
||||
}
|
@ -141,7 +141,7 @@ class Dot implements \ArrayAccess, \Iterator, \Countable
|
||||
} elseif (is_array($key)) {
|
||||
// Iterate array of paths
|
||||
foreach ($key as $k) {
|
||||
self::delete($k);
|
||||
self::deleteValue($array, $k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -18,6 +18,12 @@ class JsonDb extends \Prowebcraft\Dot
|
||||
protected $db = '';
|
||||
protected $data = null;
|
||||
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 = [])
|
||||
{
|
||||
@ -115,16 +121,16 @@ class JsonDb extends \Prowebcraft\Dot
|
||||
protected function loadData($reload = false)
|
||||
{
|
||||
if ($this->data === null || $reload) {
|
||||
$this->db = $this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name'];
|
||||
$this->db = $this->config['dir'] . $this->config['name'];
|
||||
if (!file_exists($this->db)) {
|
||||
return null; // Rebuild database manage by CMS
|
||||
} else {
|
||||
if ($this->config['backup']) {
|
||||
try {
|
||||
//todo make backup of database
|
||||
copy($this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name'], $this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name'] . '.backup');
|
||||
} catch (\Exception $e) {
|
||||
|
||||
error_log('Erreur de chargement : ' . $e);
|
||||
exit('Erreur de chargement : ' . $e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -142,22 +148,44 @@ class JsonDb extends \Prowebcraft\Dot
|
||||
*/
|
||||
public function save()
|
||||
{
|
||||
$v = json_encode($this->data, JSON_UNESCAPED_UNICODE | LOCK_EX);
|
||||
$l = strlen($v);
|
||||
$t = 0;
|
||||
while ($t < 5) {
|
||||
$w = file_put_contents($this->db, $v); // Multi user get a locker
|
||||
if ($w == $l) {
|
||||
// Encode les données au format JSON avec les options spécifiées
|
||||
//$encoded_data = json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT | JSON_PRETTY_PRINT);
|
||||
$encoded_data = json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT);
|
||||
|
||||
// Vérifie la longueur de la chaîne JSON encodée
|
||||
$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;
|
||||
}
|
||||
$try++;
|
||||
|
||||
// Incrémente le compteur de tentatives
|
||||
$attempt++;
|
||||
|
||||
// Attente
|
||||
sleep(1);
|
||||
}
|
||||
if ($w !== $l) {
|
||||
exit('Erreur d\'écriture, les données n\'ont pas été sauvegardées');
|
||||
|
||||
// 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
|
||||
* @param Page par defaut
|
||||
*/
|
||||
public function showSection()
|
||||
public function showMain()
|
||||
{
|
||||
echo '<section>';
|
||||
echo '<main><section>';
|
||||
// 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 = explode('-', $blocks);
|
||||
@ -82,19 +82,33 @@ class layout extends common
|
||||
$content = 'col' . $blocks[1];
|
||||
$blockright = 'col' . $blocks[2];
|
||||
}
|
||||
// Page pleine pour la configuration des modules et l'édition des pages sauf l'affichage d'un article de blog
|
||||
$pattern = ['config', 'edit', 'add', 'comment', 'data'];
|
||||
// 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', 'option', 'theme', 'comment', 'article', 'data', 'gallery', 'update', 'users', 'validate'];
|
||||
if (
|
||||
(sizeof($blocks) === 1 ||
|
||||
in_array($this->getUrl(1), $pattern))
|
||||
) { // 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();
|
||||
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 {
|
||||
echo '<div class="row siteContainer">';
|
||||
/**
|
||||
* Barre gauche
|
||||
*/
|
||||
if ($blockleft !== "") {
|
||||
if ($blockleft !== '') {
|
||||
echo '<div class="' . $blockleft . '" id="contentLeft"><aside>';
|
||||
// Détermine si le menu est présent
|
||||
if ($this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'displayMenu']) === 'none') {
|
||||
@ -117,12 +131,14 @@ class layout extends common
|
||||
* Contenu de page
|
||||
*/
|
||||
echo '<div class="' . $content . '" id="contentSite">';
|
||||
$this->showNavButtons('top');
|
||||
$this->showContent();
|
||||
$this->showNavButtons('bottom');
|
||||
echo '</div>';
|
||||
/**
|
||||
* Barre droite
|
||||
*/
|
||||
if ($blockright !== "") {
|
||||
if ($blockright !== '') {
|
||||
echo '<div class="' . $blockright . '" id="contentRight"><aside>';
|
||||
// Détermine si le menu est présent
|
||||
if ($this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'displayMenu']) === 'none') {
|
||||
@ -143,7 +159,7 @@ class layout extends common
|
||||
}
|
||||
echo '</div>';
|
||||
}
|
||||
echo '</section>';
|
||||
echo '</section></main>';
|
||||
}
|
||||
|
||||
/**
|
||||
@ -280,7 +296,8 @@ class layout extends common
|
||||
// Affichage de motorisé par
|
||||
$items .= '<span id="footerDisplayCopyright" ';
|
||||
$items .= $this->getData(['theme', 'footer', 'displayCopyright']) === false ? 'class="displayNone"' : '';
|
||||
$items .= '>Motorisé par </span>';
|
||||
$label = empty($this->getData(['locale', 'poweredPageLabel'])) ? 'Motorisé par' : $this->getData(['locale', 'poweredPageLabel']);
|
||||
$items .= '><wbr> ' . $label . ' </span>';
|
||||
// Toujours afficher le nom du CMS
|
||||
$items .= '<span id="footerZwiiCMS">';
|
||||
$items .= '<a href="https://zwiicms.fr/" onclick="window.open(this.href);return false" >ZwiiCMS</a>';
|
||||
@ -316,12 +333,12 @@ class layout extends common
|
||||
$items .= '<span id="footerDisplayCookie"';
|
||||
$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']);
|
||||
$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>';
|
||||
// Affichage du lien de connexion
|
||||
if (
|
||||
($this->getData(['theme', 'footer', 'loginLink'])
|
||||
and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
|
||||
and $this->isConnected() === false
|
||||
)
|
||||
or $this->getUrl(0) === 'theme'
|
||||
) {
|
||||
@ -336,19 +353,14 @@ class layout extends common
|
||||
}
|
||||
// Affichage de la barre de membre simple
|
||||
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
|
||||
) {
|
||||
$items .= '<span id="footerDisplayMemberAccount"';
|
||||
$items .= $this->getData(['theme', 'footer', 'displaymemberAccount']) === false ? ' class="displayNone">' : '>';
|
||||
$items .= '<wbr> | ' .
|
||||
template::ico('user', [
|
||||
'margin' => 'all',
|
||||
'help' => 'Mon compte',
|
||||
'href' => helper::baseUrl() . 'user/edit/' . $this->getUser('id') . '/' . $_SESSION['csrf']
|
||||
]);
|
||||
$items .= '<wbr> | ';
|
||||
if (
|
||||
$this->getData(['user', $this->getUser('id'), 'files']) === true
|
||||
$this->getUser('permission', 'filemanager') === true
|
||||
) {
|
||||
$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']),
|
||||
@ -357,6 +369,15 @@ class layout extends common
|
||||
'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', [
|
||||
'margin' => 'all',
|
||||
'help' => 'Déconnecter',
|
||||
@ -410,11 +431,27 @@ class layout extends common
|
||||
$socialUrl = 'https://www.github.com/';
|
||||
$title = 'Github';
|
||||
break;
|
||||
case 'redditId':
|
||||
$socialUrl = 'https://www.reddit.com/user/';
|
||||
$title = 'Reddit';
|
||||
break;
|
||||
case 'twitchId':
|
||||
$socialUrl = 'https://www.twitch.tv/';
|
||||
$title = 'Twitch';
|
||||
break;
|
||||
case 'vimeoId':
|
||||
$socialUrl = 'https://vimeo.com/';
|
||||
$title = 'Vimeo';
|
||||
break;
|
||||
case 'steamId':
|
||||
$socialUrl = 'https://steamcommunity.com/id/';
|
||||
$title = 'Steam';
|
||||
break;
|
||||
default:
|
||||
$socialUrl = '';
|
||||
}
|
||||
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 !== '') {
|
||||
@ -464,7 +501,7 @@ class layout extends common
|
||||
// Lien de connexion
|
||||
if (
|
||||
($this->getData(['theme', 'menu', 'loginLink'])
|
||||
and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
|
||||
and $this->isConnected() === false
|
||||
)
|
||||
or $this->getUrl(0) === 'theme'
|
||||
) {
|
||||
@ -477,11 +514,12 @@ class layout extends common
|
||||
}
|
||||
// Commandes pour les membres simples
|
||||
if (
|
||||
$this->getUser('group') == self::GROUP_MEMBER
|
||||
$this->getUser('group') === self::GROUP_MEMBER
|
||||
&& $this->getData(['theme', 'menu', 'memberBar']) === true
|
||||
) {
|
||||
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', [
|
||||
'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']),
|
||||
@ -489,11 +527,15 @@ class layout extends common
|
||||
'help' => 'Fichiers du site'
|
||||
]) . '</li>';
|
||||
}
|
||||
$itemsRight .= '<li>' . template::ico('user', [
|
||||
'help' => 'Mon compte',
|
||||
'margin' => 'right',
|
||||
'href' => helper::baseUrl() . 'user/edit/' . $this->getUser('id') . '/' . $_SESSION['csrf']
|
||||
]) . '</li>';
|
||||
if (
|
||||
$this->getUser('permission', 'user', 'edit') === true
|
||||
) {
|
||||
$itemsRight .= '<li>' . template::ico('user', [
|
||||
'help' => 'Mon compte',
|
||||
'margin' => 'right',
|
||||
'href' => helper::baseUrl() . 'user/edit/' . $this->getUser('id')
|
||||
]) . '</li>';
|
||||
}
|
||||
$itemsRight .= '<li>' .
|
||||
template::ico('logout', [
|
||||
'help' => 'Déconnecter',
|
||||
@ -503,7 +545,7 @@ class layout extends common
|
||||
}
|
||||
// Retourne les items du menu
|
||||
echo '<ul class="navMain" id="menuLeft">' . $itemsLeft . '</ul><ul class="navMain" id="menuRight">' . $itemsRight;
|
||||
// Drapeau les langues des langues selon l'existance des dossiers
|
||||
// Drapeau les langues
|
||||
foreach (self::$languages as $key => $value) {
|
||||
if (is_dir(self::DATA_DIR . $key)) {
|
||||
$t[] = $this->showi18n($key);
|
||||
@ -546,10 +588,10 @@ class layout extends common
|
||||
|
||||
if (
|
||||
($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
|
||||
and $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
||||
and $this->getUser('group') < self::GROUP_MODERATOR
|
||||
and $this->isConnected() === true
|
||||
and $this->getUser('group') < self::GROUP_EDITOR
|
||||
)
|
||||
) {
|
||||
$pageUrl = ($this->getData(['locale', 'homePageId']) === $this->getUrl(0)) ? helper::baseUrl(false) : helper::baseUrl() . $this->getUrl(0);
|
||||
@ -612,10 +654,10 @@ class layout extends common
|
||||
$items .= '<li id=' . $childKey . '>';
|
||||
if (
|
||||
($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
|
||||
and $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
||||
and $this->getUser('group') < self::GROUP_MODERATOR
|
||||
and $this->isConnected() === true
|
||||
and $this->getUser('group') < self::GROUP_EDITOR
|
||||
)
|
||||
) {
|
||||
$pageUrl = ($this->getData(['locale', 'homePageId']) === $this->getUrl(0)) ? helper::baseUrl(false) : helper::baseUrl() . $this->getUrl(0);
|
||||
@ -708,7 +750,7 @@ class layout extends common
|
||||
$items .= '<li class="menuSideChild">';
|
||||
if (
|
||||
$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) . '">';
|
||||
} else {
|
||||
@ -732,7 +774,7 @@ class layout extends common
|
||||
|
||||
if (
|
||||
$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) . '">';
|
||||
} else {
|
||||
@ -798,11 +840,33 @@ class layout extends common
|
||||
*/
|
||||
public function showMetaImage()
|
||||
{
|
||||
$items = '<meta property="og:image" content="' . helper::baseUrl(false) . self::FILE_DIR . 'source/screenshot.jpg" />';
|
||||
$items .= '<meta property="og:image:type" content="image/jpeg" />';
|
||||
$items .= '<meta property="og:image:width" content="1200" />';
|
||||
$items .= '<meta property="og:image:height" content="627" />';
|
||||
echo $items;
|
||||
$imagePath = self::FILE_DIR . 'source/' . $this->getData(['config', 'seo', 'openGraphImage']);
|
||||
if (
|
||||
$this->getData(['config', 'seo', 'openGraphImage'])
|
||||
&& 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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -846,31 +910,34 @@ class layout extends common
|
||||
*/
|
||||
public function showBar()
|
||||
{
|
||||
if ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')) {
|
||||
if ($this->isConnected() === true) {
|
||||
// Items de gauche
|
||||
$leftItems = '';
|
||||
// Sélecteur de langues
|
||||
if ($this->getUser('group') >= self::GROUP_MODERATOR) {
|
||||
$c = 0;
|
||||
if ($this->getUser('group') >= self::GROUP_EDITOR) {
|
||||
$leftItem = '';
|
||||
foreach (self::$languages as $key => $value) {
|
||||
if (is_dir(self::DATA_DIR . $key)) {
|
||||
$c++;
|
||||
$location = helper::baseUrl() . 'translate/content/' . $key;
|
||||
$leftItem .= '<option name="' . $key . '" value="' . $location . '" ' . ($key === self::$i18nContent ? 'selected' : '') . '>' . $value . '</option>';
|
||||
$location = helper::baseUrl() . 'language/content/' . $key;
|
||||
$leftItem .= '<option name="' . $key . '" value="' . $location . '" ' . ($key === self::$siteContent ? 'selected' : '') . '>' . $value . '</option>';
|
||||
}
|
||||
}
|
||||
if ($c > 1) {
|
||||
$leftItems .= '<li><select id="barSelectLanguage" >';
|
||||
$leftItems .= $leftItem;
|
||||
$leftItems .= '</select></li>';
|
||||
}
|
||||
$leftItems .= '<li><select id="barSelectLanguage" >';
|
||||
$leftItems .= $leftItem;
|
||||
$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
|
||||
if ($this->getUser('group') >= self::GROUP_MODERATOR) {
|
||||
if ($this->getUser('group') >= self::GROUP_EDITOR) {
|
||||
$leftItems .= '<li><select id="barSelectPage">';
|
||||
$leftItems .= '<option value="">Pages du site</option>';
|
||||
$leftItems .= '<optgroup label="Pages orphelines">';
|
||||
$leftItems .= '<option value="">' . helper::translate('Pages du site') . '</option>';
|
||||
$leftItems .= '<optgroup label="' . helper::translate('Pages orphelines') . '">';
|
||||
$orpheline = true;
|
||||
$currentPageId = $this->getData(['page', $this->getUrl(0)]) ? $this->getUrl(0) : $this->getUrl(2);
|
||||
foreach ($this->getHierarchy(null, false) as $parentPageId => $childrenPageIds) {
|
||||
@ -879,7 +946,7 @@ class layout extends common
|
||||
$orpheline
|
||||
) {
|
||||
$orpheline = false;
|
||||
$leftItems .= '<optgroup label="Pages dans le menu">';
|
||||
$leftItems .= '<optgroup label="' . helper::translate('Pages dans le menu') . '">';
|
||||
}
|
||||
// Exclure les barres
|
||||
if ($this->getData(['page', $parentPageId, 'block']) !== 'bar') {
|
||||
@ -909,7 +976,7 @@ class layout extends common
|
||||
}
|
||||
$leftItems .= '</optgroup' >
|
||||
// Afficher les barres
|
||||
$leftItems .= '<optgroup label="Barres latérales">';
|
||||
$leftItems .= '<optgroup label="' . helper::translate('Barres latérales') . '">';
|
||||
foreach ($this->getHierarchy(null, false, true) as $parentPageId => $childrenPageIds) {
|
||||
$leftItems .= '<option value="' . helper::baseUrl() . $parentPageId . '"' . ($parentPageId === $currentPageId ? ' selected' : false) . '>' . $this->getData(['page', $parentPageId, 'shortTitle']) . '</option>';
|
||||
foreach ($childrenPageIds as $childKey) {
|
||||
@ -918,49 +985,82 @@ class layout extends common
|
||||
}
|
||||
$leftItems .= '</optgroup>';
|
||||
$leftItems .= '</select></li>';
|
||||
$leftItems .= '<li>' . template::ico('plus', [
|
||||
'href' => helper::baseUrl() . 'page/add',
|
||||
'help' => 'Nouvelle page ou barre latérale'
|
||||
]) . '</li>';
|
||||
// Bouton Ajouter une page
|
||||
if ($this->getUser('permission', 'page', 'add')) {
|
||||
$leftItems .= '<li>' . template::ico('plus', [
|
||||
'href' => helper::baseUrl() . 'page/add/' . self::$siteContent,
|
||||
'help' => 'Nouvelle page ou barre latérale'
|
||||
]) . '</li>';
|
||||
}
|
||||
if (
|
||||
// Sur un module de page qui autorise le bouton de modification de la page
|
||||
$this->core->output['showBarEditButton']
|
||||
// Sur une page sans module
|
||||
or $this->getData(['page', $this->getUrl(0), 'moduleId']) === ''
|
||||
// Sur une page avec un module invalide
|
||||
or (!is_null($this->getData(['page', $this->getUrl(2), 'moduleId'])) &&
|
||||
!class_exists($this->getData(['page', $this->getUrl(2), 'moduleId']))
|
||||
or (empty($this->getData(['page', $this->getUrl(0), 'moduleId'])) === false
|
||||
and class_exists($this->getData(['page', $this->getUrl(0), 'moduleId'])) === false
|
||||
)
|
||||
// Sur une page d'accueil
|
||||
or $this->getUrl(0) === ''
|
||||
) {
|
||||
$leftItems .= '<li>' . template::ico('pencil', [
|
||||
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0),
|
||||
'help' => 'Éditer la page'
|
||||
]) . '</li>';
|
||||
if ($this->getData(['page', $this->getUrl(0), 'moduleId'])) {
|
||||
// Bouton Editer une page
|
||||
if (
|
||||
$this->getUser('permission', 'page', 'edit')
|
||||
and $this->geturl(1) !== 'edit'
|
||||
) {
|
||||
$leftItems .= '<li>' . template::ico('pencil', [
|
||||
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0) . '/' . self::$siteContent,
|
||||
'help' => 'Éditer la page'
|
||||
]) . '</li>';
|
||||
}
|
||||
// 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'])
|
||||
and class_exists($this->getData(['page', $this->getUrl(0), 'moduleId'])) === true
|
||||
) {
|
||||
$leftItems .= '<li>' . template::ico('gear', [
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/config',
|
||||
'help' => 'Module de la page'
|
||||
]) . '</li>';
|
||||
}
|
||||
$leftItems .= '<li>' . template::ico('clone', [
|
||||
'href' => helper::baseUrl() . 'page/duplicate/' . $this->getUrl(0) . '&csrf=' . $_SESSION['csrf'],
|
||||
'help' => 'Dupliquer la page'
|
||||
])
|
||||
. '</li>';
|
||||
// Bouton dupliquer une page
|
||||
if (
|
||||
$this->getUser('permission', 'page', 'duplicate')
|
||||
and $this->geturl(1) !== 'edit'
|
||||
) {
|
||||
$leftItems .= '<li>' . template::ico('clone', [
|
||||
'href' => helper::baseUrl() . 'page/duplicate/' . $this->getUrl(0) . '/' . self::$siteContent,
|
||||
'help' => 'Dupliquer la page'
|
||||
])
|
||||
. '</li>';
|
||||
}
|
||||
// Bouton Effacer une page
|
||||
if (
|
||||
$this->getUser('permission', 'page', 'delete')
|
||||
and $this->geturl(1) !== 'edit'
|
||||
|
||||
$leftItems .= '<li>' . template::ico('trash', [
|
||||
'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(0) . '&csrf=' . $_SESSION['csrf'],
|
||||
'help' => 'Supprimer la page',
|
||||
'id' => 'pageDelete'
|
||||
])
|
||||
. '</li>';
|
||||
) {
|
||||
$leftItems .= '<li>' . template::ico('trash', [
|
||||
'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(0) . '/' . self::$siteContent,
|
||||
'help' => 'Supprimer la page',
|
||||
'id' => 'pageDelete'
|
||||
])
|
||||
. '</li>';
|
||||
}
|
||||
}
|
||||
}
|
||||
// Items de droite
|
||||
$rightItems = '';
|
||||
if ($this->getUser('group') >= self::GROUP_MODERATOR) {
|
||||
if (
|
||||
$this->getUser('group') >= self::GROUP_EDITOR
|
||||
&& $this->getUser(
|
||||
'permission',
|
||||
'filemanager'
|
||||
)
|
||||
) {
|
||||
$rightItems .= '<li>' . template::ico('folder', [
|
||||
'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']),
|
||||
@ -972,23 +1072,14 @@ class layout extends common
|
||||
'help' => 'Thème',
|
||||
'href' => helper::baseUrl() . 'theme'
|
||||
]) . '</li>';
|
||||
$rightItems .= '<li>' . template::ico('puzzle', [
|
||||
'help' => 'Modules',
|
||||
'href' => helper::baseUrl() . 'plugin'
|
||||
]) . '</li>';
|
||||
$rightItems .= '<li>' . template::ico('flag', [
|
||||
'help' => 'Multilingue',
|
||||
'href' => helper::baseUrl() . 'translate'
|
||||
$rightItems .= '<li>' . template::ico('users', [
|
||||
'help' => 'Utilisateurs',
|
||||
'href' => helper::baseUrl() . 'user'
|
||||
]) . '</li>';
|
||||
$rightItems .= '<li>' . template::ico('cog-alt', [
|
||||
'help' => 'Configuration',
|
||||
'href' => helper::baseUrl() . 'config'
|
||||
]) . '</li>';
|
||||
$rightItems .= '<li>' . template::ico('users', [
|
||||
'help' => 'Utilisateurs',
|
||||
'href' => helper::baseUrl() . 'user'
|
||||
]) . '</li>';
|
||||
|
||||
// Mise à jour automatique
|
||||
$today = mktime(0, 0, 0);
|
||||
$checkUpdate = $this->getData(['core', 'lastAutoUpdate']);
|
||||
@ -1000,26 +1091,64 @@ class layout extends common
|
||||
$today > $checkUpdate + $this->getData(['config', 'autoUpdateDelay', 86400])
|
||||
) {
|
||||
// Dernier auto controle
|
||||
$this->setData(['core', 'lastAutoUpdate', $today]);
|
||||
$this->setData(['core', 'lastAutoUpdate', $today], false);
|
||||
if (
|
||||
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
|
||||
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>';
|
||||
}
|
||||
}
|
||||
if ($this->getUser('group') >= self::GROUP_MODERATOR) {
|
||||
$rightItems .= '<li><a href="' . helper::baseUrl() . 'user/edit/' . $this->getUser('id') . '/' . $_SESSION['csrf'] .
|
||||
'" data-tippy-content="'. helper::translate('Configurer mon compte') . '">' .
|
||||
template::ico('user', ['margin' => 'right']) . '<span id="displayUsername">' . $this->getUser('firstname') . ' ' . $this->getUser('lastname') .
|
||||
'</span></a></li>';
|
||||
if ($this->getData(['core', 'updateModuleAvailable'])) {
|
||||
$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') . '">' .
|
||||
template::ico('user', ['margin' => 'right']) . '<span id="displayUsername">' . $this->getUser('firstname') . ' ' . $this->getUser('lastname') .
|
||||
'</span></a></li>';
|
||||
}
|
||||
$rightItems .= '<li>' . template::ico('logout', [
|
||||
'help' => 'Déconnecter',
|
||||
@ -1043,7 +1172,8 @@ class layout extends common
|
||||
if ($this->core->output['inlineScript']) {
|
||||
$inlineScript = implode($this->core->output['inlineScript']);
|
||||
}
|
||||
echo '<script defer>' . helper::minifyJs($coreScript . $this->core->output['script'] . htmlspecialchars_decode($inlineScript)) . '</script>';
|
||||
echo '<script defer>' . helper::minifyJs($coreScript . $this->core->output['script']) . '</script>';
|
||||
echo '<script defer>' . helper::minifyJs(htmlspecialchars_decode($inlineScript)) . '</script>';
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1070,7 +1200,7 @@ class layout extends common
|
||||
if ($this->core->output['inlineStyle']) {
|
||||
foreach ($this->core->output['inlineStyle'] as $style) {
|
||||
if ($style) {
|
||||
echo '<style type="text/css">' . helper::minifyCss($style) . '</style>';
|
||||
echo '<style type="text/css">' . helper::minifyCss(htmlspecialchars_decode($style)) . '</style>';
|
||||
}
|
||||
|
||||
}
|
||||
@ -1083,8 +1213,8 @@ class layout extends common
|
||||
public function showFonts()
|
||||
{
|
||||
// Import des fontes liées au thème
|
||||
if (file_exists(self::DATA_DIR . 'fonts/fonts.html')) {
|
||||
include_once(self::DATA_DIR . 'fonts/fonts.html');
|
||||
if (file_exists(self::DATA_DIR . 'font/font.html')) {
|
||||
include_once(self::DATA_DIR . 'font/font.html');
|
||||
}
|
||||
}
|
||||
|
||||
@ -1097,8 +1227,8 @@ class layout extends common
|
||||
$vars = 'var baseUrl = ' . json_encode(helper::baseUrl(false)) . ';';
|
||||
$vars .= 'var baseUrlQs = ' . json_encode(helper::baseUrl()) . ';';
|
||||
if (
|
||||
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
||||
and $this->getUser('group') >= self::GROUP_MODERATOR
|
||||
$this->isConnected() === true
|
||||
and $this->getUser('group') >= self::GROUP_EDITOR
|
||||
) {
|
||||
$vars .= 'var privateKey = ' . json_encode(md5_file(self::DATA_DIR . 'core.json')) . ';';
|
||||
}
|
||||
@ -1146,22 +1276,85 @@ class layout extends common
|
||||
public function showi18n($lang)
|
||||
{
|
||||
if (
|
||||
is_dir(self::DATA_DIR . $lang)
|
||||
(isset($_SESSION['ZWII_SITE_CONTENT'])
|
||||
and $_SESSION['ZWII_SITE_CONTENT'] === $lang
|
||||
)
|
||||
) {
|
||||
if (
|
||||
(isset($_COOKIE['ZWII_CONTENT'])
|
||||
and $_COOKIE['ZWII_CONTENT'] === $lang
|
||||
)
|
||||
) {
|
||||
$select = ' class="i18nFlagSelected" ';
|
||||
} else {
|
||||
$select = ' class="i18nFlag" ';
|
||||
}
|
||||
|
||||
$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 .= '</li>';
|
||||
$select = ' class="i18nFlagSelected" ';
|
||||
} else {
|
||||
$select = ' class="i18nFlag" ';
|
||||
}
|
||||
|
||||
$items = '<li>';
|
||||
$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>';
|
||||
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
|
||||
|
||||
/**
|
||||
* Chargement des classes filles
|
||||
* router : aiguillage des pages
|
||||
*/
|
||||
|
||||
require_once('core/class/layout.class.php');
|
||||
|
||||
class core extends common
|
||||
{
|
||||
|
||||
@ -18,16 +11,16 @@ class core extends common
|
||||
parent::__construct();
|
||||
// Token CSRF
|
||||
if (empty($_SESSION['csrf'])) {
|
||||
$_SESSION['csrf'] = bin2hex(openssl_random_pseudo_bytes(32));
|
||||
$_SESSION['csrf'] = bin2hex(openssl_random_pseudo_bytes(64));
|
||||
}
|
||||
|
||||
// Fuseau horaire
|
||||
self::$timezone = $this->getData(['config', 'timezone']); // Utile pour transmettre le timezone à la classe helper
|
||||
date_default_timezone_set(self::$timezone);
|
||||
common::$timezone = $this->getData(['config', 'timezone']); // Utile pour transmettre le timezone à la classe helper
|
||||
date_default_timezone_set(common::$timezone);
|
||||
// Supprime les fichiers temporaires
|
||||
$lastClearTmp = mktime(0, 0, 0);
|
||||
if ($lastClearTmp > $this->getData(['core', 'lastClearTmp']) + 86400) {
|
||||
$iterator = new DirectoryIterator(self::TEMP_DIR);
|
||||
$iterator = new DirectoryIterator(common::TEMP_DIR);
|
||||
foreach ($iterator as $fileInfos) {
|
||||
if (
|
||||
$fileInfos->isFile() &&
|
||||
@ -39,8 +32,6 @@ class core extends common
|
||||
}
|
||||
// Date de la dernière suppression
|
||||
$this->setData(['core', 'lastClearTmp', $lastClearTmp]);
|
||||
// Enregistre les données
|
||||
//$this->SaveData();
|
||||
}
|
||||
// Backup automatique des données
|
||||
$lastBackup = mktime(0, 0, 0);
|
||||
@ -50,11 +41,11 @@ class core extends common
|
||||
and $this->getData(['user']) // Pas de backup pendant l'installation
|
||||
) {
|
||||
// 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
|
||||
$this->setData(['core', 'lastBackup', $lastBackup]);
|
||||
// Supprime les backups de plus de 30 jours
|
||||
$iterator = new DirectoryIterator(self::BACKUP_DIR);
|
||||
$iterator = new DirectoryIterator(common::BACKUP_DIR);
|
||||
foreach ($iterator as $fileInfos) {
|
||||
if (
|
||||
$fileInfos->isFile()
|
||||
@ -67,23 +58,23 @@ class core extends common
|
||||
}
|
||||
|
||||
// Crée le fichier de personnalisation avancée
|
||||
if (file_exists(self::DATA_DIR . 'custom.css') === false) {
|
||||
file_put_contents(self::DATA_DIR . 'custom.css', file_get_contents('core/module/theme/resource/custom.css'));
|
||||
chmod(self::DATA_DIR . 'custom.css', 0755);
|
||||
if (file_exists(common::DATA_DIR . 'custom.css') === false) {
|
||||
$this->secure_file_put_contents(common::DATA_DIR . 'custom.css', file_get_contents('core/module/theme/resource/custom.css'));
|
||||
chmod(common::DATA_DIR . 'custom.css', 0755);
|
||||
}
|
||||
// Crée le fichier de personnalisation
|
||||
if (file_exists(self::DATA_DIR . 'theme.css') === false) {
|
||||
file_put_contents(self::DATA_DIR . 'theme.css', '');
|
||||
chmod(self::DATA_DIR . 'theme.css', 0755);
|
||||
if (file_exists(common::DATA_DIR . 'theme.css') === false) {
|
||||
$this->secure_file_put_contents(common::DATA_DIR . 'theme.css', '');
|
||||
chmod(common::DATA_DIR . 'theme.css', 0755);
|
||||
}
|
||||
// Crée le fichier de personnalisation de l'administration
|
||||
if (file_exists(self::DATA_DIR . 'admin.css') === false) {
|
||||
file_put_contents(self::DATA_DIR . 'admin.css', '');
|
||||
chmod(self::DATA_DIR . 'admin.css', 0755);
|
||||
if (file_exists(common::DATA_DIR . 'admin.css') === false) {
|
||||
$this->secure_file_put_contents(common::DATA_DIR . 'admin.css', '');
|
||||
chmod(common::DATA_DIR . 'admin.css', 0755);
|
||||
}
|
||||
|
||||
// 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'])))) {
|
||||
// Version
|
||||
$css = '/*' . md5(json_encode($this->getData(['theme']))) . '*/';
|
||||
@ -97,9 +88,9 @@ class core extends common
|
||||
*/
|
||||
|
||||
// Fonts disponibles
|
||||
$fontsAvailable['files'] = $this->getData(['fonts', 'files']);
|
||||
$fontsAvailable['imported'] = $this->getData(['fonts', 'imported']);
|
||||
$fontsAvailable['websafe'] = self::$fontsWebSafe;
|
||||
$fontsAvailable['files'] = $this->getData(['font', 'files']);
|
||||
$fontsAvailable['imported'] = $this->getData(['font', 'imported']);
|
||||
$fontsAvailable['websafe'] = common::$fontsWebSafe;
|
||||
|
||||
// Fontes installées
|
||||
$fonts = [
|
||||
@ -112,53 +103,14 @@ class core extends common
|
||||
// Suppression des polices identiques
|
||||
$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
|
||||
*/
|
||||
$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
|
||||
* Charge les fontes
|
||||
*/
|
||||
foreach ($fonts as $fontId) {
|
||||
// Validité du tableau :
|
||||
if (isset($fontsAvailable['files'][$fontId])) {
|
||||
if (file_exists(self::DATA_DIR . 'fonts/' . $fontId)) {
|
||||
// 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';
|
||||
foreach (['websafe', 'imported', 'files'] as $typeFont) {
|
||||
if (isset($fontsAvailable[$typeFont][$fontId])) {
|
||||
$fonts[$fontId] = $fontsAvailable[$typeFont][$fontId]['font-family'];
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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 {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 #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 .= '#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
|
||||
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
|
||||
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
|
||||
$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'])))) {
|
||||
|
||||
// Version
|
||||
$css = '/*' . md5(json_encode($this->getData(['admin']))) . '*/';
|
||||
|
||||
// Fonts disponibles
|
||||
$fontsAvailable['files'] = $this->getData(['fonts', 'files']);
|
||||
$fontsAvailable['imported'] = $this->getData(['fonts', 'imported']);
|
||||
$fontsAvailable['websafe'] = self::$fontsWebSafe;
|
||||
$fontsAvailable['files'] = $this->getData(['font', 'files']);
|
||||
$fontsAvailable['imported'] = $this->getData(['font', 'imported']);
|
||||
$fontsAvailable['websafe'] = common::$fontsWebSafe;
|
||||
|
||||
/**
|
||||
* Import des polices de caractères
|
||||
@ -359,44 +305,12 @@ class core extends common
|
||||
$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
|
||||
*/
|
||||
$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
|
||||
* Charge les fontes
|
||||
*/
|
||||
foreach ($fonts as $fontId) {
|
||||
// Validité du tableau :
|
||||
if (isset($fontsAvailable['files'][$fontId])) {
|
||||
if (file_exists(self::DATA_DIR . 'fonts/' . $fontId)) {
|
||||
// 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';
|
||||
foreach (['websafe', 'imported', 'files'] as $typeFont) {
|
||||
if (isset($fontsAvailable[$typeFont][$fontId])) {
|
||||
$fonts[$fontId] = $fontsAvailable[$typeFont][$fontId]['font-family'];
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -407,6 +321,26 @@ class core extends common
|
||||
$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 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
|
||||
$colors = helper::colorVariants($this->getData(['admin', 'colorText']));
|
||||
@ -431,7 +365,7 @@ class core extends common
|
||||
// Bordure du contour TinyMCE
|
||||
$css .= '.mce-tinymce{border: 1px solid ' . $this->getData(['admin', 'borderBlockColor']) . '!important;}';
|
||||
// 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;
|
||||
}
|
||||
// Module
|
||||
elseif (is_readable(self::MODULE_DIR . $classPath)) {
|
||||
require self::MODULE_DIR . $classPath;
|
||||
elseif (is_readable(common::MODULE_DIR . $classPath)) {
|
||||
require common::MODULE_DIR . $classPath;
|
||||
}
|
||||
// Librairie
|
||||
elseif (is_readable('core/vendor/' . $classPath)) {
|
||||
@ -462,7 +396,6 @@ class core extends common
|
||||
public function router()
|
||||
{
|
||||
|
||||
//
|
||||
$layout = new layout($this);
|
||||
|
||||
// Installation
|
||||
@ -474,19 +407,14 @@ class core extends common
|
||||
header('Location:' . helper::baseUrl() . 'install');
|
||||
exit();
|
||||
}
|
||||
|
||||
// Journalisation
|
||||
$dataLog = helper::dateUTF8('%Y %m %d', time()) . ' - ' . helper::dateUTF8('%H:%M', time());
|
||||
$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);
|
||||
}
|
||||
$this->saveLog();
|
||||
|
||||
// Force la déconnexion des membres bannis ou d'une seconde session
|
||||
if (
|
||||
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
||||
and ($this->getUser('group') === self::GROUP_BANNED
|
||||
$this->isConnected() === true
|
||||
and ($this->getUser('group') === common::GROUP_BANNED
|
||||
or ($_SESSION['csrf'] !== $this->getData(['user', $this->getUser('id'), 'accessCsrf'])
|
||||
and $this->getData(['config', 'connect', 'autoDisconnect']) === true)
|
||||
)
|
||||
@ -499,9 +427,9 @@ class core extends common
|
||||
$this->getData(['config', 'maintenance'])
|
||||
and in_array($this->getUrl(0), ['maintenance', 'user']) === false
|
||||
and $this->getUrl(1) !== 'login'
|
||||
and ($this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
|
||||
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
||||
and $this->getUser('group') < self::GROUP_ADMIN
|
||||
and ($this->isConnected() === false
|
||||
or ($this->isConnected() === true
|
||||
and $this->getUser('group') < common::GROUP_ADMIN
|
||||
)
|
||||
)
|
||||
) {
|
||||
@ -513,13 +441,16 @@ class core extends common
|
||||
header('Location:' . helper::baseUrl() . 'maintenance');
|
||||
exit();
|
||||
}
|
||||
|
||||
// Check l'accès à la page
|
||||
$access = null;
|
||||
if ($this->getData(['page', $this->getUrl(0)]) !== null) {
|
||||
if (
|
||||
$this->getData(['page', $this->getUrl(0), 'group']) === self::GROUP_VISITOR
|
||||
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
||||
and $this->getUser('group') >= $this->getData(['page', $this->getUrl(0), 'group'])
|
||||
$this->getData(['page', $this->getUrl(0), 'group']) === common::GROUP_VISITOR
|
||||
or ($this->isConnected() === true
|
||||
// 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;
|
||||
@ -533,14 +464,22 @@ class core extends common
|
||||
// Empêcher l'accès aux pages désactivées par URL directe
|
||||
if (
|
||||
($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
|
||||
and $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
||||
and $this->getUser('group') < self::GROUP_MODERATOR
|
||||
and $this->isConnected() === true
|
||||
and $this->getUser('group') < common::GROUP_EDITOR
|
||||
)
|
||||
) {
|
||||
$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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -553,29 +492,32 @@ class core extends common
|
||||
*/
|
||||
$accessInfo['userName'] = '';
|
||||
$accessInfo['pageId'] = '';
|
||||
foreach ($this->getData(['user']) as $userId => $userIds) {
|
||||
if (!is_null($this->getData(['user', $userId, 'accessUrl']))) {
|
||||
$t = explode('/', $this->getData(['user', $userId, 'accessUrl']));
|
||||
}
|
||||
if (
|
||||
$this->getUser('id') &&
|
||||
$userId !== $this->getUser('id') &&
|
||||
$this->getData(['user', $userId, 'accessUrl']) === $this->getUrl() &&
|
||||
array_intersect($t, self::$accessList) &&
|
||||
array_intersect($t, self::$accessExclude) !== false &&
|
||||
time() < $this->getData(['user', $userId, 'accessTimer']) + self::ACCESS_TIMER
|
||||
) {
|
||||
$access = false;
|
||||
$accessInfo['userName'] = $this->getData(['user', $userId, 'lastname']) . ' ' . $this->getData(['user', $userId, 'firstname']);
|
||||
$accessInfo['pageId'] = end($t);
|
||||
if ($this->getData(['user'])) {
|
||||
foreach ($this->getData(['user']) as $userId => $userIds) {
|
||||
if (!is_null($this->getData(['user', $userId, 'accessUrl']))) {
|
||||
$t = explode('/', $this->getData(['user', $userId, 'accessUrl']));
|
||||
}
|
||||
if (
|
||||
$this->getUser('id') &&
|
||||
$userId !== $this->getUser('id') &&
|
||||
$this->getData(['user', $userId, 'accessUrl']) === $this->getUrl() &&
|
||||
array_intersect($t, common::$concurrentAccess) &&
|
||||
//array_intersect($t, common::$accessExclude) !== false &&
|
||||
time() < $this->getData(['user', $userId, 'accessTimer']) + common::ACCESS_TIMER
|
||||
) {
|
||||
$access = false;
|
||||
$accessInfo['userName'] = $this->getData(['user', $userId, 'lastname']) . ' ' . $this->getData(['user', $userId, 'firstname']);
|
||||
$accessInfo['pageId'] = end($t);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Accès concurrent stocke la page visitée
|
||||
if (
|
||||
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
||||
$this->isConnected() === true
|
||||
&& $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()]);
|
||||
}
|
||||
// Breadcrumb
|
||||
@ -599,10 +541,10 @@ class core extends common
|
||||
$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
|
||||
$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']);
|
||||
$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']);
|
||||
$inlineScript[] = $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'js']) === null ? '' : $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'js']);
|
||||
|
||||
@ -620,7 +562,7 @@ class core extends common
|
||||
|
||||
$this->addOutput([
|
||||
'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']),
|
||||
'metaTitle' => $this->getData(['page', $this->getUrl(0), 'metaTitle']),
|
||||
'typeMenu' => $this->getData(['page', $this->getUrl(0), 'typeMenu']),
|
||||
@ -646,7 +588,7 @@ class core extends common
|
||||
: $this->getData(['page', $this->getUrl(0), 'metaDescription']);
|
||||
|
||||
// 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([
|
||||
'title' => $title,
|
||||
@ -691,9 +633,10 @@ class core extends common
|
||||
$output = $module->output;
|
||||
// Check le groupe de l'utilisateur
|
||||
if (
|
||||
($module::$actions[$action] === self::GROUP_VISITOR
|
||||
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
||||
($module::$actions[$action] === common::GROUP_VISITOR
|
||||
or ($this->isConnected() === true
|
||||
and $this->getUser('group') >= $module::$actions[$action]
|
||||
and $this->getUser('permission', $moduleId, $action)
|
||||
)
|
||||
)
|
||||
and $output['access'] === true
|
||||
@ -703,10 +646,10 @@ class core extends common
|
||||
foreach ($_POST as $postId => $postValue) {
|
||||
if (is_array($postValue)) {
|
||||
foreach ($postValue as $subPostId => $subPostValue) {
|
||||
self::$inputBefore[$postId . '_' . $subPostId] = $subPostValue;
|
||||
common::$inputBefore[$postId . '_' . $subPostId] = $subPostValue;
|
||||
}
|
||||
} else {
|
||||
self::$inputBefore[$postId] = $postValue;
|
||||
common::$inputBefore[$postId] = $postValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -746,9 +689,9 @@ class core extends common
|
||||
// Contenu par vue
|
||||
elseif ($output['view']) {
|
||||
// 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
|
||||
$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)) {
|
||||
$this->addOutput([
|
||||
'style' => file_get_contents($stylePath)
|
||||
@ -761,7 +704,7 @@ class core extends common
|
||||
}
|
||||
|
||||
// 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)) {
|
||||
ob_start();
|
||||
include $scriptPath;
|
||||
@ -770,7 +713,7 @@ class core extends common
|
||||
]);
|
||||
}
|
||||
// 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)) {
|
||||
ob_start();
|
||||
include $viewPath;
|
||||
@ -779,7 +722,7 @@ class core extends common
|
||||
$this->addOutput([
|
||||
'content' => ob_get_clean() . ($output['showPageContent'] ? $pageContent : '')
|
||||
]);
|
||||
} else if ($modpos === 'free') {
|
||||
} elseif ($modpos === 'free' && strstr($pageContent, '[MODULE]')) {
|
||||
if (strstr($pageContent, '[MODULE]', true) === false) {
|
||||
$begin = strstr($pageContent, '[]', true);
|
||||
} else {
|
||||
@ -839,7 +782,7 @@ class core extends common
|
||||
if ($accessInfo['userName']) {
|
||||
$this->addOutput([
|
||||
'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 {
|
||||
@ -851,12 +794,35 @@ class core extends common
|
||||
} else {
|
||||
$this->addOutput([
|
||||
'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'] === '') {
|
||||
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 (
|
||||
$this->getData(['locale', 'page404']) !== 'none'
|
||||
and $this->getData(['page', $this->getData(['locale', 'page404'])])
|
||||
@ -865,7 +831,7 @@ class core extends common
|
||||
} else {
|
||||
$this->addOutput([
|
||||
'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>')
|
||||
]);
|
||||
}
|
||||
}
|
||||
@ -888,41 +854,43 @@ class core extends common
|
||||
}
|
||||
switch ($this->output['display']) {
|
||||
// Layout brut
|
||||
case self::DISPLAY_RAW:
|
||||
case common::DISPLAY_RAW:
|
||||
echo $this->output['content'];
|
||||
break;
|
||||
// Layout vide
|
||||
case self::DISPLAY_LAYOUT_BLANK:
|
||||
case common::DISPLAY_LAYOUT_BLANK:
|
||||
require 'core/layout/blank.php';
|
||||
break;
|
||||
// Affichage en JSON
|
||||
case self::DISPLAY_JSON:
|
||||
case common::DISPLAY_JSON:
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode($this->output['content']);
|
||||
break;
|
||||
// RSS feed
|
||||
case self::DISPLAY_RSS:
|
||||
case common::DISPLAY_RSS:
|
||||
header('Content-type: application/rss+xml; charset=UTF-8');
|
||||
echo $this->output['content'];
|
||||
break;
|
||||
// Layout allégé
|
||||
case self::DISPLAY_LAYOUT_LIGHT:
|
||||
case common::DISPLAY_LAYOUT_LIGHT:
|
||||
ob_start();
|
||||
require 'core/layout/light.php';
|
||||
// Supprime les espaces, les sauts de ligne, les tabulations et autres caractères inutiles
|
||||
$content = preg_replace('/[\t ]+/u', ' ', ob_get_clean());
|
||||
$content = ob_get_clean();
|
||||
// Convertit la chaîne en UTF-8 pour conserver les caractères accentués
|
||||
$content = mb_convert_encoding($content, 'UTF-8', 'UTF-8');
|
||||
// Supprime les espaces, les sauts de ligne, les tabulations et autres caractères inutiles
|
||||
$content = preg_replace('/[\t ]+/u', ' ', $content);
|
||||
echo $content;
|
||||
break;
|
||||
// Layout principal
|
||||
case self::DISPLAY_LAYOUT_MAIN:
|
||||
case common::DISPLAY_LAYOUT_MAIN:
|
||||
ob_start();
|
||||
require 'core/layout/main.php';
|
||||
// Supprime les espaces, les sauts de ligne, les tabulations et autres caractères inutiles
|
||||
$content = preg_replace('/[\t ]+/u', ' ', ob_get_clean());
|
||||
$content = ob_get_clean();
|
||||
// Convertit la chaîne en UTF-8 pour conserver les caractères accentués
|
||||
$content = mb_convert_encoding($content, 'UTF-8', 'UTF-8');
|
||||
// Supprime les espaces, les sauts de ligne, les tabulations et autres caractères inutiles
|
||||
$content = preg_replace('/[\t ]+/u', ' ', $content);
|
||||
echo $content;
|
||||
break;
|
||||
}
|
||||
|
@ -128,7 +128,17 @@ class SitemapGenerator
|
||||
*/
|
||||
private $sampleRobotsLines = [
|
||||
"User-agent: *",
|
||||
"Disallow: /",
|
||||
"User-agent: Googlebot",
|
||||
"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
|
||||
|
@ -28,7 +28,7 @@ class template
|
||||
$attributes['value'] = helper::translate($attributes['value']);
|
||||
$attributes['help'] = helper::translate($attributes['help']);
|
||||
// Retourne le html
|
||||
return sprintf(
|
||||
return sprintf(
|
||||
'<a %s class="button %s %s %s" %s>%s</a>',
|
||||
helper::sprintAttributes($attributes, ['class', 'disabled', 'ico', 'value']),
|
||||
$attributes['disabled'] ? 'disabled' : '',
|
||||
@ -65,12 +65,12 @@ class template
|
||||
// Limite addition et soustraction selon le type de captcha
|
||||
$numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20];
|
||||
$letters = ['u', 't', 's', 'r', 'q', 'p', 'o', 'n', 'm', 'l', 'k', 'j', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a'];
|
||||
$limit = $attributes['limit'] ? count($letters) - 1 : 10;
|
||||
$limit = $attributes['limit'] ? count($letters) - 1 : 10;
|
||||
|
||||
// Tirage de l'opération
|
||||
mt_srand();
|
||||
// Captcha simple limité à l'addition
|
||||
$operator = $attributes['limit'] ? mt_rand(1, 4) : 1;
|
||||
$operator = $attributes['limit'] ? mt_rand(1, 4) : 1;
|
||||
|
||||
// Limite si multiplication ou division
|
||||
if ($operator > 2) {
|
||||
@ -93,26 +93,26 @@ class template
|
||||
// Icône de l'opérateur et calcul du résultat
|
||||
switch ($operator) {
|
||||
case 1:
|
||||
$operator = template::ico('plus');
|
||||
$result = $firstNumber + $secondNumber;
|
||||
$operator = template::ico('plus', ['fontSize' => '2em;']);
|
||||
$result = $firstNumber + $secondNumber;
|
||||
break;
|
||||
case 2:
|
||||
$operator = template::ico('minus');
|
||||
$result = $firstNumber - $secondNumber;
|
||||
$operator = template::ico('minus', ['fontSize' => '2em;']);
|
||||
$result = $firstNumber - $secondNumber;
|
||||
break;
|
||||
case 3:
|
||||
$operator = template::ico('cancel');
|
||||
$result = $firstNumber * $secondNumber;
|
||||
$operator = template::ico('cancel', ['fontSize' => '2em;']);
|
||||
$result = $firstNumber * $secondNumber;
|
||||
break;
|
||||
case 4:
|
||||
$operator = template::ico('divide');
|
||||
$operator = template::ico('divide', ['fontSize' => '2em;']);
|
||||
$limit2 = [10, 10, 6, 5, 4, 3, 2, 2, 2, 2];
|
||||
for ($i = 1; $i <= $firstNumber; $i++) {
|
||||
$limit = $limit2[$i - 1];
|
||||
}
|
||||
mt_srand();
|
||||
$secondNumber = mt_rand(1, $limit);
|
||||
$firstNumber = $firstNumber * $secondNumber;
|
||||
$firstNumber = $firstNumber * $secondNumber;
|
||||
$result = $firstNumber / $secondNumber;
|
||||
break;
|
||||
}
|
||||
@ -125,8 +125,8 @@ class template
|
||||
$secondLetter = uniqid();
|
||||
|
||||
// Masquage image source pour éviter un décodage
|
||||
copy('core/vendor/zwiico/png/' . $attributes['type'] . '/' . $letters[$firstNumber] . '.png', 'site/tmp/' . $firstLetter . '.png');
|
||||
copy('core/vendor/zwiico/png/' . $attributes['type'] . '/' . $letters[$secondNumber] . '.png', 'site/tmp/' . $secondLetter . '.png');
|
||||
copy('core/vendor/zwiico/png/' . $attributes['type'] . '/' . $letters[$firstNumber] . '.png', 'site/tmp/' . $firstLetter . '.png');
|
||||
copy('core/vendor/zwiico/png/' . $attributes['type'] . '/' . $letters[$secondNumber] . '.png', 'site/tmp/' . $secondLetter . '.png');
|
||||
|
||||
|
||||
// Début du wrapper
|
||||
@ -134,7 +134,7 @@ class template
|
||||
// Label
|
||||
$html .= self::label(
|
||||
$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" /> en chiffres ?',
|
||||
'<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']
|
||||
]
|
||||
@ -224,7 +224,7 @@ class template
|
||||
* Crée un champ date
|
||||
* @param string $nameId Nom et id du champ
|
||||
* @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
|
||||
*/
|
||||
public static function date($nameId, array $attributes = [])
|
||||
@ -244,17 +244,32 @@ class template
|
||||
'placeholder' => '',
|
||||
'readonly' => false,
|
||||
'value' => '',
|
||||
'type'=> 'date',
|
||||
'type' => 'date',
|
||||
], $attributes);
|
||||
// Traduction de l'aide et de l'étiquette
|
||||
$attributes['label'] = helper::translate($attributes['label']);
|
||||
$attributes['help'] = helper::translate($attributes['help']);
|
||||
//$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
|
||||
if ($attributes['before'] and array_key_exists($attributes['id'], common::$inputBefore)) {
|
||||
$attributes['value'] = common::$inputBefore[$attributes['id']];
|
||||
} 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
|
||||
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
|
||||
@ -310,6 +325,7 @@ class template
|
||||
'name' => $nameId,
|
||||
'type' => 2,
|
||||
'value' => '',
|
||||
'folder' => '',
|
||||
'language' => 'fr_FR'
|
||||
], $attributes);
|
||||
// Traduction de l'aide et de l'étiquette
|
||||
@ -346,19 +362,21 @@ class template
|
||||
$html .= sprintf(
|
||||
'<a
|
||||
href="' .
|
||||
helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php' .
|
||||
'?relative_url=1' .
|
||||
'&lang=' . $attributes['language'] .
|
||||
'&field_id=' . $attributes['id'] .
|
||||
'&type=' . $attributes['type'] .
|
||||
'&akey=' . md5_file(core::DATA_DIR . 'core.json') .
|
||||
($attributes['extensions'] ? '&extensions=' . $attributes['extensions'] : '')
|
||||
. '"
|
||||
helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php' .
|
||||
'?relative_url=1' .
|
||||
'&lang=' . $attributes['language'] .
|
||||
'&field_id=' . $attributes['id'] .
|
||||
'&type=' . $attributes['type'] .
|
||||
'&akey=' . md5_file(core::DATA_DIR . 'core.json') .
|
||||
// Ajoute le nom du dossier si la variable est passée
|
||||
(empty($attributes['folder']) ? '&fldr=/': '&fldr=' . $attributes['folder']) .
|
||||
($attributes['extensions'] ? '&extensions=' . $attributes['extensions'] : '')
|
||||
. '"
|
||||
class="inputFile %s %s"
|
||||
%s
|
||||
data-lity
|
||||
>
|
||||
' . self::ico('upload', ['margin' => 'right']) . '
|
||||
' . self::ico('upload-cloud', ['margin' => 'right']) . '
|
||||
<span class="inputFileLabel"></span>
|
||||
</a>',
|
||||
$attributes['class'],
|
||||
@ -397,7 +415,7 @@ class template
|
||||
$html = '<form id="' . $id . '" method="post">';
|
||||
// Stock le token CSRF
|
||||
$html .= self::hidden('csrf', [
|
||||
'value' => $_SESSION['csrf']
|
||||
'value' => htmlentities($_SESSION['csrf'], ENT_QUOTES | ENT_HTML5, 'UTF-8')
|
||||
]);
|
||||
// Retourne le html
|
||||
return $html;
|
||||
@ -471,7 +489,7 @@ class template
|
||||
// Traduction de l'aide
|
||||
$attributes['help'] = helper::translate($attributes['help']);
|
||||
// Contenu de l'icône
|
||||
$alt = $attributes['help'] ? $attributes['help'] : $ico;
|
||||
$alt = $attributes['help'] ? $attributes['help'] : $ico;
|
||||
$item = $attributes['href'] ? '<a id="' . $attributes['id'] . '" data-tippy-content="' . $attributes['help'] . '" alt="' . $alt . '" href="' . $attributes['href'] . '" ' . $attributes['attr'] . ' >' : '';
|
||||
$item .= '<span class="zwiico-' . $ico . ($attributes['margin'] ? ' zwiico-margin-' . $attributes['margin'] : '') . ($attributes['animate'] ? ' animate-spin' : '') . '" style="font-size:' . $attributes['fontSize'] . '"><!----></span>';
|
||||
$item .= ($attributes['href']) ? '</a>' : '';
|
||||
@ -494,8 +512,8 @@ class template
|
||||
$lang = $langId;
|
||||
break;
|
||||
case 'selected':
|
||||
if (isset($_COOKIE['ZWII_CONTENT'])) {
|
||||
$lang = $_COOKIE['ZWII_CONTENT'];
|
||||
if (isset($_SESSION['ZWII_SITE_CONTENT'])) {
|
||||
$lang = $_SESSION['ZWII_SITE_CONTENT'];
|
||||
} else {
|
||||
$lang = 'fr_FR';
|
||||
}
|
||||
@ -686,15 +704,16 @@ class template
|
||||
'label' => '',
|
||||
'name' => $nameId,
|
||||
'selected' => '',
|
||||
'fonts' => []
|
||||
'font' => [],
|
||||
'multiple' => ''
|
||||
], $attributes);
|
||||
// Traduction de l'aide et de l'étiquette
|
||||
$attributes['label'] = helper::translate($attributes['label']);
|
||||
$attributes['help'] = helper::translate($attributes['help']);
|
||||
// Stocker les fontes et remettre à zéro le tableau des fontes transmis pour éviter une erreur de sprintAttributes
|
||||
if (empty($attributes['fonts']) === false) {
|
||||
$fonts = $attributes['fonts'];
|
||||
$attributes['fonts'] = [];
|
||||
if (empty($attributes['font']) === false) {
|
||||
$fonts = $attributes['font'];
|
||||
$attributes['font'] = [];
|
||||
}
|
||||
// Sauvegarde des données en cas d'erreur
|
||||
if ($attributes['before'] and array_key_exists($attributes['id'], common::$inputBefore)) {
|
||||
@ -715,6 +734,11 @@ class template
|
||||
$attributes['class'] .= ' notice';
|
||||
}
|
||||
$html .= self::notice($attributes['id'], $notice);
|
||||
// Attribut multiple
|
||||
if ($attributes['multiple'] === true) {
|
||||
echo "ppp";
|
||||
$attributes['multiple'] = 'multiple';
|
||||
}
|
||||
// Début sélection
|
||||
$html .= sprintf(
|
||||
'<select %s>',
|
||||
@ -722,7 +746,7 @@ class template
|
||||
);
|
||||
foreach ($options as $value => $text) {
|
||||
// Select des liste de fontes
|
||||
$html .= isset($fonts) ? sprintf(
|
||||
$html .= isset($fonts) ? sprintf(
|
||||
'<option value="%s"%s style="font-family: %s;">%s</option>',
|
||||
$value,
|
||||
$attributes['selected'] == $value ? ' selected' : '', // Double == pour ignorer le type de variable car $_POST change les types en string
|
||||
@ -744,6 +768,7 @@ class template
|
||||
return $html;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Crée une bulle de dialogue
|
||||
* @param string $text Texte de la bulle
|
||||
@ -775,7 +800,7 @@ class template
|
||||
// Traduction de l'aide et de l'étiquette
|
||||
$attributes['value'] = helper::translate($attributes['value']);
|
||||
// Retourne le html
|
||||
return sprintf(
|
||||
return sprintf(
|
||||
'<button type="submit" class="%s%s" %s>%s</button>',
|
||||
$attributes['class'],
|
||||
$attributes['uniqueSubmission'] ? 'uniqueSubmission' : '',
|
||||
@ -803,7 +828,7 @@ class template
|
||||
], $attributes);
|
||||
// Traduction de l'aide et de l'étiquette
|
||||
foreach ($head as $value) {
|
||||
$head[array_search($value, $head)] = helper::translate($value);
|
||||
$head[array_search($value, $head)] = helper::translate($value);
|
||||
}
|
||||
// Début du wrapper
|
||||
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="tableWrapper ' . $attributes['classWrapper'] . '">';
|
||||
@ -898,7 +923,7 @@ class template
|
||||
$html .= self::notice($attributes['id'], $notice);
|
||||
// Texte
|
||||
$html .= sprintf(
|
||||
'<input type="' . $attributes['type']. '" %s>',
|
||||
'<input type="' . $attributes['type'] . '" %s>',
|
||||
helper::sprintAttributes($attributes)
|
||||
);
|
||||
// Fin du wrapper
|
||||
|
@ -6,7 +6,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
@ -216,12 +216,14 @@ core.start = function () {
|
||||
// Variables des cookies
|
||||
var getUrl = window.location;
|
||||
var domain = "domain=" + getUrl.hostname + ";";
|
||||
var basePath = getUrl.pathname.substring(0, getUrl.pathname.lastIndexOf('/') + 1);
|
||||
var path = "path=" + basePath + ";";
|
||||
var e = new Date();
|
||||
e.setFullYear(e.getFullYear() + 1);
|
||||
var expires = "expires=" + e.toUTCString();
|
||||
var expires = "expires=" + e.toUTCString() + ";";
|
||||
|
||||
// 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,14 +293,14 @@ core.start = function () {
|
||||
});
|
||||
// Confirmation de mise à jour
|
||||
$("#barUpdate").on("click", function () {
|
||||
message = "<?php echo helper::translate('Mettre à jour') . ' ?';?>";
|
||||
message = "<?php echo helper::translate('Mise à jour') . ' ?';?>";
|
||||
return core.confirm(message, function () {
|
||||
$(location).attr("href", $("#barUpdate").attr("href"));
|
||||
});
|
||||
});
|
||||
// Confirmation de déconnexion
|
||||
$("#barLogout").on("click", function () {
|
||||
message = "<?php echo helper::translate('Se déconnecter') . '?';?>";
|
||||
message = "<?php echo helper::translate('Se déconnecter') . ' ?';?>";
|
||||
return core.confirm(message, function () {
|
||||
$(location).attr("href", $("#barLogout").attr("href"));
|
||||
});
|
||||
@ -462,7 +464,7 @@ $(document).ready(function () {
|
||||
/**
|
||||
* Chargement paresseux des images et des iframes
|
||||
*/
|
||||
$("img,picture,iframe").attr("loading", "lazy");
|
||||
$("img").attr("loading", "lazy");
|
||||
|
||||
/**
|
||||
* Effet accordéon
|
||||
@ -532,14 +534,14 @@ $(document).ready(function () {
|
||||
var langSelected = $(this).val();
|
||||
var langSelected = langSelected.split("/");
|
||||
// Lit le cookie de langue
|
||||
var langCookie = getCookie('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
|
||||
var url = window.location;
|
||||
var currentUrl = url.href.split("/");
|
||||
// Change si différent, corrige le problème avec le thème et le rechargement de la langue.
|
||||
if ((currentUrl !== "?theme" ||
|
||||
currentUrl !== "theme") &&
|
||||
langSelected[6] !== langCookie
|
||||
langSelected[6] !== langSession
|
||||
) {
|
||||
//$(location).attr("href", langUrl);
|
||||
var select = document.getElementById("barSelectLanguage");
|
||||
|
828
core/core.php
828
core/core.php
File diff suppressed because it is too large
Load Diff
@ -9,8 +9,8 @@ if(version_compare(PHP_VERSION, '7.2.0', '<') ) {
|
||||
|
||||
}
|
||||
|
||||
if ( version_compare(PHP_VERSION, '8.2.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');
|
||||
if ( version_compare(PHP_VERSION, '8.3.999', '>') ) {
|
||||
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) {
|
||||
if (array_search($v,$m) === false) {
|
||||
$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)
|
||||
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
|
||||
*/
|
||||
@ -48,9 +48,9 @@ $d = [
|
||||
'site/data/',
|
||||
'site/backup/',
|
||||
'site/tmp/',
|
||||
'site/i18n/'
|
||||
// 'site/i18n/', pas contrôler pour éviter les pbs de mise à jour
|
||||
];
|
||||
foreach ($d as $key) {
|
||||
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')) {
|
||||
$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
|
||||
if ($version['core']['dataVersion'] < 12000) {
|
||||
if (
|
||||
$version < 12000
|
||||
) {
|
||||
// Correspondance pour les dossiers de langue à convertir
|
||||
$languages = [
|
||||
'fr' => 'fr_FR',
|
||||
@ -24,7 +26,27 @@ if (file_exists('site/data/core.json')) {
|
||||
$end = rename('site/data/' . $key, 'site/data/' . $value);
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
*/
|
||||
if ($this->getData(['core', 'dataVersion']) < 9227) {
|
||||
|
||||
// Pas d'installation depuis une version inférieur
|
||||
if (
|
||||
$this->getData(['core', 'dataVersion']) < 9227
|
||||
) {
|
||||
// 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.');
|
||||
}
|
||||
@ -14,15 +18,15 @@ if ($this->getData(['core', 'dataVersion']) < 10000) {
|
||||
|
||||
//----------------------------------------
|
||||
// Mettre à jour les données des galeries
|
||||
$pageList = array();
|
||||
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
|
||||
$pageList[] = $parentKey;
|
||||
$hierarchy = array();
|
||||
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||
$hierarchy[] = $parentKey;
|
||||
foreach ($parentValue as $childKey) {
|
||||
$pageList[] = $childKey;
|
||||
$hierarchy[] = $childKey;
|
||||
}
|
||||
}
|
||||
// Mise à jour des données pour la galerie v2
|
||||
foreach ($pageList as $parentKey => $parent) {
|
||||
foreach ($hierarchy as $parentKey => $parent) {
|
||||
//La page a une galerie
|
||||
if ($this->getData(['page', $parent, 'moduleId']) === 'gallery') {
|
||||
// Parcourir les dossiers de la galerie
|
||||
@ -131,7 +135,7 @@ if ($this->getData(['core', 'dataVersion']) < 10200) {
|
||||
}
|
||||
// Créer les en-têtes du journal
|
||||
$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
|
||||
$this->setData(['config', 'autoUpdateHtaccess', false]);
|
||||
// Options de barre de membre simple
|
||||
@ -175,15 +179,15 @@ if ($this->getData(['core', 'dataVersion']) < 10300) {
|
||||
$this->setData(['config', 'searchPageId', '']);
|
||||
|
||||
// Mettre à jour les données des galeries
|
||||
$pageList = array(); foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
|
||||
$pageList[] = $parentKey;
|
||||
$hierarchy = array(); foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||
$hierarchy[] = $parentKey;
|
||||
foreach ($parentValue as $childKey) {
|
||||
$pageList[] = $childKey;
|
||||
$hierarchy[] = $childKey;
|
||||
}
|
||||
}
|
||||
// Mise à jour des données de thème de la galerie
|
||||
// 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
|
||||
if ($this->getData(['page', $parent, 'moduleId']) === 'gallery') {
|
||||
foreach ($this->getData(['module', $parent]) as $galleryKey => $galleryItem) {
|
||||
@ -235,15 +239,15 @@ if ($this->getData(['core', 'dataVersion']) < 10304) {
|
||||
// Version 10.3.06
|
||||
if ($this->getData(['core', 'dataVersion']) < 10306) {
|
||||
// Liste des pages
|
||||
$pageList = array();
|
||||
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
|
||||
$pageList[] = $parentKey;
|
||||
$hierarchy = array();
|
||||
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||
$hierarchy[] = $parentKey;
|
||||
foreach ($parentValue as $childKey) {
|
||||
$pageList[] = $childKey;
|
||||
$hierarchy[] = $childKey;
|
||||
}
|
||||
}
|
||||
// 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
|
||||
if ($this->getData(['page', $parent, 'moduleId']) === 'blog') {
|
||||
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
|
||||
if ($this->getData(['page', $parent, 'moduleId']) === 'news') {
|
||||
if (is_array($this->getData(['module', $parent]))) {
|
||||
@ -293,16 +297,16 @@ if ($this->getData(['core', 'dataVersion']) < 10400) {
|
||||
|
||||
// Ajouter les champs de blog v3
|
||||
// Liste des pages dans pageList
|
||||
$pageList = array();
|
||||
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
|
||||
$pageList[] = $parentKey;
|
||||
$hierarchy = array();
|
||||
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||
$hierarchy[] = $parentKey;
|
||||
foreach ($parentValue as $childKey) {
|
||||
$pageList[] = $childKey;
|
||||
$hierarchy[] = $childKey;
|
||||
}
|
||||
}
|
||||
// Parcourir pageList et rechercher les modules de blog
|
||||
|
||||
foreach ($pageList as $parentKey => $parent) {
|
||||
foreach ($hierarchy as $parentKey => $parent) {
|
||||
//La page est un blog
|
||||
if ($this->getData(['page', $parent, 'moduleId']) === 'blog') {
|
||||
$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
|
||||
|
||||
// Liste des pages dans pageList
|
||||
$pageList = array();
|
||||
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
|
||||
$pageList[] = $parentKey;
|
||||
$hierarchy = array();
|
||||
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||
$hierarchy[] = $parentKey;
|
||||
foreach ($parentValue as $childKey) {
|
||||
$pageList[] = $childKey;
|
||||
$hierarchy[] = $childKey;
|
||||
}
|
||||
}
|
||||
// Parcourir pageList et rechercher les modules au CSS autonomes
|
||||
foreach ($pageList as $parentKey => $parent) {
|
||||
foreach ($hierarchy as $parentKey => $parent) {
|
||||
if (
|
||||
$this->getData(['page', $parent, 'moduleId']) === 'search'
|
||||
|| $this->getData(['page', $parent, 'moduleId']) === 'gallery'
|
||||
@ -442,20 +446,20 @@ if ($this->getData(['core', 'dataVersion']) < 11000) {
|
||||
|
||||
// Externaliser les contenus des pages
|
||||
// Liste des pages dans pageList
|
||||
$pageList = array();
|
||||
$hierarchy = array();
|
||||
// Creation du contenu de la page
|
||||
if (!is_dir(self::DATA_DIR . self::$i18nContent . '/content')) {
|
||||
mkdir(self::DATA_DIR . self::$i18nContent . '/content', 0755);
|
||||
if (!is_dir(self::DATA_DIR . self::$siteContent . '/content')) {
|
||||
mkdir(self::DATA_DIR . self::$siteContent . '/content', 0755);
|
||||
}
|
||||
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
|
||||
$pageList[] = $parentKey;
|
||||
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||
$hierarchy[] = $parentKey;
|
||||
foreach ($parentValue as $childKey) {
|
||||
$pageList[] = $childKey;
|
||||
$hierarchy[] = $childKey;
|
||||
}
|
||||
}
|
||||
foreach ($pageList as $parentKey => $parent) {
|
||||
foreach ($hierarchy as $parentKey => $parent) {
|
||||
$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->setData(['page', $parent, 'content', $parent . '.html']);
|
||||
}
|
||||
@ -505,13 +509,13 @@ if ($this->getData(['core', 'dataVersion']) < 11200) {
|
||||
$this->setData(['config', 'connect', 'captchaType', 'alpha']);
|
||||
|
||||
// Ajout de la variable shortTitle basée sur Title
|
||||
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
|
||||
$pageList[] = $parentKey;
|
||||
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||
$hierarchy[] = $parentKey;
|
||||
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'])]);
|
||||
}
|
||||
|
||||
@ -569,8 +573,8 @@ if ($this->getData(['core', 'dataVersion']) < 11203) {
|
||||
$c3 = 0;
|
||||
$success = false;
|
||||
// Boucler sur les pages
|
||||
foreach ($this->getHierarchy(null, null, null) as $parentId => $childIds) {
|
||||
$content = $this->getPage($parentId, self::$i18nContent);
|
||||
foreach ($this->getHierarchy() as $parentId => $childIds) {
|
||||
$content = $this->getPage($parentId, self::$siteContent);
|
||||
$titre = $this->getData(['page', $parentId, 'title']);
|
||||
$content = $titre . ' ' . $content;
|
||||
$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) {
|
||||
$success = true;
|
||||
$this->setPage($parentId, $replace, self::$i18nContent);
|
||||
$this->setPage($parentId, $replace, self::$siteContent);
|
||||
$c3 += $c1 + $c2;
|
||||
}
|
||||
foreach ($childIds as $childId) {
|
||||
$content = $this->getPage($childId, self::$i18nContent);
|
||||
$content = $this->getPage($childId, self::$siteContent);
|
||||
$content = $titre . ' ' . $content;
|
||||
$replace = str_replace('href="' . $old, 'href="' . $new, stripslashes($content), $c1);
|
||||
$replace = str_replace('src="' . $old, 'src="' . $new, stripslashes($replace), $c2);
|
||||
if ($c1 > 0 || $c2 > 0) {
|
||||
$success = true;
|
||||
$this->setPage($childId, $replace, self::$i18nContent);
|
||||
$this->setPage($childId, $replace, self::$siteContent);
|
||||
$c3 += $c1 + $c2;
|
||||
}
|
||||
}
|
||||
@ -665,13 +669,13 @@ if ($this->getData(['core', 'dataVersion']) < 11300) {
|
||||
if ($this->getData(['core', 'dataVersion']) < 11303) {
|
||||
|
||||
// Ajout de la variable shortTitle basée sur Title
|
||||
foreach ($this->getHierarchy(null, null, null) as $parentKey => $parentValue) {
|
||||
$pageList[] = $parentKey;
|
||||
foreach ($this->getHierarchy() as $parentKey => $parentValue) {
|
||||
$hierarchy[] = $parentKey;
|
||||
foreach ($parentValue as $childKey) {
|
||||
$pageList[] = $childKey;
|
||||
$hierarchy[] = $childKey;
|
||||
}
|
||||
}
|
||||
foreach ($pageList as $parentKey => $parent) {
|
||||
foreach ($hierarchy as $parentKey => $parent) {
|
||||
$this->setData(['page', $parent, 'extraPosition', false]);
|
||||
}
|
||||
|
||||
@ -684,10 +688,10 @@ if ($this->getData(['core', 'dataVersion']) < 11303) {
|
||||
if ($this->getData(['core', 'dataVersion']) < 11306) {
|
||||
|
||||
// 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) {
|
||||
if (!is_null($this->getData(['fonts', 'imported', $fontId]))) {
|
||||
$this->deleteData(['fonts', 'imported', $fontId]);
|
||||
if (!is_null($this->getData(['font', 'imported', $fontId]))) {
|
||||
$this->deleteData(['font', 'imported', $fontId]);
|
||||
}
|
||||
}
|
||||
// Mise à jour
|
||||
@ -699,7 +703,7 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
|
||||
|
||||
// Effacer le dossier
|
||||
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
|
||||
$files = $this->getData(['fonts', 'files']);
|
||||
|
||||
$files = $this->getData(['font', 'files']);
|
||||
|
||||
if (is_array($files)) {
|
||||
foreach ($files as $fontId => $fontName) {
|
||||
if (
|
||||
@ -805,7 +811,7 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
|
||||
&& file_exists(self::DATA_DIR . 'fonts/' . $fontName)
|
||||
) {
|
||||
$this->setData([
|
||||
'fonts',
|
||||
'font',
|
||||
'files',
|
||||
$fontId,
|
||||
[
|
||||
@ -819,12 +825,12 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
|
||||
}
|
||||
|
||||
// Consersion des fontes importées
|
||||
$imported = $this->getData(['fonts', 'imported']);
|
||||
$imported = $this->getData(['font', 'imported']);
|
||||
if (is_array($imported)) {
|
||||
foreach ($imported as $fontId => $fontUrl) {
|
||||
if (gettype($fontUrl) === 'string') {
|
||||
$this->setData([
|
||||
'fonts',
|
||||
'font',
|
||||
'imported',
|
||||
$fontId,
|
||||
[
|
||||
@ -839,7 +845,7 @@ if ($this->getData(['core', 'dataVersion']) < 11400) {
|
||||
// Importation des fontes exemples
|
||||
$template = $fonts;
|
||||
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
|
||||
@ -897,10 +903,10 @@ if ($this->getData(['core', 'dataVersion']) < 12000) {
|
||||
|
||||
// Supprimer les fichier associés
|
||||
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')) {
|
||||
$this->removeDir('core/vendor/i18n/css');
|
||||
$this->deleteDir('core/vendor/i18n/css');
|
||||
}
|
||||
if (file_exists('core/vendor/i18n/inc.json')) {
|
||||
unlink('core/vendor/i18n/inc.json');
|
||||
@ -935,7 +941,7 @@ if ($this->getData(['core', 'dataVersion']) < 12301) {
|
||||
|
||||
// Nettoyage de flatPickr
|
||||
if (is_dir('core/vendor/flatpickr')) {
|
||||
$this->removeDir('core/vendor/flatpickr');
|
||||
$this->deleteDir('core/vendor/flatpickr');
|
||||
}
|
||||
|
||||
// email reply
|
||||
@ -945,3 +951,168 @@ if ($this->getData(['core', 'dataVersion']) < 12301) {
|
||||
// Mise à jour
|
||||
$this->setData(['core', 'dataVersion', 12301]);
|
||||
}
|
||||
|
||||
// Version 12.3.08
|
||||
if ($this->getData(['core', 'dataVersion']) < 12308) {
|
||||
|
||||
// Langue par défaut
|
||||
$l = [
|
||||
'fr_FR' => 'Français',
|
||||
'en_EN' => 'English',
|
||||
'es' => 'Español',
|
||||
];
|
||||
foreach ($l as $key => $value) {
|
||||
if (is_dir(self::DATA_DIR . $key)) {
|
||||
touch(self::DATA_DIR . $key . '/.default');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Mise à jour
|
||||
$this->setData(['core', 'dataVersion', 12308]);
|
||||
}
|
||||
|
||||
// Version 12.3.09
|
||||
if ($this->getData(['core', 'dataVersion']) < 12309) {
|
||||
|
||||
// Mettre à jour les locales
|
||||
foreach (self::$languages as $key => $value) {
|
||||
// tableau des langues installées
|
||||
if (is_dir(self::DATA_DIR . $key)) {
|
||||
$d = json_decode(file_get_contents(self::DATA_DIR . $key . '/locale.json'), true);
|
||||
$d = array_merge($d['locale'], ['poweredPageLabel' => 'Motorisé par']);
|
||||
$t['locale'] = $d;
|
||||
$this->secure_file_put_contents(self::DATA_DIR . $key . '/locale.json', $t);
|
||||
}
|
||||
}
|
||||
|
||||
// Mise à jour
|
||||
$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>
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
@ -1,8 +1,8 @@
|
||||
<!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>
|
||||
<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">
|
||||
<?php $layout->showMetaTitle(); ?>
|
||||
<?php $layout->showMetaDescription(); ?>
|
||||
@ -12,6 +12,9 @@
|
||||
<?php $layout->showVendor(); ?>
|
||||
<?php $layout->showStyle(); ?>
|
||||
<?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/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'); ?>">
|
||||
|
@ -6,7 +6,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
@ -951,6 +951,38 @@ footer #footerSocials .zwiico-github:hover {
|
||||
background: #000;
|
||||
}
|
||||
|
||||
footer #footerSocials .zwiico-reddit {
|
||||
background: #FF4500;
|
||||
}
|
||||
|
||||
footer #footerSocials .zwiico-reddit:hover {
|
||||
background: #D23311;
|
||||
}
|
||||
|
||||
footer #footerSocials .zwiico-steam {
|
||||
background: #171A21;
|
||||
}
|
||||
|
||||
footer #footerSocials .zwiico-steam:hover {
|
||||
background: #0F1318;
|
||||
}
|
||||
|
||||
footer #footerSocials .zwiico-vimeo {
|
||||
background: #162221;
|
||||
}
|
||||
|
||||
footer #footerSocials .zwiico-vimeo:hover {
|
||||
background: #121B1E;
|
||||
}
|
||||
|
||||
footer #footerSocials .zwiico-twitch {
|
||||
background: #9146FF;
|
||||
}
|
||||
|
||||
footer #footerSocials .zwiico-twitch:hover {
|
||||
background: #703CEC;
|
||||
}
|
||||
|
||||
|
||||
/* Bulle de dialogue */
|
||||
|
||||
@ -971,9 +1003,10 @@ footer #footerSocials .zwiico-github:hover {
|
||||
max-width: 500px;
|
||||
width: 100%;
|
||||
margin: 16px auto;
|
||||
text-align: left;
|
||||
text-align: center;
|
||||
border-radius: 2px;
|
||||
transition: background-color .3s ease-out;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
.speechBubble:before {
|
||||
@ -1786,4 +1819,7 @@ th.col12 {
|
||||
.bannerDisplay {
|
||||
display: none;
|
||||
}
|
||||
header {
|
||||
background-size: cover !important;
|
||||
}
|
||||
}
|
||||
|
@ -6,7 +6,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
@ -18,6 +18,14 @@
|
||||
/* Site */
|
||||
#site {
|
||||
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 {
|
||||
|
@ -1,8 +1,8 @@
|
||||
<!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>
|
||||
<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">
|
||||
<?php $layout->showMetaTitle(); ?>
|
||||
<?php $layout->showMetaDescription(); ?>
|
||||
@ -12,6 +12,9 @@
|
||||
<?php $layout->showVendor(); ?>
|
||||
<?php $layout->showStyle(); ?>
|
||||
<?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/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'); ?>">
|
||||
|
@ -1,8 +1,8 @@
|
||||
<!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>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="content-type" content="text/html;">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="x-apple-disable-message-reformatting">
|
||||
|
@ -1,8 +1,9 @@
|
||||
<!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>
|
||||
<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 name="generator" content="ZiiCMS https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
@ -13,15 +14,23 @@
|
||||
<?php $layout->showFavicon(); ?>
|
||||
<?php $layout->showVendor(); ?>
|
||||
<?php $layout->showFonts(); ?>
|
||||
<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'); ?>">
|
||||
<?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?<?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 -->
|
||||
<?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')
|
||||
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 $layout->showStyle(); ?>
|
||||
<?php $layout->showInlineStyle(); ?>
|
||||
@ -30,21 +39,22 @@
|
||||
include(self::DATA_DIR . 'head.inc.html');
|
||||
} ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- Barre d'administration -->
|
||||
<?php if ($this->getUser('group') > self::GROUP_MEMBER) : ?>
|
||||
<?php if ($this->getUser('group') > self::GROUP_MEMBER): ?>
|
||||
<?php $layout->showBar(); ?>
|
||||
<?php endif; ?>
|
||||
<!-- Notifications -->
|
||||
<?php $layout->showNotification(); ?>
|
||||
<!-- Menu dans le fond du site avant la bannière -->
|
||||
<?php if ($this->getData(['theme', 'menu', 'position']) === 'body-first' || $this->getData(['theme', 'menu', 'position']) === 'top') : ?>
|
||||
<?php if ($this->getData(['theme', 'menu', 'position']) === 'body-first' || $this->getData(['theme', 'menu', 'position']) === 'top'): ?>
|
||||
<!-- Détermine si le menu est fixe en haut de page lorsque l'utilisateur n'est pas connecté -->
|
||||
<?php
|
||||
if (
|
||||
$this->getData(['theme', 'menu', 'position']) === 'top'
|
||||
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
|
||||
) {
|
||||
echo '<nav id="navfixedconnected" >';
|
||||
@ -54,13 +64,14 @@
|
||||
?>
|
||||
<!-- Menu Burger -->
|
||||
<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']) === '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 $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 template::ico('menu', ['fontSize' => '2em']); ?>
|
||||
</div>
|
||||
<!-- fin du menu burger -->
|
||||
<?php
|
||||
$menuClass = $this->getData(['theme', 'menu', 'position']) === 'top' ? 'class="container-large"' : 'class="container"';
|
||||
$menuClass = $this->getData(['theme', 'menu', 'wide']) === 'none' ? 'class="container-large"' : 'class="container"';
|
||||
$menuClass = $this->getData(['theme', 'menu', 'position']) === 'top' ? 'class="container-large"' : 'class="container"';
|
||||
$menuClass = $this->getData(['theme', 'menu', 'wide']) === 'none' ? 'class="container-large"' : 'class="container"';
|
||||
?>
|
||||
<div id="menu" <?php echo $menuClass; ?>>
|
||||
<?php $layout->showMenu(); ?>
|
||||
@ -68,58 +79,65 @@
|
||||
</nav>
|
||||
<?php endif; ?>
|
||||
<!-- Bannière dans le fond du site -->
|
||||
<?php if ($this->getData(['theme', 'header', 'position']) === 'body') : ?>
|
||||
<?php echo ($this->getData(['theme', 'header', 'linkHomePage']) && $this->getData(['theme', 'header', 'feature']) === 'wallpaper') ? '<a href="' . helper::baseUrl(false) . '">' : ''; ?>
|
||||
<?php if ($this->getData(['theme', 'header', 'position']) === 'body'): ?>
|
||||
<?php echo ($this->getData(['theme', 'header', 'linkHomePage']) && $this->getData(['theme', 'header', 'feature']) === 'wallpaper') ? '<a href="' . helper::baseUrl(false) . '">' : ''; ?>
|
||||
<?php
|
||||
$headerClass = $this->getData(['theme', 'header', 'position']) === 'hide' ? 'displayNone' : '';
|
||||
$headerClass = $this->getData(['theme', 'header', 'position']) === 'hide' ? 'displayNone' : '';
|
||||
$headerClass .= $this->getData(['theme', 'header', 'tinyHidden']) ? ' bannerDisplay ' : '';
|
||||
$headerClass .= $this->getData(['theme', 'header', 'wide']) === 'none' ? '' : 'container';
|
||||
?>
|
||||
<header <?php echo empty($headerClass) ? '' : 'class="' . $headerClass . '"'; ?>>
|
||||
<?php if ($this->getData(['theme', 'header', 'feature']) === 'wallpaper') : ?>
|
||||
<?php if ($this->getData(['theme', 'header', 'feature']) === 'wallpaper'): ?>
|
||||
<?php if (
|
||||
$this->getData(['theme', 'header', 'textHide']) === false
|
||||
// Affiche toujours le titre de la bannière pour l'édition du thème
|
||||
or ($this->getUrl(0) === 'theme' and $this->getUrl(1) === 'header')
|
||||
) : ?>
|
||||
<span id="themeHeaderTitle"><?php echo $this->getData(['locale', 'title']); ?></span>
|
||||
<?php else : ?>
|
||||
): ?>
|
||||
<span id="themeHeaderTitle">
|
||||
<?php echo $this->getData(['locale', 'title']); ?>
|
||||
</span>
|
||||
<?php else: ?>
|
||||
<span id="themeHeaderTitle"> </span>
|
||||
<?php endif; ?>
|
||||
<?php else : ?>
|
||||
<?php else: ?>
|
||||
<div id="featureContent">
|
||||
<?php echo $this->getData(['theme', 'header', 'featureContent']); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</header>
|
||||
<?php echo ($this->getData(['theme', 'header', 'linkHomePage']) && $this->getData(['theme', 'header', 'feature']) === 'wallpaper') ? '</a>' : ''; ?>
|
||||
<?php echo ($this->getData(['theme', 'header', 'linkHomePage']) && $this->getData(['theme', 'header', 'feature']) === 'wallpaper') ? '</a>' : ''; ?>
|
||||
<?php endif; ?>
|
||||
<!-- Menu dans le fond du site après la bannière -->
|
||||
<?php if ($this->getData(['theme', 'menu', 'position']) === 'body-second') : ?>
|
||||
<?php if ($this->getData(['theme', 'menu', 'position']) === 'body-second'): ?>
|
||||
<nav>
|
||||
<!-- Menu burger -->
|
||||
<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']) === '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 $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 template::ico('menu', ['fontSize' => '2em']); ?>
|
||||
</div>
|
||||
<!-- fin du menu burger -->
|
||||
<?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; ?>>
|
||||
<?php $layout->showMenu(); ?></div>
|
||||
<?php $layout->showMenu(); ?>
|
||||
</div>
|
||||
</nav>
|
||||
<?php endif; ?>
|
||||
<!-- Site -->
|
||||
<div id="site" class="container">
|
||||
<?php if ($this->getData(['theme', 'menu', 'position']) === 'site-first') : ?>
|
||||
<?php if ($this->getData(['theme', 'menu', 'position']) === 'site-first'): ?>
|
||||
<!-- Menu dans le site avant la bannière -->
|
||||
<nav>
|
||||
<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']) === '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>
|
||||
<div id="menu" class="container"><?php $layout->showMenu(); ?></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 template::ico('menu', ['fontSize' => '2em']); ?>
|
||||
</div>
|
||||
<div id="menu" class="container">
|
||||
<?php $layout->showMenu(); ?>
|
||||
</div>
|
||||
</nav>
|
||||
<?php endif; ?>
|
||||
<?php if (
|
||||
@ -128,31 +146,33 @@
|
||||
or ($this->getData(['theme', 'header', 'position']) === 'hide'
|
||||
and $this->getUrl(0) === 'theme'
|
||||
)
|
||||
) : ?>
|
||||
): ?>
|
||||
<!-- Bannière dans le site -->
|
||||
<?php echo ($this->getData(['theme', 'header', 'linkHomePage']) && $this->getData(['theme', 'header', 'feature']) === 'wallpaper') ? '<a href="' . helper::baseUrl(false) . '">' : ''; ?>
|
||||
<?php echo ($this->getData(['theme', 'header', 'linkHomePage']) && $this->getData(['theme', 'header', 'feature']) === 'wallpaper') ? '<a href="' . helper::baseUrl(false) . '">' : ''; ?>
|
||||
<?php
|
||||
$headerClass = $this->getData(['theme', 'header', 'position']) === 'hide' ? 'displayNone' : '';
|
||||
$headerClass = $this->getData(['theme', 'header', 'position']) === 'hide' ? 'displayNone' : '';
|
||||
$headerClass .= $this->getData(['theme', 'header', 'tinyHidden']) ? ' bannerDisplay ' : '';
|
||||
?>
|
||||
<header <?php echo empty($headerClass) ? '' : 'class="' . $headerClass . '"'; ?>>
|
||||
<?php if ($this->getData(['theme', 'header', 'feature']) === 'wallpaper') : ?>
|
||||
<?php if ($this->getData(['theme', 'header', 'feature']) === 'wallpaper'): ?>
|
||||
<?php if (
|
||||
$this->getData(['theme', 'header', 'textHide']) === false
|
||||
// Affiche toujours le titre de la bannière pour l'édition du thème
|
||||
or ($this->getUrl(0) === 'theme' and $this->getUrl(1) === 'header')
|
||||
) : ?>
|
||||
<span id="themeHeaderTitle"><?php echo $this->getData(['locale', 'title']); ?></span>
|
||||
<?php else : ?>
|
||||
): ?>
|
||||
<span id="themeHeaderTitle">
|
||||
<?php echo $this->getData(['locale', 'title']); ?>
|
||||
</span>
|
||||
<?php else: ?>
|
||||
<span id="themeHeaderTitle"> </span>
|
||||
<?php endif; ?>
|
||||
<?php else : ?>
|
||||
<?php else: ?>
|
||||
<div id="featureContent">
|
||||
<?php echo $this->getData(['theme', 'header', 'featureContent']); ?>
|
||||
</diV>
|
||||
<?php endif; ?>
|
||||
</header>
|
||||
<?php echo ($this->getData(['theme', 'header', 'linkHomePage']) && $this->getData(['theme', 'header', 'feature']) === 'wallpaper') ? '</a>' : ''; ?>
|
||||
<?php echo ($this->getData(['theme', 'header', 'linkHomePage']) && $this->getData(['theme', 'header', 'feature']) === 'wallpaper') ? '</a>' : ''; ?>
|
||||
<?php endif; ?>
|
||||
<?php if (
|
||||
$this->getData(['theme', 'menu', 'position']) === 'site-second' ||
|
||||
@ -161,24 +181,29 @@
|
||||
or ($this->getData(['theme', 'menu', 'position']) === 'hide'
|
||||
and $this->getUrl(0) === 'theme'
|
||||
)
|
||||
) : ?>
|
||||
): ?>
|
||||
<!-- Menu dans le site après la bannière -->
|
||||
<nav <?php if ($this->getData(['theme', 'menu', 'position']) === 'hide') : ?>class="displayNone" <?php endif; ?>>
|
||||
<nav <?php if ($this->getData(['theme', 'menu', 'position']) === 'hide'): ?>class="displayNone" <?php endif; ?>>
|
||||
<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']) === '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>
|
||||
<div id="menu" class="container"><?php $layout->showMenu(); ?></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 template::ico('menu', ['fontSize' => '2em']); ?>
|
||||
</div>
|
||||
<div id="menu" class="container">
|
||||
<?php $layout->showMenu(); ?>
|
||||
</div>
|
||||
</nav>
|
||||
<?php endif; ?>
|
||||
<!-- Corps de page -->
|
||||
<?php $layout->showSection(); ?>
|
||||
<?php $layout->showMain(); ?>
|
||||
<!-- footer -->
|
||||
<?php $layout->showFooter(); ?>
|
||||
<!-- Fin du site -->
|
||||
<?php echo $this->getData(['theme', 'footer', 'position']) === 'site' ? '</div>' : ''; ?>
|
||||
<!-- 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-->
|
||||
<?php $layout->showCookies(); ?>
|
||||
<!-- Les scripts -->
|
||||
@ -186,7 +211,7 @@
|
||||
<!-- Script perso dans body -->
|
||||
<?php if (file_exists(self::DATA_DIR . 'body.inc.html')) {
|
||||
include(self::DATA_DIR . 'body.inc.html');
|
||||
}?>
|
||||
} ?>
|
||||
</body>
|
||||
|
||||
</html>
|
@ -9,7 +9,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
@ -22,7 +22,7 @@ class config extends common
|
||||
'copyBackups' => self::GROUP_ADMIN,
|
||||
'delBackups' => self::GROUP_ADMIN,
|
||||
'configMetaImage' => self::GROUP_ADMIN,
|
||||
'siteMap' => self::GROUP_ADMIN,
|
||||
'sitemap' => self::GROUP_ADMIN,
|
||||
'index' => self::GROUP_ADMIN,
|
||||
'restore' => self::GROUP_ADMIN,
|
||||
'updateBaseUrl' => self::GROUP_ADMIN,
|
||||
@ -30,123 +30,124 @@ class config extends common
|
||||
'logReset' => self::GROUP_ADMIN,
|
||||
'logDownload' => self::GROUP_ADMIN,
|
||||
'blacklistReset' => self::GROUP_ADMIN,
|
||||
'blacklistDownload' => self::GROUP_ADMIN
|
||||
'blacklistDownload' => self::GROUP_ADMIN,
|
||||
'testmail' => self::GROUP_ADMIN,
|
||||
];
|
||||
|
||||
public static $timezones = [
|
||||
'Pacific/Midway' => '(GMT-11:00) Midway Island',
|
||||
'US/Samoa' => '(GMT-11:00) Samoa',
|
||||
'US/Hawaii' => '(GMT-10:00) Hawaii',
|
||||
'US/Alaska' => '(GMT-09:00) Alaska',
|
||||
'US/Pacific' => '(GMT-08:00) Pacific Time (US & Canada)',
|
||||
'America/Tijuana' => '(GMT-08:00) Tijuana',
|
||||
'US/Arizona' => '(GMT-07:00) Arizona',
|
||||
'US/Mountain' => '(GMT-07:00) Mountain Time (US & Canada)',
|
||||
'America/Chihuahua' => '(GMT-07:00) Chihuahua',
|
||||
'America/Mazatlan' => '(GMT-07:00) Mazatlan',
|
||||
'America/Mexico_City' => '(GMT-06:00) Mexico City',
|
||||
'America/Monterrey' => '(GMT-06:00) Monterrey',
|
||||
'Canada/Saskatchewan' => '(GMT-06:00) Saskatchewan',
|
||||
'US/Central' => '(GMT-06:00) Central Time (US & Canada)',
|
||||
'US/Eastern' => '(GMT-05:00) Eastern Time (US & Canada)',
|
||||
'US/East-Indiana' => '(GMT-05:00) Indiana (East)',
|
||||
'America/Bogota' => '(GMT-05:00) Bogota',
|
||||
'America/Lima' => '(GMT-05:00) Lima',
|
||||
'America/Caracas' => '(GMT-04:30) Caracas',
|
||||
'Canada/Atlantic' => '(GMT-04:00) Atlantic Time (Canada)',
|
||||
'America/La_Paz' => '(GMT-04:00) La Paz',
|
||||
'America/Santiago' => '(GMT-04:00) Santiago',
|
||||
'Canada/Newfoundland' => '(GMT-03:30) Newfoundland',
|
||||
'America/Buenos_Aires' => '(GMT-03:00) Buenos Aires',
|
||||
'Greenland' => '(GMT-03:00) Greenland',
|
||||
'Atlantic/Stanley' => '(GMT-02:00) Stanley',
|
||||
'Atlantic/Azores' => '(GMT-01:00) Azores',
|
||||
'Atlantic/Cape_Verde' => '(GMT-01:00) Cape Verde Is.',
|
||||
'Africa/Casablanca' => '(GMT) Casablanca',
|
||||
'Europe/Dublin' => '(GMT) Dublin',
|
||||
'Europe/Lisbon' => '(GMT) Lisbon',
|
||||
'Europe/London' => '(GMT) London',
|
||||
'Africa/Monrovia' => '(GMT) Monrovia',
|
||||
'Europe/Amsterdam' => '(GMT+01:00) Amsterdam',
|
||||
'Europe/Belgrade' => '(GMT+01:00) Belgrade',
|
||||
'Europe/Berlin' => '(GMT+01:00) Berlin',
|
||||
'Europe/Bratislava' => '(GMT+01:00) Bratislava',
|
||||
'Europe/Brussels' => '(GMT+01:00) Brussels',
|
||||
'Europe/Budapest' => '(GMT+01:00) Budapest',
|
||||
'Europe/Copenhagen' => '(GMT+01:00) Copenhagen',
|
||||
'Europe/Ljubljana' => '(GMT+01:00) Ljubljana',
|
||||
'Europe/Madrid' => '(GMT+01:00) Madrid',
|
||||
'Europe/Paris' => '(GMT+01:00) Paris',
|
||||
'Europe/Prague' => '(GMT+01:00) Prague',
|
||||
'Europe/Rome' => '(GMT+01:00) Rome',
|
||||
'Europe/Sarajevo' => '(GMT+01:00) Sarajevo',
|
||||
'Europe/Skopje' => '(GMT+01:00) Skopje',
|
||||
'Europe/Stockholm' => '(GMT+01:00) Stockholm',
|
||||
'Europe/Vienna' => '(GMT+01:00) Vienna',
|
||||
'Europe/Warsaw' => '(GMT+01:00) Warsaw',
|
||||
'Europe/Zagreb' => '(GMT+01:00) Zagreb',
|
||||
'Europe/Athens' => '(GMT+02:00) Athens',
|
||||
'Europe/Bucharest' => '(GMT+02:00) Bucharest',
|
||||
'Africa/Cairo' => '(GMT+02:00) Cairo',
|
||||
'Africa/Harare' => '(GMT+02:00) Harare',
|
||||
'Europe/Helsinki' => '(GMT+02:00) Helsinki',
|
||||
'Europe/Istanbul' => '(GMT+02:00) Istanbul',
|
||||
'Asia/Jerusalem' => '(GMT+02:00) Jerusalem',
|
||||
'Europe/Kiev' => '(GMT+02:00) Kyiv',
|
||||
'Europe/Minsk' => '(GMT+02:00) Minsk',
|
||||
'Europe/Riga' => '(GMT+02:00) Riga',
|
||||
'Europe/Sofia' => '(GMT+02:00) Sofia',
|
||||
'Europe/Tallinn' => '(GMT+02:00) Tallinn',
|
||||
'Europe/Vilnius' => '(GMT+02:00) Vilnius',
|
||||
'Asia/Baghdad' => '(GMT+03:00) Baghdad',
|
||||
'Asia/Kuwait' => '(GMT+03:00) Kuwait',
|
||||
'Europe/Moscow' => '(GMT+03:00) Moscow',
|
||||
'Africa/Nairobi' => '(GMT+03:00) Nairobi',
|
||||
'Asia/Riyadh' => '(GMT+03:00) Riyadh',
|
||||
'Europe/Volgograd' => '(GMT+03:00) Volgograd',
|
||||
'Asia/Tehran' => '(GMT+03:30) Tehran',
|
||||
'Asia/Baku' => '(GMT+04:00) Baku',
|
||||
'Asia/Muscat' => '(GMT+04:00) Muscat',
|
||||
'Asia/Tbilisi' => '(GMT+04:00) Tbilisi',
|
||||
'Asia/Yerevan' => '(GMT+04:00) Yerevan',
|
||||
'Asia/Kabul' => '(GMT+04:30) Kabul',
|
||||
'Asia/Yekaterinburg' => '(GMT+05:00) Ekaterinburg',
|
||||
'Asia/Karachi' => '(GMT+05:00) Karachi',
|
||||
'Asia/Tashkent' => '(GMT+05:00) Tashkent',
|
||||
'Asia/Kolkata' => '(GMT+05:30) Kolkata',
|
||||
'Asia/Kathmandu' => '(GMT+05:45) Kathmandu',
|
||||
'Asia/Almaty' => '(GMT+06:00) Almaty',
|
||||
'Asia/Dhaka' => '(GMT+06:00) Dhaka',
|
||||
'Asia/Novosibirsk' => '(GMT+06:00) Novosibirsk',
|
||||
'Asia/Bangkok' => '(GMT+07:00) Bangkok',
|
||||
'Asia/Jakarta' => '(GMT+07:00) Jakarta',
|
||||
'Asia/Krasnoyarsk' => '(GMT+07:00) Krasnoyarsk',
|
||||
'Asia/Chongqing' => '(GMT+08:00) Chongqing',
|
||||
'Asia/Hong_Kong' => '(GMT+08:00) Hong Kong',
|
||||
'Asia/Irkutsk' => '(GMT+08:00) Irkutsk',
|
||||
'Asia/Kuala_Lumpur' => '(GMT+08:00) Kuala Lumpur',
|
||||
'Australia/Perth' => '(GMT+08:00) Perth',
|
||||
'Asia/Singapore' => '(GMT+08:00) Singapore',
|
||||
'Asia/Taipei' => '(GMT+08:00) Taipei',
|
||||
'Asia/Ulaanbaatar' => '(GMT+08:00) Ulaan Bataar',
|
||||
'Asia/Urumqi' => '(GMT+08:00) Urumqi',
|
||||
'Asia/Seoul' => '(GMT+09:00) Seoul',
|
||||
'Asia/Tokyo' => '(GMT+09:00) Tokyo',
|
||||
'Asia/Yakutsk' => '(GMT+09:00) Yakutsk',
|
||||
'Australia/Adelaide' => '(GMT+09:30) Adelaide',
|
||||
'Australia/Darwin' => '(GMT+09:30) Darwin',
|
||||
'Australia/Brisbane' => '(GMT+10:00) Brisbane',
|
||||
'Australia/Canberra' => '(GMT+10:00) Canberra',
|
||||
'Pacific/Guam' => '(GMT+10:00) Guam',
|
||||
'Australia/Hobart' => '(GMT+10:00) Hobart',
|
||||
'Australia/Melbourne' => '(GMT+10:00) Melbourne',
|
||||
'Pacific/Port_Moresby' => '(GMT+10:00) Port Moresby',
|
||||
'Australia/Sydney' => '(GMT+10:00) Sydney',
|
||||
'Asia/Vladivostok' => '(GMT+10:00) Vladivostok',
|
||||
'Asia/Magadan' => '(GMT+11:00) Magadan',
|
||||
'Pacific/Auckland' => '(GMT+12:00) Auckland',
|
||||
'Pacific/Fiji' => '(GMT+12:00) Fiji',
|
||||
'Asia/Kamchatka' => '(GMT+12:00) Kamchatka'
|
||||
'Pacific/Midway' => '(GMT-11:00) Midway Island',
|
||||
'US/Samoa' => '(GMT-11:00) Samoa',
|
||||
'US/Hawaii' => '(GMT-10:00) Hawaii',
|
||||
'US/Alaska' => '(GMT-09:00) Alaska',
|
||||
'US/Pacific' => '(GMT-08:00) Pacific Time (US & Canada)',
|
||||
'America/Tijuana' => '(GMT-08:00) Tijuana',
|
||||
'US/Arizona' => '(GMT-07:00) Arizona',
|
||||
'US/Mountain' => '(GMT-07:00) Mountain Time (US & Canada)',
|
||||
'America/Chihuahua' => '(GMT-07:00) Chihuahua',
|
||||
'America/Mazatlan' => '(GMT-07:00) Mazatlan',
|
||||
'America/Mexico_City' => '(GMT-06:00) Mexico City',
|
||||
'America/Monterrey' => '(GMT-06:00) Monterrey',
|
||||
'Canada/Saskatchewan' => '(GMT-06:00) Saskatchewan',
|
||||
'US/Central' => '(GMT-06:00) Central Time (US & Canada)',
|
||||
'US/Eastern' => '(GMT-05:00) Eastern Time (US & Canada)',
|
||||
'US/East-Indiana' => '(GMT-05:00) Indiana (East)',
|
||||
'America/Bogota' => '(GMT-05:00) Bogota',
|
||||
'America/Lima' => '(GMT-05:00) Lima',
|
||||
'America/Caracas' => '(GMT-04:30) Caracas',
|
||||
'Canada/Atlantic' => '(GMT-04:00) Atlantic Time (Canada)',
|
||||
'America/La_Paz' => '(GMT-04:00) La Paz',
|
||||
'America/Santiago' => '(GMT-04:00) Santiago',
|
||||
'Canada/Newfoundland' => '(GMT-03:30) Newfoundland',
|
||||
'America/Buenos_Aires' => '(GMT-03:00) Buenos Aires',
|
||||
'Greenland' => '(GMT-03:00) Greenland',
|
||||
'Atlantic/Stanley' => '(GMT-02:00) Stanley',
|
||||
'Atlantic/Azores' => '(GMT-01:00) Azores',
|
||||
'Atlantic/Cape_Verde' => '(GMT-01:00) Cape Verde Is.',
|
||||
'Africa/Casablanca' => '(GMT) Casablanca',
|
||||
'Europe/Dublin' => '(GMT) Dublin',
|
||||
'Europe/Lisbon' => '(GMT) Lisbon',
|
||||
'Europe/London' => '(GMT) London',
|
||||
'Africa/Monrovia' => '(GMT) Monrovia',
|
||||
'Europe/Amsterdam' => '(GMT+01:00) Amsterdam',
|
||||
'Europe/Belgrade' => '(GMT+01:00) Belgrade',
|
||||
'Europe/Berlin' => '(GMT+01:00) Berlin',
|
||||
'Europe/Bratislava' => '(GMT+01:00) Bratislava',
|
||||
'Europe/Brussels' => '(GMT+01:00) Brussels',
|
||||
'Europe/Budapest' => '(GMT+01:00) Budapest',
|
||||
'Europe/Copenhagen' => '(GMT+01:00) Copenhagen',
|
||||
'Europe/Ljubljana' => '(GMT+01:00) Ljubljana',
|
||||
'Europe/Madrid' => '(GMT+01:00) Madrid',
|
||||
'Europe/Paris' => '(GMT+01:00) Paris',
|
||||
'Europe/Prague' => '(GMT+01:00) Prague',
|
||||
'Europe/Rome' => '(GMT+01:00) Rome',
|
||||
'Europe/Sarajevo' => '(GMT+01:00) Sarajevo',
|
||||
'Europe/Skopje' => '(GMT+01:00) Skopje',
|
||||
'Europe/Stockholm' => '(GMT+01:00) Stockholm',
|
||||
'Europe/Vienna' => '(GMT+01:00) Vienna',
|
||||
'Europe/Warsaw' => '(GMT+01:00) Warsaw',
|
||||
'Europe/Zagreb' => '(GMT+01:00) Zagreb',
|
||||
'Europe/Athens' => '(GMT+02:00) Athens',
|
||||
'Europe/Bucharest' => '(GMT+02:00) Bucharest',
|
||||
'Africa/Cairo' => '(GMT+02:00) Cairo',
|
||||
'Africa/Harare' => '(GMT+02:00) Harare',
|
||||
'Europe/Helsinki' => '(GMT+02:00) Helsinki',
|
||||
'Europe/Istanbul' => '(GMT+02:00) Istanbul',
|
||||
'Asia/Jerusalem' => '(GMT+02:00) Jerusalem',
|
||||
'Europe/Kiev' => '(GMT+02:00) Kyiv',
|
||||
'Europe/Minsk' => '(GMT+02:00) Minsk',
|
||||
'Europe/Riga' => '(GMT+02:00) Riga',
|
||||
'Europe/Sofia' => '(GMT+02:00) Sofia',
|
||||
'Europe/Tallinn' => '(GMT+02:00) Tallinn',
|
||||
'Europe/Vilnius' => '(GMT+02:00) Vilnius',
|
||||
'Asia/Baghdad' => '(GMT+03:00) Baghdad',
|
||||
'Asia/Kuwait' => '(GMT+03:00) Kuwait',
|
||||
'Europe/Moscow' => '(GMT+03:00) Moscow',
|
||||
'Africa/Nairobi' => '(GMT+03:00) Nairobi',
|
||||
'Asia/Riyadh' => '(GMT+03:00) Riyadh',
|
||||
'Europe/Volgograd' => '(GMT+03:00) Volgograd',
|
||||
'Asia/Tehran' => '(GMT+03:30) Tehran',
|
||||
'Asia/Baku' => '(GMT+04:00) Baku',
|
||||
'Asia/Muscat' => '(GMT+04:00) Muscat',
|
||||
'Asia/Tbilisi' => '(GMT+04:00) Tbilisi',
|
||||
'Asia/Yerevan' => '(GMT+04:00) Yerevan',
|
||||
'Asia/Kabul' => '(GMT+04:30) Kabul',
|
||||
'Asia/Yekaterinburg' => '(GMT+05:00) Ekaterinburg',
|
||||
'Asia/Karachi' => '(GMT+05:00) Karachi',
|
||||
'Asia/Tashkent' => '(GMT+05:00) Tashkent',
|
||||
'Asia/Kolkata' => '(GMT+05:30) Kolkata',
|
||||
'Asia/Kathmandu' => '(GMT+05:45) Kathmandu',
|
||||
'Asia/Almaty' => '(GMT+06:00) Almaty',
|
||||
'Asia/Dhaka' => '(GMT+06:00) Dhaka',
|
||||
'Asia/Novosibirsk' => '(GMT+06:00) Novosibirsk',
|
||||
'Asia/Bangkok' => '(GMT+07:00) Bangkok',
|
||||
'Asia/Jakarta' => '(GMT+07:00) Jakarta',
|
||||
'Asia/Krasnoyarsk' => '(GMT+07:00) Krasnoyarsk',
|
||||
'Asia/Chongqing' => '(GMT+08:00) Chongqing',
|
||||
'Asia/Hong_Kong' => '(GMT+08:00) Hong Kong',
|
||||
'Asia/Irkutsk' => '(GMT+08:00) Irkutsk',
|
||||
'Asia/Kuala_Lumpur' => '(GMT+08:00) Kuala Lumpur',
|
||||
'Australia/Perth' => '(GMT+08:00) Perth',
|
||||
'Asia/Singapore' => '(GMT+08:00) Singapore',
|
||||
'Asia/Taipei' => '(GMT+08:00) Taipei',
|
||||
'Asia/Ulaanbaatar' => '(GMT+08:00) Ulaan Bataar',
|
||||
'Asia/Urumqi' => '(GMT+08:00) Urumqi',
|
||||
'Asia/Seoul' => '(GMT+09:00) Seoul',
|
||||
'Asia/Tokyo' => '(GMT+09:00) Tokyo',
|
||||
'Asia/Yakutsk' => '(GMT+09:00) Yakutsk',
|
||||
'Australia/Adelaide' => '(GMT+09:30) Adelaide',
|
||||
'Australia/Darwin' => '(GMT+09:30) Darwin',
|
||||
'Australia/Brisbane' => '(GMT+10:00) Brisbane',
|
||||
'Australia/Canberra' => '(GMT+10:00) Canberra',
|
||||
'Pacific/Guam' => '(GMT+10:00) Guam',
|
||||
'Australia/Hobart' => '(GMT+10:00) Hobart',
|
||||
'Australia/Melbourne' => '(GMT+10:00) Melbourne',
|
||||
'Pacific/Port_Moresby' => '(GMT+10:00) Port Moresby',
|
||||
'Australia/Sydney' => '(GMT+10:00) Sydney',
|
||||
'Asia/Vladivostok' => '(GMT+10:00) Vladivostok',
|
||||
'Asia/Magadan' => '(GMT+11:00) Magadan',
|
||||
'Pacific/Auckland' => '(GMT+12:00) Auckland',
|
||||
'Pacific/Fiji' => '(GMT+12:00) Fiji',
|
||||
'Asia/Kamchatka' => '(GMT+12:00) Kamchatka'
|
||||
];
|
||||
// Type de proxy
|
||||
public static $proxyType = [
|
||||
@ -187,7 +188,7 @@ class config extends common
|
||||
];
|
||||
public static $captchaTypes = [
|
||||
'num' => 'Chiffres',
|
||||
'alpha' => 'Lettres'
|
||||
'alpha' => 'Lettres'
|
||||
];
|
||||
public static $updateDelay = [
|
||||
86400 => '1',
|
||||
@ -204,23 +205,35 @@ class config extends common
|
||||
public static $onlineVersion = '';
|
||||
public static $updateButtonText = 'Réinstaller';
|
||||
|
||||
public static $imageOpenGraph = [];
|
||||
|
||||
/**
|
||||
* Génére les fichiers pour les crawlers
|
||||
* Sitemap compressé et non compressé
|
||||
* 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
|
||||
$successSitemap = $this->updateSitemap();
|
||||
|
||||
// Mettre à jour le site map
|
||||
$successSitemap = $this->createSitemap();
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'config',
|
||||
'notification' => $successSitemap ? helper::translate('La carte du site a été mise à jour') : helper::translate('Echec de l\'écriture, vérifiez les permissions'),
|
||||
'state' => $successSitemap
|
||||
]);
|
||||
}
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'config',
|
||||
'notification' => $successSitemap ? helper::translate('La carte du site a été mise à jour') : helper::translate('Echec de l\'écriture, vérifiez les permissions'),
|
||||
'state' => $successSitemap
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@ -230,7 +243,10 @@ class config extends common
|
||||
public function backup()
|
||||
{
|
||||
// Soumission du formulaire
|
||||
if ($this->isPost()) {
|
||||
if (
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||
$this->isPost()
|
||||
) {
|
||||
// Creation du ZIP
|
||||
$filter = $this->getInput('configBackupOption', helper::FILTER_BOOLEAN) === true ? ['backup', 'tmp'] : ['backup', 'tmp', 'file'];
|
||||
$fileName = helper::autoBackup(self::TEMP_DIR, $filter);
|
||||
@ -286,10 +302,8 @@ class config extends common
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Traitement des données reçues valides.
|
||||
if (!empty($token) && $data !== false) {
|
||||
if (!empty($token) && $data !== false) {
|
||||
$data = json_decode($data, true);
|
||||
$img = $data['screenshot'];
|
||||
// Effacer l'image et la miniature png
|
||||
@ -302,9 +316,9 @@ class config extends common
|
||||
$success = copy($img, self::FILE_DIR . 'source/screenshot.jpg');
|
||||
}
|
||||
|
||||
$notification = empty($token)
|
||||
$notification = empty($token)
|
||||
? 'La clé de l\'API ne peut pas être vide'
|
||||
: ($success === false ? 'Service en ligne inaccessible' : 'Capture d\'écran générée avec succès');
|
||||
: ($success === false ? 'Service en ligne inaccessible' : 'Capture d\'écran générée avec succès');
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
@ -320,7 +334,10 @@ class config extends common
|
||||
public function restore()
|
||||
{
|
||||
// Soumission du formulaire
|
||||
if ($this->isPost()) {
|
||||
if (
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||
$this->isPost()
|
||||
) {
|
||||
|
||||
$success = false;
|
||||
|
||||
@ -349,12 +366,7 @@ class config extends common
|
||||
'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
|
||||
$tmpDir = uniqid(8);
|
||||
$success = $zip->extractTo(self::TEMP_DIR . $tmpDir);
|
||||
@ -362,7 +374,7 @@ class config extends common
|
||||
$data = json_decode(file_get_contents(self::TEMP_DIR . $tmpDir . '/data/core.json'), true);
|
||||
$dataVersion = $data['core']['dataVersion'];
|
||||
// Version non prises en charge <9 ou erreur d'extraction
|
||||
if (intval(substr($dataVersion, 0, 1)) <= 9 or !$success) {
|
||||
if (intval(substr($dataVersion, 0, 1)) <= 9 or !$success) {
|
||||
// Valeurs en sortie erreur
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Restaurer'),
|
||||
@ -382,7 +394,7 @@ class config extends common
|
||||
|
||||
// Copie dans le dossier /site/data
|
||||
$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
|
||||
if (
|
||||
@ -393,8 +405,8 @@ class config extends common
|
||||
}
|
||||
|
||||
// Message de notification
|
||||
$notification = $success === true ? 'Restauration effectuée avec succès' : 'Erreur inconnue';
|
||||
$redirect = $this->getInput('configRestoreImportUser', helper::FILTER_BOOLEAN) === true ? helper::baseUrl() . 'config/restore' : helper::baseUrl() . 'user/login/';
|
||||
$notification = $success === true ? 'Restauration effectuée avec succès' : 'Erreur inconnue';
|
||||
$redirect = $this->getInput('configRestoreImportUser', helper::FILTER_BOOLEAN) === true ? helper::baseUrl() . 'config/restore' : helper::baseUrl() . 'user/login/';
|
||||
// Valeurs en sortie erreur
|
||||
$this->addOutput([
|
||||
'redirect' => $redirect,
|
||||
@ -417,7 +429,10 @@ class config extends common
|
||||
public function index()
|
||||
{
|
||||
// Soumission du formulaire
|
||||
if ($this->isPost()) {
|
||||
if (
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||
$this->isPost()
|
||||
) {
|
||||
|
||||
// Basculement en mise à jour auto, remise à 0 du compteur
|
||||
if (
|
||||
@ -451,21 +466,25 @@ class config extends common
|
||||
'twitterId' => $this->getInput('socialTwitterId'),
|
||||
'youtubeId' => $this->getInput('socialYoutubeId'),
|
||||
'youtubeUserId' => $this->getInput('socialYoutubeUserId'),
|
||||
'githubId' => $this->getInput('socialGithubId')
|
||||
'githubId' => $this->getInput('socialGithubId'),
|
||||
'redditId' => $this->getInput('socialRedditId'),
|
||||
'twitchId' => $this->getInput('socialTwitchId'),
|
||||
'vimeoId' => $this->getInput('socialVimeoId'),
|
||||
'steamId' => $this->getInput('socialSteamId'),
|
||||
],
|
||||
'smtp' => [
|
||||
'enable' => $this->getInput('smtpEnable', helper::FILTER_BOOLEAN),
|
||||
'host' => $this->getInput('smtpHost', helper::FILTER_STRING_SHORT, $this->getInput('smtpEnable', helper::FILTER_BOOLEAN)),
|
||||
'port' => $this->getInput('smtpPort', helper::FILTER_INT, $this->getInput('smtpEnable', helper::FILTER_BOOLEAN)),
|
||||
'host' => $this->getInput('smtpHost', helper::FILTER_STRING_SHORT),
|
||||
'port' => $this->getInput('smtpPort', helper::FILTER_INT),
|
||||
'auth' => $this->getInput('smtpAuth', helper::FILTER_BOOLEAN),
|
||||
'secure' => $this->getInput('smtpSecure', helper::FILTER_STRING_SHORT),
|
||||
'username' => $this->getInput('smtpUsername', helper::FILTER_STRING_SHORT, $this->getInput('smtpAuth', helper::FILTER_BOOLEAN)),
|
||||
'password' => helper::encrypt($this->getData(['config', 'smtp', 'username']), $this->getInput('smtpPassword', null, $this->getInput('smtpAuth', helper::FILTER_BOOLEAN))),
|
||||
'username' => $this->getInput('smtpUsername', helper::FILTER_STRING_SHORT),
|
||||
'password' => helper::encrypt($this->getInput('smtpPassword', helper::FILTER_STRING_SHORT), $this->getInput('smtpHost', helper::FILTER_STRING_SHORT)),
|
||||
'from' => $this->getInput('smtpFrom', helper::FILTER_MAIL, true),
|
||||
],
|
||||
'seo' => [
|
||||
'robots' => $this->getInput('seoRobots', helper::FILTER_BOOLEAN),
|
||||
'keyApi' => $this->getInput('seoKeyApi', helper::FILTER_STRING_SHORT),
|
||||
'openGraphImage' => $this->getInput('seoOpenGraphImage', helper::FILTER_STRING_SHORT),
|
||||
],
|
||||
'connect' => [
|
||||
'attempt' => $this->getInput('connectAttempt', helper::FILTER_INT),
|
||||
@ -477,11 +496,23 @@ class config extends common
|
||||
'autoDisconnect' => $this->getInput('connectAutoDisconnect', helper::FILTER_BOOLEAN),
|
||||
'captchaType' => $this->getInput('connectCaptchaType'),
|
||||
'showPassword' => $this->getInput('connectShowPassword', helper::FILTER_BOOLEAN),
|
||||
'redirectLogin' => $this->getInput('connectRedirectLogin', helper::FILTER_BOOLEAN)
|
||||
'redirectLogin' => $this->getInput('connectRedirectLogin', helper::FILTER_BOOLEAN),
|
||||
'mailAuth' => $this->getInput('connectAuthMail', helper::FILTER_INT),
|
||||
]
|
||||
]
|
||||
]);
|
||||
|
||||
// Sauvegarde la position des onglets de la vue de l'utilisateur courant
|
||||
$this->setData([
|
||||
'user',
|
||||
$this->getUser('id'),
|
||||
'view',
|
||||
[
|
||||
'config' => $this->getInput('containerSelected'),
|
||||
'page' => $this->getData(['user', $this->getUser('id'), 'view', 'page']),
|
||||
]
|
||||
]);
|
||||
|
||||
// Efface les fichiers de backup lorsque l'option est désactivée
|
||||
if ($this->getInput('configFileBackup', helper::FILTER_BOOLEAN) === false) {
|
||||
$path = realpath('site/data');
|
||||
@ -490,7 +521,8 @@ class config extends common
|
||||
unlink($filename);
|
||||
}
|
||||
}
|
||||
if (file_exists('site/data/.backup')) unlink('site/data/.backup');
|
||||
if (file_exists('site/data/.backup'))
|
||||
unlink('site/data/.backup');
|
||||
} else {
|
||||
touch('site/data/.backup');
|
||||
}
|
||||
@ -504,8 +536,8 @@ class config extends common
|
||||
) {
|
||||
// Ajout des lignes dans le .htaccess
|
||||
$fileContent = file_get_contents('.htaccess');
|
||||
$rewriteData = PHP_EOL .
|
||||
'# URL rewriting' . PHP_EOL .
|
||||
$rewriteData =
|
||||
'# URL rewriting' . PHP_EOL .
|
||||
'<IfModule mod_rewrite.c>' . PHP_EOL .
|
||||
"\tRewriteEngine on" . PHP_EOL .
|
||||
"\tRewriteBase " . helper::baseUrl(false, false) . PHP_EOL .
|
||||
@ -513,9 +545,9 @@ class config extends common
|
||||
"\tRewriteCond %{REQUEST_FILENAME} !-d" . PHP_EOL .
|
||||
"\tRewriteRule ^(.*)$ index.php?$1 [L]" . PHP_EOL .
|
||||
'</IfModule>' . PHP_EOL .
|
||||
'# URL rewriting' . PHP_EOL;
|
||||
'# URL rewriting';
|
||||
$fileContent = str_replace('# URL rewriting', $rewriteData, $fileContent);
|
||||
file_put_contents(
|
||||
$this->secure_file_put_contents(
|
||||
'.htaccess',
|
||||
$fileContent
|
||||
);
|
||||
@ -531,7 +563,7 @@ class config extends common
|
||||
$fileContent = file_get_contents('.htaccess');
|
||||
$fileContent = explode('# URL rewriting', $fileContent);
|
||||
$fileContent = $fileContent[0] . '# URL rewriting' . $fileContent[2];
|
||||
file_put_contents(
|
||||
$this->secure_file_put_contents(
|
||||
'.htaccess',
|
||||
$fileContent
|
||||
);
|
||||
@ -566,14 +598,58 @@ class config extends common
|
||||
|
||||
// Variable de version
|
||||
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
|
||||
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');
|
||||
}
|
||||
|
||||
// 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
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Configuration'),
|
||||
@ -585,13 +661,16 @@ class config extends common
|
||||
public function script()
|
||||
{
|
||||
// Soumission du formulaire
|
||||
if ($this->isPost()) {
|
||||
if (
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||
$this->isPost()
|
||||
) {
|
||||
// Ecrire les fichiers de script
|
||||
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') {
|
||||
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
|
||||
$this->addOutput([
|
||||
@ -620,26 +699,36 @@ class config extends common
|
||||
|
||||
public function logReset()
|
||||
{
|
||||
if (file_exists(self::DATA_DIR . 'journal.log')) {
|
||||
unlink(self::DATA_DIR . 'journal.log');
|
||||
// Créer les en-têtes des journaux
|
||||
$d = 'Date;Heure;IP;Id;Action' . PHP_EOL;
|
||||
file_put_contents(self::DATA_DIR . 'journal.log', $d);
|
||||
// Action interdite
|
||||
if (
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||
) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Configuration'),
|
||||
'view' => 'index',
|
||||
'notification' => helper::translate('Journal réinitialisé avec succès'),
|
||||
'state' => true
|
||||
'access' => false
|
||||
]);
|
||||
} else {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Configuration'),
|
||||
'view' => 'index',
|
||||
'notification' => helper::translate('Aucun journal à effacer'),
|
||||
'state' => false
|
||||
]);
|
||||
if (file_exists(self::DATA_DIR . 'journal.log')) {
|
||||
unlink(self::DATA_DIR . 'journal.log');
|
||||
// Créer les en-têtes des journaux
|
||||
$d = 'Date;Heure;IP;Id;Action' . PHP_EOL;
|
||||
$this->secure_file_put_contents(self::DATA_DIR . 'journal.log', $d);
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Configuration'),
|
||||
'view' => 'index',
|
||||
'notification' => helper::translate('Journal réinitialisé avec succès'),
|
||||
'state' => true
|
||||
]);
|
||||
} else {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Configuration'),
|
||||
'view' => 'index',
|
||||
'notification' => helper::translate('Aucun journal à effacer'),
|
||||
'state' => false
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -650,25 +739,35 @@ class config extends common
|
||||
*/
|
||||
public function logDownload()
|
||||
{
|
||||
$fileName = self::DATA_DIR . 'journal.log';
|
||||
if (file_exists($fileName)) {
|
||||
ob_start();
|
||||
header('Content-Description: File Transfer');
|
||||
header('Content-Type: application/octet-stream');
|
||||
header('Content-Disposition: attachment; filename="' . $fileName . '"');
|
||||
header('Content-Length: ' . filesize($fileName));
|
||||
ob_clean();
|
||||
ob_end_flush();
|
||||
readfile($fileName);
|
||||
exit();
|
||||
} else {
|
||||
// Action interdite
|
||||
if (
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||
) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Configuration'),
|
||||
'view' => 'index',
|
||||
'notification' => helper::translate('Aucun fichier journal à télécharger'),
|
||||
'state' => false
|
||||
'access' => false
|
||||
]);
|
||||
} else {
|
||||
$fileName = self::DATA_DIR . 'journal.log';
|
||||
if (file_exists($fileName)) {
|
||||
ob_start();
|
||||
header('Content-Description: File Transfer');
|
||||
header('Content-Type: application/octet-stream');
|
||||
header('Content-Disposition: attachment; filename="' . $fileName . '"');
|
||||
header('Content-Length: ' . filesize($fileName));
|
||||
ob_clean();
|
||||
ob_end_flush();
|
||||
readfile($fileName);
|
||||
exit();
|
||||
} else {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Configuration'),
|
||||
'view' => 'index',
|
||||
'notification' => helper::translate('Aucun fichier journal à télécharger'),
|
||||
'state' => false
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -677,36 +776,46 @@ class config extends common
|
||||
*/
|
||||
public function blacklistDownload()
|
||||
{
|
||||
ob_start();
|
||||
$fileName = self::TEMP_DIR . 'blacklist.log';
|
||||
$d = 'Date dernière tentative;Heure dernière tentative;Id;Adresse IP;Nombre d\'échecs' . PHP_EOL;
|
||||
file_put_contents($fileName, $d);
|
||||
if (file_exists($fileName)) {
|
||||
$d = $this->getData(['blacklist']);
|
||||
$data = '';
|
||||
foreach ($d as $key => $item) {
|
||||
$data .= helper::dateUTF8('%Y %m %d', $item['lastFail']) . ' - ' . helper::dateUTF8('%H:%M', time());
|
||||
$data .= $key . ';' . $item['ip'] . ';' . $item['connectFail'] . PHP_EOL;
|
||||
}
|
||||
file_put_contents($fileName, $data, FILE_APPEND);
|
||||
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($fileName));
|
||||
ob_clean();
|
||||
ob_end_flush();
|
||||
readfile($fileName);
|
||||
unlink(self::TEMP_DIR . 'blacklist.log');
|
||||
exit();
|
||||
} else {
|
||||
// Action interdite
|
||||
if (
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||
) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Confighelper::translate(uration'),
|
||||
'view' => 'index',
|
||||
'notification' => helper::translate('Aucune liste noire à télécharger'),
|
||||
'state' => false
|
||||
'access' => false
|
||||
]);
|
||||
} else {
|
||||
ob_start();
|
||||
$fileName = self::TEMP_DIR . 'blacklist.log';
|
||||
$d = 'Date dernière tentative;Heure dernière tentative;Id;Adresse IP;Nombre d\'échecs' . PHP_EOL;
|
||||
$this->secure_file_put_contents($fileName, $d);
|
||||
if (file_exists($fileName)) {
|
||||
$d = $this->getData(['blacklist']);
|
||||
$data = '';
|
||||
foreach ($d as $key => $item) {
|
||||
$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;
|
||||
}
|
||||
$this->secure_file_put_contents($fileName, $data, FILE_APPEND);
|
||||
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($fileName));
|
||||
ob_clean();
|
||||
ob_end_flush();
|
||||
readfile($fileName);
|
||||
unlink(self::TEMP_DIR . 'blacklist.log');
|
||||
exit();
|
||||
} else {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Configuration'),
|
||||
'view' => 'index',
|
||||
'notification' => helper::translate('Aucune liste noire à télécharger'),
|
||||
'state' => false
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -716,23 +825,33 @@ class config extends common
|
||||
|
||||
public function blacklistReset()
|
||||
{
|
||||
if (file_exists(self::DATA_DIR . 'blacklist.json')) {
|
||||
$this->setData(['blacklist', []]);
|
||||
// Action interdite
|
||||
if (
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||
) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Configuration'),
|
||||
'view' => 'index',
|
||||
'notification' => helper::translate('Liste noire réinitialisée avec succès'),
|
||||
'state' => true
|
||||
'access' => false
|
||||
]);
|
||||
} else {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Configuration'),
|
||||
'view' => 'index',
|
||||
'notification' => helper::translate('Aucune liste noire à effacer'),
|
||||
'state' => false
|
||||
]);
|
||||
if (file_exists(self::DATA_DIR . 'blacklist.json')) {
|
||||
$this->setData(['blacklist', []]);
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Configuration'),
|
||||
'view' => 'index',
|
||||
'notification' => helper::translate('Liste noire réinitialisée avec succès'),
|
||||
'state' => true
|
||||
]);
|
||||
} else {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Configuration'),
|
||||
'view' => 'index',
|
||||
'notification' => helper::translate('Aucune liste noire à effacer'),
|
||||
'state' => false
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -741,16 +860,26 @@ class config extends common
|
||||
*/
|
||||
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');
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Configuration'),
|
||||
'view' => 'index',
|
||||
'notification' => $success ? helper::translate('Copie terminée avec succès') : helper::translate('Copie terminée avec des erreurs'),
|
||||
'state' => $success
|
||||
]);
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Configuration'),
|
||||
'view' => 'index',
|
||||
'notification' => $success ? helper::translate('Copie terminée avec succès') : helper::translate('Copie terminée avec des erreurs'),
|
||||
'state' => $success
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -758,22 +887,78 @@ class config extends common
|
||||
*/
|
||||
public function delBackups()
|
||||
{
|
||||
$path = realpath(self::BACKUP_DIR);
|
||||
$success = $fail = 0;
|
||||
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) {
|
||||
if (strpos($filename, '.zip')) {
|
||||
// Action interdite
|
||||
if (
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||
) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'access' => false
|
||||
]);
|
||||
} else {
|
||||
$path = realpath(self::BACKUP_DIR);
|
||||
$success = $fail = 0;
|
||||
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) {
|
||||
if (strpos($filename, '.zip')) {
|
||||
|
||||
$r = unlink($filename);
|
||||
$success = $r === true ? $success + 1 : $success;
|
||||
$fail = $r === false ? $fail + 1 : $fail;
|
||||
$r = unlink($filename);
|
||||
$success = $r === true ? $success + 1 : $success;
|
||||
$fail = $r === false ? $fail + 1 : $fail;
|
||||
}
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Configuration'),
|
||||
'view' => 'index',
|
||||
'notification' => $success . helper::translate('Fichiers effacés') . ' - ' . helper::translate('Échecs') . ': ' . $fail,
|
||||
'state' => true
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Envoi un message de test
|
||||
* @return void
|
||||
*/
|
||||
|
||||
public function testmail()
|
||||
{
|
||||
$sent = $this->sendMail(
|
||||
$this->getUser('mail'),
|
||||
helper::translate('Test de la messagerie du site'),
|
||||
'<strong>' . $this->getUser('firstname') . ' ' . $this->getUser('lastname') . '</strong>,<br><br>' .
|
||||
'<h4>' . helper::translate('Il semblerait que votre messagerie fonctionne correctement !') . '</h4>',
|
||||
null,
|
||||
'no-reply@localhost'
|
||||
);
|
||||
if ($sent !== true) {
|
||||
// Désactivation de l'authentification par email
|
||||
$this->setData(['config', 'connect', 'mailAuth', 0]);
|
||||
// Journalisation
|
||||
$this->saveLog($sent);
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Configuration'),
|
||||
'view' => 'index',
|
||||
'notification' => $success . helper::translate('Fichiers effacés') . ' - ' . helper::translate('Échecs') . ': ' . $fail,
|
||||
'state' => true
|
||||
'redirect' => helper::baseUrl() . 'config/' . $this->getUrl(2),
|
||||
'state' => $sent === true ? true : false,
|
||||
'notification' => $sent === true ? helper::translate('Message de test envoyé avec succès') : helper::translate('Message non envoyé')
|
||||
]);
|
||||
}
|
||||
}
|
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>
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
@ -5,8 +5,8 @@
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @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()}))}}))}));
|
@ -3,13 +3,7 @@
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<h4><?php echo helper::translate('Sécurité de la connexion'); ?>
|
||||
<!--<span id="specialeHelpButton" class="helpDisplayButton">
|
||||
<a href="https://doc.zwiicms.fr/connexion" target="_blank" title="Cliquer pour consulter l'aide en ligne">
|
||||
<?php // echo template::ico('help', ['margin' => 'left']); ?>
|
||||
</a>
|
||||
</span>-->
|
||||
</h4>
|
||||
|
||||
<div class="row">
|
||||
<div class="col4">
|
||||
<?php echo template::checkbox('connectShowPassword', true, 'Dévoiler le mot de passe', [
|
||||
@ -43,32 +37,32 @@
|
||||
'selected' => $this->getData(['config', 'connect', 'timeout'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3 verticalAlignBottom">
|
||||
<label id="helpBlacklist"><?php echo helper::translate('Liste noire'); ?>
|
||||
<?php echo template::help(
|
||||
'La liste noire énumère les tentatives de connexion à partir de comptes inexistants. Sont stockés : la date, l\'heure, le nom du compte et l\'IP.
|
||||
Après le nombre de tentatives autorisées, l\'IP et le compte sont bloqués.'
|
||||
);
|
||||
?>
|
||||
</label>
|
||||
<?php echo template::button('ConnectBlackListDownload', [
|
||||
'href' => helper::baseUrl() . 'config/blacklistDownload',
|
||||
'value' => 'Télécharger la liste',
|
||||
'ico' => 'download'
|
||||
<div class="col3">
|
||||
<?php echo template::select('connectAuthMail', array_merge([0 => 'Aucune'], self::$groupNews), [
|
||||
'label' => 'Validation par clé ⚠️',
|
||||
'selected' => $this->getData(['config', 'connect', 'mailAuth']),
|
||||
'help' => 'La connexion est confirmée à l\'aide d\'une clé transmise par messagerie. Depuis le groupe sélectionné et les groupes supérieurs.'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3 verticalAlignBottom">
|
||||
<?php echo template::button('CnnectBlackListReset', [
|
||||
'class' => 'buttonRed',
|
||||
'href' => helper::baseUrl() . 'config/blacklistReset',
|
||||
'value' => 'Réinitialiser la liste',
|
||||
'ico' => 'trash'
|
||||
<?php echo template::button('ConfigSendMail', [
|
||||
'href' => helper::baseUrl() . 'config/testmail',
|
||||
'value' => 'Message de test',
|
||||
'ico' => 'mail'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<h4><?php echo helper::translate('Captcha à la connexion'); ?>
|
||||
</h4>
|
||||
<div class="row">
|
||||
<div class="col3">
|
||||
<?php echo template::checkbox('connectCaptcha', true, 'Captcha à la connexion', [
|
||||
<?php echo template::checkbox('connectCaptcha', true, 'Activer', [
|
||||
'checked' => $this->getData(['config', 'connect', 'captcha'])
|
||||
]); ?>
|
||||
</div>
|
||||
@ -92,40 +86,66 @@
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<h4><?php echo helper::translate('Journalisation'); ?>
|
||||
<!--<span id="specialeHelpButton" class="helpDisplayButton">
|
||||
<a href="https://doc.zwiicms.fr/journalisation" target="_blank" title="Cliquer pour consulter l'aide en ligne">
|
||||
<?php // echo template::ico('help', ['margin' => 'left']); ?>
|
||||
</a>
|
||||
</span>
|
||||
-->
|
||||
</h4>
|
||||
<div class="row">
|
||||
<div class="col3">
|
||||
<?php echo template::checkbox('connectLog', true, 'Activer la journalisation', [
|
||||
'checked' => $this->getData(['config', 'connect', 'log'])
|
||||
]); ?>
|
||||
<div class="col6">
|
||||
<div class="row">
|
||||
<div class="col6">
|
||||
<?php echo template::checkbox('connectLog', true, 'Activer la journalisation', [
|
||||
'checked' => $this->getData(['config', 'connect', 'log'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col6">
|
||||
<?php echo template::select('connectAnonymousIp', $module::$anonIP, [
|
||||
'label' => 'Anonymat des adresses IP',
|
||||
'selected' => $this->getData(['config', 'connect', 'anonymousIp']),
|
||||
'help' => 'La règlementation française impose un anonymat de niveau 2'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col6 ">
|
||||
<?php echo template::button('ConfigLogDownload', [
|
||||
'href' => helper::baseUrl() . 'config/logDownload',
|
||||
'value' => 'Télécharger le journal',
|
||||
'ico' => 'download'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col6">
|
||||
<?php echo template::button('ConnectLogReset', [
|
||||
'class' => 'buttonRed',
|
||||
'href' => helper::baseUrl() . 'config/logReset',
|
||||
'value' => 'Réinitialiser le journal',
|
||||
'ico' => 'trash'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col3">
|
||||
<?php echo template::select('connectAnonymousIp', $module::$anonIP, [
|
||||
'label' => 'Anonymat des adresses IP',
|
||||
'selected' => $this->getData(['config', 'connect', 'anonymousIp']),
|
||||
'help' => 'La règlementation française impose un anonymat de niveau 2'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3 verticalAlignBottom">
|
||||
<?php echo template::button('ConfigLogDownload', [
|
||||
'href' => helper::baseUrl() . 'config/logDownload',
|
||||
'value' => 'Télécharger le journal',
|
||||
'ico' => 'download'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3 verticalAlignBottom">
|
||||
<?php echo template::button('ConnectLogReset', [
|
||||
'class' => 'buttonRed',
|
||||
'href' => helper::baseUrl() . 'config/logReset',
|
||||
'value' => 'Réinitialiser le journal',
|
||||
'ico' => 'trash'
|
||||
]); ?>
|
||||
<div class="col6 verticalAlignBottom">
|
||||
<div class="row">
|
||||
<div class="col6 verticalAlignBottom">
|
||||
<label id="helpBlacklist"><?php echo helper::translate('Liste noire'); ?>
|
||||
<?php echo template::help(
|
||||
'La liste noire énumère les tentatives de connexion à partir de comptes inexistants. Sont stockés : la date, l\'heure, le nom du compte et l\'IP.
|
||||
Après le nombre de tentatives autorisées, l\'IP et le compte sont bloqués.'
|
||||
);
|
||||
?>
|
||||
</label>
|
||||
<?php echo template::button('ConnectBlackListDownload', [
|
||||
'href' => helper::baseUrl() . 'config/blacklistDownload',
|
||||
'value' => 'Télécharger la liste',
|
||||
'ico' => 'download'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col6 verticalAlignBottom">
|
||||
<?php echo template::button('ConnectBlackListReset', [
|
||||
'class' => 'buttonRed',
|
||||
'href' => helper::baseUrl() . 'config/blacklistReset',
|
||||
'value' => 'Réinitialiser la liste',
|
||||
'ico' => 'trash'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -7,7 +7,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
@ -53,3 +53,15 @@
|
||||
.activeButton {
|
||||
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')
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col1">
|
||||
<?php /**echo template::button('configHelp', [
|
||||
'class' => 'buttonHelp',
|
||||
'href' => 'https://doc.zwiicms.fr/configuration-du-site',
|
||||
'target' => '_blank',
|
||||
'value' => template::ico('help'),
|
||||
'help' => 'Consulter l\'aide en ligne'
|
||||
]); */ ?>
|
||||
<div class="col2 offset7">
|
||||
<?php echo template::button('configLocaleButton', [
|
||||
'value' => 'Identité',
|
||||
'href' => helper::baseUrl() . 'language/site'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2 offset8">
|
||||
<div class="col2">
|
||||
<?php echo template::submit('Submit'); ?>
|
||||
</div>
|
||||
</div>
|
||||
@ -24,24 +21,26 @@
|
||||
<div class="tab">
|
||||
<?php echo template::button('configSetupButton', [
|
||||
'value' => 'Configuration',
|
||||
'class' => 'buttonTab'
|
||||
'class' => 'buttonTab',
|
||||
]); ?>
|
||||
<?php echo template::button('configSocialButton', [
|
||||
'value' => 'Référencement',
|
||||
'class' => 'buttonTab'
|
||||
'class' => 'buttonTab',
|
||||
]); ?>
|
||||
|
||||
<?php echo template::button('configConnectButton', [
|
||||
'value' => 'Connexion',
|
||||
'class' => 'buttonTab'
|
||||
'class' => 'buttonTab',
|
||||
]); ?>
|
||||
|
||||
<?php echo template::button('configNetworkButton', [
|
||||
'value' => 'Réseau',
|
||||
'class' => 'buttonTab'
|
||||
'class' => 'buttonTab',
|
||||
]); ?>
|
||||
</div>
|
||||
|
||||
<!-- Champ caché pour transmettre l'onglet-->
|
||||
<?php echo template::hidden('containerSelected'); ?>
|
||||
|
||||
<!-- Pages de formulaires -->
|
||||
<?php include('core/module/config/view/setup/setup.php') ?>
|
||||
<?php include('core/module/config/view/social/social.php') ?>
|
||||
<?php include('core/module/config/view/connect/connect.php') ?>
|
||||
|
@ -4,11 +4,6 @@
|
||||
<div class="block">
|
||||
<h4>
|
||||
<?php echo helper::translate('Paramètres'); ?>
|
||||
<!--<span id="specialeHelpButton" class="helpDisplayButton">
|
||||
<a href="https://doc.zwiicms.fr/reseau" target="_blank" title="Cliquer pour consulter l'aide en ligne">
|
||||
<?php //echo template::ico('help', ['margin' => 'left']); ?>
|
||||
</a>
|
||||
</span>-->
|
||||
</h4>
|
||||
<div class="row">
|
||||
<div class="col2">
|
||||
@ -40,11 +35,6 @@
|
||||
<div class="block">
|
||||
<h4>
|
||||
<?php echo helper::translate('SMTP'); ?>
|
||||
<!--<span id="specialeHelpButton" class="helpDisplayButton">
|
||||
<a href="https://doc.zwiicms.fr/smtp" target="_blank" title="Cliquer pour consulter l'aide en ligne">
|
||||
<?php //echo template::ico('help', ['margin' => 'left']); ?>
|
||||
</a>
|
||||
</span>-->
|
||||
</h4>
|
||||
<div class="row">
|
||||
<div class="col6">
|
||||
@ -97,7 +87,7 @@
|
||||
<?php echo template::password('smtpPassword', [
|
||||
'label' => 'Mot de passe',
|
||||
'autocomplete' => 'off',
|
||||
'value' => $this->getData(['config', 'smtp', 'password'])
|
||||
'value' => $this->getData(['config', 'smtp', 'password'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2">
|
||||
@ -113,3 +103,4 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
@ -7,7 +7,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
@ -5,7 +5,7 @@
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
@ -7,7 +7,7 @@
|
||||
'value' => template::ico('left')
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2 offset8">
|
||||
<div class="col2 offset9">
|
||||
<?php echo template::submit('configRestoreSubmit', [
|
||||
'value' => 'Restaurer',
|
||||
'uniqueSubmission' => true,
|
||||
|
@ -7,7 +7,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
@ -7,7 +7,7 @@
|
||||
'value' => template::ico('left')
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2 offset8">
|
||||
<div class="col2 offset9">
|
||||
<?php echo template::submit('configManageSubmit', [
|
||||
'value' => 'Valider',
|
||||
'ico' => 'check'
|
||||
|
@ -3,12 +3,6 @@
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<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>
|
||||
<div class="row">
|
||||
<div class="col4">
|
||||
@ -17,7 +11,8 @@
|
||||
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
|
||||
'help' => 'Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.',
|
||||
'label' => 'Favicon',
|
||||
'value' => $this->getData(['config', 'favicon'])
|
||||
'value' => $this->getData(['config', 'favicon']),
|
||||
'folder' => $this->getData(['config', 'favicon']) ? dirname($this->getData(['config', 'favicon'])) : ''
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col4">
|
||||
@ -26,7 +21,8 @@
|
||||
'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.',
|
||||
'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 class="col4">
|
||||
@ -47,8 +43,8 @@
|
||||
<div class="col6">
|
||||
<?php echo template::checkbox('configRewrite', true, 'Apache URL intelligentes', [
|
||||
'checked' => helper::checkRewrite(),
|
||||
'help' => 'Supprime le point d\'interrogation dans les URL, l\'option est indisponible avec les autres serveurs Web',
|
||||
'disabled' => stripos($_SERVER["SERVER_SOFTWARE"], 'nginx')
|
||||
'help' => 'Supprime le point d\'interrogation dans les URL, l\'option est indisponible avec les autres serveurs Web',
|
||||
'disabled' => helper::checkServerSoftware() === false and $module->isModRewriteEnabled()
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
@ -59,12 +55,6 @@
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<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>
|
||||
<div class="row">
|
||||
<div class="col6">
|
||||
@ -89,11 +79,11 @@
|
||||
'selected' => $this->getData(['config', 'autoUpdateDelay']),
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3 offset2 verticalAlignBottom">
|
||||
<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>
|
||||
<div class="col3 offset1 verticalAlignBottom">
|
||||
<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>
|
||||
</div>
|
||||
<div class="col3 verticalAlignBottom">
|
||||
<div class="col3 offset2 verticalAlignBottom">
|
||||
<?php echo template::button('configUpdateForced', [
|
||||
'ico' => 'download-cloud',
|
||||
'href' => helper::baseUrl() . 'install/update',
|
||||
@ -109,12 +99,6 @@
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<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>
|
||||
<div class="row">
|
||||
<div class="col6">
|
||||
@ -169,12 +153,6 @@
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<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>
|
||||
<div class="row">
|
||||
<div class="col4 offset1 verticalAlignBottom">
|
||||
@ -198,13 +176,21 @@
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<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>
|
||||
<div class="row textAlignCenter">
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
|
@ -2,40 +2,52 @@
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<h4><?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>
|
||||
<?php echo helper::translate('Capture d\'écran Open Graph'); ?>
|
||||
</h4>
|
||||
<div class="row">
|
||||
<div class="col7">
|
||||
<div class="col6">
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<?php echo template::text('seoKeyApi', [
|
||||
'label' => 'Clé de l\'API <a href="https://app.screenshotapi.net/" target="_blank">ScreenShotApi</a>',
|
||||
'value' => $this->getData(['config', 'seo', 'keyApi']),
|
||||
'help' => 'Créez un compte gratuit, recopier la clé , puis valider le formulaire avant de cliquer sur le bouton de génération'
|
||||
<?php echo template::file('seoOpenGraphImage', [
|
||||
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
|
||||
'label' => 'Image Open Graph',
|
||||
'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 class="row">
|
||||
<div class="col6 offset3">
|
||||
<?php echo template::button('socialMetaImage', [
|
||||
'href' => helper::baseUrl() . 'config/configMetaImage',
|
||||
'value' => 'Générer une capture Open Graph'
|
||||
]); ?>
|
||||
<div class="col10 textAlignCenter">
|
||||
<?php if (!empty($module::$imageOpenGraph['type'])): ?>
|
||||
<p>
|
||||
<?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 class="col5">
|
||||
<?php if (file_exists(self::FILE_DIR . 'source/screenshot.jpg')) : ?>
|
||||
<div class="row">
|
||||
<div class="col8 offset2 textAlignCenter">
|
||||
<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." />
|
||||
</div>
|
||||
</div>
|
||||
<div class="col6">
|
||||
<?php if (
|
||||
$this->getData(['config', 'seo', 'openGraphImage']) &&
|
||||
file_exists(self::FILE_DIR . 'source/' . $this->getData(['config', 'seo', 'openGraphImage']))
|
||||
): ?>
|
||||
<img
|
||||
src="<?php echo self::FILE_DIR . 'source/' . $this->getData(['config', 'seo', 'openGraphImage']); ?>" />
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
@ -45,7 +57,8 @@
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<h4><?php echo helper::translate('Référencement'); ?>
|
||||
<h4>
|
||||
<?php echo helper::translate('Référencement'); ?>
|
||||
</h4>
|
||||
<div class="row">
|
||||
<div class="col4 offset1">
|
||||
@ -66,72 +79,98 @@
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<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="col3">
|
||||
<?php echo template::text('socialFacebookId', [
|
||||
'help' => 'Saisissez votre ID : https://www.facebook.com/[ID].',
|
||||
'label' => 'Facebook',
|
||||
'label' => template::ico('facebook', ['margin' => 'right']) . 'Facebook',
|
||||
'value' => $this->getData(['config', 'social', 'facebookId'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3">
|
||||
<?php echo template::text('socialInstagramId', [
|
||||
'help' => 'Saisissez votre ID : https://www.instagram.com/[ID].',
|
||||
'label' => 'Instagram',
|
||||
'label' => template::ico('instagram', ['margin' => 'right']) . 'Instagram',
|
||||
'value' => $this->getData(['config', 'social', 'instagramId'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3">
|
||||
<?php echo template::text('socialTwitterId', [
|
||||
'help' => 'Saisissez votre ID : https://twitter.com/[ID].',
|
||||
'label' => template::ico('twitter', ['margin' => 'right']) . 'Twitter',
|
||||
'value' => $this->getData(['config', 'social', 'twitterId'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3">
|
||||
<?php echo template::text('socialRedditId', [
|
||||
'help' => 'Saisissez votre ID Reddit : https://www.reddit.com/user/[ID].',
|
||||
'label' => template::ico('reddit', ['margin' => 'right']) . 'Reddit',
|
||||
'value' => $this->getData(['config', 'social', 'redditId'])
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col3">
|
||||
<?php echo template::text('socialYoutubeId', [
|
||||
'help' => 'ID de la chaîne : https://www.youtube.com/channel/[ID].',
|
||||
'label' => 'Chaîne Youtube',
|
||||
'label' => template::ico('youtube', ['margin' => 'right']) . 'Chaîne Youtube',
|
||||
'value' => $this->getData(['config', 'social', 'youtubeId'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3">
|
||||
<?php echo template::text('socialYoutubeUserId', [
|
||||
'help' => 'Saisissez votre ID Utilisateur : https://www.youtube.com/user/[ID].',
|
||||
'label' => 'Youtube',
|
||||
'label' => template::ico('youtube', ['margin' => 'right']) . 'Youtube',
|
||||
'value' => $this->getData(['config', 'social', 'youtubeUserId'])
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col3">
|
||||
<?php echo template::text('socialTwitterId', [
|
||||
'help' => 'Saisissez votre ID : https://twitter.com/[ID].',
|
||||
'label' => 'Twitter',
|
||||
'value' => $this->getData(['config', 'social', 'twitterId'])
|
||||
<?php echo template::text('socialVimeoId', [
|
||||
'help' => 'Saisissez votre ID Viemo : https://vimeo.com/[ID].',
|
||||
'label' => template::ico('vimeo', ['margin' => 'right']) . 'Vimeo',
|
||||
'value' => $this->getData(['config', 'social', 'vimeoId'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3">
|
||||
<?php echo template::text('socialPinterestId', [
|
||||
'help' => 'Saisissez votre ID : https://pinterest.com/[ID].',
|
||||
'label' => 'Pinterest',
|
||||
'label' => template::ico('pinterest', ['margin' => 'right']) . 'Pinterest',
|
||||
'value' => $this->getData(['config', 'social', 'pinterestId'])
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col3">
|
||||
<?php echo template::text('socialLinkedinId', [
|
||||
'help' => 'Saisissez votre ID Linkedin : https://fr.linkedin.com/in/[ID].',
|
||||
'label' => 'Linkedin',
|
||||
'label' => template::ico('linkedin', ['margin' => 'right']) . 'Linkedin',
|
||||
'value' => $this->getData(['config', 'social', 'linkedinId'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3">
|
||||
<?php echo template::text('socialGithubId', [
|
||||
'help' => 'Saisissez votre ID Github : https://github.com/[ID].',
|
||||
'label' => 'Github',
|
||||
'label' => template::ico('github', ['margin' => 'right']) . 'Github',
|
||||
'value' => $this->getData(['config', 'social', 'githubId'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3">
|
||||
<?php echo template::text('socialTwitchId', [
|
||||
'help' => 'Saisissez votre ID Twitch : https://www.twitch.tv/[ID].',
|
||||
'label' => template::ico('twitch', ['margin' => 'right']) . 'Twitch',
|
||||
'value' => $this->getData(['config', 'social', 'twitchId'])
|
||||
]); ?>
|
||||
</div>
|
||||
|
||||
<div class="col3">
|
||||
<?php echo template::text('socialSteamId', [
|
||||
'help' => 'Saisissez votre ID Viemo : https://steamcommunity.com/id/[ID].',
|
||||
'label' => template::ico('steam', ['margin' => 'right']) . 'Steam',
|
||||
'value' => $this->getData(['config', 'social', 'steamId'])
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
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-2025, 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>
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
@ -30,8 +30,7 @@ class install extends common
|
||||
'http://' => 'HTTP'
|
||||
];
|
||||
|
||||
// Thèmes proposés à l'installation
|
||||
public static $themes = [];
|
||||
public static $updateButtonText = 'Réinstaller';
|
||||
|
||||
public static $newVersion;
|
||||
|
||||
@ -50,33 +49,35 @@ class install extends common
|
||||
'access' => false
|
||||
]);
|
||||
}
|
||||
// Accès autorisé
|
||||
|
||||
// Soumission du formulaire
|
||||
if ($this->isPost()) {
|
||||
if (
|
||||
//$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||
$this->isPost()
|
||||
) {
|
||||
|
||||
$lang = $this->getInput('installLanguage');
|
||||
// Place le cookie pour la suite de l'installation
|
||||
setcookie('ZWII_UI', $lang, time() + 3600, helper::baseUrl(false, false), '', false, false);
|
||||
// Pour la suite de l'installation
|
||||
// setcookie('ZWII_UI', $lang, time() + 3600, helper::baseUrl(false, false), '', false, false);
|
||||
|
||||
$_SESSION['ZWII_UI'] = $this->getInput('installLanguage');
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'install/postinstall/' . $lang
|
||||
'redirect' => helper::baseUrl() . 'install/postinstall'
|
||||
]);
|
||||
}
|
||||
|
||||
//Nettoyage anciennes installations
|
||||
helper::deleteCookie('ZWII_CONTENT');
|
||||
|
||||
// Liste des langues UI disponibles
|
||||
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];
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
$this->addOutput([
|
||||
'display' => self::DISPLAY_LAYOUT_LIGHT,
|
||||
'title' => helper::translate('Installation'),
|
||||
'title' => helper::translate('ZwiiCMS Installation'),
|
||||
'view' => 'index'
|
||||
]);
|
||||
}
|
||||
@ -96,19 +97,13 @@ class install extends common
|
||||
// Accès autorisé
|
||||
else {
|
||||
// Soumission du formulaire
|
||||
if ($this->isPost()) {
|
||||
if (
|
||||
//$this->getUser('permission', __CLASS__, __FUNCTION__) !== true &&
|
||||
$this->isPost()
|
||||
) {
|
||||
|
||||
$success = true;
|
||||
|
||||
// Validation de la langue transmise
|
||||
self::$i18nUI = $this->getUrl(2);
|
||||
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;
|
||||
setcookie('ZWII_CONTENT', self::$i18nContent, time() + 3600, helper::baseUrl(false, false), '', helper::isHttps(), true);
|
||||
|
||||
|
||||
// Double vérification pour le mot de passe
|
||||
if ($this->getInput('installPassword', helper::FILTER_STRING_SHORT, true) !== $this->getInput('installConfirmPassword', helper::FILTER_STRING_SHORT, true)) {
|
||||
self::$inputNotices['installConfirmPassword'] = 'Incorrect';
|
||||
@ -120,135 +115,126 @@ class install extends common
|
||||
$userMail = $this->getInput('installMail', helper::FILTER_MAIL, 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';
|
||||
// Stockage de la langue par défaut afin d'afficher le site dans cette langue lors de l'affichage de la bannière de connexion.
|
||||
$this->setData(['config','defaultLanguageUI', self::$i18nUI], false);
|
||||
|
||||
// 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
|
||||
$sample = false;
|
||||
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.
|
||||
// success retour de l'enregistrement des données
|
||||
$success = $this->setData([
|
||||
$this->setData([
|
||||
'user',
|
||||
$userId,
|
||||
[
|
||||
'firstname' => $userFirstname,
|
||||
'forgot' => 0,
|
||||
'group' => self::GROUP_ADMIN,
|
||||
'profil' => 0,
|
||||
'lastname' => $userLastname,
|
||||
'pseudo' => 'Admin',
|
||||
'signature' => 1,
|
||||
'mail' => $userMail,
|
||||
'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
|
||||
// Sent contient true si réussite sinon code erreur d'envoi en clair
|
||||
$sent = $this->sendMail(
|
||||
$userMail,
|
||||
'Installation de votre site',
|
||||
'Bonjour' . ' <strong>' . $userFirstname . ' ' . $userLastname . '</strong>,<br><br>' .
|
||||
'Voici les détails de votre installation.<br><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>',
|
||||
null,
|
||||
$this->getData(['config', 'smtp', 'from']),
|
||||
);
|
||||
// Envoie le mail
|
||||
// Sent contient true si réussite sinon code erreur d'envoi en clair
|
||||
$this->sendMail(
|
||||
$userMail,
|
||||
'Installation de votre site',
|
||||
'Bonjour' . ' <strong>' . $userFirstname . ' ' . $userLastname . '</strong>,<br><br>' .
|
||||
'Voici les détails de votre installation.<br><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>',
|
||||
null,
|
||||
'no-reply@localhost'
|
||||
);
|
||||
|
||||
// Installation du site de test
|
||||
if (
|
||||
$this->getInput('installDefaultData', helper::FILTER_BOOLEAN) === false
|
||||
&& 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);
|
||||
// Supprime l'installation FR générée par défaut.
|
||||
$this->removeDir(self::DATA_DIR . 'fr_FR');
|
||||
}
|
||||
|
||||
// Sauvegarder la configuration du Proxy
|
||||
$this->setData(['config', 'proxyType', $this->getInput('installProxyType')]);
|
||||
$this->setData(['config', 'proxyUrl', $this->getInput('installProxyUrl')]);
|
||||
$this->setData(['config', 'proxyPort', $this->getInput('installProxyPort', helper::FILTER_INT)]);
|
||||
|
||||
// Images exemples livrées dans tous les cas
|
||||
try {
|
||||
// Décompression dans le dossier de fichier temporaires
|
||||
if (file_exists(self::TEMP_DIR . 'files.tar.gz')) {
|
||||
unlink(self::TEMP_DIR . 'files.tar.gz');
|
||||
}
|
||||
if (file_exists(self::TEMP_DIR . 'files.tar')) {
|
||||
unlink(self::TEMP_DIR . 'files.tar');
|
||||
}
|
||||
copy('core/module/install/ressource/files.tar.gz', self::TEMP_DIR . 'files.tar.gz');
|
||||
$pharData = new PharData(self::TEMP_DIR . 'files.tar.gz');
|
||||
$pharData->decompress();
|
||||
// Installation
|
||||
$pharData->extractTo(__DIR__ . '/../../../', null, true);
|
||||
} catch (Exception $e) {
|
||||
$success = $e->getMessage();
|
||||
}
|
||||
|
||||
// Nettoyage
|
||||
unlink(self::TEMP_DIR . 'files.tar.gz');
|
||||
unlink(self::TEMP_DIR . 'files.tar');
|
||||
|
||||
// Créer le dossier des fontes
|
||||
if (!is_dir(self::DATA_DIR . 'fonts')) {
|
||||
mkdir(self::DATA_DIR . 'fonts');
|
||||
}
|
||||
|
||||
// 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
|
||||
if (is_dir(self::I18N_DIR) === false) {
|
||||
mkdir(self::I18N_DIR);
|
||||
}
|
||||
|
||||
// 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);
|
||||
unlink(self::I18N_DIR . 'languages.json');
|
||||
|
||||
// Fixe l'adresse from pour les envois d'email
|
||||
$this->setData(['config', 'smtp', 'from', 'no-reply@' . str_replace('www.', '', $_SERVER['HTTP_HOST'])]);
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl(true) . $this->getData(['locale', 'homePageId']),
|
||||
'notification' => $sent === true ? helper::translate('Installation terminée') : $sent,
|
||||
'state' => ($sent === true && $success === true) ? true : null
|
||||
]);
|
||||
// Nettoyage fr par défaut
|
||||
if (
|
||||
$_SESSION['ZWII_SITE_CONTENT'] !== 'fr_FR'
|
||||
) {
|
||||
if (is_dir(self::DATA_DIR . 'fr_FR'))
|
||||
$this->deleteDir(self::DATA_DIR . 'fr_FR');
|
||||
}
|
||||
|
||||
// Sauvegarder la configuration du Proxy
|
||||
$this->setData(['config', 'proxyType', $this->getInput('installProxyType')], false);
|
||||
$this->setData(['config', 'proxyUrl', $this->getInput('installProxyUrl')], false);
|
||||
$this->setData(['config', 'proxyPort', $this->getInput('installProxyPort', helper::FILTER_INT)], false);
|
||||
|
||||
// Images exemples livrées dans tous les cas
|
||||
try {
|
||||
// Décompression dans le dossier de fichier temporaires
|
||||
if (file_exists(self::TEMP_DIR . 'files.tar.gz')) {
|
||||
unlink(self::TEMP_DIR . 'files.tar.gz');
|
||||
}
|
||||
if (file_exists(self::TEMP_DIR . 'files.tar')) {
|
||||
unlink(self::TEMP_DIR . 'files.tar');
|
||||
}
|
||||
copy('core/module/install/ressource/files.tar.gz', self::TEMP_DIR . 'files.tar.gz');
|
||||
$pharData = new PharData(self::TEMP_DIR . 'files.tar.gz');
|
||||
$pharData->decompress();
|
||||
// Installation
|
||||
$pharData->extractTo(__DIR__ . '/../../../', null, true);
|
||||
} catch (Exception $e) {
|
||||
$success = $e->getMessage();
|
||||
}
|
||||
|
||||
// Nettoyage
|
||||
unlink(self::TEMP_DIR . 'files.tar.gz');
|
||||
unlink(self::TEMP_DIR . 'files.tar');
|
||||
|
||||
// Créer le dossier des fontes
|
||||
if (!is_dir(self::DATA_DIR . 'font')) {
|
||||
mkdir(self::DATA_DIR . 'font');
|
||||
}
|
||||
|
||||
// Copie des langues de l'UI et génération de la base de données
|
||||
if (is_dir(self::I18N_DIR) === false) {
|
||||
mkdir(self::I18N_DIR);
|
||||
}
|
||||
|
||||
// Créer la base de données des langues
|
||||
$this->copyDir('core/module/install/ressource/i18n', self::I18N_DIR);
|
||||
|
||||
// Fixe l'adresse from pour les envois d'email
|
||||
$this->setData(['config', 'smtp', 'from', 'no-reply@' . str_replace('www.', '', $_SERVER['HTTP_HOST'])], false);
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl(),
|
||||
'notification' => helper::translate('Installation terminée'),
|
||||
'state' => true
|
||||
]);
|
||||
}
|
||||
|
||||
// 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');
|
||||
// Force la sauvegarde
|
||||
$this->saveDB('config');
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
@ -264,141 +250,205 @@ class install extends common
|
||||
*/
|
||||
public function steps()
|
||||
{
|
||||
switch ($this->getInput('step', helper::FILTER_INT)) {
|
||||
// Préparation
|
||||
case 1:
|
||||
$success = true;
|
||||
// RAZ la mise à jour auto
|
||||
$this->setData(['core', 'updateAvailable', false]);
|
||||
// Backup du dossier Data
|
||||
helper::autoBackup(self::BACKUP_DIR, ['backup', 'tmp', 'file']);
|
||||
// Sauvegarde htaccess
|
||||
if ($this->getData(['config', 'autoUpdateHtaccess'])) {
|
||||
$success = copy('.htaccess', '.htaccess' . '.bak');
|
||||
}
|
||||
// Nettoyage des fichiers d'installation précédents
|
||||
if (file_exists(self::TEMP_DIR . 'update.tar.gz') && $success) {
|
||||
$success = $success || unlink(self::TEMP_DIR . 'update.tar.gz');
|
||||
}
|
||||
if (file_exists(self::TEMP_DIR . 'update.tar') && $success) {
|
||||
$success = $success || unlink(self::TEMP_DIR . 'update.tar');
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'display' => self::DISPLAY_JSON,
|
||||
'content' => [
|
||||
'success' => $success,
|
||||
'data' => null
|
||||
]
|
||||
]);
|
||||
break;
|
||||
// Téléchargement
|
||||
case 2:
|
||||
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 = (explode(' ', $md5origin));
|
||||
$md5target = md5_file(self::TEMP_DIR . 'update.tar.gz');
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'display' => self::DISPLAY_JSON,
|
||||
'content' => [
|
||||
'success' => $md5origin[0] === $md5target,
|
||||
'data' => null
|
||||
]
|
||||
]);
|
||||
break;
|
||||
// Installation
|
||||
case 3:
|
||||
$success = true;
|
||||
// Check la réécriture d'URL avant d'écraser les fichiers
|
||||
$rewrite = helper::checkRewrite();
|
||||
// Décompression et installation
|
||||
try {
|
||||
// Décompression dans le dossier de fichier temporaires
|
||||
$pharData = new PharData(self::TEMP_DIR . 'update.tar.gz');
|
||||
$pharData->decompress();
|
||||
// Installation
|
||||
$pharData->extractTo(__DIR__ . '/../../../', null, true);
|
||||
} catch (Exception $e) {
|
||||
$success = $e->getMessage();
|
||||
}
|
||||
// Nettoyage du dossier
|
||||
if (file_exists(self::TEMP_DIR . 'update.tar.gz')) {
|
||||
unlink(self::TEMP_DIR . 'update.tar.gz');
|
||||
}
|
||||
if (file_exists(self::TEMP_DIR . 'update.tar')) {
|
||||
unlink(self::TEMP_DIR . 'update.tar');
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'display' => self::DISPLAY_JSON,
|
||||
'content' => [
|
||||
'success' => $success,
|
||||
'data' => $rewrite
|
||||
]
|
||||
]);
|
||||
break;
|
||||
// Configuration
|
||||
case 4:
|
||||
$success = true;
|
||||
$rewrite = $this->getInput('data');
|
||||
// Réécriture d'URL
|
||||
if ($rewrite === "true") { // Ajout des lignes dans le .htaccess
|
||||
$fileContent = file_get_contents('.htaccess');
|
||||
$rewriteData = PHP_EOL .
|
||||
'# URL rewriting' . PHP_EOL .
|
||||
'<IfModule mod_rewrite.c>' . PHP_EOL .
|
||||
"\tRewriteEngine on" . PHP_EOL .
|
||||
"\tRewriteBase " . helper::baseUrl(false, false) . PHP_EOL .
|
||||
"\tRewriteCond %{REQUEST_FILENAME} !-f" . PHP_EOL .
|
||||
"\tRewriteCond %{REQUEST_FILENAME} !-d" . PHP_EOL .
|
||||
"\tRewriteRule ^(.*)$ index.php?$1 [L]" . PHP_EOL .
|
||||
'</IfModule>' . PHP_EOL .
|
||||
'# URL rewriting' . PHP_EOL;
|
||||
$fileContent = str_replace('# URL rewriting', $rewriteData, $fileContent);
|
||||
$r = file_put_contents(
|
||||
'.htaccess',
|
||||
$fileContent
|
||||
);
|
||||
$success = $r === false ? false : true;
|
||||
}
|
||||
// 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
|
||||
*/
|
||||
|
||||
// Langues installées
|
||||
$installedUI = $this->getData(['languages']);
|
||||
|
||||
// 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 ($store[$key]['version'] > $value['version']) {
|
||||
echo copy('core/module/install/ressource/i18n/' . $key . '.json', self::I18N_DIR . $key . '.json');
|
||||
$this->setData(['languages', $key, $store[$key]]);
|
||||
// Action interdite
|
||||
if (
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||
) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'access' => false
|
||||
]);
|
||||
} else {
|
||||
switch ($this->getInput('step', helper::FILTER_INT)) {
|
||||
// Préparation
|
||||
case 1:
|
||||
$success = true;
|
||||
$message = '';
|
||||
// RAZ la mise à jour auto
|
||||
$this->setData(['core', 'updateAvailable', false]);
|
||||
// Backup du dossier Data
|
||||
helper::autoBackup(self::BACKUP_DIR, ['backup', 'tmp', 'file']);
|
||||
// Sauvegarde htaccess
|
||||
if ($this->getData(['config', 'autoUpdateHtaccess'])) {
|
||||
$success = copy('.htaccess', '.htaccess' . '.bak');
|
||||
$message = $success ? '' : 'Erreur de copie du fichier htaccess';
|
||||
}
|
||||
}
|
||||
// Nettoyage des fichiers d'installation précédents
|
||||
if ($success && file_exists(self::TEMP_DIR . 'update.tar.gz')) {
|
||||
$success = unlink(self::TEMP_DIR . 'update.tar.gz');
|
||||
$message = $success ? '' : 'Impossible d\'effacer la mise à jour précédente';
|
||||
}
|
||||
if ($success && file_exists(self::TEMP_DIR . 'update.tar')) {
|
||||
$success = unlink(self::TEMP_DIR . 'update.tar');
|
||||
$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
|
||||
$this->addOutput([
|
||||
'display' => self::DISPLAY_JSON,
|
||||
'content' => [
|
||||
'success' => $success,
|
||||
'data' => $message
|
||||
]
|
||||
]);
|
||||
break;
|
||||
// Téléchargement
|
||||
case 2:
|
||||
$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 = explode(' ', $md5origin);
|
||||
$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
|
||||
$this->addOutput([
|
||||
'display' => self::DISPLAY_JSON,
|
||||
'content' => [
|
||||
'success' => $success,
|
||||
'data' => $message
|
||||
]
|
||||
]);
|
||||
break;
|
||||
// Installation
|
||||
case 3:
|
||||
$success = true;
|
||||
$message = '';
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'display' => self::DISPLAY_JSON,
|
||||
'content' => [
|
||||
'success' => $success,
|
||||
'data' => null
|
||||
]
|
||||
]);
|
||||
// Check la réécriture d'URL avant d'écraser les fichiers
|
||||
if (helper::checkRewrite()) {
|
||||
touch(self::DATA_DIR . '.rewrite');
|
||||
}
|
||||
|
||||
// Décompression et installation
|
||||
try {
|
||||
// Décompression dans le dossier de fichier temporaires
|
||||
$pharData = new PharData(self::TEMP_DIR . 'update.tar.gz');
|
||||
$pharData->decompress();
|
||||
// Installation
|
||||
$pharData->extractTo(__DIR__ . '/../../../', null, true);
|
||||
} catch (Exception $e) {
|
||||
$message = $e->getMessage();
|
||||
$success = false;
|
||||
http_response_code(500);
|
||||
}
|
||||
|
||||
// Nettoyage du dossier
|
||||
if (file_exists(self::TEMP_DIR . 'update.tar.gz')) {
|
||||
unlink(self::TEMP_DIR . 'update.tar.gz');
|
||||
}
|
||||
if (file_exists(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
|
||||
$this->addOutput([
|
||||
'display' => self::DISPLAY_JSON,
|
||||
'content' => [
|
||||
'success' => $success,
|
||||
'data' => $message,
|
||||
]
|
||||
]);
|
||||
break;
|
||||
// Configuration
|
||||
case 4:
|
||||
$success = true;
|
||||
$message = '';
|
||||
|
||||
/**
|
||||
* 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');
|
||||
$rewriteData = PHP_EOL .
|
||||
'# URL rewriting' . PHP_EOL .
|
||||
'<IfModule mod_rewrite.c>' . PHP_EOL .
|
||||
"\tRewriteEngine on" . PHP_EOL .
|
||||
"\tRewriteBase " . helper::baseUrl(false, false) . PHP_EOL .
|
||||
"\tRewriteCond %{REQUEST_FILENAME} !-f" . PHP_EOL .
|
||||
"\tRewriteCond %{REQUEST_FILENAME} !-d" . PHP_EOL .
|
||||
"\tRewriteRule ^(.*)$ index.php?$1 [L]" . PHP_EOL .
|
||||
'</IfModule>' . PHP_EOL .
|
||||
'# URL rewriting' . PHP_EOL;
|
||||
$fileContent = str_replace('# URL rewriting', $rewriteData, $fileContent);
|
||||
$success = $this->secure_file_put_contents(
|
||||
'.htaccess',
|
||||
$fileContent
|
||||
);
|
||||
unlink(self::DATA_DIR . '.rewrite');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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) {
|
||||
|
||||
if (
|
||||
isset($defaultLanguages[$key]['date']) &&
|
||||
$defaultLanguages[$key]['date'] > $value['date'] &&
|
||||
isset($defaultLanguages[$key]['version']) &&
|
||||
$defaultLanguages[$key]['version'] >= $value['version']
|
||||
|
||||
) {
|
||||
copy('core/module/install/ressource/i18n/' . $key . '.json', self::I18N_DIR . $key . '.json');
|
||||
$this->setData(['language', $key, $defaultLanguages[$key]]);
|
||||
}
|
||||
}
|
||||
// Sauvegarde le message dans le journal
|
||||
if (!empty($message)) {
|
||||
$this->saveLog($message);
|
||||
}
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'display' => self::DISPLAY_JSON,
|
||||
'content' => [
|
||||
'success' => $success,
|
||||
'data' => $message
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -407,14 +457,31 @@ class install extends common
|
||||
*/
|
||||
public function update()
|
||||
{
|
||||
// Nouvelle version
|
||||
self::$newVersion = helper::getUrlContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/version');
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'display' => self::DISPLAY_LAYOUT_LIGHT,
|
||||
'title' => helper::translate('Mise à jour'),
|
||||
'view' => 'update'
|
||||
]);
|
||||
// Action interdite
|
||||
if (
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||
) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'access' => false
|
||||
]);
|
||||
} else {
|
||||
// Nouvelle 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
|
||||
$this->addOutput([
|
||||
'display' => self::DISPLAY_LAYOUT_LIGHT,
|
||||
'title' => helper::translate(self::$updateButtonText),
|
||||
'view' => 'update'
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -5,6 +5,7 @@ class init extends common
|
||||
'config' => [
|
||||
'autoBackup' => true,
|
||||
'autoUpdate' => true,
|
||||
'autoUpdateDelay' => 86400,
|
||||
'autoUpdateHtaccess' => false,
|
||||
'favicon' => 'favicon.ico',
|
||||
'faviconDark' => 'faviconDark.ico',
|
||||
@ -25,10 +26,11 @@ class init extends common
|
||||
'proxyType' => 'tcp://',
|
||||
'smtp' => [
|
||||
'enable' => false,
|
||||
'from'=> 'no-reply@localhost'
|
||||
],
|
||||
'seo' => [
|
||||
'robots' => true,
|
||||
'keyApi' => 'XXXXXXX-XXXXXXX-XXXXXXX-XXXXXXX'
|
||||
'openGraphImage' => 'screenshot.png'
|
||||
],
|
||||
'connect' => [
|
||||
'timeout' => 600,
|
||||
@ -44,33 +46,13 @@ class init extends common
|
||||
]
|
||||
],
|
||||
'core' => [
|
||||
'dataVersion' => 12300,
|
||||
'dataVersion' => 13000,
|
||||
'lastBackup' => 0,
|
||||
'lastClearTmp' => 0,
|
||||
'lastAutoUpdate' => 0,
|
||||
'updateAvailable' => false
|
||||
],
|
||||
'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'
|
||||
]
|
||||
],
|
||||
'fonts' => [
|
||||
'font' => [
|
||||
'files' => [],
|
||||
'imported' => [
|
||||
'arimo' => [
|
||||
@ -90,12 +72,12 @@ class init extends common
|
||||
],
|
||||
'droid-sans-2' => [
|
||||
'name' => 'Droid Sans',
|
||||
'font-family' => '\'Droid Sans\', sans-serif',
|
||||
'font-family' => '\'Droid Sans\', sans-serif',
|
||||
'resource' => 'https://fonts.cdnfonts.com/css/droid-sans-2'
|
||||
],
|
||||
'droid-serif-2' => [
|
||||
'name' => 'Droid Serif',
|
||||
'font-family' => '\'Droid Serif\', serif',
|
||||
'font-family' => '\'Droid Serif\', serif',
|
||||
'resource' => 'https://fonts.cdnfonts.com/css/droid-serif-2'
|
||||
],
|
||||
'indie-flower' => [
|
||||
@ -175,39 +157,8 @@ 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' => [],
|
||||
'theme' => [
|
||||
'theme' => [
|
||||
'body' => [
|
||||
'backgroundColor' => 'rgba(236, 239, 241, 1)',
|
||||
'image' => '',
|
||||
@ -330,13 +281,489 @@ class init extends common
|
||||
'backgroundColorButtonGreen' => 'rgba(100, 207, 8, 1)',
|
||||
'backgroundColorButtonHelp' => 'rgba(255, 153, 0, 1)',
|
||||
'backgroundBlockColor' => 'rgba(236, 239, 241, 1)',
|
||||
'borderBlockColor' => 'rgba(190, 202, 209, 1)'
|
||||
'borderBlockColor' => 'rgba(190, 202, 209, 1)',
|
||||
'width' => '960px'
|
||||
],
|
||||
'blacklist' => [],
|
||||
'languages'=> [],
|
||||
'language' => [
|
||||
"fr_FR" => [
|
||||
"version" => 13500,
|
||||
"date" => 1734641934
|
||||
],
|
||||
"es" => [
|
||||
"version" => 13500,
|
||||
"date" => 1734641934
|
||||
],
|
||||
"en_EN" => [
|
||||
"version" => 13500,
|
||||
"date" => 1734641934
|
||||
]
|
||||
],
|
||||
'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 = [
|
||||
'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' => [
|
||||
'homePageId' => 'home',
|
||||
'page302' => 'none',
|
||||
@ -346,6 +773,7 @@ class init extends common
|
||||
'searchPageId' => 'none',
|
||||
'searchPageLabel' => 'none',
|
||||
'sitemapPageLabel' => 'none',
|
||||
'poweredPageLabel' => 'Powered by',
|
||||
'legalPageLabel' => 'legals',
|
||||
'metaDescription' => 'Zwii is a database-free CMS that makes it easy to create and manage a website without any programming knowledge.',
|
||||
'title' => 'Your site in a few clicks!',
|
||||
@ -373,6 +801,7 @@ class init extends common
|
||||
'parentPageId' => '',
|
||||
'position' => 1,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'profil' => 0,
|
||||
'targetBlank' => false,
|
||||
'title' => 'Home page',
|
||||
'shortTitle' => 'Home',
|
||||
@ -387,12 +816,11 @@ class init extends common
|
||||
'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 $siteData = [
|
||||
public static $siteTemplate = [
|
||||
'page' => [
|
||||
'accueil' => [
|
||||
'typeMenu' => 'text',
|
||||
@ -409,6 +837,7 @@ class init extends common
|
||||
'parentPageId' => '',
|
||||
'position' => 1,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'profil' => 0,
|
||||
'targetBlank' => false,
|
||||
'title' => 'Accueil',
|
||||
'shortTitle' => 'Accueil',
|
||||
@ -436,13 +865,14 @@ class init extends common
|
||||
'parentPageId' => 'accueil',
|
||||
'position' => 1,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'profil' => 0,
|
||||
'targetBlank' => false,
|
||||
'title' => 'Page Enfant',
|
||||
'shortTitle' => 'Enfant',
|
||||
'block' => '12',
|
||||
'barLeft' => '',
|
||||
'barRight' => '',
|
||||
'displayMenu' => 'none',
|
||||
'displayMenu' => 'none',
|
||||
'hideMenuSide' => false,
|
||||
'hideMenuChildren' => false,
|
||||
'extraPosition' => false,
|
||||
@ -463,13 +893,14 @@ class init extends common
|
||||
'modulePosition' => 'bottom',
|
||||
'position' => 2,
|
||||
'group' => self::GROUP_MEMBER,
|
||||
'profil' => 1,
|
||||
'targetBlank' => false,
|
||||
'title' => 'Page privée',
|
||||
'shortTitle' => 'Privée',
|
||||
'block' => '12',
|
||||
'barLeft' => '',
|
||||
'barRight' => '',
|
||||
'displayMenu' => 'none',
|
||||
'displayMenu' => 'none',
|
||||
'hideMenuSide' => false,
|
||||
'hideMenuChildren' => false,
|
||||
'extraPosition' => false,
|
||||
@ -490,13 +921,14 @@ class init extends common
|
||||
'modulePosition' => 'bottom',
|
||||
'position' => 2,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'profil' => 0,
|
||||
'targetBlank' => false,
|
||||
'title' => 'Mise en page',
|
||||
'shortTitle' => 'Mise en page',
|
||||
'block' => '4-8',
|
||||
'barLeft' => 'barre',
|
||||
'barRight' => '',
|
||||
'displayMenu' => 'none',
|
||||
'displayMenu' => 'none',
|
||||
'hideMenuSide' => false,
|
||||
'hideMenuChildren' => false,
|
||||
'extraPosition' => false,
|
||||
@ -517,13 +949,14 @@ class init extends common
|
||||
'modulePosition' => 'bottom',
|
||||
'position' => 3,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'profil' => 0,
|
||||
'targetBlank' => false,
|
||||
'title' => 'Barre latérale avec menu',
|
||||
'shortTitle' => 'Menu latéral',
|
||||
'block' => '9-3',
|
||||
'barLeft' => '',
|
||||
'barRight' => 'barrelateraleavecmenu',
|
||||
'displayMenu' => 'none',
|
||||
'displayMenu' => 'none',
|
||||
'hideMenuSide' => false,
|
||||
'hideMenuChildren' => false,
|
||||
'extraPosition' => false,
|
||||
@ -544,13 +977,14 @@ class init extends common
|
||||
'parentPageId' => '',
|
||||
'position' => 3,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'profil' => 0,
|
||||
'targetBlank' => false,
|
||||
'title' => 'Blog',
|
||||
'shortTitle' => 'Blog',
|
||||
'block' => '12',
|
||||
'barLeft' => '',
|
||||
'barRight' => '',
|
||||
'displayMenu' => 'none',
|
||||
'displayMenu' => 'none',
|
||||
'hideMenuSide' => false,
|
||||
'hideMenuChildren' => false,
|
||||
'extraPosition' => false,
|
||||
@ -571,13 +1005,14 @@ class init extends common
|
||||
'parentPageId' => '',
|
||||
'position' => 4,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'profil' => 0,
|
||||
'targetBlank' => false,
|
||||
'title' => 'Galeries d\'images',
|
||||
'shortTitle' => 'Galeries',
|
||||
'block' => '12',
|
||||
'barLeft' => '',
|
||||
'barRight' => '',
|
||||
'displayMenu' => 'none',
|
||||
'displayMenu' => 'none',
|
||||
'hideMenuSide' => false,
|
||||
'hideMenuChildren' => false,
|
||||
'extraPosition' => false,
|
||||
@ -599,6 +1034,7 @@ class init extends common
|
||||
'parentPageId' => '',
|
||||
'position' => 5,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'profil' => 0,
|
||||
'targetBlank' => true,
|
||||
'title' => 'Site de Zwii',
|
||||
'shortTitle' => 'Site de Zwii',
|
||||
@ -626,6 +1062,7 @@ class init extends common
|
||||
'parentPageId' => '',
|
||||
'position' => 6,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'profil' => 0,
|
||||
'targetBlank' => false,
|
||||
'title' => 'Contact',
|
||||
'shortTitle' => 'Contact',
|
||||
@ -653,6 +1090,7 @@ class init extends common
|
||||
'parentPageId' => '',
|
||||
'position' => 0,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'profil' => 0,
|
||||
'targetBlank' => false,
|
||||
'title' => 'Barre latérale',
|
||||
'shortTitle' => 'Barre latérale',
|
||||
@ -680,6 +1118,7 @@ class init extends common
|
||||
'parentPageId' => '',
|
||||
'position' => 0,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'profil' => 0,
|
||||
'targetBlank' => false,
|
||||
'title' => 'Barre latérale avec menu',
|
||||
'shortTitle' => 'Barre latérale avec menu',
|
||||
@ -706,7 +1145,8 @@ class init extends common
|
||||
'modulePosition' => 'bottom',
|
||||
'parentPageId' => '',
|
||||
'position' => 0,
|
||||
'group' => 0,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'profil' => 0,
|
||||
'targetBlank' => false,
|
||||
'title' => 'Mentions légales',
|
||||
'shortTitle' => 'Mentions légales',
|
||||
@ -735,6 +1175,7 @@ class init extends common
|
||||
'parentPageId' => '',
|
||||
'position' => 0,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'profil' => 0,
|
||||
'targetBlank' => false,
|
||||
'title' => 'Maintenance en cours',
|
||||
'shortTitle' => 'Maintenance en cours',
|
||||
@ -763,6 +1204,7 @@ class init extends common
|
||||
'parentPageId' => '',
|
||||
'position' => 0,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'profil' => 0,
|
||||
'targetBlank' => false,
|
||||
'title' => 'Erreur 403',
|
||||
'shortTitle' => 'Erreur 403',
|
||||
@ -790,6 +1232,7 @@ class init extends common
|
||||
'parentPageId' => '',
|
||||
'position' => 0,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'profil' => 0,
|
||||
'targetBlank' => false,
|
||||
'title' => 'Erreur 404',
|
||||
'shortTitle' => 'Erreur 404',
|
||||
@ -817,6 +1260,7 @@ class init extends common
|
||||
'parentPageId' => '',
|
||||
'position' => 7,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'profil' => 0,
|
||||
'targetBlank' => false,
|
||||
'title' => 'Recherche dans le site',
|
||||
'shortTitle' => 'Rechercher',
|
||||
@ -855,17 +1299,17 @@ class init extends common
|
||||
'picturePosition' => 'left',
|
||||
'hidePicture' => false,
|
||||
'pictureSize' => 20,
|
||||
'picturePosition' => 'left',
|
||||
'publishedOn' => 1548790902,
|
||||
'state' => true,
|
||||
'title' => 'Mon premier article',
|
||||
'userId' => '', // Géré au moment de l'installation
|
||||
'userId' => '',
|
||||
// Géré au moment de l'installation
|
||||
'editConsent' => 'all',
|
||||
'commentMaxlength' => '500',
|
||||
'commentApproved' => false,
|
||||
'commentClose' => false,
|
||||
'commentNotification' => false,
|
||||
'commentGroupNotification' => 1
|
||||
'commentApproved' => false,
|
||||
'commentClose' => false,
|
||||
'commentNotification' => false,
|
||||
'commentGroupNotification' => 1
|
||||
],
|
||||
'mon-deuxieme-article' => [
|
||||
'closeComment' => false,
|
||||
@ -875,17 +1319,17 @@ class init extends common
|
||||
'hidePicture' => false,
|
||||
'picturePosition' => 'right',
|
||||
'pictureSize' => 40,
|
||||
'picturePosition' => 'right',
|
||||
'publishedOn' => 1550432502,
|
||||
'state' => true,
|
||||
'title' => 'Mon deuxième article',
|
||||
'userId' => '', // Géré au moment de l'installation
|
||||
'userId' => '',
|
||||
// Géré au moment de l'installation
|
||||
'editConsent' => 'all',
|
||||
'commentMaxlength' => '500',
|
||||
'commentApproved' => false,
|
||||
'commentClose' => false,
|
||||
'commentNotification' => false,
|
||||
'commentGroupNotification' => 1
|
||||
'commentApproved' => false,
|
||||
'commentClose' => false,
|
||||
'commentNotification' => false,
|
||||
'commentGroupNotification' => 1
|
||||
],
|
||||
'mon-troisieme-article' => [
|
||||
'closeComment' => true,
|
||||
@ -895,17 +1339,17 @@ class init extends common
|
||||
'hidePicture' => false,
|
||||
'picturePosition' => 'left',
|
||||
'pictureSize' => 100,
|
||||
'picturePosition' => 'left',
|
||||
'publishedOn' => 1550864502,
|
||||
'state' => true,
|
||||
'title' => 'Mon troisième article',
|
||||
'userId' => '', // Géré au moment de l'installation
|
||||
'userId' => '',
|
||||
// Géré au moment de l'installation
|
||||
'editConsent' => 'all',
|
||||
'commentMaxlength' => '500',
|
||||
'commentApproved' => false,
|
||||
'commentClose' => false,
|
||||
'commentNotification' => false,
|
||||
'commentGroupNotification' => 1
|
||||
'commentApproved' => false,
|
||||
'commentClose' => false,
|
||||
'commentNotification' => false,
|
||||
'commentGroupNotification' => 1
|
||||
],
|
||||
],
|
||||
],
|
||||
@ -955,24 +1399,24 @@ class init extends common
|
||||
],
|
||||
],
|
||||
'theme' => [
|
||||
'thumbAlign' => 'center',
|
||||
'thumbWidth' => '18em',
|
||||
'thumbHeight' => '15em',
|
||||
'thumbMargin' => '.5em',
|
||||
'thumbBorder' => '.1em',
|
||||
'thumbOpacity' => '.7',
|
||||
'thumbAlign' => 'center',
|
||||
'thumbWidth' => '18em',
|
||||
'thumbHeight' => '15em',
|
||||
'thumbMargin' => '.5em',
|
||||
'thumbBorder' => '.1em',
|
||||
'thumbOpacity' => '.7',
|
||||
'thumbBorderColor' => 'rgba(221, 221, 221, 1)',
|
||||
'thumbRadius' => '.3em',
|
||||
'thumbShadows' => '1px 1px 10px',
|
||||
'thumbRadius' => '.3em',
|
||||
'thumbShadows' => '1px 1px 10px',
|
||||
'thumbShadowsColor' => 'rgba(125, 125, 125, 1)',
|
||||
'legendHeight' => '.375em',
|
||||
'legendAlign' => 'center',
|
||||
'legendTextColor' => 'rgba(255, 255, 255, 1)',
|
||||
'legendBgColor' => 'rgba(0, 0, 0, .6)',
|
||||
'style' => 'site/data/modules/gallery/galeries.css'
|
||||
'legendHeight' => '.375em',
|
||||
'legendAlign' => 'center',
|
||||
'legendTextColor' => 'rgba(255, 255, 255, 1)',
|
||||
'legendBgColor' => 'rgba(0, 0, 0, .6)',
|
||||
'style' => 'site/data/modules/gallery/galeries.css'
|
||||
],
|
||||
'config' => [
|
||||
'versionData' => '3.0'
|
||||
'versionData' => '3.0'
|
||||
],
|
||||
],
|
||||
'site-de-zwii' => [
|
||||
@ -1020,9 +1464,20 @@ class init extends common
|
||||
'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 !'
|
||||
]
|
||||
'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'
|
||||
]
|
||||
],
|
||||
];
|
||||
|
||||
public static $siteContent = [
|
||||
|
Binary file not shown.
693
core/module/install/ressource/i18n/de.json
Normal file
693
core/module/install/ressource/i18n/de.json
Normal file
@ -0,0 +1,693 @@
|
||||
{
|
||||
"'Ne pas afficher' crée une page orpheline non accessible par le biais des menus.": "\"Nicht anzeigen\" erstellt eine Orphan -Seite, die über Menüs nicht zugegriffen werden kann.",
|
||||
"'Sauvegarder et télécharger les données du module": "'Speichern und herunterladen Moduldaten",
|
||||
"1 jour": "1 tag",
|
||||
"1/4 : Préparation...": "1/4: Vorbereitung ...",
|
||||
"10 minutes": "10 Minuten",
|
||||
"10 tentatives": "10 Versuche",
|
||||
"14 jours": "14 Tage",
|
||||
"15 minutes": "15 Minuten",
|
||||
"2 jours": "2 Tage",
|
||||
"2/4 : Téléchargement...": "2/4: Download ...",
|
||||
"3 tentatives": "3 Versuche",
|
||||
"3/4 : Installation...": "3/4: Installation ...",
|
||||
"4 jours": "4 Tage",
|
||||
"4/4 : Configuration...": "4/4: Konfiguration ...",
|
||||
"5 minutes": "5 Minuten",
|
||||
"5 tentatives": "5 Versuche",
|
||||
"7 jours": "7 Tage",
|
||||
"Accueil": "Willkommen",
|
||||
"Accède au site": "Zugriff auf die Website",
|
||||
"Accède aux pages réservées": "Zugriff auf gesperrte Seiten",
|
||||
"Accède aux pages réservées et à un dossier partagé": "Zugriff auf gesperrte Seiten und einen freigegebenen Ordner",
|
||||
"Accès bloqué %d minutes": "Blockierter Zugang %der Minuten",
|
||||
"Accès désactivé": "Zugriff deaktiviert",
|
||||
"Accès interdit, erreur 403": "Zugriff verboten, Fehler 403",
|
||||
"Action interdite": "Verbotene Aktion",
|
||||
"Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.": "Obligatorische Aktivierung gemäß den französischen Gesetzen, es sei denn, Sie verwenden Ihr eigenes Einverständnissystem.",
|
||||
"Activer": "Ermöglichen",
|
||||
"Activer la journalisation": "Journalisierung aktivieren",
|
||||
"Actualiser": "Aktualisieren",
|
||||
"Adaptation": "Anpassung",
|
||||
"Administrateur": "Administrator",
|
||||
"Administration": "Verwaltung",
|
||||
"Adresse SMTP": "Adresse SMTP",
|
||||
"Adresse du proxy": "Proxy-Adresse",
|
||||
"Adresse électronique": "E-Mail-Addresse",
|
||||
"Affectation": "Affektiertheit",
|
||||
"Affiche le nom de la page parente suivi du nom de la page, le titre ne doit pas être masqué.": "Zeigt den Namen der Parente -Seite an, gefolgt vom Seitennamen, der Titel sollte nicht maskiert werden.",
|
||||
"Affiche les icônes de gestion du compte et de déconnexion des membres simples connectés": "Zeigt die Symbole zur Kontoverwaltung und Abmeldung von eingeloggten Standardmitgliedern an",
|
||||
"Afin d'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l'opération.": "Um das ordnungsgemäße Funktionieren von Zwii zu gewährleisten, schließen Sie diese Seite bitte nicht vor dem Ende der Operation.",
|
||||
"Aide": "Berater",
|
||||
"Ajouter": "Hinzufügen",
|
||||
"Ajouter un profil": "Profil hinzufügen",
|
||||
"Ajouter un utilisateur": "Fügen Sie einen Benutzer hinzu",
|
||||
"Ajouter une fonte": "Fügen Sie eine Schriftart hinzu",
|
||||
"Alignement": "Ausrichtung des Inhalts",
|
||||
"Aligner la bannière avec le contenu": "Richten Sie das Banner mit dem Inhalt aus",
|
||||
"Ancien mot de passe": "Altes Passwort",
|
||||
"Anonymat des adresses IP": "Anonymität von IP -Adressen",
|
||||
"Apache URL intelligent": "Apache URL intelligent",
|
||||
"Apache URL intelligentes": "Apache URL intelligentes",
|
||||
"Apparence": "Aussehen",
|
||||
"Appliquer": "Anwenden",
|
||||
"Approuver un commentaire": "Kommentare genehmigen",
|
||||
"Après": "Nach",
|
||||
"Après la bannière": "Nach dem Banner",
|
||||
"Après le contenu de la page": "Nach dem Inhalt der Seite",
|
||||
"Archive": "Archiv",
|
||||
"Archive ZIP": "Archiv Reißverschluss",
|
||||
"Archive copiée dans le dossier Modules du gestionnaire de fichier": "Archiv kopiert in den Dateimodulen des Dateimanagers",
|
||||
"Archive de thème invalide": "Ungültiges Themenarchiv",
|
||||
"Archive invalide": "Archive Invalide",
|
||||
"Archive invalide, l'écriture dans le dossier core est interdite": "Ungültiges Archiv, das Schreiben in der Kerndatei ist verboten",
|
||||
"Archive invalide, le descripteur est absent": "Ungültiges Archiv, der Deskriptor fehlt",
|
||||
"Archive invalide, le fichier de classe est absent": "Invalide -Archiv, die Klassendatei fehlt",
|
||||
"Archive invalide, les dossiers ne correspondent pas au descripteur": "Ungültiges Archiv entsprechen die Dateien nicht dem Deskriptor",
|
||||
"Archive non spécifiée ou introuvable": "Archiv nicht angegeben oder nicht gefunden",
|
||||
"Archive à restaurer": "Archiv zur Wiederherstellung",
|
||||
"Arrière plan": "Hintergrund",
|
||||
"Arrière plan des blocs": "Hintergrund der Blöcke",
|
||||
"Arrière plan des champs": "Hintergrund",
|
||||
"Arrondi des angles": "Rundung der Winkel",
|
||||
"Au centre": "Im Zentrum",
|
||||
"Au début": "Anfangs",
|
||||
"Au milieu au centre": "In der Mitte in der Mitte",
|
||||
"Au milieu à droite": "In der mittleren rechts",
|
||||
"Au milieu à gauche": "In der Mitte links",
|
||||
"Au-dessus du site": "Über der Seite",
|
||||
"Aucun": "Kein",
|
||||
"Aucun dossier": "Kein Verzeichnis",
|
||||
"Aucun fichier journal à télécharger": "Keine Protokolldatei zum Herunterladen",
|
||||
"Aucun journal à effacer": "Keine Zeitung zum Löschen",
|
||||
"Aucun menu": "Kein Menü",
|
||||
"Aucune": "Keine",
|
||||
"Aucune liste noire à effacer": "Keine schwarze Liste zu löschen",
|
||||
"Aucune liste noire à télécharger": "Keine schwarze Liste zum Herunterladen",
|
||||
"Auteur :": "Auteur:",
|
||||
"Authentification": "Authentifizierung",
|
||||
"Automatique": "Automatik",
|
||||
"Autoriser les robots à référencer le site": "Erlauben Sie Robotern, auf die Site zu verweisen",
|
||||
"Autorisé": "Erlaubt",
|
||||
"Avant la bannière": "Vor dem Banner",
|
||||
"Avant le contenu de la page": "Vor dem Inhalt der Seite",
|
||||
"Background": "Hintergrund",
|
||||
"Banni": "Verbot",
|
||||
"Bannière": "Banner",
|
||||
"Bannière cliquable": "Klickbares Banner",
|
||||
"Barre 1/3 - page 2/3": "Barre 1/3 - Seite 2/3",
|
||||
"Barre 1/4 - page 1/2 - barre 1/4": "Barre 1/4 - Seite 1/2 - Barre 1/4",
|
||||
"Barre 1/4 - page 3/4": "Barre 1/4 - Seite 3/4",
|
||||
"Barre 2/12 - page 7/12 - barre 3/12": "Barre 2/12 - Seite 7/12 - Barre 3/12",
|
||||
"Barre 3/12 - page 7/12 - barre 2/12": "Barre 3/12 - Seite 7/12 - Barre 2/12",
|
||||
"Barre de membre": "Mitgliederleiste",
|
||||
"Barre latérale": "Seitliche Bar",
|
||||
"Barre latérale droite :": "Rechte Sidebar:",
|
||||
"Barre latérale gauche :": "Linke Seitenstange:",
|
||||
"Barres latérales": "Seitenstangen",
|
||||
"Bienvenue %s %s": "Willkommen %s %",
|
||||
"Blocage après échecs": "Blockieren nach Fehlern",
|
||||
"Blog": "Blog",
|
||||
"Bords arrondis": "Abgerundete Kanten",
|
||||
"Bordure des blocs": "Blockgrenze",
|
||||
"Bordure des champs": "Feldgrenze",
|
||||
"Bouton Aide": "Hilfeknopf",
|
||||
"Bouton Standard": "Bouton Standard",
|
||||
"Bouton de validation": "Validierungstaste",
|
||||
"Bouton effacement": "Löschen",
|
||||
"Bouton retour": "Rückgabeknopf",
|
||||
"Bouton standard": "Bouton Standard",
|
||||
"Bouton validation": "Bouton -Validierung",
|
||||
"Boutons": "Boutons",
|
||||
"Caché": "Versteckt",
|
||||
"Cachée": "Versteckt",
|
||||
"Captcha complexe": "Captcha Complexe",
|
||||
"Captcha à la connexion": "Captcha in Verbindung",
|
||||
"Captcha, identifiant ou mot de passe incorrects": "Captcha, falsche Kennung oder Passwort",
|
||||
"Capture d'écran Open Graph": "Graph Screenshot öffnen",
|
||||
"Capture d'écran générée avec succès": "Erfolgreicher generierter Screenshot",
|
||||
"Casse": "Gebrochen",
|
||||
"Catalogue": "Katalog",
|
||||
"Catégorie": "Kategorie",
|
||||
"Ce membre pourra téléverser ou télécharger des fichiers dans le dossier 'partage' et ses sous-dossiers": "Dieses Mitglied kann Dateien im Ordner \"Freigeben\" und in seinen Unterordnern festlegen oder herunterladen",
|
||||
"Cette page ne doit pas apparaître dans l'arborescence du menu. Créez une page orpheline.": "Diese Seite sollte nicht im Menübaum angezeigt werden. Erstellen Sie eine Waisenseite.",
|
||||
"Cette redirection ne concerne que les pages d'administration du site.": "Diese Umleitung betrifft nur die Verwaltungsseiten der Website.",
|
||||
"Chaîne Youtube": "Youtube Kanal",
|
||||
"Chiffres": "Zahlen",
|
||||
"Cible": "Ziel",
|
||||
"Cliquez sur une zone afin d'accéder à ses options de personnalisation.": "Klicken Sie auf einen Bereich, um auf die Anpassungsoptionen zuzugreifen.",
|
||||
"Commentaire": "Kommentar",
|
||||
"Complète": "Vollständig",
|
||||
"Compte administrateur": "Administrator",
|
||||
"Compte de l'utilisateur": "Benutzerkonto",
|
||||
"Compte verrouillé": "Gesperrt",
|
||||
"Configuration": "Aufbau",
|
||||
"Configuration du module": "Konfigurations -DU -Modul",
|
||||
"Configurer": "Konfigurieren",
|
||||
"Configurer mon compte": "Konfigurieren Sie mein Konto",
|
||||
"Confirmation": "Bestätigung",
|
||||
"Confirmer la suppression de cet utilisateur": "Bestätigen Sie die Löschung dieses Benutzers",
|
||||
"Confirmer la dissociation du module de cette page": "Bestätigen Sie die Dissoziation des Moduls dieser Seite",
|
||||
"Confirmer la désinstallation du module": "Bestätigen Sie das Deinstallieren des Moduls",
|
||||
"Confirmer la suppression de cet utilisateur": "Bestätigen Sie die Löschung dieses Benutzers",
|
||||
"Confirmer la suppression de cette langue": "Bestätigen Sie das Löschen dieser Sprache",
|
||||
"Confirmer la suppression de la page": "Bestätigen Sie die Löschung der Seite",
|
||||
"Confirmer la suppression des données du module": "Bestätigen Sie die Löschung der Moduldaten",
|
||||
"Confirmez-vous la suppression de cette page ?": "Bestätigen Sie die Löschung dieser Seite?",
|
||||
"Connexion": "Verbindung",
|
||||
"Consulter l'aide en ligne": "Online -Hilfe konsultieren",
|
||||
"Contents": "Inhalt",
|
||||
"Contenu": "Inhalt",
|
||||
"Contenu HTML": "HTML enthalten",
|
||||
"Contenu avancé": "Fortgeschrittene Inhalt",
|
||||
"Contenu du menu vertical": "Da fällige Vertikale enthalten",
|
||||
"Contrôle total": "Vollständige Kontrolle",
|
||||
"Cookies": "Kekse",
|
||||
"Cookies Zwii": "Kekse Zwii",
|
||||
"Copie de contenus localisés": "Lokalisierte Inhaltskopie",
|
||||
"Copie de sites inter-langues": "Kopie von Intersprage-Websites",
|
||||
"Copie des traductions rédigées": "Kopie der schriftlichen Übersetzungen",
|
||||
"Copie terminée avec des erreurs": "Kopieren Sie mit Fehlern fertig",
|
||||
"Copie terminée avec succès": "Erfolgreich abgeschlossen sein",
|
||||
"Copier": "Kopierer",
|
||||
"Copier sauvegardes auto": "Kopieren Sie automatische Sicherungen",
|
||||
"Couleur de fond automatique": "Automatische Hintergrundfarbe",
|
||||
"Couleur icône haut de page": "Farbe des Icons oben auf der Seite",
|
||||
"Couleur texte page active": "Textfarbe der aktiven Seite",
|
||||
"Couleur unie ou papier-peint": "Farbe oder Tapete vereinigte Tapete",
|
||||
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence.": "Sichtbare Farbe in Abwesenheit eines Bildes. <br /> Der horizontale Cursor reguliert das Transparenzniveau.",
|
||||
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.": "Sichtbare Farbe in Abwesenheit eines Bildes. <br /> Der horizontale Cursor reguliert das Transparenzniveau. Die Farbe des Textes ist automatisch.",
|
||||
"Couleurs": "Farben",
|
||||
"Dans le site": "In der Seite",
|
||||
"Dans quelle langue utiliserez-vous Zwii ?": "In welcher Sprache werden Sie Zwii verwenden?",
|
||||
"Date": "Datum",
|
||||
"Description": "Beschreibung",
|
||||
"Disponible si le consentement des cookies est activé.": "Verfügbar, wenn die Cookie-Einwilligung aktiviert ist.",
|
||||
"Disposition": "Anordnung",
|
||||
"Données %s copiées vers %s": "Daten %s auf %s kopiert",
|
||||
"Données des modules": "Module",
|
||||
"Données importées": "Importierte Daten",
|
||||
"Dossier": "Verzeichnis",
|
||||
"Droits sur les dossiers": "Rechte für Verzeichnisse",
|
||||
"Droits sur les fichiers": "Dateirechte",
|
||||
"Dupliquer": "Duplizieren",
|
||||
"Dupliquer la page": "Duplizieren Sie die Seite",
|
||||
"Déconnecte les sessions ouvertes précédemment sur d'autres navigateurs ou terminaux. Activation recommandée.": "Trennen Sie die offenen Sitzungen zuvor von anderen Browsern oder Terminals. Empfohlene Aktivierung.",
|
||||
"Déconnecter": "Trennen",
|
||||
"Déconnexion !": "Trennen!",
|
||||
"Déconnexion automatique": "Automatische Trennung",
|
||||
"Définir par défaut": "Als Standard festlegen",
|
||||
"Dévoiler le mot de passe": "Das Passwort angeben",
|
||||
"Effacer": "Löschen",
|
||||
"Effacer la page": "Löschen Sie die Seite",
|
||||
"Effacer tous les commentaires": "Alle Kommentare löschen",
|
||||
"Effacer toutes les statistiques": "Delete all statistics",
|
||||
"Effacer un commentaire": "Kommentar löschen",
|
||||
"Effacer une catégorie": "Kategorie löschen",
|
||||
"Emplacement :": "Einstellung:",
|
||||
"Emplacement dans le menu": "Lage im Menü",
|
||||
"En bas au centre": "Runter in der Mitte",
|
||||
"En bas à droite": "Unten rechts",
|
||||
"En bas à gauche": "Unten nach links",
|
||||
"En cas de changement de module, les données du module précédent seront supprimées.": "Im Falle einer Moduländerung werden Daten aus dem vorherigen Modul gelöscht.",
|
||||
"En dessous du site": "Unterhalb der Website",
|
||||
"En haut au centre": "Top in der Mitte",
|
||||
"En haut à droite": "Oben rechts",
|
||||
"En haut à gauche": "An der oberen Ecke links",
|
||||
"En position libre ajoutez le module en plaçant [MODULE] à l'endroit voulu dans votre page.": "Fügen Sie in der freien Position das Modul hinzu, indem Sie [Modul] dem gewünschten Ort in Ihrer Seite platzieren.",
|
||||
"En-dehors du site": "Außerhalb der Website",
|
||||
"Enregistrer": "Registrieren",
|
||||
"Envoyer un message de confirmation": "Senden Sie eine Bestätigungsnachricht",
|
||||
"Erreur : sauvegarde non générée !": "Fehler: Nicht erzeugte Sicherung!",
|
||||
"Erreur d'URL": "URL -Fehler",
|
||||
"Erreur d'extraction, vérifiez les permissions": "Extraktionsfehler, Berechtigungen überprüfen",
|
||||
"Erreur de copie": "Fehler kopieren",
|
||||
"Erreur de copie, vérifiez les permissions": "Fehler kopieren, Berechtigungen überprüfen",
|
||||
"Erreur de lecture, vérifiez les permissions": "Lesenfehler, Überprüfen Sie die Berechtigungen",
|
||||
"Erreur inconnue": "unbekannter Fehler",
|
||||
"Erreur inconnue, le module n'est pas installé": "Unbekannter Fehler, das Modul ist nicht installiert",
|
||||
"Export CSV": "CSV exportieren",
|
||||
"Expéditeur": "Absender",
|
||||
"Extension": "Verlängerung",
|
||||
"Extraire": "Extrahieren",
|
||||
"Facebook": "Facebook",
|
||||
"Famille": "Familie",
|
||||
"Favicon thème sombre": "Dunkeles Thema Favicon",
|
||||
"Feuille de style spécifique à la page.": "Stilblatt spezifisch für die Seite.",
|
||||
"Fichiers": "Dateien",
|
||||
"Fichiers effacés": "Gelöschte Dateien",
|
||||
"Fil d'Ariane dans le titre": "Ariane -Thread im Titel",
|
||||
"Fond du sous-menu": "Untermenü",
|
||||
"FontId": "Schriftart",
|
||||
"Fonte": "Quelle",
|
||||
"Fonte actualisée": "Aktualisieren",
|
||||
"Fonte créée": "Fonte erstellt",
|
||||
"Fonte en ligne": "Online -Schmelzen",
|
||||
"Fonte installée": "Installiertes Gusseisen",
|
||||
"Fonte non créée, ressource absente !": "Fonte nicht erstellt, abwesende Ressource!",
|
||||
"Fonte supprimée": "Löschen Schmelzen",
|
||||
"Fontes": "Quellen",
|
||||
"Format incorrect": "Format falsch",
|
||||
"Formulaire": "Formular",
|
||||
"Fréquence de recherche": "Forschungshäufigkeit",
|
||||
"Fuseau horaire": "Zeitzone",
|
||||
"Gabarits de page - Barre latérale": "Seitenvorlage - Seitenleiste",
|
||||
"Gestion": "Management",
|
||||
"Gestion des modules": "Modulverwaltung",
|
||||
"Gestion des thèmes": "Themenmanagement",
|
||||
"Gestionnaire de fichiers": "Dateimanager",
|
||||
"Github": "Github",
|
||||
"Grande": "Groß",
|
||||
"Grande (220%)": "Grande (220%)",
|
||||
"Grande (300px)": "Grande (300px)",
|
||||
"Gras": "Fett",
|
||||
"Groupe": "Gruppe",
|
||||
"Groupe associé": "Zugehörige Gruppe",
|
||||
"Groupe requis pour accéder à la page :": "Gruppe erforderlich, um auf die Seite zuzugreifen:",
|
||||
"Groupes": "Gruppen",
|
||||
"Générer sitemap.xml et robots.txt": "Generieren Sie Sitemap.xml und Robots.txt",
|
||||
"Générer une capture Open Graph": "Erstellen Sie eine offene Graph -Erfassung",
|
||||
"Gérer les catégories": "Kategorien verwalten",
|
||||
"Gérer les commentaires": "Kommentare verwalten",
|
||||
"Gérer les données": "Daten verwalten",
|
||||
"Hauteur": "Höhe",
|
||||
"Hauteur de l'image": "Höhe des Bildes",
|
||||
"Hauteur de l'image sélectionnée": "Höhe des ausgewählten Bildes",
|
||||
"Hauteur maximale": "Maximale Höhe",
|
||||
"ID de la chaîne : https://www.youtube.com/channel/[ID].": "Kanal -ID: https://www.youtube.com/channel/).",
|
||||
"Icône": "Symbol",
|
||||
"Icône avec bulle de texte": "Symbol mit Textblase",
|
||||
"Icône haut de page, couleur arrière-plan": "Icon oben auf der Seite, Hintergrundfarbe",
|
||||
"Identifiant": "Kennung",
|
||||
"Identifiant (sans espace ni majuscule)": "Kennung (ohne Platz oder Großbuchstaben)",
|
||||
"Identité": "Identifizieren",
|
||||
"Identité de la fonte": "Identität des Gusseisen",
|
||||
"Identité du site": "Standortidentität",
|
||||
"Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.": "Er erscheint in der Titelleiste und teilt in sozialen Netzwerken.",
|
||||
"Image": "Bild",
|
||||
"Image étirée (100% 100%)": "Gestrecktes Bild (100% 100%)",
|
||||
"Important": "Wichtig",
|
||||
"Importante": "Wichtig",
|
||||
"Importation d'utilisateurs": "Import von Benutzern",
|
||||
"Importation de fichier plat CSV": "CSV Flat File Import",
|
||||
"Importation effectuée": "Einfuhr",
|
||||
"Importer": "Importeur",
|
||||
"Importer dans": "Import in",
|
||||
"Importer des utilisateurs en masse": "Massenbenutzer importieren",
|
||||
"Impossible d'ouvrir l'archive": "Das Archiv kann nicht öffnen",
|
||||
"Impossible de modifier votre propre groupe.": "Ihre eigene Gruppe kann nicht geändert werden.",
|
||||
"Impossible de soumettre le formulaire, car il contient des erreurs": "Es ist unmöglich, das Formular einzureichen, da es Fehler enthält",
|
||||
"Impossible de supprimer une page contenant des pages enfants": "Eine Seite mit Kinderseiten kann nicht gelöscht werden",
|
||||
"Impossible de supprimer votre propre compte": "Ihr eigenes Konto kann nicht gelöscht werden",
|
||||
"Inclure le contenu du gestionnaire de fichiers": "Fügen Sie den Inhalt des Dateimanagers hinzu",
|
||||
"Incorrect": "Falsch",
|
||||
"Informations": "Informationen",
|
||||
"Instagram": "Instagram",
|
||||
"Installation terminée": "Installation abgeschlossen",
|
||||
"Installer": "Installateur",
|
||||
"Installer depuis le catalogue en ligne": "Installieren Sie aus dem Online -Katalog",
|
||||
"Installer depuis une archive": "Aus einem Archiv installieren",
|
||||
"Installer les données d'un module": "Installieren Sie eine Moduldaten",
|
||||
"Installer ou mettre à jour un module téléchargé": "Installieren oder aktualisieren Sie ein heruntergeladenes Modul",
|
||||
"Installer un module": "Installieren Sie ein Modul",
|
||||
"Installer un thème archivé (site ou administration)": "Installieren Sie ein archiviertes Thema (Standort oder Verwaltung)",
|
||||
"Instructions JS ou jquery spécifiques à la page.": "JS- oder JQuery -Anweisungen, die für die Seite spezifisch sind.",
|
||||
"Interface": "Schnittstelle",
|
||||
"Jeton invalide": "Ungültiges Token",
|
||||
"Journal réinitialisé avec succès": "Erfolgreiches Reset -Journal",
|
||||
"Journalisation": "Journalisierung",
|
||||
"L'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.": "Das Archiv wurde im Dateimanager hinterlegt. Archive unter Version 9 werden nicht akzeptiert.",
|
||||
"L'identifiant est défini lors de la création du compte, il ne peut pas être modifié.": "Die Kennung wird beim Erstellen des Kontos definiert, es kann nicht geändert werden.",
|
||||
"La carte du site a été mise à jour": "Die Site -Karte wurde aktualisiert",
|
||||
"La copie de sauvegarde du fichier htaccess n'a pas été restaurée !": "Sicherungskopie der htaccess-Datei wurde nicht wiederhergestellt!",
|
||||
"La description d'une page participe à son référencement, chaque page doit disposer d'une description différente.": "Die Beschreibung einer Seite nimmt an ihrer Referenzierung teil. Jede Seite muss eine andere Beschreibung haben.",
|
||||
"La page %s est ouverte par l'utilisateur %s": "Der %s wird vom Benutzer %s geöffnet",
|
||||
"La page demandée n'existe pas ou est introuvable (erreur 404)": "Die angeforderte Seite existiert nicht oder wird nicht gefunden (Fehler 404)",
|
||||
"La page est affichée dans un menu horizontal mais pas dans le menu vertical d'une barre latérale.": "Die Seite wird in einem horizontalen Menü, jedoch nicht im vertikalen Menü einer Seitenleiste angezeigt.",
|
||||
"La première page que vos visiteurs verront.": "Die erste Seite, die Ihre Besucher sehen werden.",
|
||||
"La règlementation française impose un anonymat de niveau 2": "Französische Vorschriften erfordern Anonymität der Stufe 2",
|
||||
"La réécriture d'URL n'a pas été restaurée !": "URL-Umschreibung wurde nicht wiederhergestellt!",
|
||||
"La sauvegarde des fichiers peut prendre du temps. Continuer ?": "Die Sicherung der Dateien kann einige Zeit in Anspruch nehmen. Weitermachen ?",
|
||||
"La suppression a échoué": "Die Löschung schlug fehl",
|
||||
"La version installée est plus récente": "Die installierte Version ist neuer",
|
||||
"La vérification est quotidienne. Option désactivée si la configuration du serveur ne le permet pas.": "Die Überprüfung ist täglich. Option deaktiviert, wenn die Serverkonfiguration dies nicht zulässt.",
|
||||
"Langue de l'administration": "Verwaltungssprache",
|
||||
"Langue du site par défaut": "Standardsprache der Website",
|
||||
"Langue par défaut": "Standard",
|
||||
"Langues": "SPRACHEN",
|
||||
"Langues disponibles": "Verfügbare Sprachen",
|
||||
"Langues installées": "Sprachen installiert",
|
||||
"Largeur": "Breite",
|
||||
"Largeur de l'image": "Breite des Bildes",
|
||||
"Largeur du site": "Breite der Website",
|
||||
"Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.": "Der horizontale Cursor reguliert das Transparenzniveau und platziert ihn links für unsichtbare Highlights.",
|
||||
"Le curseur horizontal règle le niveau de transparence.": "Der horizontale Cursor reguliert das Transparenzniveau.",
|
||||
"Le fuseau horaire est utile au bon référencement": "Die Zeitzone ist nützlich für gute SEO",
|
||||
"Le menu accessoire est aligné à droite de la barre de menu, c'est un emplacement réservé aux drapeaux et au bouton de connexion.": "Das Zubehörmenü ist rechts neben der Menüleiste ausgerichtet. Es ist ein Standort für Flaggen und die Verbindungsschaltfläche.",
|
||||
"Le menu horizontal intégral": "Das vollständige horizontale Menü",
|
||||
"Le module %s a été %s": "Das Modul %war %s",
|
||||
"Le module %s de la page %s a été supprimé": "Das %s -Modul des %s wurde gelöscht",
|
||||
"Le module %s est désinstallé, il reste peut-être des données dans %s": "Das Modul %S ist deinstalliert, es kann Daten in %s geben",
|
||||
"Le sous-menu de la page parente": "Das Untermenü der Elternseite",
|
||||
"Le survol d'une icône de l'écran de connexion affiche temporairement le mot de passe.": "Die Überflucht eines Symbols auf dem Verbindungsbildschirm zeigt das Kennwort vorübergehend an.",
|
||||
"Le titre court est affiché dans les menus. Il peut être identique au titre de la page.": "Der kurze Titel wird in den Menüs angezeigt. Es kann mit dem Titel der Seite identisch sein.",
|
||||
"Les langues sélectionnées sont identiques": "Die ausgewählten Sprachen sind identisch",
|
||||
"Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.": "Rechtliche Mitteilungen sind in Frankreich obligatorisch. Eine Option der Fußzeile fügt dieser Seite einen diskreten Link hinzu.",
|
||||
"Les modifications que vous avez apportées ne seront peut-être pas enregistrées.": "Die Änderungen, die Sie vorgenommen haben, werden möglicherweise nicht aufgezeichnet.",
|
||||
"Les tailles des polices de la bannière, de menu et de pied de page sont proportionnelles à cette taille.": "Die Schriftgrößen des Banners, Menüs und Fußzeile sind proportional zu dieser Größe.",
|
||||
"Lettres": "Lettres",
|
||||
"Libre": "Libre",
|
||||
"Licence :": "Lizenz:",
|
||||
"Lien de connexion": "Anmeldelink",
|
||||
"Lien page des mentions légales.": "Link der rechtlichen Hinweise.",
|
||||
"Liens": "Grundpfandrechte",
|
||||
"Limitation des tentatives": "Einschränkung der Versuche",
|
||||
"Limitée au site": "Auf die Website beschränkt",
|
||||
"Linkedin": "LinkedIn",
|
||||
"Liste noire": "Schwarze Liste",
|
||||
"Liste noire réinitialisée avec succès": "Erfolgreiche schwarze Liste erfolgreich zurücksetzen",
|
||||
"Lors d'une mise à jour automatique, conserve le fichier htaccess de la racine du site.": "Während eines automatischen Updates hält die HTaccess -Datei des Site -Stammes.",
|
||||
"Léger": "Leicht",
|
||||
"Légère": "Leicht",
|
||||
"Maigre": "Mager",
|
||||
"Maintenance": "Wartung",
|
||||
"Majuscule à chaque mot": "Capper mit jedem Wort",
|
||||
"Majuscules": "Großbuchstaben",
|
||||
"Marges verticales": "Vertikale Ränder",
|
||||
"Masquer la bannière en écran réduit": "Verstecken Sie das Banner im reduzierten Bildschirm",
|
||||
"Masquer la page et les pages enfants dans le menu d'une barre latérale": "Verstecken Sie die Seiten- und Kinderseiten im Menü einer Seitenleiste",
|
||||
"Masquer les pages enfants dans le menu horizontal": "Verstecken Sie Kinderseiten im horizontalen Menü",
|
||||
"Membre": "Mitglied",
|
||||
"Membre avec droit de partage": "Mitglied mit Freigaberecht",
|
||||
"Membre simple": "Einfaches Mitglied",
|
||||
"Mentions légales": "Impressum",
|
||||
"Menu": "Speisekarte",
|
||||
"Menu accessoire": "Zubehörmenü",
|
||||
"Menu burger dans écran réduit": "Burger-Menü bei reduziertem Bildschirm",
|
||||
"Menu standard": "Menüstandard",
|
||||
"Message d'acceptation des Cookies": "Cookie -Akzeptanznachricht",
|
||||
"Message de consentement aux cookies": "Cookie -Zustimmungsnachricht",
|
||||
"Mettre à jour": "Aktualisieren",
|
||||
"Mettre à jour le module orphelin": "Aktualisieren Sie das Orphan -Modul",
|
||||
"Minuscules": "Winzig",
|
||||
"Mise en forme des titres": "Formatierende Titel",
|
||||
"Mise en forme du texte": "Textformatierung",
|
||||
"Mise en forme du titre": "Titelformatierung",
|
||||
"Mise en page": "Layout",
|
||||
"Mise à jour": "Aktualisieren",
|
||||
"Mise à jour automatisée": "Automatisiertes Update",
|
||||
"Mise à jour terminée avec succès.": "Erfolgreiches Update abgeschlossen.",
|
||||
"Modifications enregistrées": "Modifikationen aufgezeichnet",
|
||||
"Module": "Modul",
|
||||
"Module de la page": "Seitenmodul",
|
||||
"Modules": "Module",
|
||||
"Modules configurés": "Konfigurierte Module",
|
||||
"Modules installés": "Module installiert",
|
||||
"Modules orphelins": "Verwaiste Module",
|
||||
"Mot de passe": "Passwort",
|
||||
"Mot de passe oublié": "Haben Sie Ihr Passwort vergessen",
|
||||
"Mot de passe perdu": "Haben Sie Ihr Passwort vergessen",
|
||||
"Motorisé par": "Angetrieben von",
|
||||
"Moyen": "Mittel",
|
||||
"Moyenne": "Durchschnittlich",
|
||||
"Moyenne (200%)": "Durchschnitt (200%)",
|
||||
"Moyenne (200px)": "Durchschnitt (200px)",
|
||||
"Méta-description": "Meta-Schreiben",
|
||||
"Méta-titre": "Stoffitis",
|
||||
"Ne pas afficher": "Werden nicht angezeigt",
|
||||
"Ne pas charger l'exemple de site (utilisateurs avancés)": "Laden Sie das Beispiel einer Website nicht auf (erweiterte Benutzer)",
|
||||
"Ne pas répéter": "Wiederhole nicht",
|
||||
"Ne pas saisir les balises": "Geben Sie die Tags nicht ein",
|
||||
"News": "Nachrichten",
|
||||
"Niveau 1 (192.168.12.x)": "Stufe 1 (192.168.12.x)",
|
||||
"Niveau 2 (192.168.x.x)": "Stufe 2 (192.168.x.x)",
|
||||
"Niveau 3 (192.x.x.x)": "Stufe 3 (192.x.x.x)",
|
||||
"Nom": "Nom",
|
||||
"Nom Prénom": "Nachname Vorname",
|
||||
"Nom du profil": "Profilname",
|
||||
"Nom utilisateur": "Nutzername",
|
||||
"Non": "Nicht",
|
||||
"Non tronquée": "Unbemannt",
|
||||
"Notre site est actuellement en maintenance. Nous sommes désolés pour la gêne occasionnée et faisons notre possible pour être rapidement de retour.": "Unsere Website befindet sich derzeit in der Wartung. Wir entschuldigen uns für die verursachten Unannehmlichkeiten und geben unser Bestes, um schnell zurück zu sein.",
|
||||
"Nouveau contenu localisé": "Neue lokalisierte Inhalte",
|
||||
"Nouveau mot de passe": "Neues Kennwort",
|
||||
"Nouveau mot de passe enregistré": "Neues aufgezeichnetes Passwort",
|
||||
"Nouvel utilisateur": "Neuer Benutzer",
|
||||
"Nouvelle page créée": "Neue Seite erstellt",
|
||||
"Nouvelle page ou barre latérale": "Neue Seite oder Seitenleiste",
|
||||
"Obligatoire": "Obligatorisch",
|
||||
"Ombre": "Ombre",
|
||||
"Option active en mode déconnecté uniquement, les pages enfants sont visibles et accessibles.": "Aktive Option im getrennten Modus, Kinderseiten sind sichtbar und zugänglich.",
|
||||
"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.": "Empfohlene Option zur Sicherung der Verbindung. Bewerben Sie sich für alle Captchas der Website. Einfache Captcha ist auf die Zugabe von Zahlen von 0 bis 10 beschränkt. Der komplexe Capha verwendet vier Zahlen von 0 bis 20. Empfohlene Aktivierung.",
|
||||
"Options": "Optionen",
|
||||
"Options avancées": "Erweiterte Optionen",
|
||||
"Origine": "Herkunft",
|
||||
"Oui": "Oui",
|
||||
"Page": "Buchseite",
|
||||
"Page 2/3 - barre 1/3": "Seite 2/3 - Barre 1/3",
|
||||
"Page 3/4 - barre 1/4": "Seite 3/4 - Barre 1/4",
|
||||
"Page associée": "Zugeordnete Seite",
|
||||
"Page de recherche": "Suchseite",
|
||||
"Page dupliquée": "Doppelte Seite",
|
||||
"Page et module dupliqués": "Duplizierte Seite und Modul",
|
||||
"Page inexistante, erreur 404": "Seite nicht vorhanden, Fehler 404",
|
||||
"Page non cliquable": "Nicht klickbare Seite",
|
||||
"Page parent": "Seite Elternteil",
|
||||
"Page standard": "Page Standard",
|
||||
"Page supprimée": "Gelöschte Seite",
|
||||
"Pages dans le menu": "Seiten im Menü",
|
||||
"Pages du site": "Standortseiten",
|
||||
"Pages et les modules de": "Seiten und Module von",
|
||||
"Pages orphelines": "Waisenseiten",
|
||||
"Papier peint": "Hintergrund",
|
||||
"Par défaut le menu est affiché APRES le contenu de la page. Pour le positionner à un emplacement précis, insérez [MENU] dans le contenu de la page.": "Standardmäßig wird das Menü nach dem Inhalt der Seite angezeigt. Um es an einem bestimmten Ort zu positionieren, fügen Sie [Menü] in den Inhalt der Seite ein.",
|
||||
"Paramètres": "Einstellungen",
|
||||
"Paramètres de la localisation": "Standortparameter",
|
||||
"Paramètres de la sauvegarde": "Backup-Einstellungen",
|
||||
"Paramètres du profil": "Profil-Einstellungen",
|
||||
"Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d'envoi de mail.": "Einstellungen, die verwendet werden müssen, wenn Ihr Host die E -Mail -Sendungsfunktionen nicht anbietet.",
|
||||
"Pas de marge au-dessus et en dessous du site": "Kein Rand über und unter der Website",
|
||||
"Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "Denken Sie daran, den Cache Ihres Browsers zu löschen, wenn sich das Favicon nicht ändert.",
|
||||
"Permission": "Erlaubnis",
|
||||
"Permission et référencement": "Erlaubnis und SEO",
|
||||
"Permissions": "Berechtigungen",
|
||||
"Permissions sur les dossiers": "Berechtigungen für Verzeichnisse",
|
||||
"Permissions sur les fichiers": "Berechtigungen für Dateien",
|
||||
"Permissions sur les pages": "Berechtigungen für Seiten",
|
||||
"Petite": "Klein",
|
||||
"Petite (150px)": "Klein (150px)",
|
||||
"Petite (180%)": "Petite (180%)",
|
||||
"Pied de page": "Fuß",
|
||||
"Pinterest": "Pinterest",
|
||||
"Plan du site": "Seitenverzeichnis",
|
||||
"Police des titres": "Titel der Polizei",
|
||||
"Police du texte": "Textpolizei",
|
||||
"Port SMTP": "Port SMTP",
|
||||
"Port du proxy": "Hafen des Stellvertreters",
|
||||
"Position": "Position",
|
||||
"Position du module": "Position du module",
|
||||
"Pour définir la page comme barre latérale, choisissez l'option dans la liste.": "Um die Seite als Seitenleiste zu definieren, wählen Sie die Option aus der Liste.",
|
||||
"Presse Papier": "Zwischenablage",
|
||||
"Presse papier": "Zwischenablage",
|
||||
"Profils des groupes": "Gruppenprofile",
|
||||
"Proportionnelle à la taille définie dans le site.": "Proportional zu dem in der Stelle definierten.",
|
||||
"Prénom": "Vorname",
|
||||
"Prénom Nom": "Vorname Name",
|
||||
"Préparation de la mise à jour": "Vorbereitung des Updates",
|
||||
"Préserver le fichier htaccess racine": "Bewahren Sie die HTaccess Racine -Datei auf",
|
||||
"Préserver les comptes des utilisateurs déjà installés": "Bewahren Sie die bereits installierten Benutzerkonten auf",
|
||||
"Prévenir l'utilisateur par mail": "Verhindern Sie den Benutzer per E -Mail",
|
||||
"Prévisualiser": "Vorschau",
|
||||
"Pseudo": "Pseudo",
|
||||
"Rang 9 > rang 1. Le profil de rang 1 n'est pas modifiable.": "Rang 9 > Rang 1. Das Profil von Rang 1 ist nicht änderbar.",
|
||||
"Ratio": "Verhältnis",
|
||||
"Ratio :": "Verhältnis :",
|
||||
"Recherche": "Suche",
|
||||
"Recherche dans le site": "Suche auf der Website",
|
||||
"Rechercher": "Forschen",
|
||||
"Rechercher une mise à jour en ligne": "Suchen Sie nach einem Online -Update",
|
||||
"Redirection": "Weiterleitung",
|
||||
"Redirection vers la connexion": "Umleitung zur Verbindung",
|
||||
"Renommer": "Umbenennen",
|
||||
"Renseignez les champs ci-dessous pour finaliser l'installation.": "Finden Sie die folgenden Felder heraus, um die Installation abzuschließen.",
|
||||
"Responsive (contain)": "Reaktionsschnell (enthalten)",
|
||||
"Responsive (cover)": "Reaktionsschnell (Cover)",
|
||||
"Restauration des bases de données absentes": "Wiederherstellung abwesender Datenbanken",
|
||||
"Restauration effectuée avec succès": "Catering erfolgreich durchgeführt",
|
||||
"Restaurer": "Wiederherstellen",
|
||||
"Restaurer les données du site": "Site -Daten wiederherstellen",
|
||||
"Rester connecté sur ce navigateur": "Bleiben Sie in diesem Browser in Verbindung",
|
||||
"Retour": "Rückmeldung",
|
||||
"Rien à importer, erreur de format ou fichier incorrect": "Nichts zu importieren, formatieren Sie Fehler oder eine falsche Datei",
|
||||
"Rédacteur": "Redakteur",
|
||||
"Référencement": "SEO",
|
||||
"Réinitialisation du mot de passe": "Passwort zurücksetzen",
|
||||
"Réinitialiser avec le thème par défaut": "Mit dem Standardthema zurücksetzen",
|
||||
"Réinitialiser la feuille de style": "Setzen Sie das Stilblatt zurück",
|
||||
"Réinitialiser la liste": "Setzen Sie die Liste zurück",
|
||||
"Réinitialiser le journal": "Setzen Sie die Zeitung zurück",
|
||||
"Réinstaller": "Neu installieren",
|
||||
"Répétition": "Wiederholung",
|
||||
"Réseau": "Netzwerk",
|
||||
"Réseaux sociaux": "Soziale Netzwerke",
|
||||
"S'ouvre dans un nouvel onglet": "Öffnet sich in einer neuen Registerkarte",
|
||||
"SMTP": "SMTP",
|
||||
"SMTP personnalisé": "Personalisierte SMTP",
|
||||
"Saisir la clé, puis valider le formulaire avant de cliquer sur le bouton de génération": "Geben Sie die Taste ein und validieren Sie das Formular, bevor Sie auf die Schaltfläche Generation klicken",
|
||||
"Saisissez le Titre de gestion des cookies.": "Geben Sie den Cookie -Management -Titel ein.",
|
||||
"Saisissez le message pour les cookies déposés par ZwiiCMS, nécessaires au fonctionnement et qui ne nécessitent pas de consentement.": "Geben Sie die von Zwiicms abgelagerte Meldung für den Betrieb erforderlich und müssen keine Zustimmung erfordern.",
|
||||
"Saisissez le texte du lien vers les mentions légales,la page doit être définie dans la configuration du site.": "Geben Sie den Link -Text in die rechtlichen Hinweise ein. Die Seite muss in der Site -Konfiguration definiert werden.",
|
||||
"Saisissez votre ID : https://pinterest.com/[ID].": "Geben Sie Ihre ID ein: https://pinterest.com/).",
|
||||
"Saisissez votre ID : https://twitter.com/[ID].": "Geben Sie Ihre ID ein: https://twitter.com/).",
|
||||
"Saisissez votre ID : https://www.facebook.com/[ID].": "Geben Sie Ihre ID ein: https://www.facebook.com/).",
|
||||
"Saisissez votre ID : https://www.instagram.com/[ID].": "Geben Sie Ihre ID ein: https://www.instagram.com/).",
|
||||
"Saisissez votre ID Github : https://github.com/[ID].": "Geben Sie Ihre GitHub -ID ein: https://github.com/).",
|
||||
"Saisissez votre ID Linkedin : https://fr.linkedin.com/in/[ID].": "Geben Sie Ihre LinkedIn -ID ein: https://fr.linkedin.com/in/ style].",
|
||||
"Saisissez votre ID Utilisateur : https://www.youtube.com/user/[ID].": "Geben Sie Ihre Benutzer -ID ein: https://www.youtube.com/user/).",
|
||||
"Sauvegarde": "Backup",
|
||||
"Sauvegarde automatique quotidienne du site": "Tägliche automatische Sicherung der Website",
|
||||
"Sauvegarde du thème dans le": "Sicherung des Themas in der",
|
||||
"Sauvegarde générée avec succès": "Erfolgreich erzeugte Backup.",
|
||||
"Sauvegarder": "Schützen",
|
||||
"Sauvegarder et télécharger le module": "Speichern und laden Sie das Modul herunter und laden Sie sie herunter",
|
||||
"Sauvegarder le module dans le gestionnaire de fichiers": "Speichern Sie das Modul im Dateimanager",
|
||||
"Sauvegarder les données du module dans le gestionnaire de fichiers": "Speichern Sie Moduldaten im Dateimanager",
|
||||
"Sauvegarder les données du site": "Site -Daten speichern",
|
||||
"Script dans body": "Skript dans Körper",
|
||||
"Script dans head": "Skript Dans Kopf",
|
||||
"Scripts externes": "Skripte externe",
|
||||
"Se déconnecter": "austragen",
|
||||
"Service en ligne inaccessible": "Unzugänglicher Online -Service",
|
||||
"Seul un administrateur peut se connecter lors d'une maintenance": "Nur ein Administrator kann während der Wartung eine Verbindung herstellen",
|
||||
"Si le contenu du gestionnaire de fichiers est très volumineux, mieux vaut une copie par FTP.": "Wenn der Inhalt des Dateimanagers sehr groß ist, ist es besser, eine Kopie von FTP zu kopieren.",
|
||||
"Signature": "Unterschrift",
|
||||
"Site": "Grundstück",
|
||||
"Site en maintenance": "Seite wird gewartet",
|
||||
"Size": "Größe",
|
||||
"Source": "Quelle",
|
||||
"Standard": "Standard",
|
||||
"Style": "Stil",
|
||||
"Suppression interdite": "Löschung verboten",
|
||||
"Suppression interdite, page active dans la configuration de la langue du site": "Löschen nicht erlaubt, Seite ist in der Sprachkonfiguration der Website aktiv",
|
||||
"Supprime le point d'interrogation dans les URL, l'option est indisponible avec les autres serveurs Web": "Löscht das Fragezeichen in den URLs, die Option ist mit anderen Webservern nicht verfügbar",
|
||||
"Supprimer": "LÖSCHEN",
|
||||
"Supprimer la page": "Löschen Sie die Seite",
|
||||
"Supprimer le module": "Löschen Sie das Modul",
|
||||
"Supprimer toutes les sauvegardes automatiques ?": "Alle automatischen Sicherungen entfernen?",
|
||||
"Sur l'axe horizontal": "Auf der horizontalen Achse",
|
||||
"Sur l'axe vertical": "Auf der vertikalen Achse",
|
||||
"Sur les deux axes": "Auf beiden Achsen",
|
||||
"Sécurité": "Sicherheit",
|
||||
"Sécurité de la connexion": "Verbindungssicherheit",
|
||||
"Sécurité désactivée": "Sicherheit deaktiviert",
|
||||
"Sélectionner un fichier": "Wählen Sie eine Datei aus",
|
||||
"Sélectionnez au moins un contenu à afficher": "Wählen Sie mindestens einen Inhalt zum Anzeigen aus",
|
||||
"Sélectionnez la langue à copier vers une langue cible": "Wählen Sie die Sprache aus, um in eine Zielsprache zu kopieren",
|
||||
"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.": "Wählen Sie ein an ein dunkles Thema adaptiertes Symbol aus. <br> Denken Sie daran, den Cache aus Ihrem Browser zu löschen, wenn sich das Favicon nicht ändert.",
|
||||
"Sélectionnez une image ou une icône de petite dimension": "Wählen Sie ein Bild oder ein kleines Symbol aus",
|
||||
"Sélectionnez une langue": "Wähle eine Sprache",
|
||||
"Sélectionnez une page contenant le module 'Recherche'. Une option du pied de page ajoute un lien discret vers cette page.": "Wählen Sie eine Seite mit dem Modul \"Forschung\" aus. Eine Option der Fußzeile fügt dieser Seite einen diskreten Link hinzu.",
|
||||
"Sélectionnez une page pour activer": "Wählen Sie eine Seite aus, um sie zu aktivieren",
|
||||
"Séparateur": "Separator",
|
||||
"Taille": "Größe",
|
||||
"Text": "Text",
|
||||
"Texte": "Text",
|
||||
"Thème": "Thema",
|
||||
"Thème de l'administration": "Verwaltungsthema",
|
||||
"Thème du site": "Site -Thema",
|
||||
"Thème importé": "Importiertes Thema",
|
||||
"Thèmes": "Themen",
|
||||
"Titre": "Titer",
|
||||
"Titre court": "Kurzer Titel",
|
||||
"Titre masqué": "Maskierter Titel",
|
||||
"Titre masqué dans la page": "Maskierter Titel auf der Seite",
|
||||
"Titres": "Titres",
|
||||
"Tous les dossiers": "Alle Verzeichnisse",
|
||||
"Tous les droits d'édition des contenus": "Alle Bearbeitungsrechte für Inhalte",
|
||||
"Tout Effacer": "Alles löschen",
|
||||
"Traduction supprimée": "Gelöschte Übersetzung",
|
||||
"Très grande": "Sehr groß",
|
||||
"Très grande (240%)": "Sehr groß (240%)",
|
||||
"Très grande (400px)": "Sehr groß (400px)",
|
||||
"Très important": "Sehr wichtig",
|
||||
"Très importante": "Sehr wichtig",
|
||||
"Très léger": "Sehr leicht",
|
||||
"Très légère": "Sehr leicht",
|
||||
"Très petite": "Sehr klein",
|
||||
"Très petite (100px) ": "Sehr klein (100px)",
|
||||
"Très petite (160%)": "Sehr klein (160%)",
|
||||
"Twitter": "Twitter",
|
||||
"Type de captcha": "Typ de captcha",
|
||||
"Type de proxy": "Geben Sie de Proxy ein",
|
||||
"Téléchargement et validation de l'archive": "Laden Sie das Archiv herunter und bestätigen Sie das Archiv",
|
||||
"Télécharger": "Herunterladen",
|
||||
"Télécharger la liste": "Laden Sie die Liste herunter",
|
||||
"Télécharger le journal": "Laden Sie die Zeitung herunter",
|
||||
"Télécharger le module dans le gestionnaire de fichiers": "Laden Sie das Modul im Dateimanager herunter",
|
||||
"Téléverser": "Hochladen",
|
||||
"URL incorrecte": "Falsche URL",
|
||||
"Un mail a été envoyé pour confirmer la réinitialisation": "Eine E -Mail wurde gesendet, um den Reset zu bestätigen",
|
||||
"Une archive du dossier /site/data est conservée pendant 30 jours. Activation recommandée": "Ein Archiv der Datei /Site /Daten wird 30 Tage lang aufbewahrt. Empfohlene Aktivierung",
|
||||
"Une erreur est survenue lors de l'étape :": "Während der Stadium trat ein Fehler auf:",
|
||||
"Url du fichier de fonte": "URL der Gusseisen -Datei",
|
||||
"Utilisateur inexistant": "Nicht existierender Benutzer",
|
||||
"Utilisateur supprimé": "Gelöschter Benutzer",
|
||||
"Utilisateurs": "Benutzer",
|
||||
"Valider": "Bestätigen",
|
||||
"Version": "Ausführung",
|
||||
"Version n°": "Version N °",
|
||||
"Vider dossier sauvegardes auto": "Leere automatische Sicherungsdatei",
|
||||
"Visiteur": "Besucher",
|
||||
"Vous n'êtes pas autorisé à consulter cette page (erreur 403)": "Sie dürfen diese Seite nicht konsultieren (Fehler 403)",
|
||||
"Youtube": "Youtube",
|
||||
"ZwiiCMS - Installation": "ZwiiCMS - Installation",
|
||||
"actualisé": "Aktualisiert",
|
||||
"favicon.ico": "Favicon.ico",
|
||||
"faviconDark.ico": "Favicondark.ico",
|
||||
"gestionnaire de fichiers": "Dateimanager",
|
||||
"installé": "Eingerichtet",
|
||||
"jour": "jour",
|
||||
"jours": "Tage",
|
||||
"sauvegardé avec succès": "Erfolgreich gespeichert",
|
||||
"vers": "gegen",
|
||||
"À droite": "Nach rechts",
|
||||
"À gauche": "Nach links",
|
||||
"À l'emplacement du mot clé [MODULE] dans la page": "Am Ort des Schlüsselworts [Modul] auf der Seite",
|
||||
"Échec de l'écriture, vérifiez les permissions": "Schreiben, Schreiben, Überprüfen Sie die Berechtigungen",
|
||||
"Échecs": "Schach",
|
||||
"Éditer": "Bearbeiten",
|
||||
"Éditer la page": "Veröffentlichen Sie die Seite",
|
||||
"Éditer les dialogues": "Bearbeiten Sie die Dialoge",
|
||||
"Éditer une catégorie": "Kategorie bearbeiten",
|
||||
"Éditeur": "Editor",
|
||||
"Éditeur CSS": "CSS -Verlag",
|
||||
"Éditeur JS": "Verlag JS",
|
||||
"Éditeur de script %s": "Skript Editor %s",
|
||||
"Éditeur de script dans Body": "Skripteditor im Körper",
|
||||
"Éditeur de script dans Head": "Skripteditor im Kopf",
|
||||
"Éditeur simple": "Einfacher Editor",
|
||||
"Édition des pages": "Seitenbearbeitung",
|
||||
"Édition du profil %s": "Profil bearbeiten %s",
|
||||
"Éléments": "Elemente",
|
||||
"Étendu sur la page": "Über die Seite ausgebreitet",
|
||||
"Étiquettes des pages spéciales": "Spezielle Seiten Beschriftungen",
|
||||
"Dimensions minimales": "Mindestabmessungen",
|
||||
"Taille maximale du fichier": "Maximale Dateigröße",
|
||||
"5 Mo pour les images JPEG": "5 MB für JPEG-Bilder",
|
||||
"1 Mo pour les images PNG": "1 MB für PNG-Bilder",
|
||||
"Poids": "Gewicht",
|
||||
"Supprimer ce profil ?": "Dieses Profil löschen?",
|
||||
"Masqué": "Versteckt",
|
||||
"Haut de page": "Seitenanfang",
|
||||
"Bas de page": "Seitenende",
|
||||
"Petit triangle": "Kleines Dreieck",
|
||||
"Grand triangle": "Großes Dreieck",
|
||||
"Flèche": "Pfeil",
|
||||
"Modèle": "Vorlage",
|
||||
"Bouton de navigation droit": "Rechte Navigations-Schaltfläche",
|
||||
"Bouton de navigation gauche": "Linke Navigations-Schaltfläche",
|
||||
"Groupes / Profils": "Gruppen / Profile",
|
||||
"Prénom commence par": "Vorname beginnt mit",
|
||||
"Nom commence par": "Nachname beginnt mit",
|
||||
"Impossible de réinitialiser le mot de passe de ce compte !": "Das Passwort für dieses Konto kann nicht zurückgesetzt werden!"
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,2 +1,706 @@
|
||||
{
|
||||
"'Ne pas afficher' crée une page orpheline non accessible par le biais des menus.": "",
|
||||
"'Sauvegarder et télécharger les données du module": "",
|
||||
"1 jour": "",
|
||||
"1/4 : Préparation...": "",
|
||||
"10 minutes": "",
|
||||
"10 tentatives": "",
|
||||
"14 jours": "",
|
||||
"15 minutes": "",
|
||||
"2 jours": "",
|
||||
"2/4 : Téléchargement...": "",
|
||||
"3 tentatives": "",
|
||||
"3/4 : Installation...": "",
|
||||
"4 jours": "",
|
||||
"4/4 : Configuration...": "",
|
||||
"5 minutes": "",
|
||||
"5 tentatives": "",
|
||||
"7 jours": "",
|
||||
"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 désactivé": "",
|
||||
"Accès interdit, erreur 403": "",
|
||||
"Action interdite": "",
|
||||
"Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.": "",
|
||||
"Activer": "",
|
||||
"Activer la journalisation": "",
|
||||
"Actualiser": "",
|
||||
"Adaptation": "",
|
||||
"Administrateur": "",
|
||||
"Administration": "",
|
||||
"Adresse SMTP": "",
|
||||
"Adresse du proxy": "",
|
||||
"Adresse électronique": "",
|
||||
"Affectation": "",
|
||||
"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.": "",
|
||||
"Aide": "",
|
||||
"Ajouter": "",
|
||||
"Ajouter un profil": "",
|
||||
"Ajouter un utilisateur": "",
|
||||
"Ajouter une fonte": "",
|
||||
"Alignement": "",
|
||||
"Aligner la bannière avec le contenu": "",
|
||||
"Ancien mot de passe": "",
|
||||
"Anonymat des adresses IP": "",
|
||||
"Apache URL intelligent": "",
|
||||
"Apache URL intelligentes": "",
|
||||
"Apparence": "",
|
||||
"Appliquer": "",
|
||||
"Approuver un commentaire": "",
|
||||
"Après": "",
|
||||
"Après la bannière": "",
|
||||
"Après le contenu de la page": "",
|
||||
"Archive": "",
|
||||
"Archive ZIP": "",
|
||||
"Archive copiée dans le dossier Modules du gestionnaire de fichier": "",
|
||||
"Archive de thème invalide": "",
|
||||
"Archive invalide": "",
|
||||
"Archive invalide, l'écriture dans le dossier core est interdite": "",
|
||||
"Archive invalide, le descripteur est absent": "",
|
||||
"Archive invalide, le fichier de classe est absent": "",
|
||||
"Archive invalide, les dossiers ne correspondent pas au descripteur": "",
|
||||
"Archive non spécifiée ou introuvable": "",
|
||||
"Archive à restaurer": "",
|
||||
"Arrière plan": "",
|
||||
"Arrière plan des blocs": "",
|
||||
"Arrière plan des champs": "",
|
||||
"Arrondi des angles": "",
|
||||
"Au centre": "",
|
||||
"Au début": "",
|
||||
"Au milieu au centre": "",
|
||||
"Au milieu à droite": "",
|
||||
"Au milieu à gauche": "",
|
||||
"Au-dessus du site": "",
|
||||
"Aucun": "",
|
||||
"Aucun dossier": "",
|
||||
"Aucun fichier journal à télécharger": "",
|
||||
"Aucun journal à effacer": "",
|
||||
"Aucun menu": "",
|
||||
"Aucune": "",
|
||||
"Aucune liste noire à effacer": "",
|
||||
"Aucune liste noire à télécharger": "",
|
||||
"Auteur :": "",
|
||||
"Authentification": "",
|
||||
"Automatique": "",
|
||||
"Autoriser les robots à référencer le site": "",
|
||||
"Autorisé": "",
|
||||
"Avant la bannière": "",
|
||||
"Avant le contenu de la page": "",
|
||||
"Background": "",
|
||||
"Banni": "",
|
||||
"Bannière": "",
|
||||
"Bannière cliquable": "",
|
||||
"Barre 1/3 - page 2/3": "",
|
||||
"Barre 1/4 - page 1/2 - barre 1/4": "",
|
||||
"Barre 1/4 - page 3/4": "",
|
||||
"Barre 2/12 - page 7/12 - barre 3/12": "",
|
||||
"Barre 3/12 - page 7/12 - barre 2/12": "",
|
||||
"Barre de membre": "",
|
||||
"Barre latérale": "",
|
||||
"Barre latérale droite :": "",
|
||||
"Barre latérale gauche :": "",
|
||||
"Barres latérales": "",
|
||||
"Bienvenue %s %s": "",
|
||||
"Blocage après échecs": "",
|
||||
"Blog": "",
|
||||
"Bords arrondis": "",
|
||||
"Bordure des blocs": "",
|
||||
"Bordure des champs": "",
|
||||
"Bouton Aide": "",
|
||||
"Bouton Standard": "",
|
||||
"Bouton de validation": "",
|
||||
"Bouton effacement": "",
|
||||
"Bouton retour": "",
|
||||
"Bouton standard": "",
|
||||
"Bouton validation": "",
|
||||
"Boutons": "",
|
||||
"Caché": "",
|
||||
"Cachée": "",
|
||||
"Captcha complexe": "",
|
||||
"Captcha à la connexion": "",
|
||||
"Captcha, identifiant ou mot de passe incorrects": "",
|
||||
"Capture d'écran Open Graph": "",
|
||||
"Capture d'écran générée avec succès": "",
|
||||
"Casse": "",
|
||||
"Catalogue": "",
|
||||
"Catégorie": "",
|
||||
"Ce membre pourra téléverser ou télécharger des fichiers dans le dossier 'partage' et ses sous-dossiers": "",
|
||||
"Cette page ne doit pas apparaître dans l'arborescence du menu. Créez une page orpheline.": "",
|
||||
"Cette redirection ne concerne que les pages d'administration du site.": "",
|
||||
"Chaîne Youtube": "",
|
||||
"Chiffres": "",
|
||||
"Cible": "",
|
||||
"Cliquez sur une zone afin d'accéder à ses options de personnalisation.": "",
|
||||
"Commentaire": "",
|
||||
"Complète": "",
|
||||
"Compte administrateur": "",
|
||||
"Compte de l'utilisateur": "",
|
||||
"Compte verrouillé": "",
|
||||
"Configuration": "",
|
||||
"Configuration du module": "",
|
||||
"Configurer": "",
|
||||
"Configurer mon compte": "",
|
||||
"Confirmation": "",
|
||||
"Confirmer la suppression de cet utilisateur": "",
|
||||
"Confirmer la dissociation du module de cette page": "",
|
||||
"Confirmer la désinstallation du module": "",
|
||||
"Confirmer la suppression de cet utilisateur": "",
|
||||
"Confirmer la suppression de cette langue": "",
|
||||
"Confirmer la suppression de la page": "",
|
||||
"Confirmer la suppression des données du module": "",
|
||||
"Confirmez-vous la suppression de cette page ?": "",
|
||||
"Connexion": "",
|
||||
"Consulter l'aide en ligne": "",
|
||||
"Contents": "",
|
||||
"Contenu": "",
|
||||
"Contenu HTML": "",
|
||||
"Contenu avancé": "",
|
||||
"Contenu du menu vertical": "",
|
||||
"Contrôle total": "",
|
||||
"Cookies": "",
|
||||
"Cookies Zwii": "",
|
||||
"Copie de contenus localisés": "",
|
||||
"Copie de sites inter-langues": "",
|
||||
"Copie des traductions rédigées": "",
|
||||
"Copie terminée avec des erreurs": "",
|
||||
"Copie terminée avec succès": "",
|
||||
"Copier": "",
|
||||
"Copier sauvegardes auto": "",
|
||||
"Couleur de fond automatique": "",
|
||||
"Couleur icône haut de page": "",
|
||||
"Couleur texte page active": "",
|
||||
"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. La couleur du texte est automatique.": "",
|
||||
"Couleurs": "",
|
||||
"Dans le site": "",
|
||||
"Dans quelle langue utiliserez-vous Zwii ?": "",
|
||||
"Date": "",
|
||||
"Description": "",
|
||||
"Disponible si le consentement des cookies est activé.": "",
|
||||
"Disposition": "",
|
||||
"Données %s copiées vers %s": "",
|
||||
"Données des modules": "",
|
||||
"Données importées": "",
|
||||
"Dossier": "",
|
||||
"Droits sur les dossiers": "",
|
||||
"Droits sur les fichiers": "",
|
||||
"Dupliquer": "",
|
||||
"Dupliquer la page": "",
|
||||
"Déconnecte les sessions ouvertes précédemment sur d'autres navigateurs ou terminaux. Activation recommandée.": "",
|
||||
"Déconnecter": "",
|
||||
"Déconnexion !": "",
|
||||
"Déconnexion automatique": "",
|
||||
"Définir par défaut": "",
|
||||
"Dévoiler le mot de passe": "",
|
||||
"Effacer": "",
|
||||
"Effacer la page": "",
|
||||
"Effacer tous les commentaires": "",
|
||||
"Effacer toutes les statistiques": "",
|
||||
"Effacer un commentaire": "",
|
||||
"Effacer une catégorie": "",
|
||||
"Emplacement :": "",
|
||||
"Emplacement dans le menu": "",
|
||||
"En bas au centre": "",
|
||||
"En bas à droite": "",
|
||||
"En bas à gauche": "",
|
||||
"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 à droite": "",
|
||||
"En haut à gauche": "",
|
||||
"En position libre ajoutez le module en plaçant [MODULE] à l'endroit voulu dans votre page.": "",
|
||||
"En-dehors du site": "",
|
||||
"Enregistrer": "",
|
||||
"Envoyer un message de confirmation": "",
|
||||
"Erreur : sauvegarde non générée !": "",
|
||||
"Erreur d'URL": "",
|
||||
"Erreur d'extraction, vérifiez les permissions": "",
|
||||
"Erreur de copie": "",
|
||||
"Erreur de copie, vérifiez les permissions": "",
|
||||
"Erreur de lecture, vérifiez les permissions": "",
|
||||
"Erreur inconnue": "",
|
||||
"Erreur inconnue, le module n'est pas installé": "",
|
||||
"Export CSV": "",
|
||||
"Expéditeur": "",
|
||||
"Extension": "",
|
||||
"Extraire": "",
|
||||
"Facebook": "",
|
||||
"Famille": "",
|
||||
"Favicon thème sombre": "",
|
||||
"Feuille de style spécifique à la page.": "",
|
||||
"Fichiers": "",
|
||||
"Fichiers effacés": "",
|
||||
"Fil d'Ariane dans le titre": "",
|
||||
"Fond du sous-menu": "",
|
||||
"FontId": "",
|
||||
"Fonte": "",
|
||||
"Fonte actualisée": "",
|
||||
"Fonte créée": "",
|
||||
"Fonte en ligne": "",
|
||||
"Fonte installée": "",
|
||||
"Fonte non créée, ressource absente !": "",
|
||||
"Fonte supprimée": "",
|
||||
"Fontes": "",
|
||||
"Format incorrect": "",
|
||||
"Formulaire": "",
|
||||
"Fréquence de recherche": "",
|
||||
"Fuseau horaire": "",
|
||||
"Gabarits de page - Barre latérale": "",
|
||||
"Gestion": "",
|
||||
"Gestion des modules": "",
|
||||
"Gestion des thèmes": "",
|
||||
"Gestionnaire de fichiers": "",
|
||||
"Github": "",
|
||||
"Grande": "",
|
||||
"Grande (220%)": "",
|
||||
"Grande (300px)": "",
|
||||
"Gras": "",
|
||||
"Groupe": "",
|
||||
"Groupe associé": "",
|
||||
"Groupe requis pour accéder à la page :": "",
|
||||
"Groupes": "",
|
||||
"Générer sitemap.xml et robots.txt": "",
|
||||
"Générer une capture Open Graph": "",
|
||||
"Gérer les catégories": "",
|
||||
"Gérer les commentaires": "",
|
||||
"Gérer les données": "",
|
||||
"Hauteur": "",
|
||||
"Hauteur de l'image": "",
|
||||
"Hauteur de l'image sélectionnée": "",
|
||||
"Hauteur maximale": "",
|
||||
"ID de la chaîne : https://www.youtube.com/channel/[ID].": "",
|
||||
"Icône": "",
|
||||
"Icône avec bulle de texte": "",
|
||||
"Icône haut de page, couleur arrière-plan": "",
|
||||
"Identifiant": "",
|
||||
"Identifiant (sans espace ni majuscule)": "",
|
||||
"Identité": "",
|
||||
"Identité de la fonte": "",
|
||||
"Identité du site": "",
|
||||
"Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.": "",
|
||||
"Image": "",
|
||||
"Image étirée (100% 100%)": "",
|
||||
"Important": "",
|
||||
"Importante": "",
|
||||
"Importation d'utilisateurs": "",
|
||||
"Importation de fichier plat CSV": "",
|
||||
"Importation effectuée": "",
|
||||
"Importer": "",
|
||||
"Importer dans": "",
|
||||
"Importer des utilisateurs en masse": "",
|
||||
"Impossible d'ouvrir l'archive": "",
|
||||
"Impossible de modifier votre propre groupe.": "",
|
||||
"Impossible de soumettre le formulaire, car il contient des erreurs": "",
|
||||
"Impossible de supprimer une page contenant des pages enfants": "",
|
||||
"Impossible de supprimer votre propre compte": "",
|
||||
"Inclure le contenu du gestionnaire de fichiers": "",
|
||||
"Incorrect": "",
|
||||
"Informations": "",
|
||||
"Instagram": "",
|
||||
"Installation terminée": "",
|
||||
"Installer": "",
|
||||
"Installer depuis le catalogue en ligne": "",
|
||||
"Installer depuis une archive": "",
|
||||
"Installer les données d'un module": "",
|
||||
"Installer ou mettre à jour un module téléchargé": "",
|
||||
"Installer un module": "",
|
||||
"Installer un thème archivé (site ou administration)": "",
|
||||
"Instructions JS ou jquery spécifiques à la page.": "",
|
||||
"Interface": "",
|
||||
"Jeton invalide": "",
|
||||
"Journal réinitialisé avec succès": "",
|
||||
"Journalisation": "",
|
||||
"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é.": "",
|
||||
"La carte du site a été mise à jour": "",
|
||||
"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 page %s est ouverte par l'utilisateur %s": "",
|
||||
"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 première page que vos visiteurs verront.": "",
|
||||
"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 suppression a échoué": "",
|
||||
"La version installée est plus récente": "",
|
||||
"La vérification est quotidienne. Option désactivée si la configuration du serveur ne le permet pas.": "",
|
||||
"Langue de l'administration": "",
|
||||
"Langue du site par défaut": "",
|
||||
"Langue par défaut": "",
|
||||
"Langues": "",
|
||||
"Langues disponibles": "",
|
||||
"Langues installées": "",
|
||||
"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 fuseau horaire est utile au bon référencement": "",
|
||||
"Le menu accessoire est aligné à droite de la barre de menu, c'est un emplacement réservé aux drapeaux et au bouton de connexion.": "",
|
||||
"Le menu horizontal intégral": "",
|
||||
"Le module %s a été %s": "",
|
||||
"Le module %s de la page %s a été supprimé": "",
|
||||
"Le module %s est désinstallé, il reste peut-être des données dans %s": "",
|
||||
"Le sous-menu de la page parente": "",
|
||||
"Le survol d'une icône de l'écran de connexion affiche temporairement le mot de passe.": "",
|
||||
"Le titre court est affiché dans les menus. Il peut être identique au titre de la page.": "",
|
||||
"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 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": "",
|
||||
"Libre": "",
|
||||
"Licence :": "",
|
||||
"Lien de connexion": "",
|
||||
"Lien page des mentions légales.": "",
|
||||
"Liens": "",
|
||||
"Limitation des tentatives": "",
|
||||
"Limitée au site": "",
|
||||
"Linkedin": "",
|
||||
"Liste noire": "",
|
||||
"Liste noire réinitialisée avec succès": "",
|
||||
"Lors d'une mise à jour automatique, conserve le fichier htaccess de la racine du site.": "",
|
||||
"Léger": "",
|
||||
"Légère": "",
|
||||
"Maigre": "",
|
||||
"Maintenance": "",
|
||||
"Majuscule à chaque mot": "",
|
||||
"Majuscules": "",
|
||||
"Marges verticales": "",
|
||||
"Masquer la bannière en écran réduit": "",
|
||||
"Masquer la page et les pages enfants dans le menu d'une barre latérale": "",
|
||||
"Masquer les pages enfants dans le menu horizontal": "",
|
||||
"Membre": "",
|
||||
"Membre avec droit de partage": "",
|
||||
"Membre simple": "",
|
||||
"Mentions légales": "",
|
||||
"Menu": "",
|
||||
"Menu accessoire": "",
|
||||
"Menu burger dans écran réduit": "",
|
||||
"Menu standard": "",
|
||||
"Message d'acceptation des Cookies": "",
|
||||
"Message de consentement aux cookies": "",
|
||||
"Mettre à jour": "",
|
||||
"Mettre à jour le module orphelin": "",
|
||||
"Minuscules": "",
|
||||
"Mise en forme des titres": "",
|
||||
"Mise en forme du texte": "",
|
||||
"Mise en forme du titre": "",
|
||||
"Mise en page": "",
|
||||
"Mise à jour": "",
|
||||
"Mise à jour automatisée": "",
|
||||
"Mise à jour terminée avec succès.": "",
|
||||
"Modifications enregistrées": "",
|
||||
"Module": "",
|
||||
"Module de la page": "",
|
||||
"Modules": "",
|
||||
"Modules configurés": "",
|
||||
"Modules installés": "",
|
||||
"Modules orphelins": "",
|
||||
"Mot de passe": "",
|
||||
"Mot de passe oublié": "",
|
||||
"Mot de passe perdu": "",
|
||||
"Motorisé par": "",
|
||||
"Moyen": "",
|
||||
"Moyenne": "",
|
||||
"Moyenne (200%)": "",
|
||||
"Moyenne (200px)": "",
|
||||
"Méta-description": "",
|
||||
"Méta-titre": "",
|
||||
"Ne pas afficher": "",
|
||||
"Ne pas charger l'exemple de site (utilisateurs avancés)": "",
|
||||
"Ne pas répéter": "",
|
||||
"Ne pas saisir les balises": "",
|
||||
"News": "",
|
||||
"Niveau 1 (192.168.12.x)": "",
|
||||
"Niveau 2 (192.168.x.x)": "",
|
||||
"Niveau 3 (192.x.x.x)": "",
|
||||
"Nom": "",
|
||||
"Nom Prénom": "",
|
||||
"Nom du profil": "",
|
||||
"Nom utilisateur": "",
|
||||
"Non": "",
|
||||
"Non tronquée": "",
|
||||
"Notre site est actuellement en maintenance. Nous sommes désolés pour la gêne occasionnée et faisons notre possible pour être rapidement de retour.": "",
|
||||
"Nouveau contenu localisé": "",
|
||||
"Nouveau mot de passe": "",
|
||||
"Nouveau mot de passe enregistré": "",
|
||||
"Nouvel utilisateur": "",
|
||||
"Nouvelle page créée": "",
|
||||
"Nouvelle page ou barre latérale": "",
|
||||
"Obligatoire": "",
|
||||
"Ombre": "",
|
||||
"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.": "",
|
||||
"Options": "",
|
||||
"Options avancées": "",
|
||||
"Origine": "",
|
||||
"Oui": "",
|
||||
"Page": "",
|
||||
"Page 2/3 - barre 1/3": "",
|
||||
"Page 3/4 - barre 1/4": "",
|
||||
"Page associée": "",
|
||||
"Page de recherche": "",
|
||||
"Page dupliquée": "",
|
||||
"Page et module dupliqués": "",
|
||||
"Page inexistante, erreur 404": "",
|
||||
"Page non cliquable": "",
|
||||
"Page parent": "",
|
||||
"Page standard": "",
|
||||
"Page supprimée": "",
|
||||
"Pages dans le menu": "",
|
||||
"Pages du site": "",
|
||||
"Pages et les modules de": "",
|
||||
"Pages orphelines": "",
|
||||
"Papier peint": "",
|
||||
"Par défaut le menu est affiché APRES le contenu de la page. Pour le positionner à un emplacement précis, insérez [MENU] dans le contenu de la page.": "",
|
||||
"Paramètres": "",
|
||||
"Paramètres de la localisation": "",
|
||||
"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.": "",
|
||||
"Pas de marge au-dessus et en dessous du site": "",
|
||||
"Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "",
|
||||
"Permission": "",
|
||||
"Permission et référencement": "",
|
||||
"Permissions": "",
|
||||
"Permissions sur les dossiers": "",
|
||||
"Permissions sur les fichiers": "",
|
||||
"Permissions sur les pages": "",
|
||||
"Petite": "",
|
||||
"Petite (150px)": "",
|
||||
"Petite (180%)": "",
|
||||
"Pied de page": "",
|
||||
"Pinterest": "",
|
||||
"Plan du site": "",
|
||||
"Police des titres": "",
|
||||
"Police du texte": "",
|
||||
"Port SMTP": "",
|
||||
"Port du proxy": "",
|
||||
"Position": "",
|
||||
"Position du module": "",
|
||||
"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.": "",
|
||||
"Prénom": "",
|
||||
"Prénom Nom": "",
|
||||
"Préparation de la mise à jour": "",
|
||||
"Préserver le fichier htaccess racine": "",
|
||||
"Préserver les comptes des utilisateurs déjà installés": "",
|
||||
"Prévenir l'utilisateur par mail": "",
|
||||
"Prévisualiser": "",
|
||||
"Pseudo": "",
|
||||
"Rang 9 > rang 1. Le profil de rang 1 n'est pas modifiable.": "",
|
||||
"Ratio": "",
|
||||
"Ratio :": "",
|
||||
"Recherche": "",
|
||||
"Recherche dans le site": "",
|
||||
"Rechercher": "",
|
||||
"Rechercher une mise à jour en ligne": "",
|
||||
"Redirection": "",
|
||||
"Redirection vers la connexion": "",
|
||||
"Renommer": "",
|
||||
"Renseignez les champs ci-dessous pour finaliser l'installation.": "",
|
||||
"Responsive (contain)": "",
|
||||
"Responsive (cover)": "",
|
||||
"Restauration des bases de données absentes": "",
|
||||
"Restauration effectuée avec succès": "",
|
||||
"Restaurer": "",
|
||||
"Restaurer les données du site": "",
|
||||
"Rester connecté sur ce navigateur": "",
|
||||
"Retour": "",
|
||||
"Rien à importer, erreur de format ou fichier incorrect": "",
|
||||
"Rédacteur": "",
|
||||
"Référencement": "",
|
||||
"Réinitialisation du mot de passe": "",
|
||||
"Réinitialiser avec le thème par défaut": "",
|
||||
"Réinitialiser la feuille de style": "",
|
||||
"Réinitialiser la liste": "",
|
||||
"Réinitialiser le journal": "",
|
||||
"Réinstaller": "",
|
||||
"Répétition": "",
|
||||
"Réseau": "",
|
||||
"Réseaux sociaux": "",
|
||||
"S'ouvre dans un nouvel onglet": "",
|
||||
"SMTP": "",
|
||||
"SMTP personnalisé": "",
|
||||
"Saisir la clé, puis valider le formulaire avant de cliquer sur le bouton de génération": "",
|
||||
"Saisissez le Titre de gestion des cookies.": "",
|
||||
"Saisissez le message pour les cookies déposés par ZwiiCMS, nécessaires au fonctionnement et qui ne nécessitent pas de consentement.": "",
|
||||
"Saisissez le texte du lien vers les mentions légales,la page doit être définie dans la configuration du site.": "",
|
||||
"Saisissez votre ID : https://pinterest.com/[ID].": "",
|
||||
"Saisissez votre ID : https://twitter.com/[ID].": "",
|
||||
"Saisissez votre ID : https://www.facebook.com/[ID].": "",
|
||||
"Saisissez votre ID : https://www.instagram.com/[ID].": "",
|
||||
"Saisissez votre ID Github : https://github.com/[ID].": "",
|
||||
"Saisissez votre ID Linkedin : https://fr.linkedin.com/in/[ID].": "",
|
||||
"Saisissez votre ID Utilisateur : https://www.youtube.com/user/[ID].": "",
|
||||
"Sauvegarde": "",
|
||||
"Sauvegarde automatique quotidienne du site": "",
|
||||
"Sauvegarde du thème dans le": "",
|
||||
"Sauvegarde générée avec succès": "",
|
||||
"Sauvegarder": "",
|
||||
"Sauvegarder et télécharger le module": "",
|
||||
"Sauvegarder le module dans le gestionnaire de fichiers": "",
|
||||
"Sauvegarder les données du module dans le gestionnaire de fichiers": "",
|
||||
"Sauvegarder les données du site": "",
|
||||
"Script dans body": "",
|
||||
"Script dans head": "",
|
||||
"Scripts externes": "",
|
||||
"Se déconnecter": "",
|
||||
"Service en ligne inaccessible": "",
|
||||
"Seul un administrateur peut se connecter lors d'une maintenance": "",
|
||||
"Si le contenu du gestionnaire de fichiers est très volumineux, mieux vaut une copie par FTP.": "",
|
||||
"Signature": "",
|
||||
"Site": "",
|
||||
"Site en maintenance": "",
|
||||
"Size": "",
|
||||
"Source": "",
|
||||
"Standard": "",
|
||||
"Style": "",
|
||||
"Suppression interdite": "",
|
||||
"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": "",
|
||||
"Supprimer": "",
|
||||
"Supprimer la page": "",
|
||||
"Supprimer le module": "",
|
||||
"Supprimer toutes les sauvegardes automatiques ?": "",
|
||||
"Sur l'axe horizontal": "",
|
||||
"Sur l'axe vertical": "",
|
||||
"Sur les deux axes": "",
|
||||
"Sécurité": "",
|
||||
"Sécurité de la connexion": "",
|
||||
"Sécurité désactivée": "",
|
||||
"Sélectionner un fichier": "",
|
||||
"Sélectionnez au moins un contenu à afficher": "",
|
||||
"Sélectionnez la langue à copier vers une langue cible": "",
|
||||
"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.": "",
|
||||
"Sélectionnez une image ou une icône de petite dimension": "",
|
||||
"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 pour activer": "",
|
||||
"Séparateur": "",
|
||||
"Taille": "",
|
||||
"Text": "",
|
||||
"Texte": "",
|
||||
"Thème": "",
|
||||
"Thème de l'administration": "",
|
||||
"Thème du site": "",
|
||||
"Thème importé": "",
|
||||
"Thèmes": "",
|
||||
"Titre": "",
|
||||
"Titre court": "",
|
||||
"Titre masqué": "",
|
||||
"Titre masqué dans la page": "",
|
||||
"Titres": "",
|
||||
"Tous les dossiers": "",
|
||||
"Tous les droits d'édition des contenus": "",
|
||||
"Tout Effacer": "",
|
||||
"Traduction supprimée": "",
|
||||
"Très grande": "",
|
||||
"Très grande (240%)": "",
|
||||
"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 (160%)": "",
|
||||
"Twitter": "",
|
||||
"Type de captcha": "",
|
||||
"Type de proxy": "",
|
||||
"Téléchargement et validation de l'archive": "",
|
||||
"Télécharger": "",
|
||||
"Télécharger la liste": "",
|
||||
"Télécharger le journal": "",
|
||||
"Télécharger le module dans le gestionnaire de fichiers": "",
|
||||
"Téléverser": "",
|
||||
"URL incorrecte": "",
|
||||
"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 erreur est survenue lors de l'étape :": "",
|
||||
"Url du fichier de fonte": "",
|
||||
"Utilisateur inexistant": "",
|
||||
"Utilisateur supprimé": "",
|
||||
"Utilisateurs": "",
|
||||
"Valider": "",
|
||||
"Version": "",
|
||||
"Version n°": "",
|
||||
"Vider dossier sauvegardes auto": "",
|
||||
"Visiteur": "",
|
||||
"Vous n'êtes pas autorisé à consulter cette page (erreur 403)": "",
|
||||
"Youtube": "",
|
||||
"ZwiiCMS - Installation": "",
|
||||
"actualisé": "",
|
||||
"favicon.ico": "",
|
||||
"faviconDark.ico": "",
|
||||
"gestionnaire de fichiers": "",
|
||||
"installé": "",
|
||||
"jour": "",
|
||||
"jours": "",
|
||||
"sauvegardé avec succès": "",
|
||||
"vers": "",
|
||||
"À droite": "",
|
||||
"À gauche": "",
|
||||
"À l'emplacement du mot clé [MODULE] dans la page": "",
|
||||
"Échec de l'écriture, vérifiez les permissions": "",
|
||||
"Échecs": "",
|
||||
"Éditer": "",
|
||||
"Éditer la page": "",
|
||||
"Éditer les dialogues": "",
|
||||
"Éditer une catégorie": "",
|
||||
"Éditeur": "",
|
||||
"Éditeur CSS": "",
|
||||
"Éditeur JS": "",
|
||||
"Éditeur de script %s": "",
|
||||
"Éditeur de script dans Body": "",
|
||||
"Éditeur de script dans Head": "",
|
||||
"Éditeur simple": "",
|
||||
"Édition des pages": "",
|
||||
"Édition du profil %s": "",
|
||||
"Éléments": "",
|
||||
"Étendu sur la page": "",
|
||||
"Étiquettes des pages spéciales": "",
|
||||
"Dimensions minimales": "",
|
||||
"Taille maximale du fichier": "",
|
||||
"5 Mo pour les images JPEG": "",
|
||||
"1 Mo pour les images PNG": "",
|
||||
"Poids": "",
|
||||
"Supprimer ce profil ?": "",
|
||||
"Masqué": "",
|
||||
"Haut de page": "",
|
||||
"Bas de page": "",
|
||||
"Petit triangle": "",
|
||||
"Grand triangle": "",
|
||||
"Flèche": "",
|
||||
"Modèle": "",
|
||||
"Bouton de navigation droit": "",
|
||||
"Bouton de navigation gauche": "",
|
||||
"Groupes / Profils": "",
|
||||
"Prénom commence par": "",
|
||||
"Nom commence par": "",
|
||||
"Impossible de réinitialiser le mot de passe de ce compte !": "",
|
||||
"Test de la messagerie du site": "",
|
||||
"Il semblerait que votre messagerie fonctionne correctement !": "",
|
||||
"Message de test envoyé avec succès": "",
|
||||
"Message non envoyé": "",
|
||||
"Validation par clé ⚠️": "",
|
||||
"La connexion est confirmée à l'aide d'une clé transmise par messagerie. Depuis le groupe sélectionné et les groupes supérieurs.": "",
|
||||
"Envoi du message d'authentification": "",
|
||||
"Connexion réussie": "",
|
||||
"Erreur de mot de passe": "",
|
||||
"Erreur de captcha": "",
|
||||
"Clé envoyée par message": "",
|
||||
"Message de test": "",
|
||||
"Clé d'authentification envoyée à votre adresse mail %s": ""
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
{
|
||||
"languages": {
|
||||
"fr_FR": {
|
||||
"version": 12300,
|
||||
"date": 1677838293
|
||||
},
|
||||
"es": {
|
||||
"version": 12300,
|
||||
"date": 1677838293
|
||||
},
|
||||
"en_EN": {
|
||||
"version": 12300,
|
||||
"date": 1677838293
|
||||
}
|
||||
}
|
||||
}
|
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-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
||||
|
||||
/** NE PAS EFFACER
|
||||
* admin.css
|
||||
*/
|
@ -6,7 +6,7 @@
|
||||
<div class="col6 offset3">
|
||||
<?php echo template::select('installLanguage', $module::$i18nFiles, [
|
||||
'label' => 'Langues installées',
|
||||
'selected' => array_key_exists ('fr_FR', $module::$i18nFiles) ? 'fr_FR': reset($module::$i18nFiles),
|
||||
'selected' => isset(self::$i18nUI) ? self::$i18nUI : 'fr_FR',
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1 +1,22 @@
|
||||
/* Vide */
|
||||
/**
|
||||
* 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-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
||||
|
||||
/** NE PAS EFFACER
|
||||
* admin.css
|
||||
*/
|
||||
|
||||
.title {
|
||||
font-weight: bold;
|
||||
}
|
@ -6,7 +6,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
@ -2,71 +2,77 @@
|
||||
<?php echo helper::translate('Renseignez les champs ci-dessous pour finaliser l\'installation.'); ?>
|
||||
</p>
|
||||
<?php echo template::formOpen('installForm'); ?>
|
||||
<h3>
|
||||
<?php echo helper::translate('Compte administrateur'); ?>
|
||||
</h3>
|
||||
<div>
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<?php echo template::text('installId', [
|
||||
'autocomplete' => 'off',
|
||||
'label' => 'Identifiant'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col6">
|
||||
<?php echo template::password('installPassword', [
|
||||
'autocomplete' => 'off',
|
||||
'label' => 'Mot de passe'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col6">
|
||||
<?php echo template::password('installConfirmPassword', [
|
||||
'autocomplete' => 'off',
|
||||
'label' => 'Confirmation'
|
||||
]); ?>
|
||||
</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>
|
||||
</div>
|
||||
<ul class="accordion" data-speed="150">
|
||||
<li class="accordion-item">
|
||||
<h3 class="accordion-title">
|
||||
<?php echo '▷ ' . helper::translate('Options avancées'); ?>
|
||||
</h3>
|
||||
<div class="accordion-content">
|
||||
<?php if ($this->getUrl(2) === 'fr_FR'): ?>
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<details open>
|
||||
<summary>
|
||||
<span class="title">
|
||||
<?php echo helper::translate('Compte administrateur'); ?>
|
||||
</span>
|
||||
</summary>
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<?php echo template::checkbox('installDefaultData', true, 'Ne pas charger l\'exemple de site (utilisateurs avancés)', [
|
||||
'checked' => false
|
||||
]);
|
||||
?>
|
||||
<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>
|
||||
<?php endif;?>
|
||||
<div class="row">
|
||||
<div class="col6">
|
||||
<?php echo template::text('installId', [
|
||||
'autocomplete' => 'off',
|
||||
'label' => 'Identifiant'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col6">
|
||||
<?php echo template::mail('installMail', [
|
||||
'autocomplete' => 'off',
|
||||
'label' => 'Adresse électronique'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col6">
|
||||
<?php echo template::password('installPassword', [
|
||||
'autocomplete' => 'off',
|
||||
'label' => 'Mot de passe'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col6">
|
||||
<?php echo template::password('installConfirmPassword', [
|
||||
'autocomplete' => 'off',
|
||||
'label' => 'Confirmation'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<details close>
|
||||
<summary>
|
||||
<span class="title">
|
||||
<?php echo helper::translate('Options avancées'); ?>
|
||||
</span>
|
||||
</summary>
|
||||
<?php if ($_SESSION['ZWII_UI'] === 'fr_FR'): ?>
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<?php echo template::checkbox('installDefaultData', true, 'Ne pas charger l\'exemple de site (utilisateurs avancés)', [
|
||||
'checked' => false
|
||||
]);
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div class="row">
|
||||
<div class="col3">
|
||||
<?php echo template::select('installProxyType', $module::$proxyType, [
|
||||
@ -88,18 +94,14 @@
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<?php echo template::select('installTheme', $module::$themes, [
|
||||
'label' => 'Thème'
|
||||
]); ?>
|
||||
<?php echo template::hidden('installLanguage', [
|
||||
'value' => $this->getUrl(2)
|
||||
]); ?>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
<div class="row">
|
||||
<div class="col2">
|
||||
<?php echo template::button('installPrevious', [
|
||||
|
@ -7,7 +7,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
@ -1,6 +1,16 @@
|
||||
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'); ?>"];
|
||||
$(".installUpdateProgressText").hide(), $(".installUpdateProgressText[data-id=" + i + "]").show(), $.ajax({
|
||||
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'); ?>"
|
||||
];
|
||||
$(".installUpdateProgressText").hide();
|
||||
$(".installUpdateProgressText[data-id=" + i + "]").show();
|
||||
|
||||
$("body").css("cursor", "wait");
|
||||
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "<?php echo helper::baseUrl(false); ?>?install/steps",
|
||||
data: {
|
||||
@ -8,13 +18,78 @@ function step(i, data) {
|
||||
data: data
|
||||
},
|
||||
success: function (result) {
|
||||
setTimeout((function () {
|
||||
!0 === result.success ? 4 === i ? ($("#installUpdateSuccess").show(), $("#installUpdateEnd").removeClass("disabled"), $("#installUpdateProgress").hide()) : step(i + 1, result.data) : ($("#installUpdateErrorStep").text(errors[i]), $("#installUpdateError").show(), $("#installUpdateEnd").removeClass("disabled"), $("#installUpdateProgress").hide(), console.error(result), $("#installUpdateErrorMessage").text(result.replace(/<[^p].*?>/g, "")))
|
||||
}), 2e3)
|
||||
setTimeout(function () {
|
||||
if (4 === i) {
|
||||
$("#installUpdateSuccess").show();
|
||||
$("body").css("cursor", "default");
|
||||
$("#installUpdateEnd").removeClass("disabled");
|
||||
$("#installUpdateProgress").hide();
|
||||
} else {
|
||||
step(i + 1, result.data);
|
||||
}
|
||||
}, 2000);
|
||||
},
|
||||
error: function (xhr) {
|
||||
$("#installUpdateErrorStep").text(errors[1]), $("#installUpdateError").show(), $("#installUpdateEnd").removeClass("disabled"), $("#installUpdateProgress").hide(), console.error(xhr.responseText), $("#installUpdateErrorMessage").text(xhr.responseText.replace(/<[^p].*?>/g, ""))
|
||||
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
|
||||
showError(i, xhr.responseText, errors);
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
$(window).on("load", step(1, null));
|
||||
|
||||
function showError(step, message, errors) {
|
||||
$("body").css("cursor", "default");
|
||||
$("#installUpdateErrorStep").text(errors[step] + " (étape n°" + step + ")");
|
||||
$("#installUpdateError").show();
|
||||
$("#installUpdateEnd").removeClass("disabled");
|
||||
$("#installUpdateProgress").hide();
|
||||
|
||||
// Vérifier si l'accolade ouvrante est trouvée et qu'elle n'est pas en première position
|
||||
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 {
|
||||
// Si pas de JSON détecté, afficher le message brut
|
||||
$("#installUpdateErrorMessage").html("Message d'erreur : " + message);
|
||||
}
|
||||
} else {
|
||||
$("#installUpdateErrorMessage").html(message);
|
||||
}
|
||||
}
|
||||
|
||||
$(window).on("load", function () {
|
||||
step(1, null);
|
||||
});
|
||||
|
@ -1,55 +1,56 @@
|
||||
<p><strong>
|
||||
<?php echo helper::translate('Mise à jour de ZwiiCMS'); ?>
|
||||
|
||||
<?php echo self::ZWII_VERSION; ?>
|
||||
<?php echo helper::translate('vers ZwiiCMS'); ?>
|
||||
|
||||
<?php echo $module::$newVersion; ?>.
|
||||
</strong></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.'); ?>
|
||||
</p>
|
||||
<div class="row">
|
||||
<div class="col9 verticalAlignMiddle">
|
||||
<div id="installUpdateProgress">
|
||||
<?php echo template::ico('spin', ['animate' => true]); ?>
|
||||
<span class="installUpdateProgressText" data-id="1">
|
||||
<?php echo helper::translate('1/4 : Préparation...'); ?>
|
||||
</span>
|
||||
<span class="installUpdateProgressText displayNone" data-id="2">
|
||||
<?php echo helper::translate('2/4 : Téléchargement...'); ?>
|
||||
</span>
|
||||
<span class="installUpdateProgressText displayNone" data-id="3">
|
||||
<?php echo helper::translate('3/4 : Installation...'); ?>
|
||||
</span>
|
||||
<span class="installUpdateProgressText displayNone" data-id="4">
|
||||
<?php echo helper::translate('4/4 : Configuration...'); ?>
|
||||
</span>
|
||||
<div id="updateContainer">
|
||||
<p><strong>
|
||||
<?php echo helper::translate('Version'); ?>
|
||||
|
||||
<?php echo self::ZWII_VERSION; ?>
|
||||
<?php echo helper::translate('vers'); ?>
|
||||
|
||||
<?php echo $module::$newVersion; ?>
|
||||
</strong></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.'); ?>
|
||||
</p>
|
||||
<div class="row">
|
||||
<div class="col9 verticalAlignMiddle">
|
||||
<div id="installUpdateProgress">
|
||||
<?php echo template::ico('spin', ['animate' => true]); ?>
|
||||
<span class="installUpdateProgressText" data-id="1">
|
||||
<?php echo helper::translate('1/4 : Préparation...'); ?>
|
||||
</span>
|
||||
<span class="installUpdateProgressText displayNone" data-id="2">
|
||||
<?php echo helper::translate('2/4 : Téléchargement...'); ?>
|
||||
</span>
|
||||
<span class="installUpdateProgressText displayNone" data-id="3">
|
||||
<?php echo helper::translate('3/4 : Installation...'); ?>
|
||||
</span>
|
||||
<span class="installUpdateProgressText displayNone" data-id="4">
|
||||
<?php echo helper::translate('4/4 : Configuration...'); ?>
|
||||
</span>
|
||||
</div>
|
||||
<div id="installUpdateError" class="message colorRed displayNone">
|
||||
<?php echo template::ico('cancel'); ?>
|
||||
<strong>
|
||||
<?php echo helper::translate('Une erreur est survenue lors de l\'étape :') . '<br>'; ?>
|
||||
<span id="installUpdateErrorStep"> </span>.
|
||||
</strong>
|
||||
</div>
|
||||
<div id="installUpdateSuccess" class="message colorGreen displayNone">
|
||||
<?php echo template::ico('check'); ?>
|
||||
<?php echo helper::translate('Mise à jour terminée avec succès.'); ?>
|
||||
</div>
|
||||
</div>
|
||||
<div id="installUpdateError" class="colorRed displayNone">
|
||||
<?php echo template::ico('cancel'); ?>
|
||||
<strong>
|
||||
<?php echo helper::translate('Une erreur est survenue lors de l\'étape :'); ?>
|
||||
|
||||
<span id="installUpdateErrorStep"> </span>.
|
||||
</strong>
|
||||
</div>
|
||||
<div id="installUpdateSuccess" class="colorGreen displayNone">
|
||||
<?php echo template::ico('check'); ?>
|
||||
<?php echo helper::translate('Mise à jour terminée avec succès.'); ?>
|
||||
<div class="col3 verticalAlignTop">
|
||||
<?php echo template::button('installUpdateEnd', [
|
||||
'value' => 'Terminer',
|
||||
'href' => helper::baseUrl() . 'config',
|
||||
'ico' => 'check',
|
||||
'class' => 'disabled'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col3 verticalAlignTop">
|
||||
<?php echo template::button('installUpdateEnd', [
|
||||
'value' => 'Terminer',
|
||||
'href' => helper::baseUrl() . 'config',
|
||||
'ico' => 'check',
|
||||
'class' => 'disabled'
|
||||
]); ?>
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<p><em><span class="colorRed" id="installUpdateErrorMessage"></span></em></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<p><em><span class="colorRed" id="installUpdateErrorMessage"></span></em></p>
|
||||
</div>
|
||||
</div
|
@ -8,14 +8,17 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @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 = [
|
||||
'index' => self::GROUP_ADMIN,
|
||||
'copy' => self::GROUP_ADMIN,
|
||||
@ -29,6 +32,7 @@ class translate extends common
|
||||
// Effacer une langue de contenu ou de l'interface
|
||||
'content' => self::GROUP_VISITOR,
|
||||
'update' => self::GROUP_ADMIN,
|
||||
'default' => self::GROUP_ADMIN
|
||||
];
|
||||
|
||||
const PAGINATION = '20';
|
||||
@ -65,39 +69,47 @@ class translate extends common
|
||||
*/
|
||||
public function update()
|
||||
{
|
||||
$lang = $this->getUrl(2);
|
||||
// Jeton incorrect ou URl avec le code langue incorrecte
|
||||
if (
|
||||
$this->getUrl(3) !== $_SESSION['csrf'] &&
|
||||
array_key_exists($lang, self::$languages) === false
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||
) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'translate',
|
||||
'state' => false,
|
||||
'notification' => helper::translate('Action interdite')
|
||||
'access' => false
|
||||
]);
|
||||
} else {
|
||||
$lang = $this->getUrl(2);
|
||||
// Action interdite ou URl avec le code langue incorrecte
|
||||
if (
|
||||
array_key_exists($lang, self::$languages) === false
|
||||
) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'language',
|
||||
'state' => false,
|
||||
'notification' => helper::translate('Action interdite')
|
||||
]);
|
||||
}
|
||||
|
||||
// Télécharger le descripteur en ligne
|
||||
$languageData = helper::getUrlContents(self::ZWII_UI_URL . $lang . '.json');
|
||||
$descripteur = json_decode(helper::getUrlContents(self::ZWII_UI_URL . 'language.json'), true);
|
||||
$success = false;
|
||||
if (
|
||||
$languageData &&
|
||||
is_array($descripteur['language'][$lang])
|
||||
) {
|
||||
if ($this->setData(['language', $lang, $descripteur['language'][$lang]])) {
|
||||
$success = $this->secure_file_put_contents(self::I18N_DIR . $lang . '.json', $languageData);
|
||||
}
|
||||
}
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'language',
|
||||
'notification' => $success ? helper::translate('Copie terminée avec succès') : 'Copie terminée avec des erreurs',
|
||||
'state' => $success
|
||||
]);
|
||||
}
|
||||
|
||||
// Upload et sauver le fichier de langue
|
||||
$response = json_decode(helper::getUrlContents(common::ZWII_UI_URL . $lang . '.json'), true);
|
||||
if ($response !== false) {
|
||||
$response = file_put_contents(self::I18N_DIR . $lang . '.json', json_encode($response, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
|
||||
// Mettre à jour le descripteur
|
||||
$enumsStore = json_decode(helper::getUrlContents(common::ZWII_UI_URL . 'languages.json'), true);
|
||||
$enums = $this->getData(['languages']);
|
||||
$enums = array_merge($enums, [
|
||||
$lang => $enumsStore['languages'][$lang]
|
||||
]);
|
||||
$response = (bool) $response && $this->setData(['languages', $enums]);
|
||||
}
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'translate',
|
||||
'notification' => $response ? helper::translate('Copie terminée avec succès') : 'Copie terminée avec des erreurs',
|
||||
'state' => $response
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -105,9 +117,11 @@ class translate extends common
|
||||
*/
|
||||
public function copy()
|
||||
{
|
||||
|
||||
// Soumission du formulaire
|
||||
if ($this->isPost()) {
|
||||
if (
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||
$this->isPost()
|
||||
) {
|
||||
// Initialisation
|
||||
$success = false;
|
||||
$copyFrom = $this->getInput('translateFormCopySource');
|
||||
@ -168,68 +182,51 @@ class translate extends common
|
||||
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) {
|
||||
// tableau des langues installées
|
||||
if (is_dir(self::DATA_DIR . $key)) {
|
||||
if (self::$i18nUI === $key) {
|
||||
$messageLocale = helper::translate('Langue par défaut');
|
||||
} elseif (isset($_COOKIE['ZWII_CONTENT']) && $_COOKIE['ZWII_CONTENT'] === $key) {
|
||||
$messageLocale = helper::translate('Langue du site sélectionnée');
|
||||
} else {
|
||||
$messageLocale = '';
|
||||
if (
|
||||
file_exists(self::DATA_DIR . $key . '/page.json') &&
|
||||
file_exists(self::DATA_DIR . $key . '/module.json') &&
|
||||
file_exists(self::DATA_DIR . $key . '/locale.json')
|
||||
) {
|
||||
if (file_exists(self::DATA_DIR . $key . '/.default')) {
|
||||
$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 {
|
||||
$messageLocale = '';
|
||||
}
|
||||
self::$languagesInstalled[] = [
|
||||
template::flag($key, '20 %') . ' ' . $value . ' (' . $key . ')',
|
||||
$messageLocale,
|
||||
template::button('translateContentLanguageLocaleEdit' . $key, [
|
||||
'class' => file_exists(self::DATA_DIR . $key . '/locale.json') ? '' : ' disabled',
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/locale/' . $key,
|
||||
'value' => template::ico('pencil'),
|
||||
'help' => 'Éditer'
|
||||
]),
|
||||
template::button('translateContentLanguageLocaleDelete' . $key, [
|
||||
'class' => 'translateDelete buttonRed' . ($messageLocale ? ' disabled' : ''),
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/locale/' . $key,
|
||||
'value' => template::ico('trash'),
|
||||
'help' => 'Supprimer',
|
||||
])
|
||||
];
|
||||
}
|
||||
self::$languagesInstalled[] = [
|
||||
template::flag($key, '20 %') . ' ' . $value . ' (' . $key . ')',
|
||||
$messageLocale,
|
||||
template::button('translateContentLanguageLocaleEdit' . $key, [
|
||||
'class' => file_exists(self::DATA_DIR . $key . '/locale.json') ? '' : ' disabled',
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/locale/' . $key,
|
||||
'value' => template::ico('pencil'),
|
||||
'help' => 'Éditer'
|
||||
]),
|
||||
template::button('translateContentLanguageLocaleDelete' . $key, [
|
||||
'class' => ' buttonRed' . ($messageLocale ? ' disabled' : ''),
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/locale/' . $key . '/' . $_SESSION['csrf'],
|
||||
'value' => template::ico('trash'),
|
||||
'help' => 'Supprimer',
|
||||
])
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
// Activation du bouton de copie
|
||||
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
|
||||
$usersUI = [];
|
||||
@ -239,11 +236,15 @@ class translate extends common
|
||||
}
|
||||
|
||||
// Langues installées
|
||||
$installedUI = $this->getData(['languages']);
|
||||
$installedUI = $this->getData(['language']);
|
||||
|
||||
if (array_key_exists('language', $installedUI)) {
|
||||
$installedUI = $installedUI['language'];
|
||||
}
|
||||
|
||||
// Langues disponibles en ligne
|
||||
$storeUI = json_decode(helper::getUrlContents(common::ZWII_UI_URL . 'languages.json'), true);
|
||||
$storeUI = $storeUI['languages'];
|
||||
$storeUI = json_decode(helper::getUrlContents(self::ZWII_UI_URL . 'language.json'), true);
|
||||
$storeUI = $storeUI ? $storeUI['language'] : null;
|
||||
|
||||
// Construction du tableau à partir des langues disponibles dans le store
|
||||
foreach ($installedUI as $file => $value) {
|
||||
@ -253,26 +254,24 @@ class translate extends common
|
||||
self::$languagesUiInstalled[$file] = [
|
||||
template::flag($file, '20 %') . ' ' . self::$languages[$file],
|
||||
$value['version'],
|
||||
helper::dateUTF8('%d/%m/%Y', $value['date']),
|
||||
helper::dateUTF8('%d/%m/%Y', $value['date'], self::$i18nUI),
|
||||
//self::$i18nUI === $file ? helper::translate('Interface') : '',
|
||||
'',
|
||||
/*
|
||||
template::button('translateContentLanguageUIEdit' . $file, [
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $file,
|
||||
'value' => template::ico('pencil'),
|
||||
'help' => 'Éditer',
|
||||
'disabled' => 'fr_FR' === $file
|
||||
]),
|
||||
*/
|
||||
template::button('translateContentLanguageUIDownload' . $file, [
|
||||
'class' => version_compare($installedUI[$file]['version'], $storeUI[$file]['version']) < 0 ? 'buttonGreen' : '',
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/update/' . $file . '/' . $_SESSION['csrf'],
|
||||
'class' => isset($storeUI[$file]['version']) && version_compare($installedUI[$file]['version'], $storeUI[$file]['version']) < 0 ? 'buttonGreen' : '',
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/update/' . $file,
|
||||
'value' => template::ico('update'),
|
||||
'help' => 'Mettre à jour',
|
||||
'help' => 'Mise à jour',
|
||||
]),
|
||||
template::button('translateContentLanguageUIDelete' . $file, [
|
||||
'class' => 'buttonRed' . (in_array($file, $usersUI) ? ' disabled' : ''),
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/ui/' . $file . '/' . $_SESSION['csrf'],
|
||||
'class' => 'translateDelete buttonRed' . (in_array($file, $usersUI) ? ' disabled' : ''),
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/ui/' . $file,
|
||||
'value' => template::ico('trash'),
|
||||
'help' => 'Supprimer',
|
||||
]),
|
||||
@ -280,29 +279,42 @@ class translate extends common
|
||||
}
|
||||
}
|
||||
// Construction du tableau à partir des langues disponibles dans le store
|
||||
foreach ($storeUI as $file => $value) {
|
||||
if ($storeUI) {
|
||||
foreach ($storeUI as $file => $value) {
|
||||
|
||||
// La langue est-elle installée ?
|
||||
if (array_key_exists($file, $installedUI) === false) {
|
||||
self::$languagesStore[$file] = [
|
||||
template::flag($file, '20 %') . ' ' . self::$languages[$file],
|
||||
$value['version'],
|
||||
helper::dateUTF8('%d/%m/%Y', $value['date']),
|
||||
'',
|
||||
template::button('translateContentLanguageUIDownload' . $file, [
|
||||
'class' => 'buttonGreen',
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/update/' . $file . '/' . $_SESSION['csrf'],
|
||||
'value' => template::ico('shopping-basket'),
|
||||
'help' => 'Installer',
|
||||
])
|
||||
];
|
||||
// La langue est-elle installée ?
|
||||
if (array_key_exists($file, $installedUI) === false) {
|
||||
self::$languagesStore[$file] = [
|
||||
template::flag($file, '20 %') . ' ' . self::$languages[$file],
|
||||
$value['version'],
|
||||
helper::dateUTF8('%d/%m/%Y', $value['date'], self::$i18nUI),
|
||||
'',
|
||||
template::button('translateContentLanguageUIDownload' . $file, [
|
||||
'class' => 'buttonGreen',
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/update/' . $file,
|
||||
'value' => template::ico('shopping-basket'),
|
||||
'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
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Multilingue'),
|
||||
'title' => helper::translate('Langues'),
|
||||
'view' => 'index'
|
||||
]);
|
||||
}
|
||||
@ -316,18 +328,25 @@ class translate extends common
|
||||
{
|
||||
|
||||
// Soumission du formulaire
|
||||
if ($this->isPost()) {
|
||||
if (
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||
$this->isPost()
|
||||
) {
|
||||
|
||||
// Création du contenu
|
||||
$lang = $this->getInput('translateAddContent');
|
||||
|
||||
// Stockage dans un sous-dossier localisé
|
||||
if (!file_exists(self::DATA_DIR . $lang)) {
|
||||
mkdir(self::DATA_DIR . $lang, 0755);
|
||||
}
|
||||
// Constructeur pour cette langue
|
||||
$this->jsonDB($lang);
|
||||
|
||||
// Création du contenu
|
||||
$this->initData('page', $lang);
|
||||
$this->initData('module', $lang);
|
||||
$this->initData('locale', $lang);
|
||||
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'translate',
|
||||
'redirect' => helper::baseUrl() . 'language',
|
||||
'notification' => helper::translate('Modifications enregistrées'),
|
||||
'state' => true
|
||||
]);
|
||||
@ -356,21 +375,24 @@ class translate extends common
|
||||
*/
|
||||
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);
|
||||
if (
|
||||
array_key_exists($lang, self::$languages) === false
|
||||
) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'translate',
|
||||
'redirect' => helper::baseUrl() . 'language',
|
||||
'state' => false,
|
||||
'notification' => helper::translate('Action interdite')
|
||||
]);
|
||||
}
|
||||
|
||||
// Soumission du formulaire
|
||||
if ($this->isPost()) {
|
||||
if (
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||
$this->isPost()
|
||||
) {
|
||||
|
||||
// Sauvegarder les locales
|
||||
$data = [
|
||||
@ -381,6 +403,7 @@ class translate extends common
|
||||
'page302' => $this->getInput('localePage302'),
|
||||
'legalPageId' => $this->getInput('localeLegalPageId'),
|
||||
'searchPageId' => $this->getInput('localeSearchPageId'),
|
||||
'poweredPageLabel' => empty($this->getInput('localePoweredPageLabel', helper::FILTER_STRING_SHORT)) ? 'Motorisé par' : $this->getInput('localePoweredPageLabel', helper::FILTER_STRING_SHORT),
|
||||
'searchPageLabel' => empty($this->getInput('localeSearchPageLabel', helper::FILTER_STRING_SHORT)) ? 'Rechercher' : $this->getInput('localeSearchPageLabel', helper::FILTER_STRING_SHORT),
|
||||
'legalPageLabel' => empty($this->getInput('localeLegalPageLabel', helper::FILTER_STRING_SHORT)) ? 'Mentions légales' : $this->getInput('localeLegalPageLabel', helper::FILTER_STRING_SHORT),
|
||||
'sitemapPageLabel' => empty($this->getInput('localeSitemapPageLabel', helper::FILTER_STRING_SHORT)) ? 'Plan du site' : $this->getInput('localeSitemapPageLabel', helper::FILTER_STRING_SHORT),
|
||||
@ -398,12 +421,12 @@ class translate extends common
|
||||
];
|
||||
|
||||
// Sauvegarde hors méthodes si la langue n'est pas celle de l'UI
|
||||
if ($lang === self::$i18nUI) {
|
||||
if ($lang === self::$siteContent) {
|
||||
// Enregistrer les données par lecture directe du formulaire
|
||||
$this->setData(['locale', $data['locale']]);
|
||||
} else {
|
||||
// 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
|
||||
@ -418,7 +441,7 @@ class translate extends common
|
||||
//-----------------------------------------
|
||||
|
||||
// La locale est-elle celle de la langue de l'UI ?
|
||||
if ($lang === self::$i18nUI) {
|
||||
if ($lang === self::$siteContent) {
|
||||
self::$locales[$lang]['locale'] = $this->getData(['locale']);
|
||||
} else {
|
||||
// Lire les locales sans passer par les méthodes
|
||||
@ -460,19 +483,22 @@ class translate extends common
|
||||
public function edit()
|
||||
{
|
||||
$lang = $this->getUrl(2);
|
||||
// Jeton incorrect ou URl avec le code langue incorrecte
|
||||
// Action interdite ou URl avec le code langue incorrecte
|
||||
if (
|
||||
array_key_exists($lang, self::$languages) === false
|
||||
) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'translate',
|
||||
'redirect' => helper::baseUrl() . 'language',
|
||||
'state' => false,
|
||||
'notification' => helper::translate('Action interdite')
|
||||
]);
|
||||
}
|
||||
// Soumission du formulaire
|
||||
if ($this->isPost()) {
|
||||
if (
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||
$this->isPost()
|
||||
) {
|
||||
|
||||
// Sauvegarder les champs de la langue
|
||||
$data = json_decode(file_get_contents(self::I18N_DIR . $lang . '.json'), true);
|
||||
@ -482,11 +508,11 @@ class translate extends common
|
||||
$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);
|
||||
file_put_contents(self::I18N_DIR . $lang . '.json', json_encode($data));
|
||||
|
||||
// Mettre à jour le descripteur
|
||||
$this->setData([
|
||||
'languages',
|
||||
'language',
|
||||
$lang,
|
||||
[
|
||||
'version' => $this->getInput('translateEditVersion'),
|
||||
@ -497,7 +523,7 @@ class translate extends common
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'notification' => helper::translate('Modifications enregistrées'),
|
||||
'redirect' => helper::baseUrl() . 'translate',
|
||||
'redirect' => helper::baseUrl() . 'language',
|
||||
'state' => true,
|
||||
]);
|
||||
}
|
||||
@ -510,13 +536,18 @@ class translate extends common
|
||||
}
|
||||
|
||||
// Ajout des champs absents selon la langue de référence
|
||||
$dataFr = json_decode(file_get_contents(self::I18N_DIR . 'fr_FR.json'), true);
|
||||
foreach ($dataFr as $key => $value) {
|
||||
if (!array_key_exists($key, $data)) {
|
||||
$data[$key] = '';
|
||||
}
|
||||
}
|
||||
file_put_contents(self::I18N_DIR . $lang . '.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT), LOCK_EX);
|
||||
/*
|
||||
$dataFr = json_decode(file_get_contents(self::I18N_DIR . 'fr_FR.json'), true);
|
||||
foreach ($dataFr as $key => $value) {
|
||||
if (!array_key_exists($key, $data)) {
|
||||
$data[$key] = '';
|
||||
}
|
||||
}
|
||||
file_put_contents(self::I18N_DIR . $lang . '.json', $data);
|
||||
*/
|
||||
|
||||
// Trier le tableau
|
||||
asort($data);
|
||||
|
||||
// Tableau des chaines à traduire dans la langue sélectionnée
|
||||
foreach ($data as $key => $value) {
|
||||
@ -539,7 +570,7 @@ class translate extends common
|
||||
'title' => helper::translate('Éditer les dialogues') . ' ' . template::flag($lang, '20 %'),
|
||||
'view' => 'edit',
|
||||
'vendor' => [
|
||||
'flatpickr',
|
||||
'tablednd'
|
||||
],
|
||||
]);
|
||||
}
|
||||
@ -549,56 +580,105 @@ class translate extends common
|
||||
*/
|
||||
public function delete()
|
||||
{
|
||||
// Jeton incorrect ou URl avec le code langue incorrecte
|
||||
$target = $this->getUrl(2);
|
||||
$lang = $this->getUrl(3);
|
||||
if (
|
||||
$this->getUrl(4) !== $_SESSION['csrf']
|
||||
|| array_key_exists($lang, self::$languages) === false
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||
) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'translate',
|
||||
'state' => false,
|
||||
'notification' => helper::translate('Action interdite')
|
||||
'access' => false
|
||||
]);
|
||||
}
|
||||
switch ($target) {
|
||||
case 'locale':
|
||||
$success = false;
|
||||
// Effacement d'une site dans une langue
|
||||
if (is_dir(self::DATA_DIR . $lang) === true) {
|
||||
$success = $this->removeDir(self::DATA_DIR . $lang);
|
||||
}
|
||||
} 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() . 'translate',
|
||||
'notification' => $success ? helper::translate('Traduction supprimée') : helper::translate('Erreur inconnue'),
|
||||
'state' => $success
|
||||
'redirect' => helper::baseUrl() . 'language',
|
||||
'state' => false,
|
||||
'notification' => helper::translate('Action interdite')
|
||||
]);
|
||||
break;
|
||||
}
|
||||
switch ($target) {
|
||||
case 'locale':
|
||||
$success = false;
|
||||
// Effacement d'une site dans une langue
|
||||
if (is_dir(self::DATA_DIR . $lang) === true) {
|
||||
$success = $this->deleteDir(self::DATA_DIR . $lang);
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'language',
|
||||
'notification' => $success ? helper::translate('Traduction supprimée') : helper::translate('Erreur inconnue'),
|
||||
'state' => $success
|
||||
]);
|
||||
break;
|
||||
|
||||
case 'ui':
|
||||
$success = false;
|
||||
// Effacement d'une langue de l'interface
|
||||
if (file_exists(self::I18N_DIR . $lang . '.json') === true) {
|
||||
$this->deleteData(['languages', $lang]);
|
||||
$success = unlink(self::I18N_DIR . $lang . '.json');
|
||||
}
|
||||
// Effacer la langue dans la base
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'translate',
|
||||
'notification' => $success ? helper::translate('Traduction supprimée') : helper::translate('Erreur inconnue'),
|
||||
'state' => $success
|
||||
]);
|
||||
break;
|
||||
default:
|
||||
# Do nothing
|
||||
break;
|
||||
case 'ui':
|
||||
$success = false;
|
||||
// Effacement d'une langue de l'interface
|
||||
if (file_exists(self::I18N_DIR . $lang . '.json') === true) {
|
||||
$this->deleteData(['language', $lang]);
|
||||
$success = unlink(self::I18N_DIR . $lang . '.json');
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'language',
|
||||
'notification' => $success ? helper::translate('Traduction supprimée') : helper::translate('Erreur inconnue'),
|
||||
'state' => $success
|
||||
]);
|
||||
break;
|
||||
default:
|
||||
# Do nothing
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Modifie la langue du site par défaut
|
||||
*
|
||||
*/
|
||||
public function default()
|
||||
{
|
||||
if (
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||
) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'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,
|
||||
'notification' => helper::translate('Action interdite')
|
||||
]);
|
||||
}
|
||||
|
||||
foreach (self::$languages as $key => $value) {
|
||||
if (file_exists(self::DATA_DIR . $key . '/.default')) {
|
||||
unlink(self::DATA_DIR . $key . '/.default');
|
||||
touch(self::DATA_DIR . $lang . '/.default');
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'notification' => helper::translate('Modifications enregistrées'),
|
||||
'redirect' => helper::baseUrl() . 'language',
|
||||
'state' => true,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Traitement du changement de langue
|
||||
@ -612,25 +692,21 @@ class translate extends common
|
||||
* Changement de la langue si
|
||||
* différe de la langue active
|
||||
* déjà initialisée
|
||||
* fait partie des lnagues installées
|
||||
* fait partie des langues installées
|
||||
*/
|
||||
if (
|
||||
$this->getInput('ZWII_CONTENT') !== $lang
|
||||
&&
|
||||
is_dir(self::DATA_DIR . $lang)
|
||||
&&
|
||||
array_key_exists($lang, self::$languages) === true
|
||||
|
||||
if (
|
||||
is_dir(self::DATA_DIR . $lang) &&
|
||||
array_key_exists($lang, self::$languages) === true
|
||||
) {
|
||||
// Nettoyer le cookie
|
||||
helper::deleteCookie('ZWII_CONTENT');
|
||||
// Stocker le choix
|
||||
setcookie('ZWII_CONTENT', $lang, time() + 3600, helper::baseUrl(false, false), '', true, helper::isHttps());
|
||||
|
||||
// Stocker la sélection
|
||||
$_SESSION['ZWII_SITE_CONTENT'] = $lang;
|
||||
}
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . $this->getData(['locale', $this->getUrl(2), 'homePageId'])
|
||||
'redirect' => helper::baseUrl()
|
||||
]);
|
||||
}
|
||||
|
@ -7,7 +7,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
@ -3,7 +3,7 @@
|
||||
<div class="col1">
|
||||
<?php echo template::button('translateFormBack', [
|
||||
'class' => 'buttonGrey',
|
||||
'href' => helper::baseUrl() . 'translate',
|
||||
'href' => helper::baseUrl() . 'language',
|
||||
'value' => template::ico('left')
|
||||
]); ?>
|
||||
</div>
|
@ -7,7 +7,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
@ -3,7 +3,7 @@
|
||||
<div class="col1">
|
||||
<?php echo template::button('translateFormCopyBack', [
|
||||
'class' => 'buttonGrey',
|
||||
'href' => helper::baseUrl() . 'translate',
|
||||
'href' => helper::baseUrl() . 'language',
|
||||
'value' => template::ico('left')
|
||||
]); ?>
|
||||
</div>
|
@ -7,7 +7,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
@ -3,7 +3,7 @@
|
||||
<div class="col1">
|
||||
<?php echo template::button('translateUIFormBack', [
|
||||
'class' => 'buttonGrey',
|
||||
'href' => helper::baseUrl() . 'translate',
|
||||
'href' => helper::baseUrl() . 'language',
|
||||
'value' => template::ico('left')
|
||||
]); ?>
|
||||
</div>
|
||||
@ -21,14 +21,14 @@
|
||||
<div class="col6">
|
||||
<?php echo template::text('translateEditVersion', [
|
||||
'label' => 'Version n°',
|
||||
'value' => $this->getData(['languages', $this->getUrl(2), 'version'])
|
||||
'value' => $this->getData(['language', $this->getUrl(2), 'version'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col6">
|
||||
<?php echo template::date('translateEditDate', [
|
||||
'label' => 'Date de publication',
|
||||
'type' => 'datetime-local',
|
||||
'value' => $this->getData(['languages', $this->getUrl(2), 'date'])
|
||||
'value' => $this->getData(['language', $this->getUrl(2), 'date'])
|
||||
]); ?>
|
||||
</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>
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
@ -6,7 +6,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
@ -52,7 +52,7 @@ $("#translateContentButton").on("click", function() {
|
||||
*/
|
||||
$(".translateDelete").on("click", function() {
|
||||
var _this = $(this);
|
||||
var message_delete = "<?php echo helper::translate('Confirmer la suppression de cette traduction du site'); ?>";
|
||||
var message_delete = "<?php echo helper::translate('Confirmer la suppression de cette langue'); ?>";
|
||||
return core.confirm(message_delete, function() {
|
||||
$(location).attr("href", _this.attr("href"));
|
||||
});
|
@ -4,7 +4,7 @@
|
||||
<?php echo template::button('translateFormBack', [
|
||||
'class' => 'buttonGrey',
|
||||
'href' => helper::baseUrl(),
|
||||
'value' => template::ico('left')
|
||||
'value' => template::ico('home')
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col1">
|
||||
@ -16,7 +16,6 @@
|
||||
'help' => 'Consulter l\'aide en ligne'
|
||||
]);*/?>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="tab">
|
||||
@ -38,7 +37,7 @@
|
||||
<?php echo helper::translate('Langues installées'); ?>
|
||||
</h4>
|
||||
<?php if ($module::$languagesUiInstalled): ?>
|
||||
<?php echo template::table([2, 1, 1, 5, 1, 1], $module::$languagesUiInstalled, ['Langues', 'Version', 'Date', '', '', '']); ?>
|
||||
<?php echo template::table([2, 1, 1, 4, 1, 1, 1], $module::$languagesUiInstalled, ['Langues', 'Version', 'Date', '', '', '', '']); ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
@ -65,7 +64,7 @@
|
||||
</h4>
|
||||
<div class="col4 offset2">
|
||||
<?php echo template::button('translateButtonCopyContent', [
|
||||
'href' => helper::baseUrl() . 'translate/copy',
|
||||
'href' => helper::baseUrl() . 'language/copy',
|
||||
'ico' => 'docs',
|
||||
'disabled' => $module::$siteCopy,
|
||||
'value' => 'Copie de contenus localisés'
|
||||
@ -73,7 +72,7 @@
|
||||
</div>
|
||||
<div class="col4">
|
||||
<?php echo template::button('translateButtonAddContent', [
|
||||
'href' => helper::baseUrl() . 'translate/add',
|
||||
'href' => helper::baseUrl() . 'language/add',
|
||||
'ico' => 'plus',
|
||||
'class' => 'buttonGreen',
|
||||
'value' => 'Nouveau contenu localisé'
|
@ -7,7 +7,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
@ -3,7 +3,7 @@
|
||||
<div class="col1">
|
||||
<?php echo template::button('translateFormBack', [
|
||||
'class' => 'buttonGrey',
|
||||
'href' => helper::baseUrl() . 'translate',
|
||||
'href' => helper::baseUrl() . 'language',
|
||||
'value' => template::ico('left')
|
||||
]); ?>
|
||||
</div>
|
||||
@ -107,20 +107,27 @@
|
||||
<div class="block">
|
||||
<h4><?php echo helper::translate('Étiquettes des pages spéciales'); ?>
|
||||
<!--<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']); ?>
|
||||
</a>
|
||||
</span>-->
|
||||
</h4>
|
||||
<div class="row">
|
||||
<div class="col6">
|
||||
<div class="col4">
|
||||
<?php echo template::text('localePoweredPageLabel', [
|
||||
'label' => 'Motorisé par',
|
||||
'placeholder' => 'Motorisé par',
|
||||
'value' => $module::$locales[$this->getUrl(2)]['locale']['poweredPageLabel']
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col4">
|
||||
<?php echo template::text('localeLegalPageLabel', [
|
||||
'label' => 'Mentions légales',
|
||||
'placeholder' => 'Mentions légales',
|
||||
'value' => $module::$locales[$this->getUrl(2)]['locale']['legalPageLabel']
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col6">
|
||||
<div class="col4">
|
||||
<?php echo template::text('localeSearchPageLabel', [
|
||||
'label' => 'Rechercher',
|
||||
'placeholder' => 'Rechercher',
|
||||
@ -129,14 +136,14 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col6">
|
||||
<div class="col4 offset2">
|
||||
<?php echo template::text('localeSitemapPageLabel', [
|
||||
'label' => 'Plan du site',
|
||||
'placeholder' => 'Plan du site',
|
||||
'value' => $module::$locales[$this->getUrl(2)]['locale']['sitemapPageLabel'],
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col6">
|
||||
<div class="col4">
|
||||
<?php echo template::text('localeCookiesFooterText', [
|
||||
'label' => 'Cookies',
|
||||
'value' => $module::$locales[$this->getUrl(2)]['locale']['cookies']['cookiesFooterText'],
|
@ -8,7 +8,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
@ -41,7 +41,7 @@ class maintenance extends common
|
||||
? ''
|
||||
: $this->getData(['page', $this->getData(['locale', 'page302']), 'title']),
|
||||
//'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'
|
||||
]);
|
||||
} else {
|
||||
|
@ -9,7 +9,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
@ -18,12 +18,13 @@ class page extends common
|
||||
{
|
||||
|
||||
public static $actions = [
|
||||
'add' => self::GROUP_MODERATOR,
|
||||
'delete' => self::GROUP_MODERATOR,
|
||||
'edit' => self::GROUP_MODERATOR,
|
||||
'duplicate' => self::GROUP_MODERATOR,
|
||||
'jsEditor' => self::GROUP_MODERATOR,
|
||||
'cssEditor' => self::GROUP_MODERATOR
|
||||
'add' => self::GROUP_EDITOR,
|
||||
'delete' => self::GROUP_EDITOR,
|
||||
'edit' => self::GROUP_EDITOR,
|
||||
'duplicate' => self::GROUP_EDITOR,
|
||||
'jsEditor' => self::GROUP_EDITOR,
|
||||
'cssEditor' => self::GROUP_EDITOR,
|
||||
'register' => self::GROUP_EDITOR,
|
||||
];
|
||||
public static $pagesNoParentId = [
|
||||
'' => 'Aucune'
|
||||
@ -65,62 +66,77 @@ class page extends common
|
||||
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
|
||||
*/
|
||||
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
|
||||
$url = explode('&', $this->getUrl(2));
|
||||
$page = $this->getUrl(2);
|
||||
|
||||
// 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
|
||||
$this->addOutput([
|
||||
'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')
|
||||
]);
|
||||
}
|
||||
// Duplication de la page
|
||||
$pageTitle = $this->getData(['page', $url[0], 'title']);
|
||||
$pageId = helper::increment(helper::filter($pageTitle, helper::FILTER_ID), $this->getData(['page']));
|
||||
$pageId = helper::increment($pageId, self::$coreModuleIds);
|
||||
$pageId = helper::increment($pageId, self::$moduleIds);
|
||||
$data = $this->getData([
|
||||
'page',
|
||||
$url[0]
|
||||
]);
|
||||
// Ecriture
|
||||
$this->setData(['page', $pageId, $data]);
|
||||
$notification = helper::translate('Page dupliquée');
|
||||
// Duplication du module présent
|
||||
if ($this->getData(['page', $url[0], 'moduleId'])) {
|
||||
} else {
|
||||
// Duplication de la page
|
||||
$pageTitle = $this->getData(['page', $page, 'title']);
|
||||
$pageId = helper::increment(helper::filter($pageTitle, helper::FILTER_ID), $this->getData(['page']));
|
||||
$pageId = helper::increment($pageId, self::$coreModuleIds);
|
||||
$pageId = helper::increment($pageId, self::$moduleIds);
|
||||
$data = $this->getData([
|
||||
'module',
|
||||
$url[0]
|
||||
'page',
|
||||
$page
|
||||
]);
|
||||
// Ecriture
|
||||
$this->setData(['module', $pageId, $data]);
|
||||
$notification = helper::translate('Page et module dupliqués');
|
||||
$this->setData(['page', $pageId, $data], false);
|
||||
$notification = helper::translate('Page dupliquée');
|
||||
// Duplication du module présent
|
||||
if ($this->getData(['page', $page, 'moduleId'])) {
|
||||
$data = $this->getData(['module', $page]);
|
||||
$this->setData(['module', $pageId, $data], false);
|
||||
$notification = helper::translate('Page et module dupliqués');
|
||||
}
|
||||
// Force la sauvegarde
|
||||
$this->saveDB('page');
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'page/edit/' . $pageId . '/' . self::$siteContent,
|
||||
'notification' => $notification,
|
||||
'state' => true
|
||||
]);
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'page/edit/' . $pageId,
|
||||
'notification' => $notification,
|
||||
'state' => true
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@ -129,55 +145,76 @@ class page extends common
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
$pageTitle = 'Nouvelle page';
|
||||
$pageId = helper::increment(helper::filter($pageTitle, helper::FILTER_ID), $this->getData(['page']));
|
||||
$this->setData([
|
||||
'page',
|
||||
$pageId,
|
||||
[
|
||||
'typeMenu' => 'text',
|
||||
'iconUrl' => '',
|
||||
'disable' => false,
|
||||
'content' => $pageId . '.html',
|
||||
'hideTitle' => false,
|
||||
'breadCrumb' => false,
|
||||
'metaDescription' => '',
|
||||
'metaTitle' => '',
|
||||
'moduleId' => '',
|
||||
'parentPageId' => '',
|
||||
'modulePosition' => 'bottom',
|
||||
'position' => 0,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'targetBlank' => false,
|
||||
'title' => $pageTitle,
|
||||
'shortTitle' => $pageTitle,
|
||||
'block' => '12',
|
||||
'barLeft' => '',
|
||||
'barRight' => '',
|
||||
'displayMenu' => '0',
|
||||
'hideMenuSide' => false,
|
||||
'hideMenuHead' => false,
|
||||
'hideMenuChildren' => false,
|
||||
'js' => '',
|
||||
'css' => ''
|
||||
]
|
||||
]);
|
||||
// Creation du contenu de la page
|
||||
if (!is_dir(self::DATA_DIR . self::$i18nContent . '/content')) {
|
||||
mkdir(self::DATA_DIR . self::$i18nContent . '/content', 0755);
|
||||
// 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();
|
||||
}
|
||||
//file_put_contents(self::DATA_DIR . self::$i18nContent . '/content/' . $pageId . '.html', '<p>Contenu de votre nouvelle page.</p>');
|
||||
$this->setPage($pageId, '<p>Contenu de votre nouvelle page.</p>', self::$i18nContent);
|
||||
// Met à jour le site map
|
||||
$this->createSitemap('all');
|
||||
// Mise à jour de la liste des pages pour TinyMCE
|
||||
$this->listPages();
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . $pageId,
|
||||
'notification' => helper::translate('Nouvelle page créée'),
|
||||
'state' => true
|
||||
]);
|
||||
|
||||
if ($this->getUser('permission', __CLASS__, __FUNCTION__) !== true) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'access' => false
|
||||
]);
|
||||
} else {
|
||||
$pageTitle = 'Nouvelle page';
|
||||
$pageId = helper::increment(helper::filter($pageTitle, helper::FILTER_ID), $this->getData(['page']));
|
||||
$this->setData([
|
||||
'page',
|
||||
$pageId,
|
||||
[
|
||||
'typeMenu' => 'text',
|
||||
'iconUrl' => '',
|
||||
'disable' => false,
|
||||
'content' => $pageId . '.html',
|
||||
'hideTitle' => false,
|
||||
'breadCrumb' => false,
|
||||
'metaDescription' => '',
|
||||
'metaTitle' => '',
|
||||
'moduleId' => '',
|
||||
'parentPageId' => '',
|
||||
'modulePosition' => 'bottom',
|
||||
'position' => 0,
|
||||
'group' => self::GROUP_VISITOR,
|
||||
'targetBlank' => false,
|
||||
'title' => $pageTitle,
|
||||
'shortTitle' => $pageTitle,
|
||||
'block' => '12',
|
||||
'barLeft' => '',
|
||||
'barRight' => '',
|
||||
'navLeft' => 'none',
|
||||
'navRight' => 'none',
|
||||
'navTemplate' => 'dir',
|
||||
'displayMenu' => '0',
|
||||
'hideMenuSide' => false,
|
||||
'hideMenuHead' => false,
|
||||
'hideMenuChildren' => false,
|
||||
'js' => '',
|
||||
'css' => ''
|
||||
]
|
||||
]);
|
||||
// Creation du contenu de la page
|
||||
if (!is_dir(self::DATA_DIR . self::$siteContent . '/content')) {
|
||||
mkdir(self::DATA_DIR . self::$siteContent . '/content', 0755);
|
||||
}
|
||||
//$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::$siteContent);
|
||||
|
||||
// Ne met à jour le sitemap pour éviter un warning, de toute manière la nouvelle page doit être éditée.
|
||||
// $this->updateSitemap();
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . $pageId,
|
||||
'notification' => helper::translate('Nouvelle page créée'),
|
||||
'state' => true
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -185,120 +222,105 @@ class page extends common
|
||||
*/
|
||||
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 = explode('&', $this->getUrl(2));
|
||||
$page = $this->getUrl(2);
|
||||
// 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
|
||||
$this->addOutput([
|
||||
'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
|
||||
elseif ($url[0] === $this->getData(['locale', 'homePageId'])) {
|
||||
elseif ($page === $this->getData(['locale', 'homePageId'])) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'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
|
||||
elseif ($url[0] === $this->getData(['locale', 'searchPageId'])) {
|
||||
// Impossible de supprimer la page affectée
|
||||
elseif ($page === $this->getData(['locale', 'searchPageId'])) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'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
|
||||
elseif ($url[0] === $this->getData(['locale', 'legalPageId'])) {
|
||||
// Impossible de supprimer la page affectée
|
||||
elseif ($page === $this->getData(['locale', 'legalPageId'])) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'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
|
||||
elseif ($url[0] === $this->getData(['locale', 'page404'])) {
|
||||
// Impossible de supprimer la page affectée
|
||||
elseif ($page === $this->getData(['locale', 'page404'])) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'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
|
||||
elseif ($url[0] === $this->getData(['locale', 'page403'])) {
|
||||
// Impossible de supprimer la page affectée
|
||||
elseif ($page === $this->getData(['locale', 'page403'])) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'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
|
||||
elseif ($url[0] === $this->getData(['locale', 'page302'])) {
|
||||
// Impossible de supprimer la page affectée
|
||||
elseif ($page === $this->getData(['locale', 'page302'])) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'config',
|
||||
'notification' => helper::translate('Suppression interdite, page active dans la configuration 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')
|
||||
'notification' => helper::translate('Suppression interdite, page active dans la configuration de la langue du site')
|
||||
]);
|
||||
}
|
||||
// Impossible de supprimer une page contenant des enfants
|
||||
elseif ($this->getHierarchy($url[0], null)) {
|
||||
elseif ($this->getHierarchy($page, null)) {
|
||||
// Valeurs en sortie
|
||||
$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')
|
||||
]);
|
||||
}
|
||||
// Suppression
|
||||
else {
|
||||
|
||||
// Effacer le dossier du module
|
||||
$moduleId = $this->getData(['page', $url[0], 'moduleId']);
|
||||
$moduleId = $this->getData(['page', $page, 'moduleId']);
|
||||
$modulesData = helper::getModules();
|
||||
if (
|
||||
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
|
||||
$this->deleteData(['page', $url[0]]);
|
||||
if (file_exists(self::DATA_DIR . self::$i18nContent . '/content/' . $url[0] . '.html')) {
|
||||
unlink(self::DATA_DIR . self::$i18nContent . '/content/' . $url[0] . '.html');
|
||||
$this->deleteData(['page', $page]);
|
||||
if (file_exists(self::DATA_DIR . self::$siteContent . '/content/' . $page . '.html')) {
|
||||
unlink(self::DATA_DIR . self::$siteContent . '/content/' . $page . '.html');
|
||||
}
|
||||
$this->deleteData(['module', $url[0]]);
|
||||
// Met à jour le site map
|
||||
$this->createSitemap('all');
|
||||
// Mise à jour de la liste des pages pour TinyMCE
|
||||
$this->listPages();
|
||||
$this->deleteData(['module', $page]);
|
||||
|
||||
// Met à jour le sitemap
|
||||
$this->updateSitemap();
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl(false),
|
||||
@ -314,8 +336,22 @@ class page extends common
|
||||
*/
|
||||
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
|
||||
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
|
||||
$this->addOutput([
|
||||
'access' => false
|
||||
@ -324,7 +360,10 @@ class page extends common
|
||||
// La page existe
|
||||
else {
|
||||
// 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
|
||||
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é
|
||||
@ -345,11 +384,13 @@ class page extends common
|
||||
$pageId = helper::increment($pageId, self::$moduleIds);
|
||||
// Met à jour les enfants
|
||||
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
|
||||
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)]);
|
||||
// Renommer le dossier du module
|
||||
$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
|
||||
mkdir($modulesData[$moduleId]['dataDirectory'] . $pageId, 0755);
|
||||
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
|
||||
$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
|
||||
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
|
||||
if ($pageId !== $this->getUrl(2)) {
|
||||
$this->deleteData(['page', $this->getUrl(2)]);
|
||||
if (file_exists(self::DATA_DIR . self::$i18nContent . '/content/' . $this->getUrl(2) . '.html')) {
|
||||
unlink(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::$siteContent . '/content/' . $this->getUrl(2) . '.html');
|
||||
}
|
||||
}
|
||||
// Traitement des pages spéciales affectées dans la config :
|
||||
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'])) {
|
||||
$this->setData(['locale', 'searchPageId', $pageId]);
|
||||
$this->setData(['locale', 'searchPageId', $pageId], false);
|
||||
}
|
||||
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'])) {
|
||||
$this->setData(['locale', 'page403', $pageId]);
|
||||
$this->setData(['locale', 'page403', $pageId], false);
|
||||
}
|
||||
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
|
||||
$lastPosition = 1;
|
||||
$hierarchy = $this->getInput('pageEditParentPageId') ? $this->getHierarchy($this->getInput('pageEditParentPageId')) : array_keys($this->getHierarchy());
|
||||
@ -413,7 +458,7 @@ class page extends common
|
||||
$lastPosition++;
|
||||
}
|
||||
// Change la position
|
||||
$this->setData(['page', $hierarchyPageId, 'position', $lastPosition]);
|
||||
$this->setData(['page', $hierarchyPageId, 'position', $lastPosition], false);
|
||||
// Incrémente pour la prochaine position
|
||||
$lastPosition++;
|
||||
}
|
||||
@ -438,30 +483,44 @@ class page extends common
|
||||
) {
|
||||
foreach ($this->getHierarchy($pageId) as $parentId => $childId) {
|
||||
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
|
||||
if ($this->getinput('pageEditBlock') === 'bar') {
|
||||
foreach ($this->getHierarchy() as $eachPageId => $parentId) {
|
||||
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)) {
|
||||
$this->setData(['page', $eachPageId, 'barLeft', $pageId]);
|
||||
$this->setData(['page', $eachPageId, 'barLeft', $pageId], false);
|
||||
}
|
||||
foreach ($parentId as $childId) {
|
||||
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)) {
|
||||
$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é
|
||||
$this->setData([
|
||||
@ -480,13 +539,17 @@ class page extends common
|
||||
'modulePosition' => $this->getInput('pageModulePosition'),
|
||||
'parentPageId' => $this->getInput('pageEditParentPageId'),
|
||||
'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),
|
||||
'title' => $this->getInput('pageEditTitle', helper::FILTER_STRING_SHORT),
|
||||
'shortTitle' => $this->getInput('pageEditShortTitle', helper::FILTER_STRING_SHORT, true),
|
||||
'block' => $this->getinput('pageEditBlock'),
|
||||
'barLeft' => $barLeft,
|
||||
'barRight' => $barRight,
|
||||
'navLeft' => $this->getInput('pageEditNavLeft'),
|
||||
'navRight' => $this->getInput('pageEditNavRight'),
|
||||
'navTemplate' => $this->getInput('pageEditNavTemplate'),
|
||||
'displayMenu' => $this->getinput('pageEditDisplayMenu'),
|
||||
'hideMenuSide' => $this->getinput('pageEditHideMenuSide', helper::FILTER_BOOLEAN),
|
||||
'hideMenuHead' => $this->getinput('pageEditHideMenuHead', helper::FILTER_BOOLEAN),
|
||||
@ -498,16 +561,14 @@ class page extends common
|
||||
]);
|
||||
|
||||
// Creation du contenu de la page
|
||||
if (!is_dir(self::DATA_DIR . self::$i18nContent . '/content')) {
|
||||
mkdir(self::DATA_DIR . self::$i18nContent . '/content', 0755);
|
||||
if (!is_dir(self::DATA_DIR . self::$siteContent . '/content')) {
|
||||
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));
|
||||
$this->setPage($pageId, $content, self::$i18nContent);
|
||||
$this->setPage($pageId, $content, self::$siteContent);
|
||||
|
||||
// Met à jour le site map
|
||||
$this->createSitemap('all');
|
||||
// Mise à jour de la liste des pages pour TinyMCE
|
||||
$this->listPages();
|
||||
// Met à jour le sitemap
|
||||
$this->updateSitemap();
|
||||
|
||||
// Redirection vers la configuration
|
||||
if (
|
||||
@ -531,6 +592,9 @@ class page extends common
|
||||
}
|
||||
// Construction du formulaire
|
||||
|
||||
// Met à jour le sitemap
|
||||
$this->updateSitemap();
|
||||
|
||||
// Création du sélecteur de modules
|
||||
self::$moduleIds = [];
|
||||
foreach (helper::getModules() as $key => $values) {
|
||||
@ -553,13 +617,20 @@ class page extends common
|
||||
self::$pagesBarId[$parentPageId] = $this->getData(['page', $parentPageId, 'title']);
|
||||
}
|
||||
}
|
||||
|
||||
// Met à jour le site map
|
||||
$this->createSitemap('all');
|
||||
|
||||
// Mise à jour de la liste des pages pour TinyMCE
|
||||
$this->listPages();
|
||||
|
||||
// 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
|
||||
$this->addOutput([
|
||||
'title' => $this->getData(['page', $this->getUrl(2), 'title']),
|
||||
@ -577,18 +648,22 @@ class page extends common
|
||||
public function cssEditor()
|
||||
{
|
||||
// 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);
|
||||
// Enregistre le CSS
|
||||
$this->setData([
|
||||
'page', $this->getUrl(2),
|
||||
'page',
|
||||
$this->getUrl(2),
|
||||
'css',
|
||||
$css
|
||||
]);
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'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
|
||||
]);
|
||||
}
|
||||
@ -608,18 +683,22 @@ class page extends common
|
||||
public function jsEditor()
|
||||
{
|
||||
// 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);
|
||||
// Enregistre le JS
|
||||
$this->setData([
|
||||
'page', $this->getUrl(2),
|
||||
'page',
|
||||
$this->getUrl(2),
|
||||
'js',
|
||||
$js
|
||||
]);
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'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
|
||||
]);
|
||||
}
|
||||
@ -632,4 +711,39 @@ class page extends common
|
||||
'view' => 'jsEditor'
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 string tableau associatif des pages dans le menu
|
||||
*/
|
||||
public function getPageInfo()
|
||||
{
|
||||
$p = $this->getData(['page']);
|
||||
$d = array_map(function ($d) {
|
||||
unset($d["css"], $d["js"]);
|
||||
return $d;
|
||||
}, $p);
|
||||
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>
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
@ -3,7 +3,7 @@
|
||||
<div class="col1">
|
||||
<?php echo template::button('pageCssEditorBack', [
|
||||
'class' => 'buttonGrey',
|
||||
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2),
|
||||
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent,
|
||||
'value' => template::ico('left')
|
||||
]); ?>
|
||||
</div>
|
||||
|
@ -7,7 +7,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
@ -44,3 +44,7 @@
|
||||
background-color: #00BFFF;
|
||||
}
|
||||
|
||||
#pageEditProfil1Wrapper,
|
||||
#pageEditProfil2Wrapper {
|
||||
padding: 0;
|
||||
}
|
@ -7,7 +7,7 @@
|
||||
* @author Rémi Jean <remi.jean@outlook.com>
|
||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||
* @authorFrédéric Tempez <frederic.tempez@outlook.com>
|
||||
* @copyright Copyright (C) 2018-2023, Frédéric Tempez
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
@ -15,7 +15,7 @@
|
||||
/**
|
||||
* Confirmation de suppression
|
||||
*/
|
||||
$("#pageEditDelete").on("click", function() {
|
||||
$("#pageEditDelete").on("click", function() {
|
||||
var _this = $(this);
|
||||
var message_delete = "<?php echo helper::translate('Confirmer la suppression de la page'); ?>";
|
||||
return core.confirm(message_delete, function() {
|
||||
@ -54,19 +54,32 @@ function protectModule() {
|
||||
*/
|
||||
$( 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
|
||||
*/
|
||||
var pageLayout = getCookie("pageLayout");
|
||||
if (pageLayout == null) {
|
||||
var pageLayout = "<?php echo $this->getData(['user', $this->getUser('id'), 'view', 'page']);?>";
|
||||
|
||||
// Non défini, valeur par défaut
|
||||
if (pageLayout == "") {
|
||||
pageLayout = "content";
|
||||
setCookie("pageLayout", "content");
|
||||
}
|
||||
// Tout cacher
|
||||
$("#pageEditContentContainer").hide();
|
||||
$("#pageEditExtensionContainer").hide();
|
||||
$("#pageEditPositionContainer").hide();
|
||||
$("#pageEditLayoutContainer").hide();
|
||||
$("#pageEditPermissionContainer").hide();
|
||||
// Afficher la bonne tab
|
||||
$("#pageEdit" + capitalizeFirstLetter(pageLayout) + "Container").show();
|
||||
$("#pageEdit" + capitalizeFirstLetter(pageLayout) + "Button").addClass("activeButton");
|
||||
|
||||
@ -183,6 +196,7 @@ $( document ).ready(function() {
|
||||
$("#pageEditSeoWrapper").slideUp();
|
||||
$("#pageEditAdvancedWrapper").removeClass("disabled");
|
||||
$("#pageEditAdvancedWrapper").slideUp();
|
||||
$(".navSelect").slideUp();
|
||||
/*
|
||||
$("#pageEditBlockLayout").removeClass("col6");
|
||||
$("#pageEditBlockLayout").addClass("col12");
|
||||
@ -284,7 +298,6 @@ $( document ).ready(function() {
|
||||
$("#PageEditPositionButton").removeClass("activeButton");
|
||||
$("#pageEditLayoutButton").removeClass("activeButton");
|
||||
$("#pageEditPermissionButton").removeClass("activeButton");
|
||||
setCookie("pageLayout", "content");
|
||||
});
|
||||
$("#pageEditExtensionButton").on("click", function () {
|
||||
$("#pageEditContentContainer").hide();
|
||||
@ -297,7 +310,6 @@ $( document ).ready(function() {
|
||||
$("#PageEditPositionButton").removeClass("activeButton");
|
||||
$("#pageEditLayoutButton").removeClass("activeButton");
|
||||
$("#pageEditPermissionButton").removeClass("activeButton");
|
||||
setCookie("pageLayout", "extension");
|
||||
});
|
||||
$("#PageEditPositionButton").on("click", function () {
|
||||
$("#pageEditContentContainer").hide();
|
||||
@ -310,7 +322,6 @@ $( document ).ready(function() {
|
||||
$("#PageEditPositionButton").addClass("activeButton");
|
||||
$("#pageEditLayoutButton").removeClass("activeButton");
|
||||
$("#pageEditPermissionButton").removeClass("activeButton");
|
||||
setCookie("pageLayout", "position");
|
||||
});
|
||||
$("#pageEditLayoutButton").on("click", function () {
|
||||
$("#pageEditContentContainer").hide();
|
||||
@ -323,7 +334,6 @@ $( document ).ready(function() {
|
||||
$("#PageEditPositionButton").removeClass("activeButton");
|
||||
$("#pageEditLayoutButton").addClass("activeButton");
|
||||
$("#pageEditPermissionButton").removeClass("activeButton");
|
||||
setCookie("pageLayout", "layout");
|
||||
});
|
||||
$("#pageEditPermissionButton").on("click", function () {
|
||||
$("#pageEditContentContainer").hide();
|
||||
@ -336,7 +346,6 @@ $( document ).ready(function() {
|
||||
$("#pageEditPositionButton").removeClass("activeButton");
|
||||
$("#pageEditLayoutButton").removeClass("activeButton");
|
||||
$("#pageEditPermissionButton").addClass("activeButton");
|
||||
setCookie("pageLayout", "permission");
|
||||
});
|
||||
|
||||
/**
|
||||
@ -499,6 +508,7 @@ pageEditBlockDOM.on("change", function() {
|
||||
$("#pageEditModuleConfig").slideUp();
|
||||
$("#pageEditDisplayMenuWrapper").addClass("disabled");
|
||||
$("#pageEditDisplayMenuWrapper").slideDown();
|
||||
$(".navSelect").slideUp();
|
||||
/*
|
||||
$("#pageEditBlockLayout").removeClass("col6");
|
||||
$("#pageEditBlockLayout").addClass("col12");
|
||||
@ -519,6 +529,7 @@ pageEditBlockDOM.on("change", function() {
|
||||
$("#pageEditModuleConfig").slideDown();
|
||||
$("#pageEditDisplayMenuWrapper").removeClass("disabled");
|
||||
$("#pageEditDisplayMenuWrapper").slideUp();
|
||||
$(".navSelect").slideDown();
|
||||
if ($("#pageEditParentPageId").val() !== "") {
|
||||
$("#pageEditbreadCrumbWrapper").addClass("disabled");
|
||||
$("#pageEditbreadCrumbWrapper").slideDown();
|
||||
@ -644,7 +655,7 @@ $("#pageEditParentPageId").on("change", function() {
|
||||
|
||||
function buildPagesList(extraPosition) {
|
||||
var hierarchy = <?php echo json_encode($this->getHierarchy()); ?>;
|
||||
var pages = <?php echo json_encode($this->getData(['page'])); ?>;
|
||||
var pages = <?php echo $module->getPageInfo(); ?>;
|
||||
var positionInitial = <?php echo $this->getData(['page',$this->getUrl(2),"position"]); ?>;
|
||||
var extraPosition = $("#pageEditExtraPosition").val();
|
||||
var positionDOM = $("#pageEditPosition");
|
||||
@ -709,30 +720,6 @@ function buildPagesList(extraPosition) {
|
||||
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
|
||||
function capitalizeFirstLetter(string) {
|
||||
return string.charAt(0).toUpperCase() + string.slice(1);
|
||||
|
@ -1,34 +1,23 @@
|
||||
<?php echo template::formOpen('pageEditForm'); ?>
|
||||
<div class="row">
|
||||
<div class="col1">
|
||||
<?php $href = helper::baseUrl() . $this->getUrl(2); ?>
|
||||
<?php if ($this->getData(['page', $this->getUrl(2), 'moduleId']) === 'redirection' || 'code') $href = helper::baseUrl(); ?>
|
||||
<?php echo template::button('pageEditBack', [
|
||||
<?php echo template::button('configModulesBack', [
|
||||
'class' => 'buttonGrey',
|
||||
'href' => $href,
|
||||
'value' => template::ico('home')
|
||||
'href' => helper::baseUrl() . $this->getUrl(2),
|
||||
'value' => template::ico('left')
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col1">
|
||||
<?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">
|
||||
<div class="col1 offset7">
|
||||
<?php echo template::button('pageEditDelete', [
|
||||
'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'),
|
||||
'help' => 'Effacer la page'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col1">
|
||||
<?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'),
|
||||
'help' => 'Dupliquer la page'
|
||||
]); ?>
|
||||
@ -39,27 +28,31 @@
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tab">
|
||||
<?php echo template::button('pageEditContentButton', [
|
||||
'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',
|
||||
'class' => 'buttonTab'
|
||||
'class' => 'buttonTab',
|
||||
'href' => helper::baseUrl() . 'page/register/position/' . $this->geturl(2)
|
||||
]); ?>
|
||||
<?php echo template::button('pageEditExtensionButton', [
|
||||
'value' => 'Extension',
|
||||
'class' => 'buttonTab'
|
||||
'class' => 'buttonTab',
|
||||
'href' => helper::baseUrl() . 'page/register/extension/' . $this->geturl(2)
|
||||
]); ?>
|
||||
<?php echo template::button('pageEditLayoutButton', [
|
||||
'value' => 'Mise en page',
|
||||
'class' => 'buttonTab'
|
||||
'class' => 'buttonTab',
|
||||
'href' => helper::baseUrl() . 'page/register/layout/' . $this->geturl(2)
|
||||
]); ?>
|
||||
<?php echo template::button('pageEditPermissionButton', [
|
||||
'value' => 'Permission',
|
||||
'class' => 'buttonTab'
|
||||
'class' => 'buttonTab',
|
||||
'href' => helper::baseUrl() . 'page/register/permission/' . $this->geturl(2)
|
||||
]); ?>
|
||||
</div>
|
||||
|
||||
@ -67,12 +60,8 @@
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<h4><?php echo helper::translate('Titres'); ?>
|
||||
<!--<span id="infoHelpButton" class="helpDisplayButton">
|
||||
<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>
|
||||
<?php echo helper::translate('Titres'); ?>
|
||||
</h4>
|
||||
<div class="row">
|
||||
<div class="col8">
|
||||
@ -109,7 +98,7 @@
|
||||
<div class="col12">
|
||||
<?php echo template::textarea('pageEditContent', [
|
||||
'class' => 'editorWysiwyg',
|
||||
'value' => $this->getPage($this->getUrl(2), self::$i18nContent)
|
||||
'value' => $this->getPage($this->getUrl(2), self::$siteContent)
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
@ -119,12 +108,8 @@
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<h4><?php echo helper::translate('Emplacement dans le menu'); ?>
|
||||
<!--<span id="positionHelpButton" class="helpDisplayButton">
|
||||
<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>
|
||||
<?php echo helper::translate('Emplacement dans le menu'); ?>
|
||||
</h4>
|
||||
<div class="blockContainer">
|
||||
<div class="row">
|
||||
@ -135,11 +120,11 @@
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col4">
|
||||
<?php if ($this->getHierarchy($this->getUrl(2), false)) : ?>
|
||||
<?php if ($this->getHierarchy($this->getUrl(2), false)): ?>
|
||||
<?php echo template::hidden('pageEditParentPageId', [
|
||||
'value' => $this->getData(['page', $this->getUrl(2), 'parentPageId'])
|
||||
]); ?>
|
||||
<?php else : ?>
|
||||
<?php else: ?>
|
||||
<?php echo template::select('pageEditParentPageId', $module::$pagesNoParentId, [
|
||||
'label' => 'Page parent',
|
||||
'selected' => $this->getData(['page', $this->getUrl(2), 'parentPageId'])
|
||||
@ -174,12 +159,8 @@
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<h4><?php echo helper::translate('Options avancées'); ?>
|
||||
<!--<span id="advancedHelpButton" class="helpDisplayButton">
|
||||
<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>
|
||||
<?php echo helper::translate('Options avancées'); ?>
|
||||
</h4>
|
||||
<div class="blockContainer">
|
||||
<div class="row">
|
||||
@ -194,7 +175,8 @@
|
||||
'help' => 'Sélectionnez une image ou une icône de petite dimension',
|
||||
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
|
||||
'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>
|
||||
@ -221,7 +203,8 @@
|
||||
<div class="row">
|
||||
<div class="col6">
|
||||
<div class="block">
|
||||
<h4><?php echo helper::translate('Module'); ?>
|
||||
<h4>
|
||||
<?php echo helper::translate('Module'); ?>
|
||||
</h4>
|
||||
<div class="row">
|
||||
<div class="col10">
|
||||
@ -258,7 +241,9 @@
|
||||
</div>
|
||||
<div class="col6">
|
||||
<div class="block">
|
||||
<h4><?php echo helper::translate('Contenu avancé');?></h4>
|
||||
<h4>
|
||||
<?php echo helper::translate('Contenu avancé'); ?>
|
||||
</h4>
|
||||
<div class="row">
|
||||
<div class="col6 offset3">
|
||||
<?php echo template::button('pageEditCssEditor', [
|
||||
@ -286,12 +271,8 @@
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<h4><?php echo helper::translate('Mise en page'); ?>
|
||||
<!--<span id="layoutHelpButton" class="helpDisplayButton">
|
||||
<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>
|
||||
<?php echo helper::translate('Mise en page'); ?>
|
||||
</h4>
|
||||
<div class="blockContainer">
|
||||
<div class="row">
|
||||
@ -308,21 +289,21 @@
|
||||
</div>
|
||||
<div class="col6">
|
||||
<!-- Sélection des barres latérales -->
|
||||
<?php if ($this->getHierarchy($this->getUrl(2), false, true)) : ?>
|
||||
<?php if ($this->getHierarchy($this->getUrl(2), false, true)): ?>
|
||||
<?php echo template::hidden('pageEditBarLeft', [
|
||||
'value' => $this->getData(['page', $this->getUrl(2), 'barLeft'])
|
||||
]); ?>
|
||||
<?php else : ?>
|
||||
<?php else: ?>
|
||||
<?php echo template::select('pageEditBarLeft', $module::$pagesBarId, [
|
||||
'label' => 'Barre latérale gauche :',
|
||||
'selected' => $this->getData(['page', $this->getUrl(2), 'barLeft'])
|
||||
]); ?>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->getHierarchy($this->getUrl(2), false, true)) : ?>
|
||||
<?php if ($this->getHierarchy($this->getUrl(2), false, true)): ?>
|
||||
<?php echo template::hidden('pageEditBarRight', [
|
||||
'value' => $this->getData(['page', $this->getUrl(2), 'barRight'])
|
||||
]); ?>
|
||||
<?php else : ?>
|
||||
<?php else: ?>
|
||||
<?php echo template::select('pageEditBarRight', $module::$pagesBarId, [
|
||||
'label' => 'Barre latérale droite :',
|
||||
'selected' => $this->getData(['page', $this->getUrl(2), 'barRight'])
|
||||
@ -335,6 +316,26 @@
|
||||
]); ?>
|
||||
</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>
|
||||
@ -345,21 +346,38 @@
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<h4><?php echo helper::translate('Permission et référencement');?>
|
||||
<!--<span id="seoHelpButton" class="helpDisplayButton">
|
||||
<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>
|
||||
<?php echo helper::translate('Permission et référencement'); ?>
|
||||
</h4>
|
||||
<div class="blockContainer">
|
||||
<div class="row">
|
||||
<div class='col6'>
|
||||
<?php echo template::select('pageEditGroup', self::$groupPublics, [
|
||||
'label' => 'Groupe requis pour accéder à la page :',
|
||||
'selected' => $this->getData(['page', $this->getUrl(2), 'group'])
|
||||
'label' => 'Groupe minimal pour accéder à la page',
|
||||
'selected' => $this->getData(['page', $this->getUrl(2), 'group']),
|
||||
'help' => 'Les groupes de niveau supérieur accèdent à la page.'
|
||||
]); ?>
|
||||
</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'>
|
||||
<?php echo template::text('pageEditMetaTitle', [
|
||||
'label' => 'Méta-titre',
|
||||
@ -377,5 +395,4 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php echo template::formClose(); ?>
|
@ -7,7 +7,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
@ -3,7 +3,7 @@
|
||||
<div class="col1">
|
||||
<?php echo template::button('pageJsEditorBack', [
|
||||
'class' => 'buttonGrey',
|
||||
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2),
|
||||
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent,
|
||||
'value' => template::ico('left')
|
||||
]); ?>
|
||||
</div>
|
||||
|
@ -9,7 +9,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
@ -21,14 +21,8 @@ class plugin extends common
|
||||
'index' => self::GROUP_ADMIN,
|
||||
'delete' => 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,
|
||||
'item' => self::GROUP_ADMIN,
|
||||
//'item' => self::GROUP_ADMIN,
|
||||
// détail d'un objet
|
||||
'upload' => self::GROUP_ADMIN,
|
||||
// Téléverser catalogue
|
||||
@ -62,28 +56,29 @@ class plugin extends common
|
||||
public function delete()
|
||||
{
|
||||
|
||||
// Jeton incorrect
|
||||
if ($this->getUrl(3) !== $_SESSION['csrf']) {
|
||||
// Action interdite
|
||||
if ($this->getUser('permission', __CLASS__, __FUNCTION__) !== true) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'plugin',
|
||||
'state' => false,
|
||||
'notification' => helper::translate('Action interdite')
|
||||
'access' => false
|
||||
]);
|
||||
} else {
|
||||
// Suppression des dossiers
|
||||
$infoModules = helper::getModules();
|
||||
$module = $this->getUrl(2);
|
||||
//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;
|
||||
$notification = 'Module ' . $module . ' désinstallé';
|
||||
if (($infoModules[$this->getUrl(2)]['dataDirectory'])) {
|
||||
if (
|
||||
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 {
|
||||
@ -136,7 +131,7 @@ class plugin extends common
|
||||
$module = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . 'enum.json'), true);
|
||||
} else {
|
||||
// Message de retour
|
||||
$this->removeDir(self::TEMP_DIR . $tempFolder);
|
||||
$this->deleteDir(self::TEMP_DIR . $tempFolder);
|
||||
$zip->close();
|
||||
return ([
|
||||
'success' => false,
|
||||
@ -151,7 +146,7 @@ class plugin extends common
|
||||
// Vérification de la présence des dossier décrits
|
||||
if (!is_dir(self::TEMP_DIR . $tempFolder . $src)) {
|
||||
// Message de retour
|
||||
$this->removeDir(self::TEMP_DIR . $tempFolder);
|
||||
$this->deleteDir(self::TEMP_DIR . $tempFolder);
|
||||
$zip->close();
|
||||
return ([
|
||||
'success' => false,
|
||||
@ -161,7 +156,7 @@ class plugin extends common
|
||||
// Interdire l'écriture dans le dossier core
|
||||
if (strstr($dest, 'core') !== false) {
|
||||
// Message de retour
|
||||
$this->removeDir(self::TEMP_DIR . $tempFolder);
|
||||
$this->deleteDir(self::TEMP_DIR . $tempFolder);
|
||||
$zip->close();
|
||||
return ([
|
||||
'success' => false,
|
||||
@ -176,7 +171,7 @@ class plugin extends common
|
||||
*/
|
||||
if (!file_exists(self::TEMP_DIR . $tempFolder . $module['name'] . '.php')) {
|
||||
// Message de retour
|
||||
$this->removeDir(self::TEMP_DIR . $tempFolder);
|
||||
$this->deleteDir(self::TEMP_DIR . $tempFolder);
|
||||
$zip->close();
|
||||
return ([
|
||||
'success' => false,
|
||||
@ -209,7 +204,7 @@ class plugin extends common
|
||||
$installOk = true;
|
||||
} else {
|
||||
// Message de retour
|
||||
$this->removeDir(self::TEMP_DIR . $tempFolder);
|
||||
$this->deleteDir(self::TEMP_DIR . $tempFolder);
|
||||
$zip->close();
|
||||
return ([
|
||||
'success' => false,
|
||||
@ -229,27 +224,28 @@ class plugin extends common
|
||||
if (!is_dir(self::TEMP_DIR . $tempFolder . $src)) {
|
||||
mkdir(self::TEMP_DIR . $tempFolder . $src);
|
||||
}
|
||||
$success = $success && $this->copyDir(self::TEMP_DIR . $tempFolder . $src, $dest);
|
||||
$success = $success || $this->copyDir(self::TEMP_DIR . $tempFolder . $src, $dest);
|
||||
}
|
||||
}
|
||||
// Message de retour
|
||||
$t = isset($versionInstalled) ? helper::translate('actualisé') : helper::translate('installé');
|
||||
$this->removeDir(self::TEMP_DIR . $tempFolder);
|
||||
$this->deleteDir(self::TEMP_DIR . $tempFolder);
|
||||
$zip->close();
|
||||
return ([
|
||||
'success' => $success,
|
||||
'notification' => $success
|
||||
? sprintf(helper::translate('Le module %s a été %s'), $module['name'], $t)
|
||||
: helper::translate('Erreur inconnue, le module n\'est pas installé')
|
||||
? sprintf(helper::translate('Le module %s a été %s'), $module['name'], $t)
|
||||
: helper::translate('Erreur inconnue, le module n\'est pas installé')
|
||||
]);
|
||||
} else {
|
||||
// Supprimer le dossier temporaire
|
||||
$this->deleteDir(self::TEMP_DIR . $tempFolder);
|
||||
$zip->close();
|
||||
return ([
|
||||
'success' => false,
|
||||
'notification' => helper::translate('Erreur inconnue, le module n\'est pas installé')
|
||||
]);
|
||||
// Supprimer le dossier temporaire
|
||||
$this->removeDir(self::TEMP_DIR . $tempFolder);
|
||||
$zip->close();
|
||||
|
||||
}
|
||||
} else {
|
||||
// Message de retour
|
||||
@ -266,7 +262,11 @@ class plugin extends common
|
||||
public function upload()
|
||||
{
|
||||
// Soumission du formulaire
|
||||
if ($this->isPost()) {
|
||||
|
||||
if (
|
||||
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
|
||||
$this->isPost()
|
||||
) {
|
||||
// Installation d'un module
|
||||
$checkValidMaj = $this->getInput('configModulesCheck', helper::FILTER_BOOLEAN);
|
||||
$zipFilename = $this->getInput('configModulesInstallation', helper::FILTER_STRING_SHORT);
|
||||
@ -291,13 +291,11 @@ class plugin extends common
|
||||
*/
|
||||
public function uploadItem()
|
||||
{
|
||||
// Jeton incorrect
|
||||
if ($this->getUrl(3) !== $_SESSION['csrf']) {
|
||||
// Action interdite
|
||||
if ($this->getUser('permission', __CLASS__, __FUNCTION__) !== true) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'store',
|
||||
'state' => false,
|
||||
'notification' => helper::translate('Action interdite')
|
||||
'access' => false
|
||||
]);
|
||||
} else {
|
||||
// Récupérer le module en ligne
|
||||
@ -316,7 +314,7 @@ class plugin extends common
|
||||
mkdir(self::FILE_DIR . 'source/modules', 0755);
|
||||
}
|
||||
// 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
|
||||
if (file_exists(self::FILE_DIR . 'source/modules/' . $moduleFile)) {
|
||||
@ -332,6 +330,7 @@ class plugin extends common
|
||||
'state' => $r['success']
|
||||
]);
|
||||
}
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Catalogue de modules'),
|
||||
@ -379,11 +378,11 @@ class plugin extends common
|
||||
$store[$key]['category'],
|
||||
'<a href="' . self::BASEURL_STORE . self::MODULE_STORE . $key . '" target="_blank" >' . $store[$key]['title'] . '</a>',
|
||||
$store[$key]['version'],
|
||||
helper::dateUTF8('%d %B %Y', $store[$key]['versionDate']),
|
||||
helper::dateUTF8('%d %B %Y', $store[$key]['versionDate'], self::$i18nUI),
|
||||
implode(' - ', $pageInfos),
|
||||
template::button('moduleExport' . $key, [
|
||||
'class' => $class,
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/uploadItem/' . $key . '/' . $_SESSION['csrf'],
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/uploadItem/' . $key,
|
||||
'value' => $ico,
|
||||
'help' => $help
|
||||
])
|
||||
@ -405,7 +404,7 @@ class plugin extends common
|
||||
{
|
||||
$store = json_decode(helper::getUrlContents(self::BASEURL_STORE . self::MODULE_STORE . 'list'), true);
|
||||
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
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Module ' . self::$storeItem['title']),
|
||||
@ -413,16 +412,30 @@ 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
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
|
||||
$i18nSites = [];
|
||||
// Tableau des langues rédigées
|
||||
foreach (self::$languages as $key => $value) {
|
||||
// tableau des langues installées
|
||||
if (is_dir(self::DATA_DIR . $key)) {
|
||||
if (
|
||||
is_dir(self::DATA_DIR . $key)
|
||||
&& file_exists(self::DATA_DIR . $key . '/page.json')
|
||||
&& file_exists(self::DATA_DIR . $key . '/module.json')
|
||||
) {
|
||||
$i18nSites[$key] = $value;
|
||||
}
|
||||
}
|
||||
@ -432,10 +445,11 @@ class plugin extends common
|
||||
|
||||
// Parcourir les langues du site traduit et recherche les modules affectés à des pages
|
||||
$pagesInfos = [];
|
||||
|
||||
foreach ($i18nSites as $keyi18n => $valuei18n) {
|
||||
|
||||
// Clés moduleIds dans les pages de la langue
|
||||
$pages = json_decode(file_get_contents(self::DATA_DIR . $keyi18n . '/' . 'page.json'), true);
|
||||
$pages = json_decode(file_get_contents(self::DATA_DIR . $keyi18n . '/page.json'), true);
|
||||
|
||||
// Extraire les clés des modules
|
||||
$pagesModules[$keyi18n] = array_filter(helper::arrayColumn($pages['page'], 'moduleId', 'SORT_DESC'), 'strlen');
|
||||
@ -443,7 +457,6 @@ class plugin extends common
|
||||
// Générer la liste des pages avec module de la langue par défaut
|
||||
foreach ($pagesModules[$keyi18n] as $key => $value) {
|
||||
if (!empty($value)) {
|
||||
|
||||
$pagesInfos[$keyi18n][$key]['pageId'] = $key;
|
||||
$pagesInfos[$keyi18n][$key]['title'] = $pages['page'][$key]['title'];
|
||||
$pagesInfos[$keyi18n][$key]['moduleId'] = $value;
|
||||
@ -476,7 +489,7 @@ class plugin extends common
|
||||
$infoModules[$key]['delete'] === true
|
||||
? template::button('moduleDelete' . $key, [
|
||||
'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'),
|
||||
'help' => 'Supprimer le module'
|
||||
])
|
||||
@ -497,12 +510,12 @@ class plugin extends common
|
||||
$infoModules[$key]['version'],
|
||||
'',
|
||||
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'),
|
||||
'help' => 'Sauvegarder le module dans le gestionnaire de fichiers'
|
||||
]),
|
||||
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'),
|
||||
'help' => 'Sauvegarder et télécharger le module'
|
||||
])
|
||||
@ -528,19 +541,19 @@ class plugin extends common
|
||||
$infoModules[$pagesInfos[$keyi18n][$keyPage]['moduleId']]['version'],
|
||||
template::flag($keyi18n, '20px') . ' <a href ="' . helper::baseUrl() . $keyPage . '" target="_blank">' . $pagesInfos[$keyi18n][$keyPage]['title'] . ' (' . $keyPage . ')</a>',
|
||||
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
|
||||
'value' => template::ico('download-cloud'),
|
||||
'help' => 'Sauvegarder les données du module dans le gestionnaire de fichiers'
|
||||
]),
|
||||
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
|
||||
'value' => template::ico('download'),
|
||||
'help' => 'Sauvegarder et télécharger les données du module'
|
||||
]),
|
||||
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
|
||||
'value' => template::ico('trash'),
|
||||
'class' => 'buttonRed dataDelete',
|
||||
@ -553,6 +566,9 @@ class plugin extends common
|
||||
}
|
||||
}
|
||||
|
||||
// Désactive l'icône rouge
|
||||
$this->setData(['core', 'updateModuleAvailable', false]);
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Gestion des modules'),
|
||||
@ -566,18 +582,15 @@ class plugin extends common
|
||||
*/
|
||||
public function save()
|
||||
{
|
||||
// Jeton incorrect
|
||||
if ($this->getUrl(4) !== $_SESSION['csrf']) {
|
||||
// Action interdite
|
||||
if ($this->getUser('permission', __CLASS__, __FUNCTION__) !== true) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'plugin',
|
||||
'state' => false,
|
||||
'notification' => helper::translate('Action interdite')
|
||||
'access' => false
|
||||
]);
|
||||
} else {
|
||||
|
||||
// Créer un dossier temporaire
|
||||
$tmpFolder = self::TEMP_DIR . uniqid();
|
||||
$tmpFolder = self::TEMP_DIR . uniqid() . '/';
|
||||
if (!is_dir($tmpFolder)) {
|
||||
mkdir($tmpFolder, 0755);
|
||||
}
|
||||
@ -587,273 +600,43 @@ class plugin extends common
|
||||
|
||||
// Descripteur de l'archive
|
||||
$infoModule = helper::getModules();
|
||||
//Nom de l'archive
|
||||
$fileName = $moduleId . $infoModule[$moduleId]['version'] . '.zip';
|
||||
|
||||
// Régénération du module
|
||||
$success = file_put_contents(self::MODULE_DIR . $moduleId . '/enum.json', json_encode($infoModule[$moduleId], JSON_UNESCAPED_UNICODE));
|
||||
//Nom de l'archive
|
||||
$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
|
||||
$this->makeZip(self::TEMP_DIR . $fileName, self::MODULE_DIR . $moduleId);
|
||||
$this->makeZip($tmpFolder . $fileName, self::MODULE_DIR . $moduleId);
|
||||
|
||||
switch ($action) {
|
||||
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');
|
||||
}
|
||||
$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
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'plugin',
|
||||
'notification' => $success ? helper::translate('Archive copiée dans le dossier Modules du gestionnaire de fichier') : helper::translate('Erreur de copie'),
|
||||
'state' => $success
|
||||
]);
|
||||
// Nettoyage
|
||||
unlink(self::TEMP_DIR . $fileName);
|
||||
$this->removeDir($tmpFolder);
|
||||
break;
|
||||
case 'download':
|
||||
default:
|
||||
|
||||
// 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);
|
||||
header('Content-Length: ' . filesize($tmpFolder . $fileName));
|
||||
readfile($tmpFolder . $fileName);
|
||||
exit();
|
||||
}
|
||||
// Nettoyage
|
||||
unlink(self::TEMP_DIR . $fileName);
|
||||
$this->deleteDir($tmpFolder);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 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
|
||||
unlink(self::TEMP_DIR . $fileName);
|
||||
$this->removeDir($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>
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
@ -17,31 +17,3 @@
|
||||
* 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,17 +3,17 @@
|
||||
<?php echo template::button('configModulesBack', [
|
||||
'class' => 'buttonGrey',
|
||||
'href' => helper::baseUrl(),
|
||||
'value' => template::ico('left')
|
||||
'value' => template::ico('home')
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col1">
|
||||
<?php /**echo template::button('pluginHelp', [
|
||||
'href' => 'https://doc.zwiicms.fr/gestion-des-modules',
|
||||
'target' => '_blank',
|
||||
'value' => template::ico('help'),
|
||||
'class' => 'buttonHelp',
|
||||
'help' => 'Consulter l\'aide en ligne'
|
||||
]);*/ ?>
|
||||
'href' => 'https://doc.zwiicms.fr/gestion-des-modules',
|
||||
'target' => '_blank',
|
||||
'value' => template::ico('help'),
|
||||
'class' => 'buttonHelp',
|
||||
'help' => 'Consulter l\'aide en ligne'
|
||||
]);*/?>
|
||||
</div>
|
||||
<div class="col1 offset8">
|
||||
<?php echo template::button('pluginModulesStore', [
|
||||
@ -30,70 +30,31 @@
|
||||
]); ?>
|
||||
</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) : ?>
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<h4><?php echo helper::translate('Sauvegarde'); ?>
|
||||
</h4>
|
||||
<?php echo template::table([2, 2, 1, 5, 1, 1], $module::$modulesInstalled, ['Module', 'Identifiant', 'Version', '', '', '']); ?>
|
||||
</div>
|
||||
<?php if ($module::$modulesInstalled): ?>
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<h4>
|
||||
<?php echo helper::translate('Sauvegarde'); ?>
|
||||
</h4>
|
||||
<?php echo template::table([2, 2, 1, 5, 1, 1], $module::$modulesInstalled, ['Module', 'Identifiant', 'Version', '', '', '']); ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<?php echo template::speech('Aucun module installé.'); ?>
|
||||
<?php endif; ?>
|
||||
<?php if ($module::$modulesOrphan) : ?>
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<h4><?php echo helper::translate('Modules orphelins'); ?>
|
||||
</h4>
|
||||
<?php echo template::table([2, 2, 1, 6, 1], $module::$modulesOrphan, ['Module', 'Identifiant', 'Version', '', '']); ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<?php echo template::speech('Aucun module installé.'); ?>
|
||||
<?php endif; ?>
|
||||
<?php if ($module::$modulesOrphan): ?>
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<h4>
|
||||
<?php echo helper::translate('Modules orphelins'); ?>
|
||||
</h4>
|
||||
<?php echo template::table([2, 2, 1, 6, 1], $module::$modulesOrphan, ['Module', 'Identifiant', 'Version', '', '']); ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<?php echo template::speech('Aucun module orphelin.'); ?>
|
||||
<?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>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<?php echo template::speech('Aucun module orphelin.'); ?>
|
||||
<?php endif; ?>
|
@ -7,7 +7,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
@ -7,7 +7,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
@ -7,7 +7,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
@ -8,7 +8,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
@ -7,7 +7,7 @@
|
||||
* @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
|
||||
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user