Compare commits

...

801 Commits

Author SHA1 Message Date
Andy Miller
e507300134 Merge branch 'release/1.6.20' 2020-02-03 10:04:38 -07:00
Andy Miller
463a55897c prepare for release 2020-02-03 10:04:26 -07:00
Andy Miller
192cc4eb9b minor symfony updates 2020-02-03 10:00:40 -07:00
Matias Griese
a592f6fe0b Fixed unit test for Uri::currentPage(): it only returns integers now 2020-01-30 09:11:19 +02:00
Matias Griese
6b887a98cd Fixed site.metadata saving issues [#2615] 2020-01-29 18:55:44 +02:00
Matias Griese
18a26b42e2 Fixed Assets::addInlineJs() parameter type mismatch between v1.5 and v1.6 [#2659] 2020-01-29 18:40:58 +02:00
Matias Griese
a47e446b60 Composer update (and lock rockettheme/toolbox to 1.4.x) 2020-01-29 13:23:28 +02:00
Matias Griese
864a938f8d Fixed Data::filter() removing empty fields (such as empty list) by default [#2805] 2020-01-29 11:48:59 +02:00
Matias Griese
53bd1641bb Fixed fatal error with non-integer page param value [#2803] 2020-01-29 11:32:40 +02:00
Matias Griese
7c0dcd6808 Fixed special case [#1273] 2020-01-14 17:54:19 +02:00
Matias Griese
ea8b7b7a3a Oops, changelog update [#1273] 2020-01-14 14:48:02 +02:00
Matias Griese
8714aa9202 Fixed validation: strict not working in blueprints [#1273] 2020-01-14 14:46:19 +02:00
Matias Griese
3731d61b78 Fixed checkbox field not being saved, requires also Form v4.0.2 [#1225] 2020-01-14 11:40:39 +02:00
Matias Griese
7b5d6f7031 Fixed session not restarting if user was invalid (downgrading from Grav 1.7) 2019-12-13 13:13:52 +02:00
Matias Griese
a269d49392 Fixed filesystem iterator calls with non-existing folders 2019-12-10 18:59:58 +02:00
Matias Griese
3a8775f545 Fixed session cookie is being set twice in the HTTP header [#2745] 2019-12-10 16:06:54 +02:00
Matias Griese
842dc0d49e Incorrect routing caused by str_replace() in Uri::init() [#2754] 2019-12-10 14:52:16 +02:00
Andy Miller
1532de8f20 Merge branch 'release/1.6.19' 2019-12-04 16:31:16 -07:00
Andy Miller
95bd217c3c Merge tag '1.6.19' into develop
Release 1.6.18
2019-12-04 16:31:16 -07:00
Andy Miller
f633c921cc prepare for release 2019-12-04 16:31:04 -07:00
Andy Miller
e8c79ffd97 Sync with 1.7 approach 2019-12-04 16:27:47 -07:00
Andy Miller
e842eb9d9e Better fix for #2750 2019-12-04 16:11:08 -07:00
Matias Griese
3e8572dbe9 Merge remote-tracking branch 'origin/develop' into develop 2019-12-03 20:26:50 +02:00
Matias Griese
ad8d0a2ab1 Updated plugins phpstan to work with Gantry5 plugin 2019-12-03 19:29:04 +02:00
Andy Miller
4a1e16449d Updated changelog 2019-12-03 09:03:07 -07:00
Andy Miller
41d31cb5ea PHP 7.4 fix for #2750 2019-12-03 09:00:07 -07:00
Matias Griese
909e2cbf89 Catch PHP 7.4 deprecation messages and report them in debugbar instead of throwing fatal error 2019-12-03 13:06:44 +02:00
Matias Griese
1290503895 Fixed multiple issues when there are no pages in the site 2019-12-03 12:55:24 +02:00
Matias Griese
a204b24d78 Fixed fatal error when calling {{ grav.undefined }} 2019-12-03 12:47:01 +02:00
Matias Griese
86c969998f Merge remote-tracking branch 'origin/develop' into develop 2019-12-02 20:12:59 +02:00
Matias Griese
158874039a Fixed bad str_replace('...', null) parameter in CSVFormatter 2019-12-02 20:11:15 +02:00
Andy Miller
de6c35f4ab Merge branch 'release/1.6.18' 2019-12-02 10:33:06 -07:00
Andy Miller
46816a74e9 Merge tag '1.6.18' into develop
Release v1.6.18
2019-12-02 10:33:06 -07:00
Andy Miller
1111c3d1b1 prepare for release 2019-12-02 10:32:06 -07:00
Andy Miller
e919685ad3 minor vendor update 2019-12-02 10:29:41 -07:00
Andy Miller
238ba9b9b4 PHP 7.4 fix for Pages::buildSort() 2019-12-02 08:53:17 -07:00
Andy Miller
1d966a0c92 Vendor lib updates 2019-12-02 08:41:32 -07:00
Jacob Peck
e3a6436031 Fix rewrite rule for lighttpd config (#2721)
Just plain doesn't work without this!  Was probably omitted in error.
2019-11-18 06:13:51 -07:00
Matias Griese
f59441eb55 Fixed fatal error when $page->id() is null [#2731] 2019-11-14 12:21:28 +02:00
Xaver Maierhofer
fcc0c5e345 Correct download argument annotation (#2727) 2019-11-09 20:49:33 -07:00
Andy Miller
c862b0bc26 Merge branch 'release/1.6.17' 2019-11-06 17:51:32 -07:00
Andy Miller
575a1e4603 Merge tag '1.6.17' into develop
Release v1.6.17
2019-11-06 17:51:32 -07:00
Andy Miller
a74ccad282 fixed changelog date 2019-11-06 17:50:35 -07:00
Andy Miller
ffeb5648c6 Merge branch 'release/1.6.17' 2019-11-06 16:07:07 -07:00
Andy Miller
86c87929ec Merge tag '1.6.17' into develop
Release v1.6.17
2019-11-06 16:07:07 -07:00
Andy Miller
e0e92b843c prepare for release 2019-11-06 16:06:45 -07:00
Keith Bentrup
8678f22f6b do NOT ignore "." dirs OR ignore "." dirs and all children (#2581)
If you ignore any "files" beginning with "." including directories, then the all() method will exclude .somedir, but not .somedir/somefile. Subsequently, when trying to copy all files returned from all(), it will fail when the method tries to copy a file into a directory that has not yet been created because .somedir was omitted from the return array of all().
I found this bug when trying to install the admin plugin and ./tmp was a mount and thus rename() failed and self:copy() was invoked instead (line 365).
2019-10-23 15:39:05 -06:00
Jérôme Nadaud
8322a0cfa3 Make script name more explicit (#2637) 2019-10-17 05:57:25 -06:00
Jérôme Nadaud
ab6b82eaaa Fix cache image generation when using cropresize (#2639) 2019-10-17 05:56:46 -06:00
buzatuAda
b16e8066ca fix exception array_merge() when $this->header->metadata is not array (#2701)
Exception gets thrown when $this->header->metadata is not an array, added extra verification in order to make sure it is and array before doing array_merge()
2019-10-17 05:55:27 -06:00
Matias Griese
bc1dd2a7b4 Added working ETag (304 Not Modified) support based on the final rendered HTML 2019-10-16 23:40:08 +03:00
Djamil Legato
d11772b681 Change of Behavior: Inflector::hyphenize will now automatically trim dashes at beginning and end of a string. 2019-10-16 11:02:44 -07:00
Matias Griese
feeee9ef86 Fixed PHP 7.1 bug in Flex 2019-10-15 19:00:25 +03:00
Jeremy Gonyea
eb1b9567df Updated for latest ddev version (#2676) 2019-10-03 14:54:05 -06:00
Andy Miller
c795ead402 Updated changelog 2019-10-01 17:52:14 -06:00
Andy Miller
91270c9c66 CSVFormatter null char support 2019-10-01 17:51:29 -06:00
Andy Miller
342eac1047 Smarter CSV handling 2019-09-26 18:35:25 -06:00
Andy Miller
f72eb1b002 Merge tag '1.6.16' into develop
Release v1.6.16

# gpg: Signature made Thu Sep 19 16:42:43 2019 MDT
# gpg:                using RSA key 6AA7DB4F23BD1A7280C4CC63E82B8D0EAB94EFB9
# gpg: Good signature from "Andy Miller <rhuk@mac.com>" [ultimate]
2019-09-19 16:42:44 -06:00
Andy Miller
25caa5138a Merge branch 'release/1.6.16' 2019-09-19 16:42:43 -06:00
Andy Miller
dffb227df6 prepare for release 2019-09-19 16:42:21 -06:00
Matias Griese
5c9eb1cdb8 Fixed Badly encoded JSON data warning when uploading files [#2663] 2019-09-17 22:02:21 +03:00
Matias Griese
e30ab9a043 Fixed Flex user creation if file storage is being used [#2444] 2019-09-17 11:37:09 +03:00
Newb I the Newbd
651b354d3e Correct non-published collection filter evaluation (#2668) 2019-09-14 10:10:24 -06:00
Andy Miller
dd8b503aa0 Merge tag '1.6.15' into develop
Release v1.6.15
2019-08-20 17:22:26 -06:00
Andy Miller
dab30673e0 Merge branch 'release/1.6.15' 2019-08-20 17:22:25 -06:00
Andy Miller
13689c2065 prepare for release 2019-08-20 17:22:16 -06:00
Andy Miller
6e23627f26 update changelog 2019-08-20 17:21:32 -06:00
Andy Miller
7db85cc79c Force Symfony 4.2 2019-08-20 17:06:19 -06:00
Matias Griese
e5cedd074b Fixed broken markdown Twig tag [#2635] 2019-08-19 10:46:03 +03:00
Daithí Seán Ó Foghlú
ed87faad92 Update robots.txt (#2632)
I have found that Bing/Yahoo/DuckDuckGo, Yandex and Google report crawl errors when using the default robots.txt. Specifically their bots will not crawl the the path '/' or any sub-paths. I agree that the current robots.txt should work and properly implements the specification. However it still does not work.

In my experience explicitly permitting the path '/' by adding the directive Allow: / resolves the issue.

More details can be found in a blog post about the issue here: https://www.dfoley.ie/blog/starting-with-the-indieweb
2019-08-18 11:22:33 -06:00
Andy Miller
239f34d40c Merge branch 'release/1.6.14' 2019-08-18 09:52:55 -06:00
Andy Miller
20b9ca56fa Merge tag '1.6.14' into develop
Release v1.6.14
2019-08-18 09:52:55 -06:00
Andy Miller
647ae0fda3 prepare for release 2019-08-18 09:52:45 -06:00
Andy Miller
806dbd9ee5 refactor 2019-08-18 09:51:10 -06:00
Andy Miller
1ab8442630 add fix 2019-08-18 09:50:56 -06:00
Andy Miller
505661404b Merge branch 'release/1.6.13' 2019-08-16 09:53:21 -06:00
Andy Miller
a2ea6faf4d Merge tag '1.6.13' into develop
Release v1.6.13
2019-08-16 09:53:21 -06:00
Andy Miller
ce51491b4d prepare for release 2019-08-16 09:53:12 -06:00
Andy Miller
d241223aa3 update changelog 2019-08-16 07:45:40 -06:00
Andy Miller
d16f83fdd8 Merge tag '1.6.12' into develop
Release v1.6.12
2019-08-14 16:19:44 -06:00
Andy Miller
02e10ff8fe Merge branch 'release/1.6.12' 2019-08-14 16:19:43 -06:00
Andy Miller
6a44d8f286 prepare for release 2019-08-14 16:19:21 -06:00
Andy Miller
4b614d871f update changelog 2019-08-14 16:18:38 -06:00
Matias Griese
3286d70092 Lock Grav user class once GRAV_USER_INSTANCE has been defined 2019-08-14 10:12:00 +03:00
Thomas Threadgold
9fc37e46fa check if GRAV_USER_INSTANCE constants are already defined (#2621) 2019-08-13 15:30:20 -06:00
Matias Griese
f304f429c5 Fix bad check in CSV escaping 2019-08-13 18:19:28 +03:00
Andy Miller
65c73f639f Update changelog 2019-08-12 16:06:16 -06:00
Aaron Dalton
d2833a1997 Allow users to override plugin handler priorities (#2165) 2019-08-12 15:22:21 -06:00
ale rimoldi
aa8f764436 run route.php when grav is not at the root of the server (#2541) 2019-08-12 15:11:41 -06:00
Andy Miller
618a59921a make markdown more page context aware 2019-08-09 18:23:05 -06:00
Andy Miller
039f71dc61 fix for var order in Validation.php 2019-08-09 17:16:31 -06:00
Andy Miller
27b8db4c10 Updated vendor libs 2019-08-09 13:33:35 -06:00
Matias Griese
afd53d76c2 Fixed CSV formatter not encoding strings with " and , properly 2019-07-18 16:11:46 +03:00
Matias Griese
57c65ad881 Fixed FlexObject::exists() failing sometimes just after the object has been saved 2019-07-16 09:50:30 +03:00
Matias Griese
a372ae90c2 Fixed an error when trying to delete a file from non-existing Flex Object 2019-07-16 09:11:11 +03:00
Andy Miller
c8739c40a5 Fixed collections using page@.self: should allow modular pages if requested 2019-07-12 12:02:28 -06:00
Andy Miller
00ff9ac42d fix 2019-07-11 08:50:09 -06:00
Andy Miller
e13a8304e6 Added arrayLower() method 2019-07-10 11:01:17 -06:00
Matias Griese
3c2b17853c Fixed non-existing Flex object having a bad media folder 2019-07-10 12:30:59 +03:00
Matias Griese
288b2a1953 Fixed fatal error 'Expiration date must be an integer, a DateInterval or null, "double" given' [#2529] 2019-07-09 13:43:51 +03:00
Matias Griese
86b1f1fbac Workaround bug in flex forms 2019-07-02 22:01:38 +03:00
Matias Griese
b5e26133a7 Fixed new Flex User creation not being possible because of username could not be given 2019-07-02 20:27:12 +03:00
Matias Griese
c97faa0238 ixed Flex User to have permissions to save and delete his own user 2019-07-01 22:25:29 +03:00
Matias Griese
69b39b4b21 Fixed multiple url() issues with streams
* Fixed `url()` returning wrong path if using stream with grav root path in it, eg: `user-data://shop` when Grav is in `/shop`
* Fixed `url()` not returning a path to non-existing file (`user-data://shop` => `/user/data/shop`) if it is set to fail gracefully
* Fixed `url()` returning false on unknown streams, such as `ftp://domain.com`, they should be treated as external URL
2019-06-28 13:36:37 +03:00
Matias Griese
02f544f813 Merge remote-tracking branch 'origin/develop' into develop 2019-06-27 18:08:21 +03:00
Matias Griese
69b5a779e4 Fixed error when calling Media::add($name, null) 2019-06-27 18:08:12 +03:00
Andy Miller
fa5c1e495d Use new Utils::getSupportedPageTypes() to enforce html,htm at the front of the list #2531 2019-06-26 08:59:24 -06:00
Matias Griese
7fdb2c10cb Minor code cleanup 2019-06-26 12:14:57 +03:00
Keith Bentrup
e422eebd3c fixed typos in comments / API docs 2019-06-26 11:46:08 +03:00
Keith Bentrup
3dca7e3539 fixed typos in comments / API docs 2019-06-26 11:46:08 +03:00
Matias Griese
75210b102e Changelog update 2019-06-26 10:48:06 +03:00
Matias Griese
f0e97a7277 Fixed some potential issues when $grav['user'] is not set 2019-06-26 10:38:38 +03:00
Newb I the Newbd
e16c81516e Make yaml_decode only return array, again 2019-06-25 10:02:40 +03:00
Matias Griese
140c9a941f Added support for custom FormFlash save locations 2019-06-24 13:15:27 +03:00
Andy Miller
eb58fe9e97 Merge branch 'release/1.6.11' 2019-06-21 15:19:04 -06:00
Andy Miller
5d4ea87402 Merge tag '1.6.11' into develop
Release v1.6.11
2019-06-21 15:19:04 -06:00
Andy Miller
9f1d7240a9 Prepare for release 2019-06-21 15:18:54 -06:00
Matias Griese
84894274f0 Fixed some FormFlash bugs, cleaned up the code 2019-06-21 22:59:54 +03:00
Matias Griese
ea09002012 Changed FormFlashInterface constructor to take $config array 2019-06-21 13:19:01 +03:00
Matias Griese
601ec5cb7a Added FormFlashInterface 2019-06-21 11:47:21 +03:00
Matias Griese
85ec2ee3a0 Fixed error if user has no form flashes 2019-06-20 21:19:10 +03:00
Matias Griese
965f69f680 Fixed issue with FormFlash objects when there is no session initialized 2019-06-20 21:10:48 +03:00
Matias Griese
13a56dd4da Initialize pages only once 2019-06-20 19:21:52 +03:00
Matias Griese
4cf1b8c400 Better fix for Route class 2019-06-20 19:21:35 +03:00
Matias Griese
9c805a4317 Added created timestamp to FormFlash 2019-06-20 12:18:55 +03:00
Matias Griese
b7b1182e14 Added timestamp to FormFlash objects 2019-06-20 11:47:23 +03:00
Matias Griese
f695aaaea4 Added FormTrait::getAllFlashes() method to get all the available form flash objects for the form 2019-06-20 00:51:20 +03:00
Matias Griese
b398d04d96 Fixed a bug in Route::withParam() method 2019-06-20 00:45:59 +03:00
Matias Griese
ac9ef4da76 Fixed empty form flash name after update 2019-06-19 20:56:23 +03:00
Matias Griese
a10893eaad Fixed error in ImageMedium::url() if the image cache folder does not exist 2019-06-19 11:23:12 +03:00
Andy Miller
0e0d5b23be Merge branch 'release/1.6.10' 2019-06-14 13:59:12 -06:00
Andy Miller
e6c8b30882 Merge tag '1.6.10' into develop
Release v1.6.10
2019-06-14 13:59:12 -06:00
Andy Miller
a222e353ba prepare for release 2019-06-14 13:59:01 -06:00
Tracerneo
30cfe3bdfa Change minimal port number to 0 (unix socket) (#2452) 2019-06-11 08:39:26 -06:00
Andy Miller
d227a82056 Fixed regresssion issue of Utils::Url() not returning false on failure #2524 2019-05-27 11:58:53 +03:00
Matias Griese
9825daa79b Merge remote-tracking branch 'origin/develop' into develop 2019-05-26 16:27:53 +03:00
Matias Griese
10d405112c Fixed Excerpts::processMediaActions() return value 2019-05-26 16:27:43 +03:00
Andy Miller
c4c70d082c Fixes #2510 and #2511 2019-05-26 13:36:12 +03:00
Andy Miller
23a928c5b7 Fixed bitwise operator in TwigExtension::exifFunc() #2518 2019-05-26 13:33:24 +03:00
Andy Miller
8a7f624558 return the found language rather than just ‘true’ 2019-05-26 13:23:08 +03:00
Djamil Legato
92e8dbf4ea Added Funding.yml 2019-05-23 09:44:47 -07:00
y-u-s-s-u-f-i-s-l-a-m
aca04cee6b Create now.json (#2515)
* Create now.json

* Update now.json
2019-05-23 07:43:27 -07:00
Matias Griese
7bc45bd9e0 Minor code cleanup/refactoring on flex caching 2019-05-23 10:04:09 +03:00
Matias Griese
9e5363b4df Merge branch 'develop' of github.com:getgrav/grav into develop 2019-05-22 11:56:00 +03:00
Matias Griese
37f69d89cc Some phpstan level 6 fixes 2019-05-20 10:52:32 +03:00
Andy Miller
30e96aa4ff address deprecated message 2019-05-18 11:12:58 -06:00
Djamil Legato
7e1d3b260e Fixed regression with bin/plugin not listing the plugins available (1c725c0) 2019-05-17 23:01:54 -07:00
Andy Miller
be558ccac9 fixes #2507 2019-05-17 11:10:15 -06:00
Matias Griese
e991056106 Minor constructor change in Parsedown classes 2019-05-17 20:06:49 +03:00
Matias Griese
b795155345 Framework: Fix all phpstan level 5 issues 2019-05-17 15:18:41 +03:00
Matias Griese
99d0c7cb3e Generalized markdown classes so they can be used outside of Page scope with a custom Excerpts class instance 2019-05-17 14:48:12 +03:00
Matias Griese
01b85f19bc Fixed GPM errors from blueprints not being logged [#2505] 2019-05-16 11:51:30 +03:00
Andy Miller
65ba214494 size of summary chars field 2019-05-15 15:48:26 -06:00
Andy Miller
ccff51144e Fixes #2493 2019-05-15 13:45:59 -06:00
Andy Miller
c8f6e7b0e1 Merge branch 'develop' of github.com:getgrav/grav into develop 2019-05-14 15:44:39 -06:00
Andy Miller
7cccf8e237 vendor updates 2019-05-14 15:44:33 -06:00
Ole Vik
e1f646c308 Remove Gitter, Slack (#2502)
Replace with redirecting link to chat.getgrav.org, also link to forum again.
2019-05-14 11:44:27 -06:00
Andy Miller
2a49a2ba7c Added page blueprints to YamlLinter 2019-05-12 11:24:50 -06:00
Andy Miller
e9bbd1e0b0 Optimizations for Plugin/Theme loading 2019-05-10 17:17:06 -06:00
Andy Miller
84e259f0f1 minor optimization 2019-05-10 17:01:52 -06:00
Andy Miller
b3f4461f34 Merge tag '1.6.9' into develop
Release v1.6.9
2019-05-09 10:49:11 -06:00
Andy Miller
1df6b76e25 Merge branch 'release/1.6.9' 2019-05-09 10:49:10 -06:00
Andy Miller
2153e20bc5 prepare for release 2019-05-09 10:49:01 -06:00
Andy Miller
0cbc98ab53 Merge branch 'develop' of github.com:getgrav/grav into develop 2019-05-08 20:57:11 -06:00
Andy Miller
0915a0413d Added composer scripts api-16 and api-15 2019-05-08 20:57:06 -06:00
Andy Miller
f4d3d302f4 thowing api error 2019-05-08 20:54:42 -06:00
Riley Sommerville
5d5e2264c0 Update default.md (#2496)
Correct an error that ignored the "Typography" menu item in the default Grav installation and caused a discrepancy between the install page and the corresponding tutorial on getgrav/grav-learn. Related to PR https://github.com/getgrav/grav-learn/pull/681#issue-270418391 and solves issue https://github.com/getgrav/grav-learn/issues/650#issue-365078790.
2019-05-08 17:39:09 -06:00
Andy Miller
b39fc72bd2 Update languages 2019-05-08 14:22:47 -06:00
Matias Griese
d6d50c4b66 Fixed empty $grav['request']->getAttribute('route')->getExtension() 2019-05-07 19:07:09 +03:00
Matias Griese
791ef8ad88 Changelog update 2019-05-07 17:58:10 +03:00
Matias Griese
e0861e5505 Merge branch 'develop' of github.com:getgrav/grav into develop 2019-05-07 17:55:59 +03:00
Newb I the Newbd
48c9176d90 Make yaml_decode only return array to avoid errors (#2494) 2019-05-07 17:53:42 +03:00
Matias Griese
33cb20561e Fixed backwards compatibility to select field with selectize.create set to true [git-sync#141] 2019-05-07 14:05:55 +03:00
Andy Miller
0acb38f586 Checkbox getting interpreted as string 2019-05-06 16:22:31 -06:00
Andy Miller
1a41e00a4f Merge branch 'develop' of github.com:getgrav/grav into develop 2019-05-03 10:43:17 -06:00
Andy Miller
48ef93e495 more tidy 2019-05-03 10:43:13 -06:00
Matias Griese
3f7da86711 Missed lock file 2019-05-03 08:54:51 +03:00
Matias Griese
11aa2314d5 Fixed typo in composer.json 2019-05-03 08:52:53 +03:00
Andy Miller
179c5065ca minor rounding stuff 2019-05-02 16:06:08 -06:00
Andy Miller
7c60f73942 vendor libs 2019-05-02 15:05:01 -06:00
Andy Miller
7095c665b7 Output correct "Last Updated" in bin/gpm info command 2019-05-02 15:03:01 -06:00
Matias Griese
c6d94885e0 Fixed exception in Flex::getDirectories() if the first parameter is set 2019-05-02 16:37:35 +03:00
Matias Griese
d9ddab8239 Merge remote-tracking branch 'origin/develop' into develop 2019-05-02 14:11:35 +03:00
Matias Griese
a118d45177 Flex collection and object now fall back to the default template if template file doesn't exist 2019-05-02 14:11:22 +03:00
Matias Griese
416c400367 Made UserCollectionInderface to extend Countable to get the count of existing users 2019-05-02 14:10:09 +03:00
Raphaël Droz
e6839530d8 When using Grav behind an HTTPS-endpoint, we would probably have either one of (#2486)
* `HTTPS=on`
* `X-Forwarded-Proto https`
Still, the latest virtualhost would still provide `REQUEST_SCHEME` which,
contrary to HTTPS environment, would not be overriden (eg: Apache only
creates `REDIRECT_REQUEST_SCHEME` with the requested value).

This change gives priority to non-empty `HTTPS` over `REQUEST_SCHEME`.
2019-04-30 12:18:20 -06:00
Matias Griese
fea9e53be3 Flex admin: added default search options for flex objects 2019-04-30 10:49:59 +03:00
Matias Griese
c5b3792a60 Change cache touch parameter to invalidate, added CLI option for it 2019-04-30 10:48:35 +03:00
Andy Miller
4f83b5da5b non-standard lang code length fixes 2019-04-29 17:31:56 -06:00
Andy Miller
504c8faf4c Merge branch 'develop' of github.com:getgrav/grav into develop 2019-04-26 13:11:32 -06:00
Andy Miller
4d6db5b334 Fix for avatar_url provided by 3rd party providers 2019-04-26 13:11:28 -06:00
Matias Griese
ec1fc1f1e3 Change cache touch parameter to invalidate, added CLI option for it 2019-04-26 09:54:14 +03:00
Matias Griese
563cf8900c Merge remote-tracking branch 'origin/develop' into develop 2019-04-25 21:08:16 +03:00
Matias Griese
0850c2f362 Added Cache::clearCache('touch') parameter for just forcing simple cache clear 2019-04-25 21:08:07 +03:00
Andy Miller
f30334d80f Fixed Assets options array mixed with standalone priority #2477 2019-04-25 11:53:11 -06:00
Matias Griese
9057a804a2 Added Pages::setCheckMethod() method to override page configuration in Admin Plugin 2019-04-25 16:07:25 +03:00
Matias Griese
4c5c26033a Added support for configurable actions in Flex 2019-04-24 17:14:44 +03:00
Matias Griese
a4f679adcf Added Route::withoutParams() methods 2019-04-24 14:48:37 +03:00
Matias Griese
e9e12392ac Fixed $grav['route'] from being modified when the route instance gets modified 2019-04-24 14:03:55 +03:00
Andy Miller
6b4663c2ff Merge branch 'release/1.6.8' 2019-04-23 15:02:10 -06:00
Andy Miller
0411c3a98b Merge tag '1.6.8' into develop
Release v1.6.8
2019-04-23 15:02:10 -06:00
Andy Miller
972a758ac9 prepaer for release 2019-04-23 15:01:59 -06:00
Andy Miller
05d72306c6 updated changelog 2019-04-23 14:58:42 -06:00
Andy Miller
18b7c0955d updated clean command 2019-04-23 14:46:51 -06:00
Andy Miller
71cbbf4e1e remove hipchat 2019-04-23 14:46:35 -06:00
Matias Griese
0606e12872 Added FlexCollection::filterBy() method 2019-04-23 13:24:45 +03:00
Matias Griese
afc7cac5ab Improve null result handling in Flex 2019-04-23 11:13:29 +03:00
Matias Griese
471e3d8954 Revert "Use Null Coalesce Operator (#2466)"
This reverts commit be8eb639
2019-04-23 10:54:26 +03:00
Andy Miller
89a92cddc7 Merge branch 'release/1.6.7' 2019-04-22 15:20:18 -06:00
Andy Miller
74988f1254 Merge tag '1.6.7' into develop
Release v1.6.7
2019-04-22 15:20:18 -06:00
Andy Miller
f2f2bc1cf8 prepare for release 2019-04-22 15:20:08 -06:00
Andy Miller
31c5809e4a Better fix for #2470 2019-04-22 14:43:54 -06:00
Andy Miller
b4b8b63e24 Fix for manually set position on external URLs #2470 2019-04-22 14:29:31 -06:00
Andy Miller
9c0de8b0d3 New Yaml linter class 2019-04-20 17:41:17 -06:00
Andy Miller
f4cca777c2 Created a YAML Linter CLI command 2019-04-20 17:41:09 -06:00
Andy Miller
8d7d143d01 Merge branch 'develop' of github.com:getgrav/grav into develop 2019-04-20 12:33:11 -06:00
Andy Miller
d9109e9934 Fix issue when excluding inlineJs and inlineCss from Assets pipeline #2468 2019-04-20 12:33:07 -06:00
Gabriel Caruso
be8eb63944 Use Null Coalesce Operator (#2466) 2019-04-20 10:55:55 -06:00
Andy Miller
9342981d8c updated changelog 2019-04-19 10:43:01 -06:00
Tyler Cosgrove
6e9af3bb29 Add getSubnet util to Grav\Common\Utils (#2465) 2019-04-19 10:29:19 -06:00
Matias Griese
7e39755154 Improve null result handling in Flex 2019-04-18 19:16:01 +03:00
Matias Griese
97af8919fc Remove disabled fields from the form schema 2019-04-18 19:14:55 +03:00
Matias Griese
6cdfaeb8fb Improve FormTrait backwards compatibility with existing forms 2019-04-18 11:43:22 +03:00
Andy Miller
4ea00b0140 Merge branch 'release/1.6.6' 2019-04-17 16:02:05 -06:00
Andy Miller
864c5027c6 Merge tag '1.6.6' into develop
Release v1.6.6
2019-04-17 16:02:05 -06:00
Andy Miller
0bb55faa2d prepare for release 2019-04-17 16:01:54 -06:00
Andy Miller
f757863e1c updated changelog 2019-04-17 15:49:30 -06:00
Matias Griese
3ffd2f5f5e Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	CHANGELOG.md
2019-04-17 22:11:08 +03:00
Matias Griese
6aa135e80a Fixed FlexForm missing getter methods for defining form variables 2019-04-17 22:10:28 +03:00
Andy Miller
07f4bd0699 fixes #2461 2019-04-17 11:44:00 -06:00
Andy Miller
c200a55336 fixes #2460 2019-04-17 11:27:45 -06:00
Andy Miller
14fed2bb75 Merge branch 'develop' of github.com:getgrav/grav into develop
# Conflicts:
#	CHANGELOG.md
2019-04-17 09:00:35 -06:00
Andy Miller
44ecd61489 Roll back redirect_default_route fix as it has issues with multilang #2459 2019-04-17 09:00:03 -06:00
Matias Griese
882212520f Fixed bug in text field filtering: return empty string if value isn't a string or number 2019-04-17 16:25:36 +03:00
Matias Griese
9467939f53 Added new FormInterface::getTask() method which reads the task from form.task in the blueprint 2019-04-16 14:43:44 +03:00
Matias Griese
e3933ebdf6 Minor fix in Flex 2019-04-16 14:41:14 +03:00
Matias Griese
0d99a03c39 Fixed Flex simple storage not being properly initialized if used with caching 2019-04-16 10:58:20 +03:00
Andy Miller
e9117301d4 Merge branch 'release/1.6.5' 2019-04-15 19:22:14 -06:00
Andy Miller
bf199e9394 Merge tag '1.6.5' into develop
Release v1.6.5
2019-04-15 19:22:14 -06:00
Andy Miller
c070b0afbb prepare for release 2019-04-15 19:21:59 -06:00
Andy Miller
d54387b281 Backwards compatiblity with old Uri::__toString() output 2019-04-15 19:21:14 -06:00
Andy Miller
2bc6848464 Merge branch 'release/1.6.4' 2019-04-15 14:48:10 -06:00
Andy Miller
ab7c5d2fc5 Merge tag '1.6.4' into develop
Release v1.6.4
2019-04-15 14:48:10 -06:00
Andy Miller
abefbfc776 prepare for release 2019-04-15 14:48:01 -06:00
Andy Miller
ad173ca129 Improved redirect_default_route logic as well as Uri::toArray() to take into account root_path and extension 2019-04-15 12:44:48 -06:00
Andy Miller
d69ef0e39c Refactored rounded logic in Utils::parseSize() #2394 2019-04-15 11:00:11 -06:00
Matias Griese
436be17881 Fixed Flex simple storage not being properly initialized if used with caching 2019-04-15 14:26:55 +03:00
Andy Miller
9a5fa7e699 Extra forcing of first level arrays in taxonomy 2019-04-14 13:08:57 -06:00
Andy Miller
d502ff08c1 Attempt to resolve issue in form#332 2019-04-13 17:20:45 -06:00
Andy Miller
14eb1281f9 Fix to force all Page::taxonomy to be treated as strings #2446 2019-04-13 13:53:46 -06:00
Andy Miller
8fd7a5aebe Fixes #2445 pipeline excluded assets with cache on 2019-04-13 13:18:13 -06:00
Andy Miller
08423df547 code tidy 2019-04-13 12:27:19 -06:00
Andy Miller
40563ed2f8 Better Utils::normalizePath() logic #2216 2019-04-13 12:21:54 -06:00
Andy Miller
b639f09ca7 Merge branch 'release/1.6.3' 2019-04-12 19:48:13 -06:00
Andy Miller
dd134ad551 Merge tag '1.6.3' into develop
Release v1.6.3
2019-04-12 19:48:13 -06:00
Andy Miller
3d93d50cf0 prepare for release 2019-04-12 19:48:03 -06:00
Andy Miller
f1da7b6063 Fix for vUndefined errors when upgrading 2019-04-12 09:49:20 -06:00
Andy Miller
ef7b33f9b6 Fixed issue with Utils::normalizePath messing with external URLs #2216 2019-04-12 07:55:51 -06:00
Andy Miller
0f0e6ab1c8 Missed this one! #2442 2019-04-12 07:26:44 -06:00
Matias Griese
5362b312d1 Added Blueprint::addDynamicHandler() method to allow custom dynamic handlers, for example custom-options@: getCustomOptions 2019-04-12 12:23:31 +03:00
Andy Miller
ca4d6a398f Merge branch 'release/1.6.2' 2019-04-11 18:25:47 -06:00
Andy Miller
ed00d480f2 Merge tag '1.6.2' into develop
Release v1.6.2
2019-04-11 18:25:47 -06:00
Andy Miller
057bdd546b prepare for release 2019-04-11 18:25:38 -06:00
Andy Miller
7762f0c85e * Revert renaming of ClearCacheCommand to ensure CLI GPM upgrades go smoothly 2019-04-11 18:22:38 -06:00
Andy Miller
1e6c01ea65 Merge branch 'release/1.6.1' 2019-04-11 16:46:51 -06:00
Andy Miller
4b777f508b Merge tag '1.6.1' into develop
Release v1.6.1
2019-04-11 16:46:51 -06:00
Andy Miller
d15f125964 prepare for release 2019-04-11 16:46:43 -06:00
Andy Miller
32b435b7e6 Revert attempted fixes 2019-04-11 16:45:31 -06:00
Andy Miller
31d301911f Merge branch 'release/1.6.1' 2019-04-11 16:33:08 -06:00
Andy Miller
911eec5e68 Merge tag '1.6.1' into develop
Release v1.6.1
2019-04-11 16:33:08 -06:00
Andy Miller
2e4bb25e2e prepare for release 2019-04-11 16:32:59 -06:00
Andy Miller
d99c80eae9 More backwards compatibility 2019-04-11 16:29:55 -06:00
Andy Miller
0e03240d13 Merge branch 'release/1.6.1' 2019-04-11 15:25:47 -06:00
Andy Miller
02064117bc Merge tag '1.6.1' into develop
Release v1.6.1
2019-04-11 15:25:47 -06:00
Andy Miller
a9e0cc7159 prepare for release 2019-04-11 15:25:31 -06:00
Andy Miller
6b4332db72 not sure if needed, but might be same issue as DebuggerAssetsProcessor 2019-04-11 15:24:54 -06:00
Andy Miller
0f591953a0 update changelog 2019-04-11 15:19:55 -06:00
Andy Miller
0a5e78ccc6 Hopefully fix the DebuggerAssetsProcess error on upgrade of older versions 2019-04-11 15:19:43 -06:00
Andy Miller
fbf7c50a12 no longer needed 2019-04-11 15:06:19 -06:00
Andy Miller
09c1255239 fixes #2440 2019-04-11 15:05:50 -06:00
Andy Miller
75650ceba3 Better CSS for DebugBar 2019-04-11 15:04:00 -06:00
Andy Miller
e2a65004f3 Merge tag '1.6.0' into develop
Release v1.6.0
2019-04-11 12:38:38 -06:00
Andy Miller
d4e1bcc660 Merge branch 'release/1.6.0' 2019-04-11 12:38:37 -06:00
Andy Miller
b1b1670c77 prepare for release 2019-04-11 12:38:27 -06:00
Andy Miller
5a3674f6f6 set releases to stable 2019-04-11 12:36:14 -06:00
Andy Miller
e622e204bf update to include PHP 7.3 next time 2019-04-11 12:31:13 -06:00
Andy Miller
c378b06a90 Merge tag '1.6.0' into develop
Release v1.6.0
2019-04-11 12:23:38 -06:00
Andy Miller
c6ce6e6c32 Merge branch 'release/1.6.0' 2019-04-11 12:23:37 -06:00
Andy Miller
355f7ee748 prepare for release (take 2) 2019-04-11 12:23:27 -06:00
Andy Miller
c19fa22a26 update changelog 2019-04-11 12:22:51 -06:00
Matias Griese
5ba4c8ee5b Merge remote-tracking branch 'origin/1.6' into 1.6 2019-04-11 19:43:12 +03:00
Matias Griese
306df5837d Added FlexStorageInterface::hasKeys() 2019-04-11 19:43:01 +03:00
Andy Miller
66bba376db minor fixes and tests for Utils::url 2019-04-11 07:30:12 -06:00
Andy Miller
ec07d37623 Merge branch '1.6' of github.com:getgrav/grav into 1.6 2019-04-10 16:51:07 -06:00
Andy Miller
cab78d36f3 Missing file 2019-04-10 16:51:02 -06:00
Andy Miller
449682baea Allow reseting of Page::metadtta 2019-04-10 16:50:55 -06:00
Andy Miller
6eb11b9717 Fix for Utils::url and extra base_url 2019-04-10 16:50:30 -06:00
Matias Griese
5a1d138d08 Merge remote-tracking branch 'origin/1.6' into 1.6 2019-04-10 20:59:21 +03:00
Matias Griese
dfd75efbe5 Fixed join() in flex user 2019-04-10 20:59:13 +03:00
Andy Miller
76ed48fc7c escape spaces 2019-04-10 11:27:49 -06:00
Andy Miller
1043b9a189 Added languages.default_lang option to override the default lang 2019-04-09 17:27:35 -06:00
Matias Griese
e401c683f5 Grav 1.6: Fixed bad key in Flex Users if file storage is being used 2019-04-09 12:06:20 +03:00
Matias Griese
9d4fe331fa Fixed error in FlexUserIndex if there are users without an email address 2019-04-09 09:58:55 +03:00
Matias Griese
fbae3fd194 Fixed Flex erroring out with all numeric keys in storage (changelog) 2019-04-08 21:38:25 +03:00
Matias Griese
022f1ce758 Composer update 2019-04-08 21:37:41 +03:00
Andy Miller
b367c664c7 tidy up 2019-04-05 17:42:30 -06:00
Andy Miller
8512968726 this closes #2432 2019-04-05 17:38:45 -06:00
Matias Griese
2ffc110f03 Composer update 2019-04-05 10:21:51 +03:00
Matias Griese
36836c516f Fixed deleting last list item in the form 2019-04-05 10:19:55 +03:00
Andy Miller
1f288c25de typo! 2019-04-04 17:06:12 -06:00
Matias Griese
a4b62d48b2 Fixed minor bugs in Flex 2019-04-04 11:28:30 +03:00
Andy Miller
397f6902f3 Improved Utils::normalizePath() to support non-protocol URLs 2019-04-03 16:52:52 -06:00
Andy Miller
e97bceed56 changelog updated 2019-04-02 12:25:27 -06:00
Andy Miller
7efc0f418e Fixed cached images not being updated when source image is modified 2019-04-02 12:20:38 -06:00
Matias Griese
ac2a4e1c06 Try fixing cache issue with media 2019-04-02 20:28:43 +03:00
Matias Griese
ef43348020 Changelog update 2019-04-01 19:53:14 +03:00
Matias Griese
b6e68bb362 PSR-16, not 15 2019-04-01 19:51:28 +03:00
Matias Griese
8d9ceb5d99 MediaTrait: Use PSR-15 cache 2019-04-01 19:49:15 +03:00
Andy Miller
af47825b76 Merge branch '1.6' of github.com:getgrav/grav into 1.6
# Conflicts:
#	CHANGELOG.md
2019-03-29 11:31:32 -06:00
Andy Miller
a4c88697af set_time_limit(0) for Archiver class 2019-03-29 11:30:55 -06:00
Matias Griese
45fbfb098a Added FlexObjectInterface::getDefaultValue() and FormInterface::getDefaultValue() 2019-03-29 18:19:03 +02:00
Matias Griese
9172e442f2 Blueprint: cache defaults to the object to speed multiple getDefaults() calls up 2019-03-29 18:14:26 +02:00
Matias Griese
3b91f9af8c FlexObjects: Remove null values during save 2019-03-29 13:01:55 +02:00
Matias Griese
d5e9cc4bfe Added RenderInterface 2019-03-28 12:52:34 +02:00
Matias Griese
bb719c5d53 Improve deprecated error logic to better track twig/yaml/markdown issues 2019-03-27 12:06:48 +02:00
Matias Griese
05a6775b08 Minor tweak 2019-03-26 14:07:58 +02:00
Matias Griese
1accbb8edc DebugBar: Fixed some instances where twig template wasn't properly assigned 2019-03-26 14:02:04 +02:00
Matias Griese
a04a7f5714 DebugBar: Resolve twig templates in deprecated backtraces in order to help locating Twig issues 2019-03-26 12:56:53 +02:00
Matias Griese
f31f7f7499 Merge remote-tracking branch 'origin/1.6' into 1.6 2019-03-26 07:51:04 +02:00
Matias Griese
354d6f307c Added Flex[Name]::getFlexType() to all flex classes to have the interface for all Flex classes 2019-03-26 07:50:54 +02:00
Andy Miller
90aa4083ca improved order of page types - fixes #2337 2019-03-25 17:29:35 -07:00
Matias Griese
5fbd252db9 Merge branch 'develop' of github.com:getgrav/grav into 1.6
# Conflicts:
#	CHANGELOG.md
#	composer.json
#	composer.lock
#	system/defines.php
2019-03-25 18:56:09 +02:00
Matias Griese
04d3237a89 Changelog update 2019-03-25 18:53:04 +02:00
Antoine Goutenoir
55aaaeed47 Add the page to the onMarkdownInitialized event. (#2418)
This will allow plugins hooking this event to mergeConfig #2412
2019-03-25 18:51:06 +02:00
Matias Griese
84d995335e Fixed Undefined method closure::fields() when getting avatar for user, thanks @Romarain [#2422] 2019-03-22 18:01:22 +02:00
Djamil Legato
f7d3299ebb Added Awesome Grav link to the Exploring More 2019-03-21 19:06:12 -07:00
Andy Miller
e762c3add9 Merge branch 'release/1.5.10' 2019-03-21 14:16:21 -06:00
Andy Miller
df6bb065d3 Merge tag '1.5.10' into develop
Release v1.5.10
2019-03-21 14:16:21 -06:00
Andy Miller
2fed02affa Prepare for release 2019-03-21 14:16:10 -06:00
Matias Griese
a739ed6825 Improved Exceptions middleware 2019-03-21 12:17:48 +02:00
Matias Griese
90c708db2b Added Content-Type: application/json body support for PSR-7 ServerRequest 2019-03-21 12:01:05 +02:00
Andy Miller
fcbd819f48 Added deferred twig extension 2019-03-20 16:31:19 -06:00
Andy Miller
a25d18bca7 prepare for RC.4 release 2019-03-20 14:06:51 -06:00
Andy Miller
4480077894 Updated with Toolbox 1.4.6 2019-03-20 14:04:35 -06:00
Andy Miller
e9aa338c1e Merge branch 'develop' into 1.6
# Conflicts:
#	composer.json
#	composer.lock
#	system/defines.php
#	system/src/Grav/Common/Page/Media.php
2019-03-20 14:04:00 -06:00
Andy Miller
88a3e874aa Merge branch 'release/1.5.9' 2019-03-20 14:01:21 -06:00
Andy Miller
87814039bc Merge tag '1.5.9' into develop
Release v1.5.9
2019-03-20 14:01:21 -06:00
Andy Miller
af72951671 prepare for release 2019-03-20 14:01:10 -06:00
Andy Miller
5f2dfc8221 Use toolbox 1.4.2 in develop branch for now 2019-03-20 13:58:00 -06:00
Andy Miller
c706756d19 changelog updated 2019-03-20 13:52:27 -06:00
Andy Miller
a4801ead6a Fix for streams with EXIF 2019-03-20 13:52:04 -06:00
Matias Griese
a57cec8404 Merge remote-tracking branch 'origin/1.6' into 1.6 2019-03-20 21:12:41 +02:00
Matias Griese
8b171435a7 Fixed File::save() silently ignoring failures with read only streams 2019-03-20 21:12:33 +02:00
Andy Miller
ab23d071a4 Merge branch 'release/1.5.9' 2019-03-20 12:04:51 -06:00
Andy Miller
3e6c4e9c5e Merge tag '1.5.9' into develop
Release 1.5.9
2019-03-20 12:04:51 -06:00
Andy Miller
28db98c95d Prepare for release 2019-03-20 12:04:26 -06:00
Andy Miller
95583dbbcd updated vendor libs 2019-03-20 11:50:00 -06:00
Andy Miller
9d8fc4a065 New onPageContent() event 2019-03-20 11:16:18 -06:00
Andy Miller
b23cd7bb65 New onPageContent() event 2019-03-20 11:14:38 -06:00
Matias Griese
28d5be982c Merge remote-tracking branch 'origin/1.6' into 1.6 2019-03-20 16:15:28 +02:00
Matias Griese
3836e4d38a Fixed file saving when temporary file cannot be created to the current folder / stream 2019-03-20 16:15:18 +02:00
Andy Miller
4ebfd51e98 Safer stream check 2019-03-20 07:22:05 -06:00
Andy Miller
25ff1241d4 docblock 2019-03-19 13:14:21 -06:00
Matias Griese
0dc3e5806e Minor fix 2019-03-19 16:42:06 +02:00
Matias Griese
982b12a239 Fixed session_start(): Setting option 'session.name' failed [#2408] 2019-03-19 13:47:35 +02:00
Matias Griese
5995515419 Added detection for deprecated features into phpstan 2019-03-19 13:37:02 +02:00
Matias Griese
8c1c813acd Greatly improved Flex interfaces and docblocks 2019-03-19 13:36:12 +02:00
Matias Griese
0e95d7faf6 Class Grav\Common\Page\Medium\AbstractMedia now use array traits instead of extending Grav\Common\Getters 2019-03-19 12:16:02 +02:00
Matias Griese
47c3d4bf9b Improved docblocks for multiple classes 2019-03-18 11:01:41 +02:00
Matias Griese
33282e043b Added composer test-plugins to test plugin issues with the current version of Grav 2019-03-18 10:58:21 +02:00
Andy Miller
81efef7c60 Hopefully fix auto_metadata_exif error #2248 2019-03-15 19:02:17 -06:00
Andy Miller
2678f56499 remove extra stuff 2019-03-15 18:11:49 -06:00
Andy Miller
cd8f578b39 site crashes if header is invalid #2343 2019-03-15 05:10:19 -06:00
Andy Miller
ab535ec8be Better solution for SEO imagename format 2019-03-14 17:14:19 -06:00
Matias Griese
ada6c3f160 Fixed phpstan level 4 and 5 errors in Grav\Framework 2019-03-14 14:06:53 +02:00
Matias Griese
0917850634 Oops, fix a bug 2019-03-14 13:27:13 +02:00
Matias Griese
c09a8fbbc4 Fixed phpstan level 3 errors in Grav\Framework 2019-03-14 13:20:29 +02:00
Matias Griese
2b392055c1 Fixed few phpstan level 3-7 issues 2019-03-14 11:31:26 +02:00
Matias Griese
45acd237f5 Changelog update (2) 2019-03-14 09:18:32 +02:00
Matias Griese
cbf79e38c4 Changelog update 2019-03-14 09:10:38 +02:00
Matias Griese
ed10ce03e2 Twig nicenumber: do not use 0 + string casting hack 2019-03-14 09:04:41 +02:00
Matias Griese
561abc851f Twig tags: use namespaced classes 2019-03-14 09:03:24 +02:00
Matias Griese
8789fd91ee Fixed/silenced the remaining phpstan level 2 issues 2019-03-14 09:01:16 +02:00
Andy Miller
b835db49f4 Added PHPStan badge 2019-03-13 21:35:49 -06:00
Andy Miller
a5e832b0b0 new option for image.prettyname_prefix 2019-03-13 18:04:52 -06:00
Matias Griese
2b16f813ef Merge remote-tracking branch 'origin/1.6' into 1.6 2019-03-13 22:22:14 +02:00
Matias Griese
30b013f5b0 Fixed most phpstan level 2 issues in Grav\Common 2019-03-13 22:22:03 +02:00
Djamil Legato
5eccfaa34b Reverted commit 48816d9 causing issues with GPM cli commands (ref, getgrav/grav-plugin-admin@e3fc4ce) 2019-03-13 13:17:10 -07:00
Matias Griese
fde69ade6b Fixed some phpstan level 2 issues in Grav\Console 2019-03-13 19:46:06 +02:00
Andy Miller
af3d5e9683 phpstan fixes 2019-03-13 11:24:07 -06:00
Andy Miller
c757e00ac9 phpstan fix 2019-03-13 11:16:00 -06:00
Matias Griese
19d61b4013 Merge branch 'develop' of github.com:getgrav/grav into 1.6
# Conflicts:
#	CHANGELOG.md
#	system/src/Grav/Common/User/User.php
2019-03-13 16:13:19 +02:00
Matias Griese
b4a4b60871 Fixed phpdoc generation 2019-03-13 16:00:00 +02:00
Matias Griese
9727f30c61 Fixed broken @inheritdoc in phpdoc blocks 2019-03-13 15:44:53 +02:00
Matias Griese
db8e5b3cbb Merge remote-tracking branch 'origin/1.6' into 1.6 2019-03-13 15:21:18 +02:00
Matias Griese
b0b6c1dd17 Fixed some more phpstan level 2 issues 2019-03-13 15:21:09 +02:00
Sébastien Vanvelthem
47bb35e2e9 Preliminary tests for CsvFormatter::encode + minor fix for empty data (#2405) 2019-03-13 15:02:46 +02:00
Matias Griese
2433e0d2cd Fixed phpstan level 2 issues in Grav\Framework 2019-03-13 14:28:16 +02:00
Matias Griese
cdf891478e Fixed some phpstan level 2 issues 2019-03-13 11:05:50 +02:00
Matias Griese
39b1940f94 Fixed phpstan level 1 issues 2019-03-13 10:16:47 +02:00
Matias Griese
8564524984 Fixed some bugs found by phpstan 2019-03-13 09:49:08 +02:00
Matias Griese
2f74f0f587 Composer update 2019-03-13 08:37:33 +02:00
Matias Griese
6e2e533184 Minor fix for FlexUser, changelog update 2019-03-13 08:30:38 +02:00
Sébastien Vanvelthem
ecd39421d6 Some phpstan issues (#2393)
* Fix bug, method init must be protected
* Added phpstan level 0
* Added exclusions
* Fix: incorrect case in Twig_SimpleFunction
* Fix, no abstract properties, if properties used in methods let's set them
* Fixed Psr\SimpleCache\InvalidArgumentException referenced with incorrect case
* added exclusions
* Fixed: Access to an undefined property Grav\Framework\Form\FormFlash::$uploadObjects.
* Fixed: does not call parent constructor from Grav\Common\Iterator.
* Fixed: does not call parent constructor from Grav\Common\Iterator.
* Fixed: does not call parent constructor
* Fixed: does not call parent constructor
* Minor: correct type for inflector
* Moved phpstan.neon out of public directory
* Added exclusion
* set GRAV_USER_INSTANCE to prevent LogiException in User
* Exlude Stream:create
* Minor: Missing storage property
* Minor: Fixed missing properties (phpstan level 1)
* Added type for $data
* Minor: Ensure $langs is initialized
* Fix possible bug in $http_response_header status code retrieval (PHP 7.1 only)
* Added exclusion for $http_response_header (isset is actually not required)
* Strict null check
2019-03-13 08:15:22 +02:00
Andy Miller
68d43a0c88 update vendor libs 2019-03-12 15:58:33 -06:00
Kirsten Roschanski
c80a3f5568 Update User.php (#2403) 2019-03-12 14:15:03 -06:00
Matias Griese
b3d84a05f5 Merge remote-tracking branch 'origin/1.6' into 1.6 2019-03-12 20:25:35 +02:00
Matias Griese
95495614a8 Simplify grav services and processors 2019-03-12 20:25:17 +02:00
Andy Miller
45d7a164b5 updated changelog 2019-03-12 06:45:39 -06:00
Andy Miller
97b236d117 updated changelog 2019-03-12 06:29:04 -06:00
Andy Miller
8718c5ef31 Remove legacy media.upload_limit references 2019-03-12 06:25:56 -06:00
Andy Miller
7d7418df26 Merge branch '1.6' of github.com:getgrav/grav into 1.6 2019-03-11 12:14:26 -06:00
Andy Miller
dd9aa5bf78 couple of helpers 2019-03-11 12:14:21 -06:00
Matias Griese
7f86f8eb6f Bug fixes 2019-03-11 14:35:44 +02:00
Matias Griese
8b4cac7ba6 Fixed settion caching in FlexIndex 2019-03-11 14:14:20 +02:00
Matias Griese
b388e91177 Implemented Grav\Framework\Pagination classes 2019-03-11 13:25:47 +02:00
Matias Griese
a2ac3f4c8b FlexForm: Fix unique id for new objects 2019-03-08 20:35:54 +02:00
Matias Griese
1db8b93cfa Request object: Include attribute for request time 2019-03-08 20:34:14 +02:00
Matias Griese
6217ac90e0 Improved Flex::getObjects() logic 2019-03-07 14:43:24 +02:00
Matias Griese
bb385490bc Regression: index not working due to missing method 2019-03-07 11:15:16 +02:00
Matias Griese
a5e48ba160 Fixed typo 2019-03-06 12:35:10 +02:00
Matias Griese
c7a4e8e4bb Added FlexObjectInterface::search() and FlexCollectionInterface::search() methods 2019-03-06 12:34:00 +02:00
Matias Griese
85d5b6e889 Generalized flex index creation 2019-03-06 10:19:47 +02:00
Andy Miller
1c725c02f0 Better error checking in bin/plugin for existence and enabled 2019-03-05 12:46:48 -07:00
Matias Griese
5008672a48 Add missing extend to PageInterface 2019-03-05 15:40:34 +02:00
Matias Griese
4e03f19bac Update all classes to rely on PageInterface instead of Page class 2019-03-05 15:29:39 +02:00
Matias Griese
a03c328ee3 Create set of interfaces for all page methods 2019-03-05 15:16:01 +02:00
Andy Miller
77ac68f2e8 Merge branch '1.6' of github.com:getgrav/grav into 1.6 2019-03-04 20:05:21 -07:00
Andy Miller
02acc34461 Move last backup logging into the backup command 2019-03-04 20:05:15 -07:00
Matias Griese
a402a8ef84 Fix FlexForm::getBlueprint() for admin 2019-03-05 00:15:30 +02:00
Matias Griese
60573c1d78 Add parameters for FlexForm::getMediaTaskRoute 2019-03-04 22:59:43 +02:00
Matias Griese
56adf40bb4 Merge remote-tracking branch 'origin/1.6' into 1.6 2019-03-04 18:22:57 +02:00
Matias Griese
d33c45165d Add object.media[filename] support into FlexMediaTrait 2019-03-04 18:22:47 +02:00
Andy Miller
032acedafe Lang updates 2019-03-01 14:32:59 -07:00
Andy Miller
6a48216afb Updated editorconfig to be valid 2019-03-01 14:14:44 -07:00
Matias Griese
85af461eb4 FlexObject: When creating object and key isn't set, use storage key instead 2019-03-01 15:13:21 +02:00
Matias Griese
4b1a129f38 Merge remote-tracking branch 'origin/1.6' into 1.6 2019-03-01 14:48:01 +02:00
Matias Griese
1762ef3d1e Added Medium::size() 2019-03-01 14:47:53 +02:00
Andy Miller
8ffba2d88d fix typo 2019-03-01 05:44:21 -07:00
Andy Miller
f19cb94f89 cleanup 2019-03-01 05:25:29 -07:00
Andy Miller
8fb7caa22a Safer check for admin 2019-02-28 18:44:29 -07:00
Andy Miller
07646860f2 updated toolbox version 2019-02-28 16:11:54 -07:00
Andy Miller
6765c5f594 Merge branch '1.6' of github.com:getgrav/grav into 1.6 2019-02-28 14:59:39 -07:00
Matias Griese
026f9cb3a0 Fixed potential undefined property in onPageNotFound event handling 2019-02-28 22:35:37 +02:00
Andy Miller
516dfd5c26 Merge branch '1.6' of github.com:getgrav/grav into 1.6 2019-02-28 11:30:12 -07:00
Andy Miller
1fbd5e0b38 Fix for static admin::tu() call 2019-02-28 11:29:54 -07:00
Matias Griese
b35a892853 Added Flex::getObjects() and Flex::getMixedCollection() methods for co-mingled collections
Added support to use single Flex key parameter in `Flex::getObject()` method
2019-02-28 16:26:39 +02:00
Matias Griese
578f8e4947 Grav\Framework\File\AbstractFile::save(): Fixed missing directory creation 2019-02-28 10:26:41 +02:00
Andy Miller
a934dd4fff Minor backup things 2019-02-27 12:46:32 -07:00
Andy Miller
18625758e5 Merge branch '1.6' of github.com:getgrav/grav into 1.6 2019-02-26 17:09:15 -07:00
Andy Miller
eb689c417b Updated libs including Toolbox 1.4.3 2019-02-26 17:09:11 -07:00
Matias Griese
df226a1102 Improved File::save() to use a temporary file if file isn't locked 2019-02-26 23:00:43 +02:00
Matias Griese
8947f5ade9 Improved File::save() not to use file lock, but a temporary file, fixed Obtaining write lock failed on file... 2019-02-26 21:21:07 +02:00
Matias Griese
941a5db8de Disable deprecation messages for Page methods for now (used in too many places) 2019-02-26 15:17:03 +02:00
Matias Griese
2fcaaea6ac Fixed mkdir(...) race condition 2019-02-26 15:13:40 +02:00
Matias Griese
5887a396c1 Update changelog by marking fixes/changes between Grav 1.6 beta releases 2019-02-26 12:28:32 +02:00
Matias Griese
f934256e06 Added more deprecation messages 2019-02-26 12:11:51 +02:00
Matias Griese
ccb465e998 Grav 1.6: Renamed $grav['users'] service to $grav['accounts'] 2019-02-26 12:11:15 +02:00
Matias Griese
1b0a6e99f7 Merge branch '1.6' of github.com:getgrav/grav into 1.6 2019-02-26 11:09:52 +02:00
Andy Miller
2e647be565 this is deprecated... 2019-02-25 16:30:31 -07:00
Matias Griese
863123ac92 Changelog update 2019-02-25 19:11:50 +02:00
Matias Griese
434620dea0 Fixed FlexObject::update() removing fields which aren't allowed by ACL 2019-02-25 15:08:33 +02:00
Matias Griese
212d7d24ef Changelog update, minor cleanup 2019-02-25 11:47:24 +02:00
Matias Griese
61cf416df4 Added B/C layer for FormatterInterface 2019-02-25 11:43:42 +02:00
Matias Griese
ff23f6b015 Renamed Grav\Framework\File\Formatter\FormatterInterface to Grav\Framework\File\Interfaces\FileFormatterInterface 2019-02-25 11:29:48 +02:00
Matias Griese
d59d60647c Fixed FlexUser::find() breaking when nothing is found 2019-02-19 23:06:29 +02:00
Matias Griese
cf088d00ff Fixed FlexUser loosing ACL information (apply only for user) 2019-02-19 22:39:47 +02:00
Matias Griese
dd5a10d0e2 Fixed FlexUser loosing ACL information 2019-02-19 22:33:51 +02:00
Matias Griese
0da39aa397 Added method to return FlexIndex from FlexCollection 2019-02-19 12:16:48 +02:00
Andy Miller
2dff43acba prepare for rc.3 2019-02-18 14:56:57 -07:00
Andy Miller
c97853e1aa updated languages 2019-02-18 14:43:06 -07:00
Andy Miller
c9be74fe39 Updated libs 2019-02-18 13:52:56 -07:00
Andy Miller
e7df9c1dca Merge branch 'develop' into 1.6
# Conflicts:
#	CHANGELOG.md
#	system/defines.php
2019-02-18 13:50:22 -07:00
Andy Miller
3c680cd8e8 Added support for a backlink in scheduler 2019-02-18 13:18:01 -07:00
Andy Miller
3545761b92 reformatted the site.yaml a little 2019-02-18 12:59:56 -07:00
Andy Miller
72016d7e7c Fixed purgeJob() and added clearJob() 2019-02-18 12:59:47 -07:00
Andy Miller
6c1701ea5a Fix for email causing infinite ‘call’ recursion 2019-02-16 18:13:24 -07:00
Matias Griese
28372be982 Fixed bug in Flex collection caching 2019-02-15 22:08:02 +02:00
Matias Griese
58f85212db Renamed flex users blueprints to match the class name, move index file [#2378] 2019-02-15 20:15:17 +02:00
Matias Griese
c39bdaf7f2 Added getCache() method to FlexIndex, FlexCollection and FlexObject 2019-02-15 14:17:21 +02:00
Matias Griese
16ab2e59f1 Renamed FlexIndex::getIndex() to getIndexMap() 2019-02-15 13:15:24 +02:00
Matias Griese
29c65c74db Merge remote-tracking branch 'origin/1.6' into 1.6 2019-02-15 11:14:02 +02:00
Matias Griese
fee77d7301 Fixed FlexIndex keys being lost when FlexCollection gets loaded 2019-02-15 11:13:50 +02:00
Andy Miller
21d9fa1e74 display fullname instead of title in list 2019-02-14 16:40:02 -07:00
Matias Griese
b4d973bfd0 Remove var_dump(), oopsie! 2019-02-14 21:12:53 +02:00
Matias Griese
993db32652 Console commands: add method for invalidating cache 2019-02-14 15:32:42 +02:00
Matias Griese
a0f4878c12 Updated version to rc.3 2019-02-14 11:44:32 +02:00
Matias Griese
452df10ea1 Updated UserInterface and FlexObjectInterface by adding missing update() parameter 2019-02-14 11:35:43 +02:00
Matias Griese
a3bf38b182 Change typehints from User to UserInterface 2019-02-14 11:34:41 +02:00
Matias Griese
674ea8ae25 Fixed validation for boolean toggles 2019-02-14 10:39:10 +02:00
Matias Griese
94610f4e61 Fixed missing form_nonce for JS when using FlexForm 2019-02-14 10:06:24 +02:00
Matias Griese
b2df60647d Initialize users before plugins on bin/plugin commands 2019-02-14 09:56:11 +02:00
Matias Griese
e8650a55af Merge remote-tracking branch 'origin/1.6' into 1.6 2019-02-13 23:48:26 +02:00
Matias Griese
09805f7091 Fixed FlexIndex keys being lost when FlexCollection gets loaded 2019-02-13 23:30:35 +02:00
Andy Miller
a63040aa11 Updated built-in composer 2019-02-13 13:18:22 -07:00
Andy Miller
3e97ecab68 Fixes issue with uninitialized users object 2019-02-13 13:17:21 -07:00
Robbert
409b4028d0 fix dead link + add http > https changes to site urls (#2369) 2019-02-12 12:14:28 -07:00
Matias Griese
85b4996dbf Changelog update 2019-02-12 16:16:17 +02:00
Matias Griese
e7041ff48e Change default attribute value of Flex[class]::getType($prefix) to false 2019-02-12 16:14:02 +02:00
Matias Griese
793b56fc8c Fixed validation for select field type with selectize 2019-02-12 14:32:29 +02:00
Matias Griese
ea91601459 Allow onRequestHandlerInit to set Response object 2019-02-11 15:01:23 +02:00
Matias Griese
6e3edb7dfb Some bug fixes for Psr-7 & request handler 2019-02-11 13:59:15 +02:00
Matias Griese
4e38c1fe25 Improve onRequestHandlerInit event 2019-02-11 13:18:32 +02:00
Andy Miller
2adb13ac66 Use array to make ordering easier 2019-02-08 12:34:52 -07:00
Matias Griese
d565c4af16 Improvements for Grav\Framework\Psr7 2019-02-08 21:24:02 +02:00
Matias Griese
877529ae5b Implemented Grav\Framework\Psr7 classes as Nyholm/psr7 decorators 2019-02-08 20:49:05 +02:00
Andy Miller
8b89c2c52e Missing pages.types #1612 2019-02-08 08:47:57 -07:00
Matias Griese
427ba0e420 Fixed FlexUser caching 2019-02-08 13:33:33 +02:00
Matias Griese
4be7aa5665 Changelog update 2019-02-08 12:58:34 +02:00
Matias Griese
9bd66031ab Grav 1.6 code cleanup (#2366)
* Code cleanup
* Define admin menu for Flex Users
2019-02-08 12:56:15 +02:00
Andy Miller
48816d9f2e Fix issue with vUndefined in GPM 2019-02-07 17:56:45 -07:00
Andy Miller
031bfdc1e7 prepare for rc.2 release 2019-02-07 16:23:57 -07:00
Andy Miller
88121aaab4 Merge tag '1.5.8' into develop
Release v1.5.8
2019-02-07 16:04:56 -07:00
Andy Miller
8f588aca99 Merge branch 'release/1.5.8' 2019-02-07 16:04:55 -07:00
Andy Miller
5b34a9bfc4 prepare for release 2019-02-07 16:04:31 -07:00
Andy Miller
ef55d2615f update changelog 2019-02-07 16:03:49 -07:00
Matias Griese
1391dd38a4 Changelog update 2019-02-07 23:40:33 +02:00
Andy Miller
f8f1d5854c Squashed commit of the following:
commit 6522db9beb579ee9ccb4f8b73f22bd0a57af5294
Merge: e047173f a1c8cb9f
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Feb 7 21:25:18 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit e047173fe0acf79a593db5b2e9db87cdc6f416a1
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Feb 7 21:09:18 2019 +0200

    Updated FlexCollection to match object isAuthorized() call (fixed oopsie)

commit a937a5834fab908c915d9859479b07088cbe1677
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Feb 7 21:02:21 2019 +0200

    Updated FlexCollection to match object isAuthorized() call

commit 24ea31364632dddc38057e243075787340c3e86b
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Feb 7 20:48:13 2019 +0200

    Fixed infinite loop when creating DataUser object

commit 5da9fa8e1a4d213e16d8ca5c64a898c1712a28aa
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Feb 7 17:34:54 2019 +0200

    Renamed `FlexAuthorizeInterface::authorize()` to `isAuthorized()`

commit 42fcf352a53a89e2082449ff6280804d913cac99
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Feb 7 10:10:41 2019 +0200

    Added proper security check for user access levels

commit 43f8051305909f4579a65026de020c4ccdb1d15a
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Feb 7 10:07:35 2019 +0200

    Added configuration options for system.accounts fields

commit 9ff8cc6e984744cb1031184721cb3a03d38ca33a
Author: Andy Miller <rhuk@mac.com>
Date:   Wed Feb 6 13:20:02 2019 -0700

    Cleanly handle session corruption due to changing Flex object types

commit 472c7e5367d7e27044e6bf1629800c69178a4b70
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Feb 6 21:50:48 2019 +0200

    Added isValid() method for Data/FlexUser classes

commit 3098479d5e5f0ae370495f77e0615f1a50d9501c
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Feb 6 14:00:06 2019 +0200

    Changelog update

commit 56956e178c93b8eefe055f645693b44f0ce71092
Merge: 84510cdc 466374ba
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Feb 6 13:32:03 2019 +0200

    Merge remote-tracking branch 'origin/1.7' into 1.7

commit 84510cdc24bf445aeb3b4787c6a3198d31789e8c
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Feb 6 13:31:40 2019 +0200

    Restructure Users logic to allow us to switch between old and new classes

commit 466374ba33ba89b396a36cc4fc0bd53f0d974bd0
Merge: 3a84c382 26de0340
Author: Andy Miller <rhuk@mac.com>
Date:   Tue Feb 5 20:37:33 2019 -0700

    Merge branch '1.6' into 1.7

commit 8f9c0e513a48161e97ca8940036c94984b9e814e
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Feb 5 16:23:21 2019 +0200

    Restructure FlexUsers to allow us to switch between old and new classes

commit 3a84c3822b4374dd767fed235003f426a0e48f4b
Merge: 6412498a 34bf8fb5
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Feb 5 14:24:09 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

    # Conflicts:
    #	system/defines.php

commit 6412498acab51bfe96ff2fd071a6875e3f8e435b
Merge: 3467f1d8 b1d43d29
Author: Andy Miller <rhuk@mac.com>
Date:   Mon Feb 4 16:48:04 2019 -0700

    Merge branch '1.6' into 1.7

commit 3467f1d8d0448e588a8902ff70f13e24c4117e33
Merge: 49cf9820 c713625a
Author: Matias Griese <matias@trilbymedia.com>
Date:   Mon Feb 4 22:27:56 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit 49cf9820be70b37ae9ac69e7a35950e5b9fb6c25
Merge: e0aca2f6 24e6b6c8
Author: Matias Griese <matias@trilbymedia.com>
Date:   Mon Feb 4 22:21:37 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit e0aca2f6a0823b7346dc3eeaed698d55d9ae2f4f
Merge: 0bc93fae 632a2d79
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Feb 1 09:06:50 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

    # Conflicts:
    #	system/src/Grav/Common/User/User.php

commit 0bc93faec721e497867bdba224a61bdd397ff8c6
Merge: 91e17b8b e4b1d2ed
Author: Andy Miller <rhuk@mac.com>
Date:   Thu Jan 31 18:42:25 2019 -0700

    Merge branch '1.6' into 1.7

commit 91e17b8b14d4eeeccdd2f297dd27efbc4f515a19
Merge: 959cd21d 9fadb992
Author: Andy Miller <rhuk@mac.com>
Date:   Thu Jan 31 15:41:51 2019 -0700

    Merge branch '1.7' of github.com:getgrav/grav into 1.7

    # Conflicts:
    #	CHANGELOG.md

commit 959cd21da6a3aa3d15e67ad25114b4238fd5eba9
Merge: 22eedbfd a3fea3d0
Author: Andy Miller <rhuk@mac.com>
Date:   Thu Jan 31 15:40:21 2019 -0700

    Merge branch '1.6' into 1.7

    # Conflicts:
    #	CHANGELOG.md
    #	system/defines.php

commit 9fadb992a409473ec047cee329adfd2fc001ec99
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Feb 1 00:11:05 2019 +0200

    Added search() for user collection

commit fb1193e465fa0f6719a43215d0218d9e774519f1
Merge: d633eabf d50e5d95
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Jan 31 21:19:35 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit d633eabf58216f18c3bd2ac179f474f621206d5a
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Jan 31 21:17:35 2019 +0200

    Index username and email in lowercase letters

commit 86db584b0075ef7ad523d97bbe600c83815648e0
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Jan 31 15:21:40 2019 +0200

    Rework FlexUser index

commit 540dbcd24c790114cec122f8bfbdc4d199cd9e2b
Merge: 28e41fb7 7a044c73
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Jan 31 15:08:38 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

    # Conflicts:
    #	CHANGELOG.md

commit 28e41fb7e76bc1e569c0fcb8440c16d228396c73
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Jan 31 11:17:29 2019 +0200

    Remove useless check

commit bd7b91efcba0914a3b4a664319c73b230e0e0755
Merge: 22eedbfd 4f80a156
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Jan 31 10:16:33 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

    # Conflicts:
    #	CHANGELOG.md
    #	system/defines.php

commit 22eedbfd1160a38f24525c50cb4ca61caec4a1f8
Author: Andy Miller <rhuk@mac.com>
Date:   Wed Jan 30 17:18:59 2019 -0700

    Defines update

commit 338d40993e16e5c233c5fd010a259bbb37433de3
Merge: 1ecb6c4c f312c44a
Author: Andy Miller <rhuk@mac.com>
Date:   Wed Jan 30 17:15:38 2019 -0700

    Merge branch '1.6' into 1.7

commit 1ecb6c4c2b42e61785c473348bbeaffd2319344a
Merge: 22fc6ede 60436104
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 30 21:05:13 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit 22fc6edea286a51bb15f23dd8762960b5bb1821f
Merge: 21b9e2cd d45efb48
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 30 20:51:30 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit 21b9e2cd7c06e9f286428f2794ebd7d4e8f0e64d
Merge: 09f9eb22 610c6c34
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 30 11:20:39 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit 09f9eb228f5980a56602b0a82ca73929d1d0336c
Author: Andy Miller <rhuk@mac.com>
Date:   Tue Jan 29 17:16:42 2019 -0700

    updated changelog

commit d2641c89e5a8e25d5a8d20cb10d7d0d302661ac7
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 29 23:08:04 2019 +0200

    Added support for looking up user by key, flex_key and storage_key

commit 2482ae7b8ca46e9cd6c7759ee5c3a62cb1e58363
Merge: 354bfd95 bbdac0fd
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 29 22:22:29 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit 354bfd95fccf169357591a7f4c6b603121012f12
Merge: c0299f0d 5f5bfdaa
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 29 19:32:41 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit c0299f0de81ebc3a0d05e147443a1602e7f86a34
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 29 19:22:24 2019 +0200

    Log alert if user index file gets corrupted or cannot be read

commit a9bd316868c45ada12ba7756ef6abc46daa3638d
Merge: 318cff10 ad7fdd5c
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 29 18:15:00 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit 318cff102747c863e785f3bdbf3e538c84884b29
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 29 18:00:18 2019 +0200

    FlexUser: Do not fail hard if user index is corrupted

commit a402e675e485c2ccaa9e15f0d4f444073efe1fc5
Merge: a6179018 1321e582
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 29 16:09:10 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit a6179018d3e57acf6a0e00ed8cbe65be1b214ae7
Merge: eaeb9d30 f7865873
Author: Matias Griese <matias@trilbymedia.com>
Date:   Mon Jan 28 19:48:39 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit eaeb9d30251e9e31cd72c34c2f0f3a9b8e448f6c
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 25 12:20:16 2019 +0200

    FlexUser: Fixed original avatar image saving if there wasn't any before resize

commit 6e9b880dba19e3e717065e1d6b9adce4eb4fa100
Merge: d02f1c3d 5ad4ffd3
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 25 12:13:03 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

    # Conflicts:
    #	system/src/Grav/Common/Form/FormFlash.php

commit d02f1c3dd6b9e621fd1da5d9fb845faf2efb14d2
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 25 11:42:56 2019 +0200

    Fixed a bug on Form file crop with existing data

commit 17221a2a31fb7153e83e6a949bd004fe6aa73af8
Merge: c1c0467e 0700e4bf
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 25 11:08:14 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into 1.7

commit c1c0467ea1510bf7a7dceadefccb1358a6e74b28
Author: Matias Griese <matias@trilbymedia.com>
Date:   Thu Jan 24 16:20:51 2019 +0200

    Added `FlexCollection::sort()` method

commit a07f36995573646ce08fa8fb70adcb9f6ccbb95b
Merge: 4929c700 6d89108c
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 21:25:35 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit 4929c700065c10c6e047fd46169d121aea8c0fad
Merge: 13aac576 4e31a114
Author: Andy Miller <rhuk@mac.com>
Date:   Wed Jan 23 12:17:23 2019 -0700

    Merge branch '1.6' into feature/1.6-flex-users

commit 13aac576f81c0ef1a6721652c04432512c3bb669
Merge: 81b47c21 18d53079
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 20:54:29 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit 81b47c21ff58d5c6c876857dd9ea24d9cef97880
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 15:43:23 2019 +0200

    Move user search index into user-data://accounts folder

commit c7bf4fc71abd1298d729da08e0770dd94ab4f708
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 15:41:48 2019 +0200

    Fixed fatal error when user has no avatar

commit 586f6252d84c657b58fe84b79955c4542900e56a
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 15:41:18 2019 +0200

    Added configuration option for account storage type, default to old structure

commit 78cd6d05aa06e132ba4090edac5b4a4dab54d13b
Merge: 2d554b55 57de7cc0
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 15:14:17 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit 2d554b5577224bdd160e1319a9ba51b0b0ee6a34
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 12:46:50 2019 +0200

    FlexUser: Added original/cropped image support

commit 3f78f1b82316cf4d8bb2d0109c11ec6bf73c2bc5
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 12:13:54 2019 +0200

    FlexUser: Added original image/crop support

commit f8b7e7922cb036d57345d5587e9ba70271722503
Merge: f6b81fde e6b6e218
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 11:21:16 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit f6b81fde528a2b6ef17b784a5b695bb371b4617c
Merge: d82eeeac 24305528
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 11:11:39 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit d82eeeac9b50290d17b852e2221d9ae97b375fdc
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 10:28:58 2019 +0200

    MediaTrait: Clearing cache should unset media variable

commit ddaa9117ed7e795f95d897b6dd07a604482ca60b
Author: Matias Griese <matias@trilbymedia.com>
Date:   Wed Jan 23 10:11:26 2019 +0200

    FlexUser: Fixed issue on avatar if the field isn't what is expected by default (an array)

commit 8b23a47708106557c41fe497211e4dc3c7c1767e
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 22 22:03:47 2019 +0200

    Added User::getAvatarMedia() method

commit bb175341a5cb556c698481731fe73e9fa4b07643
Merge: bc9d60ca 5b0e2e40
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 22 21:44:18 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

    # Conflicts:
    #	system/src/Grav/Common/User/User.php

commit bc9d60ca79888c1c7eb0087bc841f409a67017b0
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 22 21:25:19 2019 +0200

    FlexUser: Fix extra parameter

commit 93b4b03706e8440e8e7ccad473fc5595ac85b631
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 22 11:10:51 2019 +0200

    FlexUser: Added support for avatar (or images in general)

commit fcd5756d2747cc4126c03fc53c2bd1bd35f0e8dc
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 22 09:29:54 2019 +0200

    Add `FormFlash::clearFiles()` method

commit 9da3c566188fa3f68077292d82a68b793763dc6a
Author: Matias Griese <matias@trilbymedia.com>
Date:   Mon Jan 21 20:57:07 2019 +0200

    Added media support for User

commit bb94022b709cebc73be4b3f010568b6504535aa2
Author: Matias Griese <matias@trilbymedia.com>
Date:   Mon Jan 21 11:44:35 2019 +0200

    Store users with unique ids

commit 6a184c4011ed3ed90cec4d536ead067896a580aa
Merge: 698a291c bd27d6fe
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 18 14:14:23 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

    # Conflicts:
    #	system/src/Grav/Common/User/User.php

commit 698a291cc844605dd8e969784883207308bc3a5f
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 18 14:02:02 2019 +0200

    Make sure that `authenticated` and `authorized` will not be saved into the file

commit 59c7dd59af86c7e0feaf4a9fa3832bad8a85b631
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 18 13:09:43 2019 +0200

    FlexUser: Fixed missing username in the object

commit b139e5daaa67d51baa26222e6155b359ac5a17f5
Merge: 426dae47 254fe990
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 18 12:22:22 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

    # Conflicts:
    #	system/src/Grav/Common/User/User.php

commit 426dae4731383bfd64f7e8e611f3721f58776feb
Merge: f4ff6713 0afe9d4f
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 18 11:00:36 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit f4ff6713ac1c930b3f932b285c762552f99c79b0
Merge: eaab0b0a 751d1da7
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 11 13:04:04 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit eaab0b0ae9c50ca5995ea7aa769720fc647ec4c2
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 11 12:57:15 2019 +0200

    Fixed merge conflict

commit 531dd1a788a6496c228c56103d4512d39c4d7650
Merge: 3bd925d6 f0cf4ed8
Author: Matias Griese <matias@trilbymedia.com>
Date:   Fri Jan 11 12:50:46 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit 3bd925d61b96c12ea77cad19f4a9c01ba9afba8f
Merge: a383fbac a224c8b3
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Jan 8 18:37:22 2019 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/1.6-flex-users

commit a383fbac0447d3226ee3a6109b99edca5210c5e5
Merge: 422e1f70 b38a143c
Author: Matias Griese <matias@trilbymedia.com>
Date:   Tue Dec 4 15:32:39 2018 +0200

    Merge branch '1.6' of https://github.com/getgrav/grav into feature/flex-users

    # Conflicts:
    #	system/src/Grav/Common/Grav.php

commit 422e1f7027389fd1727dac4e269309a33187ea69
Author: Matias Griese <matias@trilbymedia.com>
Date:   Mon Nov 26 19:57:28 2018 +0200

    Implement Flex User classes
2019-02-07 14:36:07 -07:00
Matias Griese
a1c8cb9f78 Typo in changelog 2019-02-07 14:42:19 +02:00
Matias Griese
54ce1b570a Regression: $session->getFlashObject('files-upload) did not work with Form 3.0 2019-02-07 11:28:54 +02:00
Matias Griese
f2d66c810a Use standard filename check in FormTrait 2019-02-07 08:35:43 +02:00
Andy Miller
26de0340ec Updated vendor libs including Symfony 4.2.3 2019-02-05 16:47:53 -07:00
Andy Miller
333fbd0db1 Update vendor libraries 2019-02-05 16:47:05 -07:00
Andy Miller
4cf4c09339 limit stack track rows… 50+ is nuts! 2019-02-05 14:18:48 -07:00
Matias Griese
34bf8fb5bb Minor fix when installing full package via direct install 2019-02-05 13:51:07 +02:00
Matias Griese
06eee1e711 Some installer fixes (clear cache, direct install with full package) 2019-02-05 13:23:16 +02:00
Matias Griese
b6ab086bf7 Changelog update 2019-02-05 11:35:11 +02:00
Andy Miller
b1d43d292d Added some useful object twig functions/filters 2019-02-04 16:30:18 -07:00
Matias Griese
19b92f17dd Improved Grav Core installer 2019-02-04 22:34:46 +02:00
Matias Griese
c713625a38 FlexIndex: Fixed undefined index 2019-02-04 22:27:21 +02:00
Matias Griese
24e6b6c8f1 Fixed Flex from indexing hidden folders/files as objects 2019-02-04 22:21:11 +02:00
Andy Miller
cebe28e591 Updated changelog 2019-02-01 19:02:16 -07:00
Andy Miller
b111a2c29d Added standard Yes/No lang strings to Grav 2019-02-01 13:34:23 -07:00
Matias Griese
8743a8080c Changelog update for #2350 2019-02-01 21:31:59 +02:00
Andy Miller
f2155aa04f Merge branch '1.6' of github.com:getgrav/grav into 1.6 2019-02-01 11:26:21 -07:00
Andy Miller
45346b72f2 Fix for trailing slash redirect in multlang 2019-02-01 11:26:16 -07:00
Matias Griese
632a2d79b6 Merge branch 'develop' of https://github.com/getgrav/grav into 1.6
# Conflicts:
#	CHANGELOG.md
2019-02-01 09:05:29 +02:00
Matias Griese
2fa5021a0c Improved User unserialize to not to break the object if serialized data is not what expected 2019-02-01 09:04:01 +02:00
Andy Miller
e4b1d2ed9e Enhancements to logviewer output to support lines in trace 2019-01-31 18:38:31 -07:00
Andy Miller
a3fea3d0fc Added LogViewer class and CLI command 2019-01-31 15:39:46 -07:00
Matias Griese
d50e5d954d Fixed oopsie in Package class 2019-01-31 20:49:12 +02:00
Matias Griese
970af3870e Some code cleanup 2019-01-31 17:57:05 +02:00
Matias Griese
9ba572d788 Fixed non-namespaced exceptions in scheduler 2019-01-31 17:53:11 +02:00
Matias Griese
ba2c37c216 Removed apc and xcache support, made apc alias of apcu 2019-01-31 17:51:04 +02:00
Matias Griese
0e14a325f8 Fixed some static/object calls to match the method 2019-01-31 17:42:18 +02:00
Matias Griese
1141dabbd8 Code cleanup 2019-01-31 17:32:06 +02:00
Matias Griese
7a044c7397 Added index file support for Flex Objects 2019-01-31 15:07:30 +02:00
Matias Griese
d0b3dd1d99 Improved error detection for broken Flex Objects 2019-01-31 15:06:41 +02:00
Matias Griese
4f80a1567d Update PHP file headers and copyrights 2019-01-31 10:04:57 +02:00
Andy Miller
23098a6b02 Revert "Grav 1.6 copyright updates and cleanup (PHP files only) (#2351)"
This reverts commit 0566185c4f.
2019-01-30 17:54:37 -07:00
Andy Miller
5c8a37be64 Updated version 2019-01-30 17:35:30 -07:00
Andy Miller
7b8944e8f2 updated changelog 2019-01-30 17:34:17 -07:00
Andy Miller
37fcb12ad1 Updated languages 2019-01-30 17:33:25 -07:00
Matias Griese
f312c44a46 Changelog update 2019-01-31 00:13:16 +02:00
Andy Miller
999e439d47 Merge branch 'develop' into 1.6 2019-01-30 13:45:19 -07:00
Matias Griese
0566185c4f Grav 1.6 copyright updates and cleanup (PHP files only) (#2351)
* Framework: update copyrights to 2019

* Some code cleanup (Assets, Backup, Config, Session)

* Continue code cleanup, update copyrights

* Fixed exception issues in scheduler, code cleanup

* Remove apc and xcache support, make apc alias of apcu

* Fixed Getters::count() method not returning anything

* More code cleanup, copyright updates

* Copyright updates for Grav\Console
2019-01-30 13:44:19 -07:00
Hamilton Turner
b91574e5c2 Remove unused parameter (#2357) 2019-01-30 13:42:34 -07:00
Matias Griese
604361045b Fixed bad host header in PSR-7 (if using 'php -S localhost:8000 system/router.php') part 2 2019-01-30 21:04:53 +02:00
Matias Griese
d45efb484c Fixed bad host header in PSR-7 (if using 'php -S localhost:8000 system/router.php') 2019-01-30 20:51:09 +02:00
Matias Griese
610c6c341c Fixed ImageMedium constructor warning when file cannot be accessed 2019-01-30 11:20:12 +02:00
Matias Griese
6daf480bfc Fixed FlexMediaTrait::getMedia() trying to include uploaded but already moved media 2019-01-30 11:17:49 +02:00
Matias Griese
bbdac0fd6d Made FormFlashFile more robust against deleted files (over time) 2019-01-29 22:22:00 +02:00
Matias Griese
5f5bfdaa42 Add protected method FormTrait::unsetFlash() 2019-01-29 19:32:19 +02:00
Matias Griese
ad7fdd5c2b Fixed a bug in FormFlashFile::moveTo() not deleting the old file 2019-01-29 18:12:38 +02:00
Matias Griese
1321e582d5 FlexObject: Fixed a bug when updating media 2019-01-29 14:13:14 +02:00
Stefan Bauer
6d6689b431 Update CHANGELOG.md (#2355) 2019-01-29 10:21:39 +02:00
Matias Griese
f78658738a FlexObject: Fixed a bug when updating media 2019-01-28 13:00:51 +02:00
Andy Miller
7c99ece0e1 make sure HTTP_DNT is set before inspecting it 2019-01-25 16:49:23 -07:00
Andy Miller
9058e1166d prepare for release 2019-01-25 14:42:33 -07:00
Andy Miller
ebd94a532c Merge branch 'develop' into 1.6
# Conflicts:
#	CHANGELOG.md
#	composer.lock
#	system/defines.php
2019-01-25 14:41:36 -07:00
Andy Miller
95a4ecb0f1 Merge branch 'release/1.5.7' 2019-01-25 14:38:52 -07:00
Andy Miller
ff8cc83b3a Merge tag '1.5.7' into develop
Release v1.5.7
2019-01-25 14:38:52 -07:00
Andy Miller
fbd3bbdbf9 Prepare for release 2019-01-25 14:38:31 -07:00
Andy Miller
f0e58adfbc Updated vendor libraries 2019-01-25 14:37:43 -07:00
Matias Griese
5ad4ffd3cf FormFlash: Fixed some image cropping issues 2019-01-25 12:12:04 +02:00
Matias Griese
0700e4bfdb Replace array cast in FormTrait::getFiles() 2019-01-25 10:42:21 +02:00
Matias Griese
82e5df960d Merge remote-tracking branch 'origin/1.6' into 1.6 2019-01-25 10:40:36 +02:00
Matias Griese
3ace15d01a Added FlexCollection::sort() method 2019-01-25 10:40:28 +02:00
Andy Miller
d367e6a1fb Fix null -> array issue 2019-01-24 15:08:23 -07:00
Matias Griese
a09940ef6a Added FlexCollection::sort() method 2019-01-24 16:21:26 +02:00
Matias Griese
6d89108cc4 Merge remote-tracking branch 'origin/1.6' into 1.6 2019-01-23 21:24:37 +02:00
Matias Griese
bd01b07b4b Reverted Route::__toString() behavior and added deprecated message for proper use (part 2) 2019-01-23 21:24:31 +02:00
Andy Miller
4e31a114ef Use new toString() 2019-01-23 12:16:48 -07:00
Matias Griese
18d53079dd Reverted Route::__toString() behavior and added deprecated message for proper use 2019-01-23 20:54:10 +02:00
Matias Griese
57de7cc03d Missing docblock parameter 2019-01-23 15:13:52 +02:00
Matias Griese
2d7eeb611d Added missing Flex::getObject() and Flex::getCollection() parameters 2019-01-23 13:02:33 +02:00
Matias Griese
e6b6e218f8 Fixed MediaTrait::getMedia() to return refreshed Media object after calling MediaTrait::clearMediaCache() 2019-01-23 11:20:44 +02:00
Matias Griese
243055289b Add FormFlash::clearFiles() method 2019-01-23 10:59:04 +02:00
Matias Griese
52c7d8dfb7 Fixed Grav\Framework\Route::__toString() returning relative URL, not relative route 2019-01-23 10:55:32 +02:00
Andy Miller
5b0e2e401e vendor udpates 2019-01-22 09:40:09 -07:00
Matias Griese
8381261b7c Do not cache FlexObject::authorize() 2019-01-22 13:33:44 +02:00
Matias Griese
2ada99d314 Make $user->update() to behave like $user->merge() 2019-01-21 21:00:58 +02:00
Matias Griese
bd27d6fe8c Fixed backwards incompatibility: Form::getData($name) 2019-01-18 14:12:28 +02:00
Matias Griese
b94631533d User: Ignore authenticated and authorized on object creation 2019-01-18 14:11:33 +02:00
Matias Griese
fb9baaed8a Make sure that authenticated and authorized will not be saved into the file 2019-01-18 13:33:17 +02:00
Matias Griese
254fe990ba Improved Grav\Common\User class; added $user->update() method 2019-01-18 12:20:57 +02:00
Matias Griese
0afe9d4f93 Undo comment out, code works now 2019-01-17 15:26:22 +02:00
Matias Griese
ccca3170d3 Fixed HTTP codes for non-standard response codes becoming 500 server errors 2019-01-17 12:08:19 +02:00
Andy Miller
00b1f12dda Updated changelog 2019-01-16 17:05:48 -07:00
Andy Miller
9ca411aa24 Fixed issue with redirect_trailing_slash losing query string #2269 2019-01-16 17:05:42 -07:00
Andy Miller
e976aa0f5f Fixed some issues with Medium querystring + timestamps 2019-01-16 14:21:56 -07:00
Matias Griese
02c979bdf6 Fixed FlexForm::getValue() call to return the correct data 2019-01-16 21:53:44 +02:00
Matias Griese
88625c6362 For now, do not save form data in flex submit 2019-01-16 18:09:04 +02:00
Matias Griese
76ff68a594 Added file modification timestamps for media images 2019-01-16 17:59:29 +02:00
Matias Griese
d27a2171ea Route: Added support for file extension (part 2) 2019-01-16 15:10:00 +02:00
Matias Griese
075498d03b Route: Added support for file extension 2019-01-16 12:04:26 +02:00
Matias Griese
f04ae315e4 Filter unknown array fields as arrays, not text 2019-01-16 10:45:19 +02:00
Matias Griese
2e277f3cb3 Make Form::getFlash() public 2019-01-16 10:10:53 +02:00
Andy Miller
29098aa8db Updated changelog 2019-01-15 16:32:00 -07:00
Andy Miller
659cd1bb92 return $this from init() 2019-01-15 16:31:54 -07:00
Andy Miller
3bf7c6943a Added some Util array functions 2019-01-15 16:31:43 -07:00
Andy Miller
189e29b5c6 Add FlexObject::getChanges() method 2019-01-15 16:29:47 -07:00
Matias Griese
0ede252fa3 Fix undefined variable id on FormTrait::getFlash() 2019-01-15 20:18:46 +02:00
Matias Griese
d7d69b2be8 Added support for storing form state by user or session 2019-01-15 12:31:03 +02:00
Matias Griese
d79729f596 Fixed a timer bug in Tasks Processor 2019-01-15 11:31:33 +02:00
Matias Griese
988d4ab047 Fix a bug in FormTrait::validate() 2019-01-15 11:31:08 +02:00
Andy Miller
437866dfcd Merge branch 'develop' into 1.6 2019-01-14 19:00:21 -07:00
Rotzbua
c40dcf020c add do not track header detection (#2334) 2019-01-14 17:49:46 -07:00
Andy Miller
e520bd0eb8 Fixed environment issue #2284 2019-01-14 13:55:29 -07:00
Matias Griese
3a9e57e228 Added form preview support for FlexObject, including a way to render newly uploaded files before saving them 2019-01-14 18:44:37 +02:00
Matias Griese
22ed1286e8 Added support to add extra files to Media object 2019-01-14 18:41:05 +02:00
Matias Griese
1a37c54316 Fixed FlexForm::updateObject() to update array values when they are empty in the form 2019-01-14 14:15:22 +02:00
Andy Miller
b6328944a3 Move processMarkdown() method from TwigExtension to more general Utils class 2019-01-13 16:20:19 -07:00
Matias Griese
751d1da704 Added unset type/filter to the validation 2019-01-11 13:03:04 +02:00
Matias Griese
5cf4eea09e Remove debug backtrace and die when session fails to start 2019-01-11 13:02:37 +02:00
Matias Griese
f0cf4ed8ff Regression: Fix serialize issues with forms 2019-01-11 00:28:57 +02:00
Matias Griese
fa61ed17b1 Added check for bad JSON back (tracked down and fixed the issue in form plugin) 2019-01-10 19:59:11 +02:00
Raphaël Droz
f1363877d8 preserve accents in fields containing Twig expr. using unicode (#2279)
When a fields contain accentuated characters, reduce the risk of messing with it by passing unicode characters unescaped.
Twig will deal with them. And fewer backslash-escaping problems will arise.
2019-01-09 13:05:32 -07:00
Basile Trujillo [L0gIn]
e8825beae5 Added support for AWS Cloudfront forwarded scheme header (#2297)
AWS Cloudfront does not provide HTTP_X_FORWARDED_PROTO header but provide a HTTP_CLOUDFRONT_FORWARDED_PROTO header instead
2019-01-09 13:04:32 -07:00
Matias Griese
830a83e3d1 Symfony library update 2019-01-09 09:28:33 +02:00
Matias Griese
7d249c61c2 Added check for bad JSON back (tracked down and fixed the issue in form plugin) 2019-01-08 19:35:51 +02:00
Matias Griese
a224c8b348 FlexForm: Maintain form state on page reloads 2019-01-08 14:32:18 +02:00
Matias Griese
c04208d5dd FlexForm: Fixed missing inputs after save, reset form after save 2019-01-08 13:52:13 +02:00
ranitham
394dfad566 Small bugfix for responsive images (#2300)
* Replace spaces in image filename with %20 to avoid parse errors with the srcset attribute

* Update system/src/Grav/Common/Page/Medium/ImageMedium.php

Co-Authored-By: ranitham <ranitha.m@gmail.com>
2019-01-07 21:34:00 -07:00
Rotzbua
2c55fe01ac add return types for user/authentication (#2293) 2019-01-07 21:29:30 -07:00
Rotzbua
680bfef2c3 http to https (#2299) 2019-01-07 21:28:56 -07:00
Matias Griese
a23cbd0257 Added Blueprint::processForm() method to filter form inputs in Flex form 2018-12-21 12:37:08 +02:00
Matias Griese
f5b77e8082 Added onPageAction, onPageTask, onPageAction.{$action} and onPageTask.{$action} events 2018-12-20 14:08:40 +02:00
Matias Griese
10378ac5af FlexForm: Added support for custom(ized) blueprint layouts 2018-12-20 11:36:01 +02:00
Matias Griese
4a290e6194 Added Grav\Framework\Form\Interfaces\FormFactoryInterface 2018-12-19 22:44:31 +02:00
Matias Griese
c2c0fb242b Minor bugfix 2018-12-19 21:00:10 +02:00
Matias Griese
9b37e50492 Added Page::forms() method to get normalized list of all forms defined in the page 2018-12-19 20:57:47 +02:00
Matias Griese
6c6e8d2605 Added Flex::getObject() for getting flex object directly 2018-12-19 17:40:09 +02:00
Matias Griese
5a6e6dceda Define FormInterface 2018-12-19 13:35:02 +02:00
Andy Miller
e8631da9f3 parepare for beta release 2018-12-14 15:13:09 -07:00
Andy Miller
5d57713f95 Merge branch 'develop' into 1.6
# Conflicts:
#	system/defines.php
2018-12-14 15:07:51 -07:00
Andy Miller
28bd4027cd Merge branch 'release/1.5.6' 2018-12-14 15:07:22 -07:00
Andy Miller
108541e0d0 Merge tag '1.5.6' into develop
Release v1.5.6
2018-12-14 15:07:22 -07:00
Andy Miller
54a177279f prepare for release 2018-12-14 15:07:12 -07:00
Andy Miller
b3e9974e95 updated changelog 2018-12-14 15:06:39 -07:00
Matias Griese
2ad66102d2 FlexMediaTrait: Cropping existing image without original fails to move the original image to safe place 2018-12-13 23:14:31 +02:00
Matias Griese
6828114e86 Merge remote-tracking branch 'origin/1.6' into 1.6 2018-12-13 22:21:18 +02:00
Matias Griese
f53b43de14 FormFlash: Added support for storing form data 2018-12-13 22:21:10 +02:00
Andy Miller
d53dbdf5ba Updated vendor libs 2018-12-13 13:06:34 -07:00
Matias Griese
8ba00f5967 Flex: Fixed cropping issues on edit 2018-12-13 18:21:39 +02:00
Matias Griese
56c7b8ca5f Flex: Fixed uploading images when creating a new object 2018-12-13 13:49:04 +02:00
Matias Griese
d6115007ab Flex: Clear updated after saving the changes to prevent it being called twice 2018-12-13 11:36:59 +02:00
Matias Griese
ba53d876bc FlexMediaTrait::deleteMediaFile() should check if folder exists 2018-12-13 10:55:45 +02:00
Matias Griese
2d593995ee Flex: Added support to automatically update object media on save 2018-12-13 10:42:23 +02:00
Matias Griese
3808776ddb Merge remote-tracking branch 'origin/1.6' into 1.6 2018-12-12 23:37:58 +02:00
Matias Griese
9a118d0a71 Fixed upload of original images 2018-12-12 23:37:50 +02:00
Andy Miller
684d6d3389 This can get used externally too… 2018-12-12 10:14:28 -07:00
Matias Griese
89a0e960e2 Improve file upload logic on flex objects 2018-12-12 16:14:55 +02:00
Matias Griese
1b21e01938 FlexForm: Disable handling of file uploads on form submit (for now) 2018-12-12 14:09:24 +02:00
Matias Griese
3b692a27b4 Improved Flex save/delete 2018-12-12 12:45:06 +02:00
Matias Griese
3c83f379ee Added onFlexObjectSave and onFlexObjectDelete events 2018-12-12 11:52:50 +02:00
Matias Griese
0c344df07a Fixed Flex indexes with flex_key 2018-12-12 10:38:09 +02:00
Matias Griese
2a20959660 Fixed session throwing error in CLI if initialized 2018-12-12 09:39:13 +02:00
Matias Griese
94a843429d Added {% render object layout: 'default' with { variable: true } %} for Flex objects and collections 2018-12-12 00:02:38 +02:00
Matias Griese
34e6b6652a Make FlexForm more flexible for different tasks 2018-12-11 20:25:31 +02:00
Matias Griese
1ba785f28e ContentBlock: Fixed nested caching detection 2018-12-11 16:08:58 +02:00
Matias Griese
bac24cf520 Flex: Improve FlexAuthorizeTrait 2018-12-11 11:54:59 +02:00
Matias Griese
40b7d53349 Merge remote-tracking branch 'origin/1.6' into 1.6 2018-12-10 15:30:19 +02:00
Matias Griese
96d44b4322 Flex: Allow disabling collection/object caching from template 2018-12-10 15:30:09 +02:00
Andy Miller
bf127fb0bd fix for ini_set 2018-12-07 13:04:35 -07:00
Matias Griese
501bc0133f FormFlash: Allow no field for file uploads 2018-12-07 21:35:28 +02:00
Matias Griese
787bf8beeb FlexForm: Implemented delayed flash uploads 2018-12-07 20:41:37 +02:00
Matias Griese
257396aa06 FormFlash: Added support for removing existing files (null instead of object) 2018-12-05 14:45:29 +02:00
Matias Griese
7eb469f0ae Fixed bug in FlexForm::getFlash() 2018-12-05 12:09:56 +02:00
Matias Griese
156e544ab9 Change FormFlash constructor to be more generic, add method to clear session 2018-12-05 09:37:56 +02:00
Matias Griese
b38a143c66 Added new $grav['filesystem'] service using an instance of the new Filesystem object 2018-12-04 15:30:37 +02:00
Matias Griese
cd21d65400 FlexForm: minor improvement to making method overriding more of copy/paste 2018-12-04 15:03:29 +02:00
Matias Griese
b19cb1215b Fix tests 2018-12-03 13:55:32 +02:00
Matias Griese
48acad3e47 Improve Filesystem class 2018-12-03 13:54:40 +02:00
Matias Griese
009db01ab9 Changelog update 2018-12-03 11:37:51 +02:00
Matias Griese
7d8fff9571 Minor fix, oops 2018-12-03 11:36:42 +02:00
Matias Griese
9d048f5f36 Merge branch 'feature/1.6-cleanup' into 1.6 2018-12-03 11:29:20 +02:00
Matias Griese
cb4ea86310 Improved Grav\Framework\File classes to use better type hints and the new Filesystem class 2018-12-03 11:26:55 +02:00
Matias Griese
2b099c2ed5 Added Grav\Framework\Filesystem\Filesystem class with methods to manipulate stream URLs 2018-12-03 11:11:00 +02:00
Matias Griese
6afb55cc30 Improved Grav\Framework\File\Formatter classes to have abstract parent class and some useful methods 2018-12-03 08:00:14 +02:00
Matias Griese
0937e0ff91 Added return type DI\Container::has(): bool 2018-12-03 07:40:59 +02:00
Matias Griese
d602cb6e9e Fixed Object serialization breaking if overriding jsonSerialize() method 2018-12-03 07:34:59 +02:00
Matias Griese
e02fa1a4e7 Some code cleanup 2018-12-03 07:28:50 +02:00
Andy Miller
9e1661eb8c commited composer lock file 2018-12-02 21:31:53 -07:00
Chris Jung
00c6313102 Update to Symfony 4.2 (#2280) 2018-12-02 21:29:53 -07:00
Matias Griese
f01792ae81 Added FormFlash and FormFlashFile classes, allow custom FlexForm class, improvements 2018-12-01 22:09:44 +02:00
Matias Griese
bc18b9408b Added onAction.{$action} event 2018-12-01 10:04:15 +02:00
Matias Griese
fa948c04ab Typo in changelog 2018-11-30 23:05:51 +02:00
Matias Griese
8fdd34c245 Added support for task:action (like task but works without nonce) 2018-11-30 23:04:34 +02:00
Matias Griese
cd5bda3f9e Improve debug messages (routed page, flex view) 2018-11-30 20:31:32 +02:00
Matias Griese
e14129d278 Implemented object save in FlexForm::submit() 2018-11-30 15:16:22 +02:00
Matias Griese
decb19b92e Further improve FlexObject::update() 2018-11-30 15:06:27 +02:00
Matias Griese
eb770e95d5 Fixed FlexObject::update() call with partial object update 2018-11-30 14:30:50 +02:00
Matias Griese
77f035eb2d FlexForm: Allow custom nonce, fix fatal error on validation failure 2018-11-30 13:15:20 +02:00
Matias Griese
db2738978e Sanitize $grav['task']` 2018-11-30 13:14:10 +02:00
Matias Griese
180f3c2eca FlexDirectory::getObject() should return any existing object 2018-11-30 13:13:13 +02:00
Matias Griese
e84fbc425f FlexMediaTrait: Fix media meta file 2018-11-29 23:19:28 +02:00
Matias Griese
c5e2ed9f22 FlexForm: Added methods for file upload/delete task routes 2018-11-29 22:04:57 +02:00
Matias Griese
a92f0898d8 Fixed Medium::relativePath() for streams 2018-11-29 21:12:37 +02:00
Matias Griese
d968901d98 Flex: store metadata on file uploads (if available) 2018-11-29 19:27:11 +02:00
Matias Griese
c38b761871 Improve Flex index caching by sharing the same cached item even if using a different key 2018-11-29 12:43:32 +02:00
Matias Griese
b49741f8aa Fixed Flex index caching if using non-standard key 2018-11-29 11:51:27 +02:00
Matias Griese
6866c2a39a Merge remote-tracking branch 'origin/1.6' into 1.6 2018-11-29 10:25:56 +02:00
Matias Griese
9598cd13fe Added user-data:// which is a writable stream (user://data is not and should be avoided) 2018-11-29 10:25:48 +02:00
Andy Miller
49c8fef5f5 Made inflector static so it can be used quickly 2018-11-28 21:58:31 -07:00
Matias Griese
13341f8aa8 Tasks: Pass path to the controller as well 2018-11-28 14:55:03 +02:00
Matias Griese
251cb3f9fa FlexForm: Implement HTML id support 2018-11-28 14:20:50 +02:00
Matias Griese
51767a8f36 Improve FlexMediaTrait 2018-11-28 11:36:07 +02:00
Andy Miller
c653fe6e4a multibyte and case insensitivity support in Util string functions 2018-11-27 16:39:30 -07:00
Matias Griese
70688f3e00 Fixed cache test in Flex 2018-11-27 22:22:13 +02:00
Matias Griese
e9c52046fa Fixed timestamp and serialization 2018-11-27 11:39:04 +02:00
Matias Griese
a01b94f80b Merge branch 'develop' of https://github.com/getgrav/grav into 1.6
# Conflicts:
#	CHANGELOG.md
2018-11-27 10:17:53 +02:00
Matias Griese
708c79cef8 Improved user serialization to use less memory in the session 2018-11-27 10:15:55 +02:00
Matias Griese
f1ce69d4bf Fixed some minor issues in Flex 2018-11-26 14:17:13 +02:00
Matias Griese
5bd417aa39 Minor Flex improvements 2018-11-26 09:49:06 +02:00
Andy Miller
2bf448c587 Merge branch 'develop' into 1.6 2018-11-25 19:08:01 -07:00
Stephan Diehl
b6c582ad3a Update InitializeProcessor.php (#2268)
fix redirect_trailing_slash in a multi language page
2018-11-23 23:01:47 -07:00
Matias Griese
c35c285580 Fixed a bug in flex index caching 2018-11-21 09:45:59 +02:00
Matias Griese
890a61358a Code cleanup on CLI 2018-11-20 20:40:13 +02:00
Matias Griese
7de66cdc53 Improve debugger in CLI 2018-11-20 13:17:19 +02:00
Matias Griese
b353ec12e1 Flex: Fixes for indexing with different keys 2018-11-20 12:01:32 +02:00
Matias Griese
48489ae291 Composer update 2018-11-19 23:26:11 +02:00
Matias Griese
85a3d98d4c Flex: Fixed object keys if using non-standard keys in index 2018-11-19 15:07:36 +02:00
Matias Griese
c9eea7e019 Flex: Fixed some issues with new orderBy() logic 2018-11-19 13:43:02 +02:00
Matias Griese
da483d63f6 Flex: Fixed a bug if there's no entries in the index 2018-11-19 12:43:32 +02:00
Matias Griese
3f89b39b60 Flex: Added support for custom index fields when ordering (major speed up) 2018-11-19 11:11:45 +02:00
Matias Griese
e89b5ce870 Flex: Added support for defining used key field when getting index/collection/build 2018-11-19 10:09:07 +02:00
Matias Griese
88f6d02c03 Merge branch 'develop' of https://github.com/getgrav/grav into 1.6
# Conflicts:
#	README.md
2018-11-19 09:25:23 +02:00
Matias Griese
cc78fcf31c Some bug fixes in Flex collection / index 2018-11-17 00:34:53 +02:00
Matias Griese
37e880b64a Allow switching to custom keys on FlexIndex 2018-11-17 00:06:46 +02:00
Matias Griese
75b2307d30 Added initial support for Flex keys (unique identifier) 2018-11-16 15:13:12 +02:00
Matias Griese
9e8f700119 Improved Custom FlexIndex logic (breaking old API) 2018-11-16 12:34:17 +02:00
Matias Griese
4bcba0e4f9 Flex: Added support for custom object index classes 2018-11-16 10:26:09 +02:00
Andy Miller
11b661cad5 new Discord reference 2018-11-15 16:30:44 -07:00
Andy Miller
5e1980d770 New Discord reference 2018-11-15 16:30:21 -07:00
Andy Miller
5e7eb6b2f4 Better discord badge 2018-11-15 16:29:08 -07:00
Andy Miller
994a1f89cd Better Badge 2018-11-15 16:28:15 -07:00
Andy Miller
4daa07fd14 Discord Chat button 2018-11-15 16:21:51 -07:00
Andy Miller
d39165f506 discord only 2018-11-15 16:21:03 -07:00
Matias Griese
468db9566b Fixed missing $collection->getStorageKeys() 2018-11-15 22:37:47 +02:00
Matias Griese
33309105d3 Fixed clearing cache having no effect on Doctrine cache 2018-11-15 13:25:53 +02:00
Matias Griese
8cfe6e772d Debug mode: Include HTML comments around the output when rendering flex objects 2018-11-15 13:23:40 +02:00
Matias Griese
bad6e32e18 ObjectIndex: Remove unneeded method which was moved to base class 2018-11-15 12:12:38 +02:00
Matias Griese
02d48693dd Added select() and unselect() methods to CollectionInterface and its base classes
Added `orderBy()` and `limit()` methods to `ObjectCollectionInterface` and its base classes
2018-11-15 10:01:09 +02:00
Andy Miller
7975ec8d09 Merge branch 'develop' into 1.6 2018-11-14 11:21:14 -07:00
Matias Griese
de898b610d Flex: Fixed a bug in new findPrefixedKeysFromFilesystem() method 2018-11-14 16:31:06 +02:00
Matias Griese
0743816822 Flex: Improved object indexing 2018-11-14 16:18:59 +02:00
Matias Griese
bb4958115b Added support for prefixed FolderStorage 2018-11-14 10:59:22 +02:00
Matias Griese
b64404a924 Fixed duplicate key in blueprint YAML 2018-11-14 09:41:03 +02:00
Djamil Legato
9a8b47872e Updated opencollective backers/sponsors list 2018-11-13 23:05:18 -08:00
Andy Miller
76070ddd43 Better handling of append_url_extension inside of Page::templateFormat() #2264 2018-11-13 18:04:53 -07:00
Andy Miller
22066e11b3 more lang stuff 2018-11-13 14:53:39 -07:00
Andy Miller
ef157c7d2b Fixed a broken lang string #2261 2018-11-13 14:08:37 -07:00
Andy Miller
e42e9fdd54 Merge branch '1.6' of github.com:getgrav/grav into 1.6 2018-11-13 11:29:36 -07:00
Andy Miller
e2594dc72c symlink .editorconfig when using sandbox 2018-11-13 11:29:31 -07:00
Andy Miller
f4e2153291 Updated clean command with vendor udpates 2018-11-13 11:29:16 -07:00
Matias Griese
44db0245a7 Improve new flex object saving and storage 2018-11-13 20:13:32 +02:00
Matias Griese
ff5aa8a0ac Improve Flex storage 2018-11-13 18:00:18 +02:00
Matias Griese
8c0dd6a8d1 Added missing changelog entry from 1.5.5 2018-11-13 08:35:17 +02:00
Andy Miller
1ba21afd30 prepare for release 2018-11-12 15:59:10 -07:00
Andy Miller
e73537f488 Merge branch 'develop' into 1.6
# Conflicts:
#	CHANGELOG.md
#	system/defines.php
2018-11-12 15:57:47 -07:00
Andy Miller
9405418572 Merge branch 'release/1.5.5' 2018-11-12 15:56:13 -07:00
Andy Miller
59ccd662c7 Merge tag '1.5.5' into develop
Release v1.5.5
2018-11-12 15:56:13 -07:00
Andy Miller
377751416b Prepare for release 2018-11-12 15:56:04 -07:00
Andy Miller
116c279f01 update changelog 2018-11-12 15:55:29 -07:00
Matias Griese
1d8ef45e9c Added Plugin::isCli() to determine if plugin is running under CLI 2018-11-12 13:48:20 +02:00
Matias Griese
380b3be928 Added $grav->setup() to simplify CLI and custom access points 2018-11-12 12:21:44 +02:00
Matias Griese
c151043c70 Code cleanup in Language class 2018-11-12 11:39:15 +02:00
Andy Miller
64e13c5f87 Updated changelog 2018-11-11 21:37:08 -07:00
Andy Miller
b55d29dfb7 Merge branch 'develop' into 1.6 2018-11-11 21:23:36 -07:00
Aaron Dalton
bf86b5a924 Propagate error code if between 400 and 600 for production sites (errors:display = false or -1) (#2181) 2018-11-11 21:22:47 -07:00
Andy Miller
9f2da67d48 Merge branch 'develop' into 1.6
# Conflicts:
#	CHANGELOG.md
#	system/defines.php
2018-11-11 21:20:07 -07:00
Emil Hesslow
d0b34d114d Register theme prefixes as namespaces in twig (#2210) 2018-11-11 21:18:57 -07:00
Andy Miller
d0c9e56aeb Support negotiated language types set via the Request Accept-Language: header 2018-11-11 18:51:20 -07:00
Andy Miller
74cd3ac1e0 Supporting negotiated content types 2018-11-11 18:27:12 -07:00
Andy Miller
ecbc401584 Revert "Set template type based on request headers content-type if set"
This reverts commit 005f626b88.

# Conflicts:
#	CHANGELOG.md
#	system/src/Grav/Common/Page/Page.php
2018-11-11 15:01:44 -07:00
Andy Miller
0c81568df6 Updated changelog 2018-11-11 14:58:36 -07:00
Makara Sok
b9dc2baef1 Remove hardcoded 302 when redirecting trailing slash (#2155)
When `system.pages.redirect_trailing_slash` is enabled, it's always a 302 even though `redirect_default_code` is set to something else. 

By removing it, it works as intended.
2018-11-09 22:30:35 -07:00
Andy Miller
9b43f20159 Use append_url_extension from page header to set template format #2604 2018-11-09 22:28:44 -07:00
Andy Miller
82d3d5edda Fixed Uri::hasStandardPort() to support reverse proxy configurations #1786 2018-11-09 17:22:34 -07:00
Andy Miller
005f626b88 Set template type based on request headers content-type if set 2018-11-09 17:10:03 -07:00
Andy Miller
63005a8280 minor monolog update 2018-11-08 10:40:22 -07:00
Matias Griese
2943294d08 Added CsvFormatter and CvsFile classes 2018-11-08 12:12:37 +02:00
Andy Miller
ed03b02e52 updated changelog 2018-11-06 08:54:48 -07:00
Andy Miller
f43f992125 Merge branch '1.6' of github.com:getgrav/grav into 1.6 2018-11-06 08:52:51 -07:00
Andy Miller
0b646875d0 cleaned up service id map 2018-11-06 08:52:45 -07:00
Matias Griese
b1b4469d18 Flex form: allow custom form views 2018-11-06 13:54:55 +02:00
Andy Miller
72cc5b9d07 Merge tag '1.5.4' into develop
Release v1.5.4
2018-11-05 15:42:04 -07:00
Andy Miller
b9c28c5a7c Merge branch 'release/1.5.4' 2018-11-05 15:42:03 -07:00
Andy Miller
c56d7ac793 prepare for release 2018-11-05 15:41:54 -07:00
Andy Miller
000bac8cfc Updated changelog 2018-11-05 15:41:19 -07:00
418 changed files with 23538 additions and 6868 deletions

View File

@@ -13,6 +13,5 @@ indent_style = space
indent_size = 4 indent_size = 4
# 2 space indentation # 2 space indentation
[*.yaml, *.yml] [*.{yaml,.yml}]
indent_style = space
indent_size = 2 indent_size = 2

8
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,8 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: grav
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
custom: # Replace with a single custom sponsorship URL

View File

@@ -2,6 +2,7 @@ language: php
php: php:
- '7.1' - '7.1'
- '7.2' - '7.2'
- '7.3'
branches: branches:
only: only:
- develop - develop
@@ -11,13 +12,6 @@ notifications:
email: email:
on_success: never on_success: never
on_failure: always on_failure: always
hipchat:
# hipchat_api@grav
rooms:
- secure: "bqO0wM1B7bJnQw2fuhquSXEqI9gw6WmFytIh9sEWXzbYTzTUP5t0PcKOd3FT2BNMRaDxPJLVl+vG/oqmqDUBkEmOGcG504IQjeNzZqnMz0tXQMIcCc22Las9tFfc4Jf6RVi/qGomFtHGE9Wgii+TAN4zqZaufbNjwd8SyjO0+W8="
template:
- '%{repository}#%{build_number} (%{branch}): Travis Job Finished [%{duration}] (<a href="%{build_url}">Details</a>)'
format: html
slack: slack:
secure: dowksPsxxCxGKT6nis5hUgkp6+ZDAhoqzQHF9rJnx4hx0iEygPhVBs7pKl9yL2jubYJoLs+EXwE7z1dYgDAEJh4BnfrCokCMLpFGcxVxQC/HeAUdSQ2/RtdBYR5PRT75ScaFpqM/SfXXZVtnwVXAw9Z+JC6BjQ9vmn23m51Jw4k= secure: dowksPsxxCxGKT6nis5hUgkp6+ZDAhoqzQHF9rJnx4hx0iEygPhVBs7pKl9yL2jubYJoLs+EXwE7z1dYgDAEJh4BnfrCokCMLpFGcxVxQC/HeAUdSQ2/RtdBYR5PRT75ScaFpqM/SfXXZVtnwVXAw9Z+JC6BjQ9vmn23m51Jw4k=
env: env:

View File

@@ -1,12 +1,354 @@
# v1.6.0-beta.5 # v1.6.20
## 11/05/2018 ## 03/02/2020
1. [](#bugfix)
* Fixed incorrect routing caused by `str_replace()` in `Uri::init()` [#2754](https://github.com/getgrav/grav/issues/2754)
* Fixed session cookie is being set twice in the HTTP header [#2745](https://github.com/getgrav/grav/issues/2745)
* Fixed session not restarting if user was invalid (downgrading from Grav 1.7)
* Fixed filesystem iterator calls with non-existing folders
* Fixed `checkbox` field not being saved, requires also Form v4.0.2 [#1225](https://github.com/getgrav/grav/issues/1225)
* Fixed `validation: strict` not working in blueprints [#1273](https://github.com/getgrav/grav/issues/1273)
* Fixed `Data::filter()` removing empty fields (such as empty list) by default [#2805](https://github.com/getgrav/grav/issues/2805)
* Fixed fatal error with non-integer page param value [#2803](https://github.com/getgrav/grav/issues/2803)
* Fixed `Assets::addInlineJs()` parameter type mismatch between v1.5 and v1.6 [#2659](https://github.com/getgrav/grav/issues/2659)
* Fixed `site.metadata` saving issues [#2615](https://github.com/getgrav/grav/issues/2615)
# v1.6.19
## 12/04/2019
1. [](#new) 1. [](#new)
* Catch PHP 7.4 deprecation messages and report them in debugbar instead of throwing fatal error
1. [](#bugfix)
* Fixed fatal error when calling `{{ grav.undefined }}`
* Fixed multiple issues when there are no pages in the site
* PHP 7.4 fix for [#2750](https://github.com/getgrav/grav/issues/2750)
# v1.6.18
## 12/02/2019
1. [](#bugfix)
* PHP 7.4 fix in `Pages::buildSort()`
* Updated vendor libraries for PHP 7.4 fixes in Twig and other libraries
* Fixed fatal error when `$page->id()` is null [#2731](https://github.com/getgrav/grav/pull/2731)
* Fixed cache conflicts on pages with no set id
* Fix rewrite rule for for `lighttpd` default config [#721](https://github.com/getgrav/grav/pull/2721)
# v1.6.17
## 11/06/2019
1. [](#new)
* Added working ETag (304 Not Modified) support based on the final rendered HTML
1. [](#improved)
* Safer file handling + customizable null char replacement in `CsvFormatter::decode()`
* Change of Behavior: `Inflector::hyphenize` will now automatically trim dashes at beginning and end of a string.
* Change in Behavior for `Folder::all()` so no longer fails if trying to copy non-existent dot file [#2581](https://github.com/getgrav/grav/pull/2581)
* renamed composer `test-plugins` script to `phpstan-plugins` to be more explicit [#2637](https://github.com/getgrav/grav/pull/2637)
1. [](#bugfix)
* Fixed PHP 7.1 bug in FlexMedia
* Fix cache image generation when using cropResize [#2639](https://github.com/getgrav/grav/pull/2639)
* Fix `array_merge()` exception with non-array page header metadata [#2701](https://github.com/getgrav/grav/pull/2701)
# v1.6.16
## 09/19/2019
1. [](#bugfix)
* Fixed Flex user creation if file storage is being used [#2444](https://github.com/getgrav/grav/issues/2444)
* Fixed `Badly encoded JSON data` warning when uploading files [#2663](https://github.com/getgrav/grav/issues/2663)
# v1.6.15
## 08/20/2019
1. [](#improved)
* Improved robots.txt [#2632](https://github.com/getgrav/grav/issues/2632)
1. [](#bugfix)
* Fixed broken markdown Twig tag [#2635](https://github.com/getgrav/grav/issues/2635)
* Force Symfony 4.2 in Grav 1.6 to remove a bunch of deprecated messages
# v1.6.14
## 08/18/2019
1. [](#bugfix)
* Actually include fix for `system\router.php` [#2627](https://github.com/getgrav/grav/issues/2627)
# v1.6.13
## 08/16/2019
1. [](#bugfix)
* Regression fix for `system\router.php` [#2627](https://github.com/getgrav/grav/issues/2627)
# v1.6.12
## 08/14/2019
1. [](#new)
* Added support for custom `FormFlash` save locations
* Added a new `Utils::arrayLower()` method for lowercasing arrays
* Support new GRAV_BASEDIR environment variable [#2541](https://github.com/getgrav/grav/pull/2541)
* Allow users to override plugin handler priorities [#2165](https://github.com/getgrav/grav/pull/2165)
1. [](#improved)
* Use new `Utils::getSupportedPageTypes()` to enforce `html,htm` at the front of the list [#2531](https://github.com/getgrav/grav/issues/2531)
* Updated vendor libraries
* Markdown filter is now page-aware so that it works with modular references [admin#1731](https://github.com/getgrav/grav-plugin-admin/issues/1731)
* Check of `GRAV_USER_INSTANCE` constant is already defined [#2621](https://github.com/getgrav/grav/pull/2621)
1. [](#bugfix)
* Fixed some potential issues when `$grav['user']` is not set
* Fixed error when calling `Media::add($name, null)`
* Fixed `url()` returning wrong path if using stream with grav root path in it, eg: `user-data://shop` when Grav is in `/shop`
* Fixed `url()` not returning a path to non-existing file (`user-data://shop` => `/user/data/shop`) if it is set to fail gracefully
* Fixed `url()` returning false on unknown streams, such as `ftp://domain.com`, they should be treated as external URL
* Fixed Flex User to have permissions to save and delete his own user
* Fixed new Flex User creation not being possible because of username could not be given
* Fixed fatal error 'Expiration date must be an integer, a DateInterval or null, "double" given' [#2529](https://github.com/getgrav/grav/issues/2529)
* Fixed non-existing Flex object having a bad media folder
* Fixed collections using `page@.self:` should allow modular pages if requested
* Fixed an error when trying to delete a file from non-existing Flex Object
* Fixed `FlexObject::exists()` failing sometimes just after the object has been saved
* Fixed CSV formatter not encoding strings with `"` and `,` properly
* Fixed var order in `Validation.php` [#2610](https://github.com/getgrav/grav/issues/2610)
# v1.6.11
## 06/21/2019
1. [](#new)
* Added `FormTrait::getAllFlashes()` method to get all the available form flash objects for the form
* Added creation and update timestamps to `FormFlash` objects
1. [](#improved)
* Added `FormFlashInterface`, changed constructor to take `$config` array
1. [](#bugfix)
* Fixed error in `ImageMedium::url()` if the image cache folder does not exist
* Fixed empty form flash name after file upload or form state update
* Fixed a bug in `Route::withParam()` method
* Fixed issue with `FormFlash` objects when there is no session initialized
# v1.6.10
## 06/14/2019
1. [](#improved)
* Added **page blueprints** to `YamlLinter` CLI and Admin reports
* Removed `Gitter` and `Slack` [#2502](https://github.com/getgrav/grav/issues/2502)
* Optimizations for Plugin/Theme loading
* Generalized markdown classes so they can be used outside of `Page` scope with a custom `Excerpts` class instance
* Change minimal port number to 0 (unix socket) [#2452](https://github.com/getgrav/grav/issues/2452)
1. [](#bugfix)
* Force question to install demo content in theme update [#2493](https://github.com/getgrav/grav/issues/2493)
* Fixed GPM errors from blueprints not being logged [#2505](https://github.com/getgrav/grav/issues/2505)
* Don't error when IP is invalid [#2507](https://github.com/getgrav/grav/issues/2507)
* Fixed regression with `bin/plugin` not listing the plugins available (1c725c0)
* Fixed bitwise operator in `TwigExtension::exifFunc()` [#2518](https://github.com/getgrav/grav/issues/2518)
* Fixed issue with lang prefix incorrectly identifying as admin [#2511](https://github.com/getgrav/grav/issues/2511)
* Fixed issue with `U0ils::pathPrefixedBYLanguageCode()` and trailing slash [#2510](https://github.com/getgrav/grav/issues/2511)
* Fixed regresssion issue of `Utils::Url()` not returning `false` on failure. Added new optional `fail_gracefully` 3rd attribute to return string that caused failure [#2524](https://github.com/getgrav/grav/issues/2524)
# v1.6.9
## 05/09/2019
1. [](#new)
* Added `Route::withoutParams()` methods
* Added `Pages::setCheckMethod()` method to override page configuration in Admin Plugin
* Added `Cache::clearCache('invalidate')` parameter for just invalidating the cache without deleting any cached files
* Made `UserCollectionInderface` to extend `Countable` to get the count of existing users
1. [](#improved)
* Flex admin: added default search options for flex objects
* Flex collection and object now fall back to the default template if template file doesn't exist
* Updated Vendor libraries including Twig 1.40.1
* Updated language files from `https://crowdin.com/project/grav-core`
1. [](#bugfix)
* Fixed `$grav['route']` from being modified when the route instance gets modified
* Fixed Assets options array mixed with standalone priority [#2477](https://github.com/getgrav/grav/issues/2477)
* Fix for `avatar_url` provided by 3rd party providers
* Fixed non standard `lang` code lengths in `Utils` and `Session` detection
* Fixed saving a new object in Flex `SimpleStorage`
* Fixed exception in `Flex::getDirectories()` if the first parameter is set
* Output correct "Last Updated" in `bin/gpm info` command
* Checkbox getting interpreted as string, so created new `Validation::filterCheckbox()`
* Fixed backwards compatibility to `select` field with `selectize.create` set to true [git-sync#141](https://github.com/trilbymedia/grav-plugin-git-sync/issues/141)
* Fixed `YamlFormatter::decode()` to always return array [#2494](https://github.com/getgrav/grav/pull/2494)
* Fixed empty `$grav['request']->getAttribute('route')->getExtension()`
# v1.6.8
## 04/23/2019
1. [](#new)
* Added `FlexCollection::filterBy()` method
1. [](#bugfix)
* Revert `Use Null Coalesce Operator` [#2466](https://github.com/getgrav/grav/pull/2466)
* Fixed `FormTrait::render()` not providing config variable
* Updated `bin/grav clean` to clear `cache/compiled` and `user/config/security.yaml`
# v1.6.7
## 04/22/2019
1. [](#new)
* Added a new `bin/grav yamllinter` CLI command to find YAML Linting issues [#2468](https://github.com/getgrav/grav/issues/2468#issuecomment-485151681)
1. [](#improved)
* Improve `FormTrait` backwards compatibility with existing forms
* Added a new `Utils::getSubnet()` function for IPv4/IPv6 parsing [#2465](https://github.com/getgrav/grav/pull/2465)
1. [](#bugfix)
* Remove disabled fields from the form schema
* Fix issue when excluding `inlineJs` and `inlineCss` from Assets pipeline [#2468](https://github.com/getgrav/grav/issues/2468)
* Fix for manually set position on external URLs [#2470](https://github.com/getgrav/grav/issues/2470)
# v1.6.6
## 04/17/2019
1. [](#new)
* `FormInterface` now implements `RenderInterface`
* Added new `FormInterface::getTask()` method which reads the task from `form.task` in the blueprint
1. [](#improved)
* Updated vendor libraries to latest
1. [](#bugfix)
* Rollback `redirect_default_route` logic as it has issues with multi-lang [#2459](https://github.com/getgrav/grav/issues/2459)
* Fix potential issue with `|contains` Twig filter on PHP 7.3
* Fixed bug in text field filtering: return empty string if value isn't a string or number [#2460](https://github.com/getgrav/grav/issues/2460)
* Force Asset `priority` to be an integer and not throw error if invalid string passed [#2461](https://github.com/getgrav/grav/issues/2461)
* Fixed bug in text field filtering: return empty string if value isn't a string or number
* Fixed `FlexForm` missing getter methods for defining form variables
# v1.6.5
## 04/15/2019
1. [](#bugfix)
* Backwards compatiblity with old `Uri::__toString()` output
# v1.6.4
## 04/15/2019
1. [](#bugfix)
* Improved `redirect_default_route` logic as well as `Uri::toArray()` to take into account `root_path` and `extension`
* Rework logic to pull out excluded files from pipeline more reliably [#2445](https://github.com/getgrav/grav/issues/2445)
* Better logic in `Utils::normalizePath` to handle externals properly [#2216](https://github.com/getgrav/grav/issues/2216)
* Fixed to force all `Page::taxonomy` to be treated as strings [#2446](https://github.com/getgrav/grav/issues/2446)
* Fixed issue with `Grav['user']` not being available [form#332](https://github.com/getgrav/grav-plugin-form/issues/332)
* Updated rounding logic for `Utils::parseSize()` [#2394](https://github.com/getgrav/grav/issues/2394)
* Fixed Flex simple storage not being properly initialized if used with caching
# v1.6.3
## 04/12/2019
1. [](#new)
* Added `Blueprint::addDynamicHandler()` method to allow custom dynamic handlers, for example `custom-options@: getCustomOptions`
1. [](#bugfix)
* Missed a `CacheCommand` reference in `bin/grav` [#2442](https://github.com/getgrav/grav/issues/2442)
* Fixed issue with `Utils::normalizePath` messing with external URLs [#2216](https://github.com/getgrav/grav/issues/2216)
* Fix for `vUndefined` versions when upgrading
# v1.6.2
## 04/11/2019
1. [](#bugfix)
* Revert renaming of `ClearCacheCommand` to ensure CLI GPM upgrades go smoothly
# v1.6.1
## 04/11/2019
1. [](#improved)
* Improved CSS for the bottom filter bar of DebugBar
1. [](#bugfix)
* Fixed issue with `@import` not being added to top of pipelined css [#2440](https://github.com/getgrav/grav/issues/2440)
# v1.6.0
## 04/11/2019
1. [](#new)
* Set minimum requirements to [PHP 7.1.3](https://getgrav.org/blog/raising-php-requirements-2018)
* New `Scheduler` functionality for periodic jobs
* New `Backup` functionality with multiple backup profiles and scheduler integration
* Refactored `Assets Manager` to be more powerful and flexible
* Updated Doctrine Collections to 1.6
* Updated Doctrine Cache to 1.8
* Updated Symfony Components to 4.2
* Added new Cache purge functionality old cache manually via CLI/Admin as well as scheduler integration
* Added new `{% throw 404 'Not Found' %}` twig tag (with custom code/message)
* Added `Grav\Framework\File` classes for handling YAML, Markdown, JSON, INI and PHP serialized files
* Added `Grav\Framework\Collection\AbstractIndexCollection` class
* Added `Grav\Framework\Object\ObjectIndex` class
* Added `Grav\Framework\Flex` classes
* Added support for hiding form fields in blueprints by using dynamic property like `security@: admin.foobar`, `scope@: object` or `scope-ignore@: object` to any field
* New experimental **FlexObjects** powered `Users` for increased performance and capability (**disabled** by default)
* Added PSR-7 and PSR-15 classes * Added PSR-7 and PSR-15 classes
* Added `Grav\Framework\DI\Container` class * Added `Grav\Framework\DI\Container` class
* Added `Grav\Framework\RequestHandler\RequestHandler` class * Added `Grav\Framework\RequestHandler\RequestHandler` class
* Added `Page::httpResponseCode()` and `Page::httpHeaders()` methods * Added `Page::httpResponseCode()` and `Page::httpHeaders()` methods
* Added `Grav\Framework\Form\Interfaces\FormInterface`
* Added `Grav\Framework\Form\Interfaces\FormFactoryInterface`
* Added `Grav\Framework\Form\FormTrait`
* Added `Page::forms()` method to get normalized list of all form headers defined in the page
* Added `onPageAction`, `onPageTask`, `onPageAction.{$action}` and `onPageTask.{$task}` events
* Added `Blueprint::processForm()` method to filter form inputs
* Move `processMarkdown()` method from `TwigExtension` to more general `Utils` class
* Added support to include extra files into `Media` (such as uploaded files)
* Added form preview support for `FlexObject`, including a way to render newly uploaded files before saving them
* Added `FlexObject::getChanges()` to determine what fields change during an update
* Added `arrayDiffMultidimensional`, `arrayIsAssociative`, `arrayCombine` Util functions
* New `$grav['users']` service to allow custom user classes implementing `UserInterface`
* Added `LogViewer` helper class and CLI command: `bin/grav logviewer`
* Added `select()` and `unselect()` methods to `CollectionInterface` and its base classes
* Added `orderBy()` and `limit()` methods to `ObjectCollectionInterface` and its base classes
* Added `user-data://` which is a writable stream (`user://data` is not and should be avoided)
* Added support for `/action:{$action}` (like task but used without nonce when only receiving data)
* Added `onAction.{$action}` event
* Added `Grav\Framework\Form\FormFlash` class to contain AJAX uploaded files in more reliable way
* Added `Grav\Framework\Form\FormFlashFile` class which implements `UploadedFileInterface` from PSR-7
* Added `Grav\Framework\Filesystem\Filesystem` class with methods to manipulate stream URLs
* Added new `$grav['filesystem']` service using an instance of the new `Filesystem` object
* Added `{% render object layout: 'default' with { variable: true } %}` for Flex objects and collections
* Added `$grav->setup()` to simplify CLI and custom access points
* Added `CsvFormatter` and `CsvFile` classes
* Added new system config option to `pages.hide_empty_folders` if a folder has no valid `.md` file available. Default behavior is `false` for compatibility.
* Added new system config option for `languages.pages_fallback_only` forcing only 'fallback' to find page content through supported languages, default behavior is to display any language found if active language is missing
* Added `Utils::arrayFlattenDotNotation()` and `Utils::arrayUnflattenDotNotation()` helper methods
1. [](#improved) 1. [](#improved)
* Add the page to onMarkdownInitialized event [#2412](https://github.com/getgrav/grav/issues/2412)
* Doctrine filecache is now namespaced with prefix to support purging
* Register all page types into `blueprint://pages` stream
* Removed `apc` and `xcache` support, made `apc` alias of `apcu`
* Support admin and regular translations via the `|t` twig filter and `t()` twig function
* Improved Grav Core installer/updater to run installer script
* Updated vendor libraries including Symfony `4.2.3`
* Renamed old `User` class to `Grav\Common\User\DataUser\User` with multiple improvements and small fixes
* `User` class now acts as a compatibility layer to older versions of Grav
* Deprecated `new User()`, `User::load()`, `User::find()` and `User::delete()` in favor of `$grav['users']` service
* `Media` constructor has now support to not to initialize the media objects
* Cleanly handle session corruption due to changing Flex object types
* Added `FlexObjectInterface::getDefaultValue()` and `FormInterface::getDefaultValue()`
* Added new `onPageContent()` event for every call to `Page::content()`
* Added phpstan: PHP Static Analysis Tool [#2393](https://github.com/getgrav/grav/pull/2393)
* Added `composer test-plugins` to test plugin issues with the current version of Grav
* Added `Flex::getObjects()` and `Flex::getMixedCollection()` methods for co-mingled collections
* Added support to use single Flex key parameter in `Flex::getObject()` method
* Added `FlexObjectInterface::search()` and `FlexCollectionInterface::search()` methods
* Override `system.media.upload_limit` with PHP's `post_max_size` or `upload_max_filesize`
* Class `Grav\Common\Page\Medium\AbstractMedia` now use array traits instead of extending `Grav\Common\Getters`
* Implemented `Grav\Framework\Psr7` classes as `Nyholm/psr7` decorators
* Added a new `cache-clear` scheduled job to go along with `cache-purge`
* Renamed `Grav\Framework\File\Formatter\FormatterInterface` to `Grav\Framework\File\Interfaces\FileFormatterInterface`
* Improved `File::save()` to use a temporary file if file isn't locked
* Improved `|t` filter to better support admin `|tu` style filter if in admin
* Update all classes to rely on `PageInterface` instead of `Page` class
* Better error checking in `bin/plugin` for existence and enabled
* Removed `media.upload_limit` references
* Twig `nicenumber`: do not use 0 + string casting hack
* Converted Twig tags to use namespaced Twig classes
* Site shows error on page rather than hard-crash when page has invalid frontmatter [#2343](https://github.com/getgrav/grav/issues/2343)
* Added `languages.default_lang` option to override the default lang (usually first supported language)
* Added `Content-Type: application/json` body support for PSR-7 `ServerRequest`
* Remove PHP time limit in `ZipArchive`
* DebugBar: Resolve twig templates in deprecated backtraces in order to help locating Twig issues
* Added `$grav['cache']->getSimpleCache()` method for getting PSR-16 compatible cache
* MediaTrait: Use PSR-16 cache
* Improved `Utils::normalizePath()` to support non-protocol URLs
* Added ability to reset `Page::metadata` to allow rebuilding from automatically generated values
* Added back missing `page.types` field in system content configuration [admin#1612](https://github.com/getgrav/grav-plugin-admin/issues/1612)
* Console commands: add method for invalidating cache
* Updated languages
* Improved `$page->forms()` call, added `$page->addForms()`
* Updated languages from crowdin
* Fixed `ImageMedium` constructor warning when file does not exist
* Improved `Grav\Common\User` class; added `$user->update()` method
* Added trim support for text input fields `validate: trim: true`
* Improved `Grav\Framework\File\Formatter` classes to have abstract parent class and some useful methods
* Support negotiated content types set via the Request `Accept:` header
* Support negotiated language types set via the Request `Accept-Language:` header
* Cleaned up and sorted the Service `idMap`
* Updated `Grav` container object to implement PSR-11 `ContainerInterface` * Updated `Grav` container object to implement PSR-11 `ContainerInterface`
* Updated Grav `Processor` classes to implement PSR-15 `MiddlewareInterface` * Updated Grav `Processor` classes to implement PSR-15 `MiddlewareInterface`
* Make `Data` class to extend `JsonSerializable` * Make `Data` class to extend `JsonSerializable`
@@ -15,67 +357,104 @@
* Set session name based on `security.salt` rather than `GRAV_ROOT` [#2242](https://github.com/getgrav/grav/issues/2242) * Set session name based on `security.salt` rather than `GRAV_ROOT` [#2242](https://github.com/getgrav/grav/issues/2242)
* Added option to configure list of `xss_invalid_protocols` in `Security` config [#2250](https://github.com/getgrav/grav/issues/2250) * Added option to configure list of `xss_invalid_protocols` in `Security` config [#2250](https://github.com/getgrav/grav/issues/2250)
* Smarter `security.salt` checking now we use `security.yaml` for other options * Smarter `security.salt` checking now we use `security.yaml` for other options
* Merged Grav 1.5.4 fixes in
# v1.6.0-beta.4
## 10/24/2018
1. [](#new)
* Added new system config option to `pages.hide_empty_folders` if a folder has no valid `.md` file available. Default behavior is `false` for compatibility.
* Added new system config option for `languages.pages_fallback_only` forcing only 'fallback' to find page content through supported languages, default behavior is to display any language found if active language is missing
* Added `Utils::arrayFlattenDotNotation()` and `Utils::arrayUnflattenDotNotation()` helper methods
1. [](#improved)
* Added apcu autoloader optimization * Added apcu autoloader optimization
* Additional helper methods in `Language`, `Languages`, and `LanguageCodes` classes * Additional helper methods in `Language`, `Languages`, and `LanguageCodes` classes
1. [](#bugfix)
* Use login provider User avatar if set
* Fixed `Folder::doDelete($folder, false)` removing symlink when it should not
# v1.6.0-beta.3
## 10/15/2018
1. [](#improved)
* Call `onFatalException` event also on internal PHP errors * Call `onFatalException` event also on internal PHP errors
* Built-in PHP Webserver: log requests before handling them * Built-in PHP Webserver: log requests before handling them
1. [](#bugfix)
* Grav 1.6: Scheduler Fallback for never runs and Windows support [#2202](https://github.com/getgrav/grav/pull/2202)
# v1.6.0-beta.2
## 10/09/2018
1. [](#new)
* Added Flex support for custom media tasks
1. [](#improved)
* Added support for syslog and syslog facility logging (default: 'file') * Added support for syslog and syslog facility logging (default: 'file')
* Improved usability of `System` configuration blueprint with side-tabs * Improved usability of `System` configuration blueprint with side-tabs
1. [](#bugfix) 1. [](#bugfix)
* Fixed issue with `Truncator::truncateWords` and `Truncator::truncateLetters` when string not wrapped in tags [#2432](https://github.com/getgrav/grav/issues/2432)
* Fixed `Undefined method closure::fields()` when getting avatar for user, thanks @Romarain [#2422](https://github.com/getgrav/grav/issues/2422)
* Fixed cached images not being updated when source image is modified
* Fixed deleting last list item in the form
* Fixed issue with `Utils::url()` method would append extra `base_url` if URL already included it
* Fixed `mkdir(...)` race condition
* Fixed `Obtaining write lock failed on file...`
* Fixed potential undefined property in `onPageNotFound` event handling
* Fixed some potential issues/bugs found by phpstan
* Fixed regression in GPM packages casted to Array (ref, getgrav/grav-plugin-admin@e3fc4ce)
* Fixed session_start(): Setting option 'session.name' failed [#2408](https://github.com/getgrav/grav/issues/2408)
* Fixed validation for select field type with selectize
* Fixed validation for boolean toggles
* Fixed non-namespaced exceptions in scheduler
* Fixed trailing slash redirect in multlang environment [#2350](https://github.com/getgrav/grav/issues/2350)
* Fixed some issues related to Medium objects losing query string attributes
* Broke out Medium timestamp so it's not cleared on `reset()`s
* Fixed issue with `redirect_trailing_slash` losing query string [#2269](https://github.com/getgrav/grav/issues/2269)
* Fixed failed login if user attempts to log in with upper case non-english letters
* Removed extra authenticated/authorized fields when saving existing user from a form
* Fixed `Grav\Framework\Route::__toString()` returning relative URL, not relative route
* Fixed handling of `append_url_extension` inside of `Page::templateFormat()` [#2264](https://github.com/getgrav/grav/issues/2264)
* Fixed a broken language string [#2261](https://github.com/getgrav/grav/issues/2261)
* Fixed clearing cache having no effect on Doctrine cache
* Fixed `Medium::relativePath()` for streams
* Fixed `Object` serialization breaking if overriding `jsonSerialize()` method
* Fixed `YamlFormatter::decode()` when calling `init_set()` with integer
* Fixed session throwing error in CLI if initialized
* Fixed `Uri::hasStandardPort()` to support reverse proxy configurations [#1786](https://github.com/getgrav/grav/issues/1786)
* Use `append_url_extension` from page header to set template format if set [#2604](https://github.com/getgrav/grav/pull/2064)
* Fixed some bugs in Grav environment selection logic
* Use login provider User avatar if set
* Fixed `Folder::doDelete($folder, false)` removing symlink when it should not
* Fixed asset manager to not add empty assets when they don't exist in the filesystem * Fixed asset manager to not add empty assets when they don't exist in the filesystem
* Regression: Fixed asset manager methods with default legacy attributes
* Update `script` and `style` Twig tags to use the new `Assets` classes * Update `script` and `style` Twig tags to use the new `Assets` classes
* Fixed asset pipeline to rewrite remote URLs as well as local [#2216](https://github.com/getgrav/grav/issues/2216) * Fixed asset pipeline to rewrite remote URLs as well as local [#2216](https://github.com/getgrav/grav/issues/2216)
# v1.6.0-beta.1 # v1.5.10
## 10/01/2018 ## 03/21/2019
1. [](#new) 1. [](#new)
* Set minimum requirements to [PHP 7.1.3](https://getgrav.org/blog/raising-php-requirements-2018) * Added new `deferred` Twig extension
* New `Scheduler` functionality for periodic jobs
* New `Backup` functionality with multiple backup profiles and scheduler integration # v1.5.9
* Refactored `Assets Manager` to be more powerful and flexible ## 03/20/2019
* Updated Doctrine Collections to 1.5
* Updated Doctrine Cache to 1.8 1. [](#new)
* Updated Symfony Components to 4.1 * Added new `onPageContent()` event for every call to `Page::content()`
* Added a new Deferred Twig extension to allow adding content to Twig blocks after render
* Added new Cache purge functionality old cache manually via CLI/Admin as well as scheduler integration
* Added new `{% throw 404 'Not Found' %}` twig tag (with custom code/message)
* Added `Grav\Framework\File` classes for handling YAML, Markdown, JSON, INI and PHP serialized files
* Added `Grav\Framework\Collection\AbstractIndexCollection` class
* Added `Grav\Framework\Object\ObjectIndex` class
* Added `Grav\Framework\Flex` classes
* Added support for hiding form fields in blueprints by using dynamic property like `security@: admin.foobar`, `scope@: object` or `scope-ignore@: object` to any field
1. [](#improved) 1. [](#improved)
* Doctrine filecache is now namespaced with prefix to support purging * Fixed phpdoc generation
* Register all page types into `blueprint://pages` stream * Updated vendor libraries
* Force Toolbox v1.4.2
1. [](#bugfix)
* EXIF fix for streams
* Fix for User avatar not working due to uppercase or spaces in email [#2403](https://github.com/getgrav/grav/pull/2403)
# v1.5.8
## 02/07/2019
1. [](#improved)
* Improved `User` unserialize to not to break the object if serialized data is not what expected
* Removed unused parameter [#2357](https://github.com/getgrav/grav/pull/2357)
# v1.5.7
## 01/25/2019
1. [](#new)
* Support for AWS Cloudfront forwarded scheme header [#2297](https://github.com/getgrav/grav/pull/2297)
1. [](#improved)
* Set homepage with `https://` protocol [#2299](https://github.com/getgrav/grav/pull/2299)
* Preserve accents in fields containing Twig expr. using unicode [#2279](https://github.com/getgrav/grav/pull/2279)
* Updated vendor libraries
1. [](#bugfix)
* Support spaces with filenames in responsive images [#2300](https://github.com/getgrav/grav/pull/2300)
# v1.5.6
## 12/14/2018
1. [](#improved)
* Updated InitializeProcessor.php to use lang-safe redirect [#2268](https://github.com/getgrav/grav/pull/2268)
* Improved user serialization to use less memory in the session
# v1.5.5
## 11/12/2018
1. [](#new)
* Register theme prefixes as namespaces in Twig [#2210](https://github.com/getgrav/grav/pull/2210)
1. [](#improved)
* Propogate error code between 400 and 600 for production sites [#2181](https://github.com/getgrav/grav/pull/2181)
1. [](#bugfix)
* Remove hardcoded `302` when redirecting trailing slash [#2155](https://github.com/getgrav/grav/pull/2155)
# v1.5.4 # v1.5.4
## 11/05/2018 ## 11/05/2018

View File

@@ -29,7 +29,7 @@ The issue tracker is the preferred channel for [bug reports](#bugs),
requests](#pull-requests), but please respect the following restrictions: requests](#pull-requests), but please respect the following restrictions:
* Please **do not** use the issue tracker for support requests. Use * Please **do not** use the issue tracker for support requests. Use
[the Forum](http://getgrav.org/forum) or [the Gitter chat](https://gitter.im/getgrav/grav). [the Forum](http://getgrav.org/forum) or [the Chat](https://chat.getgrav.org/).
<a name="bugs"></a> <a name="bugs"></a>
@@ -110,7 +110,8 @@ Good pull requests - patches, improvements, new features - are a fantastic
help. They should remain focused in scope and avoid containing unrelated help. They should remain focused in scope and avoid containing unrelated
commits. commits.
**Please ask first** in [Slack](https://getgrav.org/slack) or in the Forum before embarking on any significant pull request (e.g. **Please ask first** in [the Forum](http://getgrav.org/forum) or [the Chat](https://chat.getgrav.org/)
before embarking on any significant pull request (e.g.
implementing features, refactoring code..), implementing features, refactoring code..),
otherwise you risk spending a lot of time working on something that the otherwise you risk spending a lot of time working on something that the
project's developers might not want to merge into the project. project's developers might not want to merge into the project.

View File

@@ -1,21 +1,22 @@
# ![](https://avatars1.githubusercontent.com/u/8237355?v=2&s=50) Grav # ![](https://avatars1.githubusercontent.com/u/8237355?v=2&s=50) Grav
[![PHPStan](https://img.shields.io/badge/PHPStan-enabled-brightgreen.svg?style=flat)](https://github.com/phpstan/phpstan)
[![SensioLabsInsight](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad/mini.png)](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad/mini.png)](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad)
[![Discord](https://img.shields.io/discord/501836936584101899.svg)](https://chat.getgrav.org) [![Discord](https://img.shields.io/discord/501836936584101899.svg?logo=discord&colorB=728ADA&label=Discord%20Chat)](https://chat.getgrav.org)
[![Slack](https://grav-chat.now.sh/badge.svg)](https://chat.getgrav.org) [![Build Status](https://travis-ci.org/getgrav/grav.svg?branch=develop)](https://travis-ci.org/getgrav/grav) [![OpenCollective](https://opencollective.com/grav/backers/badge.svg)](#backers) [![OpenCollective](https://opencollective.com/grav/sponsors/badge.svg)](#sponsors) [![Build Status](https://travis-ci.org/getgrav/grav.svg?branch=develop)](https://travis-ci.org/getgrav/grav) [![OpenCollective](https://opencollective.com/grav/backers/badge.svg)](#backers) [![OpenCollective](https://opencollective.com/grav/sponsors/badge.svg)](#sponsors)
Grav is a **Fast**, **Simple**, and **Flexible**, file-based Web-platform. There is **Zero** installation required. Just extract the ZIP archive, and you are already up and running. It follows similar principles to other flat-file CMS platforms, but has a different design philosophy than most. Grav comes with a powerful **Package Management System** to allow for simple installation and upgrading of plugins and themes, as well as simple updating of Grav itself. Grav is a **Fast**, **Simple**, and **Flexible**, file-based Web-platform. There is **Zero** installation required. Just extract the ZIP archive, and you are already up and running. It follows similar principles to other flat-file CMS platforms, but has a different design philosophy than most. Grav comes with a powerful **Package Management System** to allow for simple installation and upgrading of plugins and themes, as well as simple updating of Grav itself.
The underlying architecture of Grav is designed to use well-established and _best-in-class_ technologies to ensure that Grav is simple to use and easy to extend. Some of these key technologies include: The underlying architecture of Grav is designed to use well-established and _best-in-class_ technologies to ensure that Grav is simple to use and easy to extend. Some of these key technologies include:
* [Twig Templating](http://twig.sensiolabs.org/): for powerful control of the user interface * [Twig Templating](https://twig.sensiolabs.org/): for powerful control of the user interface
* [Markdown](http://en.wikipedia.org/wiki/Markdown): for easy content creation * [Markdown](https://en.wikipedia.org/wiki/Markdown): for easy content creation
* [YAML](http://yaml.org): for simple configuration * [YAML](https://yaml.org): for simple configuration
* [Parsedown](http://parsedown.org/): for fast Markdown and Markdown Extra support * [Parsedown](https://parsedown.org/): for fast Markdown and Markdown Extra support
* [Doctrine Cache](http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/caching.html): layer for performance * [Doctrine Cache](https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html): layer for performance
* [Pimple Dependency Injection Container](http://pimple.sensiolabs.org/): for extensibility and maintainability * [Pimple Dependency Injection Container](https://pimple.sensiolabs.org/): for extensibility and maintainability
* [Symfony Event Dispatcher](http://symfony.com/doc/current/components/event_dispatcher/introduction.html): for plugin event handling * [Symfony Event Dispatcher](https://symfony.com/doc/current/components/event_dispatcher/introduction.html): for plugin event handling
* [Symfony Console](http://symfony.com/doc/current/components/console/introduction.html): for CLI interface * [Symfony Console](https://symfony.com/doc/current/components/console/introduction.html): for CLI interface
* [Gregwar Image Library](https://github.com/Gregwar/Image): for dynamic image manipulation * [Gregwar Image Library](https://github.com/Gregwar/Image): for dynamic image manipulation
# Requirements # Requirements
@@ -96,7 +97,7 @@ If you discover a possible security issue related to Grav or one of its plugins,
* [Install](https://learn.getgrav.org/basics/installation) Grav in few seconds * [Install](https://learn.getgrav.org/basics/installation) Grav in few seconds
* Understand the [Configuration](https://learn.getgrav.org/basics/grav-configuration) * Understand the [Configuration](https://learn.getgrav.org/basics/grav-configuration)
* Take a peek at our available free [Skeletons](https://getgrav.org/downloads/skeletons) * Take a peek at our available free [Skeletons](https://getgrav.org/downloads/skeletons)
* If you have questions, jump on our [Slack Room](https://getgrav.org/slack)! * If you have questions, jump on our [Discord Chat Server](https://chat.getgrav.org)!
* Have fun! * Have fun!
# Exploring More # Exploring More
@@ -105,75 +106,17 @@ If you discover a possible security issue related to Grav or one of its plugins,
* Dive into more [advanced](https://learn.getgrav.org/advanced) functions * Dive into more [advanced](https://learn.getgrav.org/advanced) functions
* Learn about the [Grav CLI](https://learn.getgrav.org/cli-console/grav-cli) * Learn about the [Grav CLI](https://learn.getgrav.org/cli-console/grav-cli)
* Review examples in the [Grav Cookbook](https://learn.getgrav.org/cookbook) * Review examples in the [Grav Cookbook](https://learn.getgrav.org/cookbook)
* More [Awesome Grav Stuff](https://github.com/getgrav/awesome-grav)
# Backers # Backers
Support Grav with a monthly donation to help us continue development. [[Become a backer](https://opencollective.com/grav#backer)] Support Grav with a monthly donation to help us continue development. [[Become a backer](https://opencollective.com/grav#backer)]
<a href="https://opencollective.com/grav/backer/0/website" target="_blank"><img src="https://opencollective.com/grav/backer/0/avatar.svg"></a> <img src="https://opencollective.com/grav/tiers/backers.svg?avatarHeight=36&width=600" />
<a href="https://opencollective.com/grav/backer/1/website" target="_blank"><img src="https://opencollective.com/grav/backer/1/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/2/website" target="_blank"><img src="https://opencollective.com/grav/backer/2/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/3/website" target="_blank"><img src="https://opencollective.com/grav/backer/3/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/4/website" target="_blank"><img src="https://opencollective.com/grav/backer/4/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/5/website" target="_blank"><img src="https://opencollective.com/grav/backer/5/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/6/website" target="_blank"><img src="https://opencollective.com/grav/backer/6/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/7/website" target="_blank"><img src="https://opencollective.com/grav/backer/7/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/8/website" target="_blank"><img src="https://opencollective.com/grav/backer/8/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/9/website" target="_blank"><img src="https://opencollective.com/grav/backer/9/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/10/website" target="_blank"><img src="https://opencollective.com/grav/backer/10/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/11/website" target="_blank"><img src="https://opencollective.com/grav/backer/11/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/12/website" target="_blank"><img src="https://opencollective.com/grav/backer/12/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/13/website" target="_blank"><img src="https://opencollective.com/grav/backer/13/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/14/website" target="_blank"><img src="https://opencollective.com/grav/backer/14/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/15/website" target="_blank"><img src="https://opencollective.com/grav/backer/15/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/16/website" target="_blank"><img src="https://opencollective.com/grav/backer/16/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/17/website" target="_blank"><img src="https://opencollective.com/grav/backer/17/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/18/website" target="_blank"><img src="https://opencollective.com/grav/backer/18/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/19/website" target="_blank"><img src="https://opencollective.com/grav/backer/19/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/20/website" target="_blank"><img src="https://opencollective.com/grav/backer/20/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/21/website" target="_blank"><img src="https://opencollective.com/grav/backer/21/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/22/website" target="_blank"><img src="https://opencollective.com/grav/backer/22/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/23/website" target="_blank"><img src="https://opencollective.com/grav/backer/23/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/24/website" target="_blank"><img src="https://opencollective.com/grav/backer/24/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/25/website" target="_blank"><img src="https://opencollective.com/grav/backer/25/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/26/website" target="_blank"><img src="https://opencollective.com/grav/backer/26/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/27/website" target="_blank"><img src="https://opencollective.com/grav/backer/27/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/28/website" target="_blank"><img src="https://opencollective.com/grav/backer/28/avatar.svg"></a>
<a href="https://opencollective.com/grav/backer/29/website" target="_blank"><img src="https://opencollective.com/grav/backer/29/avatar.svg"></a>
# Sponsors # Sponsors
Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/grav#sponsor)] Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/grav#sponsor)]
<a href="https://opencollective.com/grav/sponsor/0/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/0/avatar.svg"></a> <img src="https://opencollective.com/grav/tiers/sponsors.svg?avatarHeight=36&width=600" />
<a href="https://opencollective.com/grav/sponsor/1/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/1/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/2/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/2/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/3/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/3/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/4/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/4/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/5/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/5/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/6/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/6/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/7/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/7/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/8/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/8/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/9/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/9/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/10/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/10/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/11/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/11/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/12/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/12/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/13/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/13/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/14/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/14/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/15/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/15/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/16/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/16/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/17/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/17/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/18/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/18/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/19/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/19/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/20/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/20/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/21/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/21/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/22/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/22/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/23/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/23/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/24/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/24/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/25/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/25/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/26/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/26/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/27/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/27/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/28/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/28/avatar.svg"></a>
<a href="https://opencollective.com/grav/sponsor/29/website" target="_blank"><img src="https://opencollective.com/grav/sponsor/29/avatar.svg"></a>
# License # License

Binary file not shown.

30
bin/gpm
View File

@@ -1,26 +1,23 @@
#!/usr/bin/env php #!/usr/bin/env php
<?php <?php
use Grav\Common\Composer;
use Symfony\Component\Console\Application;
use Grav\Common\Grav;
\define('GRAV_CLI', true); \define('GRAV_CLI', true);
\define('GRAV_REQUEST_TIME', microtime(true)); \define('GRAV_REQUEST_TIME', microtime(true));
if (!file_exists(__DIR__ . '/../vendor')){ if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
}
use Grav\Common\Composer;
use Grav\Common\Config\Setup;
if (!file_exists(__DIR__ . '/../vendor')){
// Before we can even start, we need to run composer first // Before we can even start, we need to run composer first
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
$composer = Composer::getComposerExecutor(); $composer = Composer::getComposerExecutor();
echo "Preparing to install vendor dependencies...\n\n"; echo "Preparing to install vendor dependencies...\n\n";
echo system($composer.' --working-dir="'.__DIR__.'/../" --no-interaction --no-dev --prefer-dist -o install'); echo system($composer.' --working-dir="'.__DIR__.'/../" --no-interaction --no-dev --prefer-dist -o install');
echo "\n\n"; echo "\n\n";
} }
use Symfony\Component\Console\Application;
use Grav\Common\Grav;
$autoload = require __DIR__ . '/../vendor/autoload.php'; $autoload = require __DIR__ . '/../vendor/autoload.php';
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) { if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
@@ -31,7 +28,7 @@ if (!ini_get('date.timezone')) {
date_default_timezone_set('UTC'); date_default_timezone_set('UTC');
} }
if (!file_exists(ROOT_DIR . 'index.php')) { if (!file_exists(GRAV_ROOT . '/index.php')) {
exit('FATAL: Must be run from ROOT directory of Grav!'); exit('FATAL: Must be run from ROOT directory of Grav!');
} }
@@ -49,15 +46,16 @@ $climate->arguments->add([
] ]
]); ]);
$climate->arguments->parse(); $climate->arguments->parse();
$environment = $climate->arguments->get('environment');
// Set up environment based on params. // Set up environment based on params.
Setup::$environment = $environment; $environment = $climate->arguments->get('environment');
$grav = Grav::instance(array('loader' => $autoload)); $grav = Grav::instance(array('loader' => $autoload));
$grav['uri']->init(); $grav->setup($environment);
$grav['config']->init(); $grav['config']->init();
$grav['streams']; $grav['uri']->init();
$grav['users'];
$app = new Application('Grav Package Manager', GRAV_VERSION); $app = new Application('Grav Package Manager', GRAV_VERSION);
$app->addCommands(array( $app->addCommands(array(

View File

@@ -1,18 +1,18 @@
#!/usr/bin/env php #!/usr/bin/env php
<?php <?php
use Grav\Common\Composer;
use Grav\Common\Grav;
use League\CLImate\CLImate;
use Symfony\Component\Console\Application;
\define('GRAV_CLI', true); \define('GRAV_CLI', true);
\define('GRAV_REQUEST_TIME', microtime(true)); \define('GRAV_REQUEST_TIME', microtime(true));
if (!file_exists(__DIR__ . '/../vendor')){ if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
}
use Grav\Common\Grav;
use Grav\Common\Composer;
use Symfony\Component\Console\Application;
if (!file_exists(__DIR__ . '/../vendor')){
// Before we can even start, we need to run composer first // Before we can even start, we need to run composer first
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
$composer = Composer::getComposerExecutor(); $composer = Composer::getComposerExecutor();
echo "Preparing to install vendor dependencies...\n\n"; echo "Preparing to install vendor dependencies...\n\n";
echo system($composer.' --working-dir="'.__DIR__.'/../" --no-interaction --no-dev --prefer-dist -o install'); echo system($composer.' --working-dir="'.__DIR__.'/../" --no-interaction --no-dev --prefer-dist -o install');
@@ -20,17 +20,33 @@ if (!file_exists(__DIR__ . '/../vendor')){
} }
$autoload = require __DIR__ . '/../vendor/autoload.php'; $autoload = require __DIR__ . '/../vendor/autoload.php';
Grav::instance(array('loader' => $autoload));
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) { if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req)); exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
} }
$climate = new League\CLImate\CLImate;
$climate->arguments->add([
'environment' => [
'prefix' => 'e',
'longPrefix' => 'env',
'description' => 'Configuration Environment',
'defaultValue' => 'localhost'
]
]);
$climate->arguments->parse();
// Set up environment based on params.
$environment = $climate->arguments->get('environment');
$grav = Grav::instance(array('loader' => $autoload));
$grav->setup($environment);
if (!ini_get('date.timezone')) { if (!ini_get('date.timezone')) {
date_default_timezone_set('UTC'); date_default_timezone_set('UTC');
} }
if (!file_exists(ROOT_DIR . 'index.php')) { if (!file_exists(GRAV_ROOT . '/index.php')) {
exit('FATAL: Must be run from ROOT directory of Grav!'); exit('FATAL: Must be run from ROOT directory of Grav!');
} }
@@ -40,10 +56,12 @@ $app->addCommands(array(
new \Grav\Console\Cli\ComposerCommand(), new \Grav\Console\Cli\ComposerCommand(),
new \Grav\Console\Cli\SandboxCommand(), new \Grav\Console\Cli\SandboxCommand(),
new \Grav\Console\Cli\CleanCommand(), new \Grav\Console\Cli\CleanCommand(),
new \Grav\Console\Cli\CacheCommand(), new \Grav\Console\Cli\ClearCacheCommand(),
new \Grav\Console\Cli\BackupCommand(), new \Grav\Console\Cli\BackupCommand(),
new \Grav\Console\Cli\NewProjectCommand(), new \Grav\Console\Cli\NewProjectCommand(),
new \Grav\Console\Cli\SchedulerCommand(), new \Grav\Console\Cli\SchedulerCommand(),
new \Grav\Console\Cli\SecurityCommand(), new \Grav\Console\Cli\SecurityCommand(),
new \Grav\Console\Cli\LogViewerCommand(),
new \Grav\Console\Cli\YamlLinterCommand(),
)); ));
$app->run(); $app->run();

View File

@@ -1,30 +1,27 @@
#!/usr/bin/env php #!/usr/bin/env php
<?php <?php
\define('GRAV_CLI', true);
\define('GRAV_REQUEST_TIME', microtime(true));
if (!file_exists(__DIR__ . '/../vendor')) {
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
}
use Grav\Common\Composer; use Grav\Common\Composer;
if (!file_exists(__DIR__ . '/../vendor')) {
// Before we can even start, we need to run composer first
$composer = Composer::getComposerExecutor();
echo "Preparing to install vendor dependencies...\n\n";
echo system($composer . ' --working-dir="' . __DIR__ . '/../" --no-interaction --no-dev --prefer-dist -o install');
echo "\n\n";
}
use Symfony\Component\Console\Application; use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\ArgvInput; use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Output\ConsoleOutput; use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Formatter\OutputFormatterStyle; use Symfony\Component\Console\Formatter\OutputFormatterStyle;
use Grav\Common\Grav; use Grav\Common\Grav;
use Grav\Common\Config\Setup;
use Grav\Common\Filesystem\Folder; use Grav\Common\Filesystem\Folder;
\define('GRAV_CLI', true);
\define('GRAV_REQUEST_TIME', microtime(true));
if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
// Before we can even start, we need to run composer first
require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
$composer = Composer::getComposerExecutor();
echo "Preparing to install vendor dependencies...\n\n";
echo system($composer.' --working-dir="'.__DIR__.'/../" --no-interaction --no-dev --prefer-dist -o install');
echo "\n\n";
}
$autoload = require __DIR__ . '/../vendor/autoload.php'; $autoload = require __DIR__ . '/../vendor/autoload.php';
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) { if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
@@ -35,7 +32,7 @@ if (!ini_get('date.timezone')) {
date_default_timezone_set('UTC'); date_default_timezone_set('UTC');
} }
if (!file_exists(ROOT_DIR . 'index.php')) { if (!file_exists(GRAV_ROOT . '/index.php')) {
exit('FATAL: Must be run from ROOT directory of Grav!'); exit('FATAL: Must be run from ROOT directory of Grav!');
} }
@@ -49,19 +46,18 @@ $climate->arguments->add([
] ]
]); ]);
$climate->arguments->parse(); $climate->arguments->parse();
$environment = $climate->arguments->get('environment'); $environment = $climate->arguments->get('environment');
// Set up environment based on params.
Setup::$environment = $environment;
$grav = Grav::instance(array('loader' => $autoload)); $grav = Grav::instance(array('loader' => $autoload));
$grav['uri']->init(); $grav->setup($environment);
$grav['config']->init(); $grav['config']->init();
$grav['streams']; $grav['uri']->init();
$grav['users'];
$grav['plugins']->init(); $grav['plugins']->init();
$grav['themes']->init(); $grav['themes']->init();
$app = new Application('Grav Plugins Commands', GRAV_VERSION); $app = new Application('Grav Plugins Commands', GRAV_VERSION);
$pattern = '([A-Z]\w+Command\.php)'; $pattern = '([A-Z]\w+Command\.php)';
@@ -76,6 +72,7 @@ $argv = array_merge([$bin], $argv);
$input = new ArgvInput($argv); $input = new ArgvInput($argv);
/** @var \Grav\Common\Data\Data $plugin */
$plugin = $grav['plugins']->get($name); $plugin = $grav['plugins']->get($name);
$output = new ConsoleOutput(); $output = new ConsoleOutput();
@@ -101,18 +98,30 @@ if (!$name) {
$entry = array_shift($split); $entry = array_shift($split);
$index = str_pad($index++ + 1, 2, '0', STR_PAD_LEFT); $index = str_pad($index++ + 1, 2, '0', STR_PAD_LEFT);
$total = str_pad($total++ + 1, 2, '0', STR_PAD_LEFT); $total = str_pad($total++ + 1, 2, '0', STR_PAD_LEFT);
if (in_array($entry, $available)) { if (\in_array($entry, $available, true)) {
$total -= 1; $total--;
continue; continue;
} }
$available[] = $entry; $available[] = $entry;
$commands_count = $index - $total + 1; $commands_count = $index - $total + 1;
$output->writeln(' ' . $total . '. <red>' . str_pad($entry, 15) . "</red> <white>${bla} ${bin} ${entry} list</white>"); $output->writeln(' ' . $total . '. <red>' . str_pad($entry, 15) . "</red> <white>{$bin} {$entry} list</white>");
} }
} }
exit; exit;
} else {
if (is_null($plugin)) {
$output->writeln('');
$output->writeln("<red>$name plugin not found</red>");
die;
}
if (!$plugin->enabled) {
$output->writeln('');
$output->writeln("<red>$name not enabled</red>");
die;
}
} }
if ($plugin === null) { if ($plugin === null) {

View File

@@ -2,8 +2,14 @@
"name": "getgrav/grav", "name": "getgrav/grav",
"type": "project", "type": "project",
"description": "Modern, Crazy Fast, Ridiculously Easy and Amazingly Powerful Flat-File CMS", "description": "Modern, Crazy Fast, Ridiculously Easy and Amazingly Powerful Flat-File CMS",
"keywords": ["cms","flat-file cms","flat cms","flatfile cms","php"], "keywords": [
"homepage": "http://getgrav.org", "cms",
"flat-file cms",
"flat cms",
"flatfile cms",
"php"
],
"homepage": "https://getgrav.org",
"license": "MIT", "license": "MIT",
"require": { "require": {
"php": ">=7.1.3", "php": ">=7.1.3",
@@ -12,50 +18,57 @@
"ext-openssl": "*", "ext-openssl": "*",
"ext-curl": "*", "ext-curl": "*",
"ext-zip": "*", "ext-zip": "*",
"ext-dom": "*",
"symfony/polyfill-iconv": "^1.9", "symfony/polyfill-iconv": "^1.9",
"symfony/polyfill-php72": "^1.9", "symfony/polyfill-php72": "^1.9",
"symfony/polyfill-php73": "^1.9", "symfony/polyfill-php73": "^1.9",
"psr/simple-cache": "^1.0", "psr/simple-cache": "^1.0",
"psr/http-message": "^1.0", "psr/http-message": "^1.0",
"psr/http-server-middleware": "^1.0", "psr/http-server-middleware": "^1.0",
"kodus/psr7-server": "*",
"nyholm/psr7-server": "^0.2.1",
"nyholm/psr7": "^1.0", "nyholm/psr7": "^1.0",
"twig/twig": "~1.40",
"twig/twig": "~1.35",
"erusev/parsedown": "1.6.4", "erusev/parsedown": "1.6.4",
"erusev/parsedown-extra": "~0.7", "erusev/parsedown-extra": "~0.7",
"symfony/yaml": "~4.1", "symfony/yaml": "~4.2.0",
"symfony/console": "~4.1", "symfony/console": "~4.2.0",
"symfony/event-dispatcher": "~4.1", "symfony/event-dispatcher": "~4.2.0",
"symfony/var-dumper": "~4.1", "symfony/var-dumper": "~4.2.0",
"symfony/process": "~4.1", "symfony/process": "~4.2.0",
"doctrine/cache": "^1.8", "doctrine/cache": "^1.8",
"doctrine/collections": "^1.5", "doctrine/collections": "^1.5",
"guzzlehttp/psr7": "^1.4", "guzzlehttp/psr7": "^1.4",
"filp/whoops": "~2.2", "filp/whoops": "~2.2",
"matthiasmullie/minify": "^1.3", "matthiasmullie/minify": "^1.3",
"monolog/monolog": "~1.0", "monolog/monolog": "~1.0",
"gregwar/image": "2.*", "gregwar/image": "2.*",
"donatj/phpuseragentparser": "~0.10", "donatj/phpuseragentparser": "~0.10",
"pimple/pimple": "~3.2", "pimple/pimple": "~3.2",
"rockettheme/toolbox": "~1.4", "rockettheme/toolbox": "~1.4.0",
"maximebf/debugbar": "~1.15", "maximebf/debugbar": "~1.15",
"league/climate": "^3.4", "league/climate": "^3.4",
"antoligy/dom-string-iterators": "^1.0", "antoligy/dom-string-iterators": "^1.0",
"miljar/php-exif": "^0.6.4", "miljar/php-exif": "^0.6.4",
"composer/ca-bundle": "^1.0", "composer/ca-bundle": "^1.0",
"dragonmantank/cron-expression": "^1.2", "dragonmantank/cron-expression": "^1.2",
"phive/twig-extensions-deferred": "^1.0" "phive/twig-extensions-deferred": "^1.0",
"willdurand/negotiation": "^2.3"
}, },
"require-dev": { "require-dev": {
"codeception/codeception": "^2.4", "codeception/codeception": "^2.4",
"phpstan/phpstan": "^0.11",
"phpstan/phpstan-deprecation-rules": "^0.11.0",
"phpunit/php-code-coverage": "~6.0", "phpunit/php-code-coverage": "~6.0",
"fzaninotto/faker": "^1.8", "fzaninotto/faker": "^1.8",
"victorjonsson/markdowndocs": "dev-master" "victorjonsson/markdowndocs": "dev-master"
}, },
"suggest": {
"ext-zend-opcache": "Recommended for better performance",
"ext-intl": "Recommended for multi-language sites",
"ext-memcache": "Needed to support Memcache servers",
"ext-memcached": "Needed to support Memcached servers",
"ext-redis": "Needed to support Redis servers"
},
"config": { "config": {
"apcu-autoloader": true, "apcu-autoloader": true,
"platform": { "platform": {
@@ -72,13 +85,22 @@
"psr-4": { "psr-4": {
"Grav\\": "system/src/Grav" "Grav\\": "system/src/Grav"
}, },
"files": ["system/defines.php"] "files": [
"system/defines.php"
]
}, },
"archive": { "archive": {
"exclude": ["VERSION"] "exclude": [
"VERSION"
]
}, },
"scripts": { "scripts": {
"api-16": "vendor/bin/phpdoc-md generate system/src > user/pages/14.api/default.16.md",
"api-15": "vendor/bin/phpdoc-md generate system/src > user/pages/14.api/default.md",
"post-create-project-cmd": "bin/grav install", "post-create-project-cmd": "bin/grav install",
"phpstan": "vendor/bin/phpstan analyse -l 2 -c ./tests/phpstan/phpstan.neon system/src --memory-limit=256M",
"phpstan-framework": "vendor/bin/phpstan analyse -l 5 -c ./tests/phpstan/phpstan.neon system/src/Grav/Framework --memory-limit=256M",
"phpstan-plugins": "vendor/bin/phpstan analyse -l 0 -c ./tests/phpstan/plugins.neon user/plugins --memory-limit=256M",
"test": "vendor/bin/codecept run unit", "test": "vendor/bin/codecept run unit",
"test-windows": "vendor\\bin\\codecept run unit" "test-windows": "vendor\\bin\\codecept run unit"
}, },

2146
composer.lock generated

File diff suppressed because it is too large Load Diff

4
now.json Normal file
View File

@@ -0,0 +1,4 @@
{
"version": 2,
"builds": [{ "src": "*.php", "use": "@now/php" }]
}

View File

@@ -10,3 +10,4 @@ Disallow: /user/
Allow: /user/pages/ Allow: /user/pages/
Allow: /user/themes/ Allow: /user/themes/
Allow: /user/images/ Allow: /user/images/
Allow: /

View File

@@ -30,9 +30,25 @@ div.phpdebugbar {
} }
.phpdebugbar .phpdebugbar-widgets-toolbar { .phpdebugbar .phpdebugbar-widgets-toolbar {
border-top: 1px solid #ddd;
padding-left: 5px; padding-left: 5px;
padding-right: 2px;
padding-top: 2px;
background-color: #fafafa !important;
width: auto !important;
left: 0;
right: 0;
} }
.phpdebugbar .phpdebugbar-widgets-toolbar input {
background: transparent !important;
}
.phpdebugbar .phpdebugbar-widgets-toolbar .phpdebugbar-widgets-filter {
}
.phpdebugbar input[type=text] { .phpdebugbar input[type=text] {
padding: 0; padding: 0;
display: inline; display: inline;

View File

@@ -19,22 +19,22 @@ form:
purge.trigger: purge.trigger:
type: select type: select
label: Backup Storage Purge Trigger label: PLUGIN_ADMIN.BACKUPS_STORAGE_PURGE_TRIGGER
size: medium size: medium
default: space default: space
options: options:
space: Maximum Backup Space space: Maximum Backup Space
number: Maximum Number of Backups number: Maximum Number of Backups
time: maximum Rention Time time: maximum Retention Time
validate: validate:
required: true required: true
purge.max_backups_count: purge.max_backups_count:
type: number type: number
label: Maximum Number of Backups label: PLUGIN_ADMIN.BACKUPS_MAX_COUNT
default: 25 default: 25
size: x-small size: x-small
help: "0 is unlimited" help: PLUGIN_ADMIN.BACKUPS_MAX_COUNT
validate: validate:
min: 0 min: 0
type: number type: number
@@ -43,7 +43,7 @@ form:
purge.max_backups_space: purge.max_backups_space:
type: number type: number
label: Maximum Backups Space label: PLUGIN_ADMIN.BACKUPS_MAX_SPACE
append: in GB append: in GB
size: x-small size: x-small
default: 5 default: 5
@@ -55,8 +55,8 @@ form:
purge.max_backups_time: purge.max_backups_time:
type: number type: number
label: Maximum Rention Time label: PLUGIN_ADMIN.BACKUPS_MAX_RETENTION_TIME
append: in Days append: PLUGIN_ADMIN.BACKUPS_MAX_RETENTION_TIME_APPEND
size: x-small size: x-small
default: 365 default: 365
validate: validate:
@@ -80,35 +80,35 @@ form:
fields: fields:
.name: .name:
type: text type: text
label: Name label: PLUGIN_ADMIN.NAME
placeholder: 'Clear Backup Name' placeholder: PLUGIN_ADMIN.BACKUPS_PROFILE_NAME
validate: validate:
max: 20 max: 20
message: 'Name must be less than 20 characters' message: 'Name must be less than 20 characters'
required: true required: true
.root: .root:
type: text type: text
label: Root Folder label: PLUGIN_ADMIN.BACKUPS_PROFILE_ROOT_FOLDER
help: Can be an absolute path or a stream help: PLUGIN_ADMIN.BACKUPS_PROFILE_ROOT_FOLDER_HELP
placeholder: '/' placeholder: '/'
default: '/' default: '/'
validate: validate:
required: true required: true
.exclude_paths: .exclude_paths:
type: textarea type: textarea
label: Exclude Paths label: PLUGIN_ADMIN.BACKUPS_PROFILE_EXCLUDE_PATHS
rows: 5 rows: 5
placeholder: "/backup\r/cache\r/images\r/logs\r/tmp" placeholder: "/backup\r/cache\r/images\r/logs\r/tmp"
help: Absolute paths to exclude, one per line help: PLUGIN_ADMIN.BACKUPS_PROFILE_EXCLUDE_PATHS_HELP
.exclude_files: .exclude_files:
type: textarea type: textarea
label: Exclude Files label: PLUGIN_ADMIN.BACKUPS_PROFILE_EXCLUDE_FILES
rows: 5 rows: 5
placeholder: ".DS_Store\r.git\r.svn\r.hg\r.idea\r.vscode\rnode_modules" placeholder: ".DS_Store\r.git\r.svn\r.hg\r.idea\r.vscode\rnode_modules"
help: Specfic Files or Folders to exclude, one per line help: PLUGIN_ADMIN.BACKUPS_PROFILE_EXCLUDE_FILES_HELP
.schedule: .schedule:
type: toggle type: toggle
label: Enable Scheduled Job label: PLUGIN_ADMIN.BACKUPS_PROFILE_SCHEDULE
highlight: 1 highlight: 1
default: 1 default: 1
options: options:
@@ -118,7 +118,7 @@ form:
type: bool type: bool
.schedule_at: .schedule_at:
type: cron type: cron
label: Run Scheduled Job label: PLUGIN_ADMIN.BACKUPS_PROFILE_SCHEDULE_AT
default: '* 3 * * *' default: '* 3 * * *'
validate: validate:
required: true required: true

View File

@@ -38,37 +38,37 @@ form:
message: 'ID must be lowercase with dashes/underscores only and less than 20 characters' message: 'ID must be lowercase with dashes/underscores only and less than 20 characters'
.command: .command:
type: text type: text
label: Command label: PLUGIN_ADMIN.COMMAND
placeholder: 'cd ~;ls -lah;' placeholder: 'cd ~;ls -lah;'
validate: validate:
required: true required: true
.args: .args:
type: text type: text
label: Extra Arguments label: PLUGIN_ADMIN.EXTRA_ARGUMENTS
.at: .at:
type: cron type: cron
label: Run At label: PLUGIN_ADMIN.SCHEDULER_RUNAT
help: 'Cron formatted "at" syntax' help: PLUGIN_ADMIN.SCHEDULER_RUNAT_HELP
placeholder: '* * * * *' placeholder: '* * * * *'
validate: validate:
required: true required: true
.output: .output:
type: text type: text
label: Output File label: PLUGIN_ADMIN.SCHEDULER_OUTPUT
help: 'The path/filename of the output file (from the root of the Grav installation)' help: PLUGIN_ADMIN.SCHEDULER_OUTPUT_HELP
placeholder: 'logs/ls-cron.out' placeholder: 'logs/ls-cron.out'
.output_mode: .output_mode:
type: select type: select
label: Output Type label: PLUGIN_ADMIN.SCHEDULER_OUTPUT_TYPE
help: 'Either append to the same file each run, or overwrite the file with each run' help: PLUGIN_ADMIN.SCHEDULER_OUTPUT_TYPE_HELP
default: append default: append
options: options:
append: Append append: Append
overwrite: Overwrite overwrite: Overwrite
.email: .email:
type: text type: text
label: Email label: PLUGIN_ADMIN.SCHEDULER_EMAIL
help: 'Email to send output to. NOTE: requires output file to be set' help: PLUGIN_ADMIN.SCHEDULER_EMAIL_HELP
placeholder: 'notifications@yoursite.com' placeholder: 'notifications@yoursite.com'

View File

@@ -65,7 +65,7 @@ form:
summary.size: summary.size:
type: text type: text
size: x-small size: small
append: PLUGIN_ADMIN.CHARACTERS append: PLUGIN_ADMIN.CHARACTERS
label: PLUGIN_ADMIN.SUMMARY_SIZE label: PLUGIN_ADMIN.SUMMARY_SIZE
help: PLUGIN_ADMIN.SUMMARY_SIZE_HELP help: PLUGIN_ADMIN.SUMMARY_SIZE_HELP

View File

@@ -41,7 +41,6 @@ form:
validate: validate:
type: bool type: bool
pages.theme: pages.theme:
type: themeselect type: themeselect
classes: fancy classes: fancy
@@ -60,6 +59,14 @@ form:
twig: Twig twig: Twig
use: keys use: keys
pages.types:
type: array
label: PLUGIN_ADMIN.PAGE_TYPES
help: PLUGIN_ADMIN.PAGE_TYPES_HELP
size: small
default: ['html','htm','json','xml','txt','rss','atom']
value_only: true
timezone: timezone:
type: select type: select
label: PLUGIN_ADMIN.TIMEZONE label: PLUGIN_ADMIN.TIMEZONE
@@ -316,6 +323,12 @@ form:
validate: validate:
type: commalist type: commalist
languages.default_lang:
type: text
size: x-small
label: PLUGIN_ADMIN.DEFAULT_LANG
help: PLUGIN_ADMIN.DEFAULT_LANG_HELP
languages.include_default_lang: languages.include_default_lang:
type: toggle type: toggle
label: PLUGIN_ADMIN.INCLUDE_DEFAULT_LANG label: PLUGIN_ADMIN.INCLUDE_DEFAULT_LANG
@@ -406,7 +419,7 @@ form:
pages.expires: pages.expires:
type: text type: text
size: small size: small
append: NICETIME.SECOND_PLURAL append: GRAV.NICETIME.SECOND_PLURAL
label: PLUGIN_ADMIN.EXPIRES label: PLUGIN_ADMIN.EXPIRES
help: PLUGIN_ADMIN.EXPIRES_HELP help: PLUGIN_ADMIN.EXPIRES_HELP
validate: validate:
@@ -561,8 +574,23 @@ form:
type: cron type: cron
label: PLUGIN_ADMIN.CACHE_PURGE_JOB label: PLUGIN_ADMIN.CACHE_PURGE_JOB
help: PLUGIN_ADMIN.CACHE_PURGE_JOB_HELP help: PLUGIN_ADMIN.CACHE_PURGE_JOB_HELP
default: '* 4 * * *'
cache.clear_at:
type: cron
label: PLUGIN_ADMIN.CACHE_CLEAR_JOB
help: PLUGIN_ADMIN.CACHE_CLEAR_JOB_HELP
default: '* 3 * * *' default: '* 3 * * *'
cache.clear_job_type:
type: select
size: medium
label: PLUGIN_ADMIN.CACHE_JOB_TYPE
help: PLUGIN_ADMIN.CACHE_JOB_TYPE_HELP
options:
standard: Standard Cache Folders
all: All Cache Folders
cache.clear_images_by_default: cache.clear_images_by_default:
type: toggle type: toggle
label: PLUGIN_ADMIN.CLEAR_IMAGES_BY_DEFAULT label: PLUGIN_ADMIN.CLEAR_IMAGES_BY_DEFAULT
@@ -588,7 +616,7 @@ form:
cache.lifetime: cache.lifetime:
type: text type: text
size: small size: small
append: NICETIME.SECOND_PLURAL append: GRAV.NICETIME.SECOND_PLURAL
label: PLUGIN_ADMIN.LIFETIME label: PLUGIN_ADMIN.LIFETIME
help: PLUGIN_ADMIN.LIFETIME_HELP help: PLUGIN_ADMIN.LIFETIME_HELP
validate: validate:
@@ -1040,6 +1068,17 @@ form:
validate: validate:
type: bool type: bool
images.seofriendly:
type: toggle
label: PLUGIN_ADMIN.IMAGES_SEOFRIENDLY
help: PLUGIN_ADMIN.IMAGES_SEOFRIENDLY_HELP
highlight: 0
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
media.enable_media_timestamp: media.enable_media_timestamp:
type: toggle type: toggle
label: PLUGIN_ADMIN.ENABLE_MEDIA_TIMESTAMP label: PLUGIN_ADMIN.ENABLE_MEDIA_TIMESTAMP
@@ -1063,7 +1102,6 @@ form:
type: bool type: bool
media.allowed_fallback_types: media.allowed_fallback_types:
type: selectize type: selectize
size: large size: large
@@ -1119,7 +1157,7 @@ form:
session.timeout: session.timeout:
type: text type: text
size: small size: small
append: NICETIME.SECOND_PLURAL append: GRAV.NICETIME.SECOND_PLURAL
label: PLUGIN_ADMIN.TIMEOUT label: PLUGIN_ADMIN.TIMEOUT
help: PLUGIN_ADMIN.TIMEOUT_HELP help: PLUGIN_ADMIN.TIMEOUT_HELP
validate: validate:
@@ -1224,9 +1262,8 @@ form:
gpm.official_gpm_only: gpm.official_gpm_only:
type: toggle type: toggle
label: PLUGIN_ADMIN.GPM_OFFICIAL_ONLY label: PLUGIN_ADMIN.GPM_OFFICIAL_ONLY
highlight: auto
help: PLUGIN_ADMIN.GPM_OFFICIAL_ONLY_HELP
highlight: 1 highlight: 1
help: PLUGIN_ADMIN.GPM_OFFICIAL_ONLY_HELP
options: options:
1: PLUGIN_ADMIN.YES 1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO 0: PLUGIN_ADMIN.NO
@@ -1342,6 +1379,12 @@ form:
label: PLUGIN_ADMIN.CUSTOM_BASE_URL label: PLUGIN_ADMIN.CUSTOM_BASE_URL
help: PLUGIN_ADMIN.CUSTOM_BASE_URL_HELP help: PLUGIN_ADMIN.CUSTOM_BASE_URL_HELP
accounts.type:
type: hidden
accounts.storage:
type: hidden
strict_mode.yaml_compat: strict_mode.yaml_compat:
type: toggle type: toggle
label: PLUGIN_ADMIN.STRICT_YAML_COMPAT label: PLUGIN_ADMIN.STRICT_YAML_COMPAT

View File

@@ -100,13 +100,14 @@ form:
security: security:
security@: admin.super
title: PLUGIN_ADMIN.ACCESS_LEVELS title: PLUGIN_ADMIN.ACCESS_LEVELS
type: section type: section
security: admin.super
underline: true underline: true
fields: fields:
groups: groups:
security@: admin.super
type: select type: select
multiple: true multiple: true
size: large size: large
@@ -118,6 +119,7 @@ form:
type: commalist type: commalist
access: access:
security@: admin.super
type: permissions type: permissions
label: PLUGIN_ADMIN.PERMISSIONS label: PLUGIN_ADMIN.PERMISSIONS
ignore_empty: true ignore_empty: true

View File

@@ -12,5 +12,7 @@ form:
type: text type: text
label: PLUGIN_ADMIN.USERNAME label: PLUGIN_ADMIN.USERNAME
help: PLUGIN_ADMIN.USERNAME_HELP help: PLUGIN_ADMIN.USERNAME_HELP
unset-disabled@: true
unset-readonly@: true
validate: validate:
required: true required: true

View File

@@ -0,0 +1,39 @@
title: User Accounts
description: User Accounts
type: flex-objects
extends@: 'user/account'
config:
admin:
list:
fields:
username:
link: edit
search: true
email:
search: true
fullname:
search: true
options:
per_page: 20
order:
by: username
dir: asc
menu:
list:
route: '/accounts'
title: Accounts
icon: fa-users
authorize: ['admin.users', 'admin.accounts', 'admin.super']
form:
fields:
username:
flex-disabled@: exists
disabled: false
flex-readonly@: exists
readonly: false
validate:
required: true

View File

@@ -27,7 +27,7 @@ routes:
blog: blog:
route: '/blog' # Custom value added (accessible via system.blog.route) route: '/blog' # Custom value added (accessible via system.blog.route)
#menu: # Sample Menu Example #menu: # Menu Example
# - text: Source # - text: Source
# icon: github # icon: github
# url: https://github.com/getgrav/grav # url: https://github.com/getgrav/grav

View File

@@ -13,6 +13,7 @@ intl_enabled: true # Special logic for PHP Interna
languages: languages:
supported: [] # List of languages supported. eg: [en, fr, de] supported: [] # List of languages supported. eg: [en, fr, de]
default_lang: # Default is the first supported language. Must be one of the supported languages
include_default_lang: true # Include the default lang prefix in all URLs include_default_lang: true # Include the default lang prefix in all URLs
pages_fallback_only: false # Only fallback to find page content through supported languages pages_fallback_only: false # Only fallback to find page content through supported languages
translations: true # Enable translations by default translations: true # Enable translations by default
@@ -53,7 +54,7 @@ pages:
special_chars: # List of special characters to automatically convert to entities special_chars: # List of special characters to automatically convert to entities
'>': 'gt' '>': 'gt'
'<': 'lt' '<': 'lt'
types: [txt,xml,html,htm,json,rss,atom] # list of valid page types types: [html,htm,xml,txt,json,rss,atom] # list of valid page types
append_url_extension: '' # Append page's extension in Page urls (e.g. '.html' results in /path/page.html) append_url_extension: '' # Append page's extension in Page urls (e.g. '.html' results in /path/page.html)
expires: 604800 # Page expires time in seconds (604800 seconds = 7 days) expires: 604800 # Page expires time in seconds (604800 seconds = 7 days)
cache_control: # Can be blank for no setting, or a valid `cache-control` text value cache_control: # Can be blank for no setting, or a valid `cache-control` text value
@@ -76,9 +77,11 @@ cache:
enabled: true # Set to true to enable caching enabled: true # Set to true to enable caching
check: check:
method: file # Method to check for updates in pages: file|folder|hash|none method: file # Method to check for updates in pages: file|folder|hash|none
driver: auto # One of: auto|file|apc|xcache|memcache|wincache driver: auto # One of: auto|file|apcu|memcache|wincache
prefix: 'g' # Cache prefix string (prevents cache conflicts) prefix: 'g' # Cache prefix string (prevents cache conflicts)
purge_at: '0 4 * * *' # How often to purge old cache (using new scheduler) purge_at: '0 4 * * *' # How often to purge old file cache (using new scheduler)
clear_at: '0 3 * * *' # How often to clear cache (using new scheduler)
clear_job_type: 'standard' # Type to clear when processing the scheduled clear job `standard`|`all`
clear_images_by_default: true # By default grav will include processed images in cache clear, this can be disabled clear_images_by_default: true # By default grav will include processed images in cache clear, this can be disabled
cli_compatibility: false # Ensures only non-volatile drivers are used (file, redis, memcache, etc.) cli_compatibility: false # Ensures only non-volatile drivers are used (file, redis, memcache, etc.)
lifetime: 604800 # Lifetime of cached data in seconds (0 = infinite) lifetime: 604800 # Lifetime of cached data in seconds (0 = infinite)
@@ -131,6 +134,7 @@ images:
cache_perms: '0755' # MUST BE IN QUOTES!! Default cache folder perms. Usually '0755' or '0775' cache_perms: '0755' # MUST BE IN QUOTES!! Default cache folder perms. Usually '0755' or '0775'
debug: false # Show an overlay over images indicating the pixel depth of the image when working with retina for example debug: false # Show an overlay over images indicating the pixel depth of the image when working with retina for example
auto_fix_orientation: false # Automatically fix the image orientation based on the Exif data auto_fix_orientation: false # Automatically fix the image orientation based on the Exif data
seofriendly: false # SEO-friendly processed image names
media: media:
enable_media_timestamp: false # Enable media timestamps enable_media_timestamp: false # Enable media timestamps
@@ -156,6 +160,10 @@ gpm:
verify_peer: true # Sometimes on some systems (Windows most commonly) GPM is unable to connect because the SSL certificate cannot be verified. Disabling this setting might help. verify_peer: true # Sometimes on some systems (Windows most commonly) GPM is unable to connect because the SSL certificate cannot be verified. Disabling this setting might help.
official_gpm_only: true # By default GPM direct-install will only allow URLs via the official GPM proxy to ensure security official_gpm_only: true # By default GPM direct-install will only allow URLs via the official GPM proxy to ensure security
accounts:
type: data # Account type: data or flex
storage: file # Flex storage type: file or folder
strict_mode: strict_mode:
yaml_compat: true # Grav 1.5+: Enables YAML backwards compatibility yaml_compat: true # Grav 1.5+: Enables YAML backwards compatibility
twig_compat: true # Grav 1.5+: Enables deprecated Twig autoescape setting (autoescape: false) twig_compat: true # Grav 1.5+: Enables deprecated Twig autoescape setting (autoescape: false)

View File

@@ -1,15 +1,15 @@
<?php <?php
/** /**
* @package Grav.Core * @package Grav\Core
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
// Some standard defines // Some standard defines
define('GRAV', true); define('GRAV', true);
define('GRAV_VERSION', '1.6.0-beta.5'); define('GRAV_VERSION', '1.6.20');
define('GRAV_TESTING', true); define('GRAV_TESTING', false);
define('DS', '/'); define('DS', '/');
if (!defined('GRAV_PHP_MIN')) { if (!defined('GRAV_PHP_MIN')) {

17
system/install.php Normal file
View File

@@ -0,0 +1,17 @@
<?php
/**
* @package Grav\Core
*
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
if (!defined('GRAV_ROOT')) {
die();
}
use Grav\Installer\Install;
require_once __DIR__ . '/src/Grav/Installer/Install.php';
return Install::instance();

View File

@@ -1,19 +1,6 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: | FRONTMATTER_ERROR_PAGE: "---\nالعنوان: %1$s\n---\n# خطأ: مادة أمامية غير صحيحة\n\nمسار: '%2$s'\n\n**%3$s**\n\n, , ,\n\n%4$s\n, , ,"
---
العنوان: %1$s
---
# خطأ: مادة أمامية غير صحيحة
مسار: '%2$s'
**%3$s**
, , ,
%4$s
, , ,
NICETIME: NICETIME:
NO_DATE_PROVIDED: لم يتم تقديم التاريخ NO_DATE_PROVIDED: لم يتم تقديم التاريخ
BAD_DATE: تاريخ خاطئ BAD_DATE: تاريخ خاطئ
@@ -35,7 +22,7 @@ GRAV:
YR: سنة YR: سنة
DEC: عقد DEC: عقد
SECOND_PLURAL: ثواني SECOND_PLURAL: ثواني
MINUTE_PLURAL: ‮دقائق MINUTE_PLURAL: '‮دقائق'
HOUR_PLURAL: ساعات HOUR_PLURAL: ساعات
DAY_PLURAL: أيام DAY_PLURAL: أيام
WEEK_PLURAL: أسابيع WEEK_PLURAL: أسابيع
@@ -50,27 +37,27 @@ GRAV:
YR_PLURAL: سنوات YR_PLURAL: سنوات
DEC_PLURAL: عقود DEC_PLURAL: عقود
FORM: FORM:
VALIDATION_FAIL: '<b>فشل التحقق من صحة:</b>' VALIDATION_FAIL: <b>فشل التحقق من صحة:</b>
INVALID_INPUT: إدخال غير صحيح في INVALID_INPUT: إدخال غير صحيح في
MISSING_REQUIRED_FIELD: 'حقل مطلوب مفقود:' MISSING_REQUIRED_FIELD: 'حقل مطلوب مفقود:'
MONTHS_OF_THE_YEAR: MONTHS_OF_THE_YEAR:
- كانون الثاني - 'كانون الثاني'
- شباط - 'شباط'
- آذار/ مارس - 'آذار/ مارس'
- نيسان - 'نيسان'
- أيار - 'أيار'
- حزيران - 'حزيران'
- تموز - 'تموز'
- آب - 'آب'
- أيلول - 'أيلول'
- تشرين الأول - 'تشرين الأول'
- تشرين الثاني - 'تشرين الثاني'
- كانون الأول - 'كانون الأول'
DAYS_OF_THE_WEEK: DAYS_OF_THE_WEEK:
- الاثنين - 'الاثنين'
- الثلاثاء - 'الثلاثاء'
- الأربعاء - 'الأربعاء'
- الخميس - 'الخميس'
- الجمعة - 'الجمعة'
- السبت - 'السبت'
- الأحد - 'الأحد'

View File

@@ -1,6 +1,5 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Error: Invalid Frontmatter\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
NICETIME: NICETIME:
NO_DATE_PROVIDED: Не е въведена дата NO_DATE_PROVIDED: Не е въведена дата
BAD_DATE: Невалидна дата BAD_DATE: Невалидна дата

View File

@@ -1,24 +1,11 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: | FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# S'ha produït un error: Frontmatter invàlid\n\nRuta: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
---
title: %1$s
---
# S'ha produït un error: Frontmatter invàlid
Ruta: `%2$s`
**%3$s**
```
%4$s
```
NICETIME: NICETIME:
NO_DATE_PROVIDED: "No s'ha proporcionat data" NO_DATE_PROVIDED: No s'ha proporcionat data
BAD_DATE: Data invàlida BAD_DATE: Data invàlida
AGO: abans AGO: abans
FROM_NOW: "des d'ara" FROM_NOW: des d'ara
SECOND: segon SECOND: segon
MINUTE: minut MINUTE: minut
HOUR: hora HOUR: hora
@@ -28,7 +15,6 @@ GRAV:
YEAR: any YEAR: any
DECADE: dècada DECADE: dècada
SEC: s SEC: s
MIN: min
HR: h HR: h
WK: setm. WK: setm.
MO: m. MO: m.
@@ -50,27 +36,27 @@ GRAV:
YR_PLURAL: anys YR_PLURAL: anys
DEC_PLURAL: dèc. DEC_PLURAL: dèc.
FORM: FORM:
VALIDATION_FAIL: '<b>Ha fallat la validació:</b>' VALIDATION_FAIL: <b>Ha fallat la validació:</b>
INVALID_INPUT: Entrada no vàlida a INVALID_INPUT: Entrada no vàlida a
MISSING_REQUIRED_FIELD: 'Falta camp obligatori:' MISSING_REQUIRED_FIELD: 'Falta camp obligatori:'
MONTHS_OF_THE_YEAR: MONTHS_OF_THE_YEAR:
- Gener - 'Gener'
- Febrer - 'Febrer'
- Març - 'Març'
- Abril - 'Abril'
- Maig - 'Maig'
- Juny - 'Juny'
- Juliol - 'Juliol'
- Agost - 'Agost'
- Setembre - 'Setembre'
- Octubre - 'Octubre'
- Novembre - 'Novembre'
- Desembre - 'Desembre'
DAYS_OF_THE_WEEK: DAYS_OF_THE_WEEK:
- Dilluns - 'Dilluns'
- Dimarts - 'Dimarts'
- Dimecres - 'Dimecres'
- Dijous - 'Dijous'
- Divendres - 'Divendres'
- Dissabte - 'Dissabte'
- Diumenge - 'Diumenge'

View File

@@ -1,6 +1,49 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Chyba: Chybný frontmatter\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```" FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Chyba: Chybný frontmatter\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE: INFLECTOR_UNCOUNTABLE:
- 'vybavení' - 'vybavení'
- 'informace' - 'informace'
@@ -26,6 +69,7 @@ GRAV:
BAD_DATE: Chybné datum BAD_DATE: Chybné datum
AGO: zpět AGO: zpět
FROM_NOW: od teď FROM_NOW: od teď
JUST_NOW: právě teď
SECOND: sekunda SECOND: sekunda
MINUTE: minuta MINUTE: minuta
HOUR: hodina HOUR: hodina
@@ -81,3 +125,20 @@ GRAV:
- 'pátek' - 'pátek'
- 'sobota' - 'sobota'
- 'neděle' - 'neděle'
CRON:
EVERY: každý
EVERY_HOUR: každou hodinu
EVERY_MINUTE: každou minutu
EVERY_DAY_OF_WEEK: každý den v týdnu
EVERY_DAY_OF_MONTH: každý den v měsíci
EVERY_MONTH: každý měsíc
TEXT_PERIOD: Every <b />
TEXT_MINS: ' at <b /> minute(s) past the hour'
TEXT_TIME: ' at <b />:<b />'
TEXT_DOW: ' on <b />'
TEXT_MONTH: ' of <b />'
TEXT_DOM: ' on <b />'
ERROR1: Tag %s není podporován!
ERROR2: Chybný počet prvků
ERROR3: jquery_element musí být nastaven v nastaveních pro jqCron
ERROR4: Nerozpoznaný výraz

View File

@@ -15,7 +15,6 @@ GRAV:
YEAR: år YEAR: år
DECADE: årti DECADE: årti
SEC: sek SEC: sek
MIN: min
HR: t HR: t
WK: u WK: u
MO: md MO: md
@@ -41,23 +40,23 @@ GRAV:
INVALID_INPUT: Ugyldigt input i INVALID_INPUT: Ugyldigt input i
MISSING_REQUIRED_FIELD: 'Mangler obligatorisk felt:' MISSING_REQUIRED_FIELD: 'Mangler obligatorisk felt:'
MONTHS_OF_THE_YEAR: MONTHS_OF_THE_YEAR:
- 'Januar' - 'januar'
- 'Februar' - 'februar'
- 'Marts' - 'mars'
- 'April' - 'april'
- 'Maj' - 'mai'
- 'Juni' - 'juni'
- 'Juli' - 'juli'
- 'August' - 'august'
- 'September' - 'september'
- 'Oktober' - 'oktober'
- 'November' - 'november'
- 'December' - 'desember'
DAYS_OF_THE_WEEK: DAYS_OF_THE_WEEK:
- 'mandag' - 'mandag'
- 'Tirsdag' - 'tirsdag'
- 'Onsdag' - 'onsdag'
- 'Torsdag' - 'torsdag'
- 'Fredag' - 'fredag'
- 'Lørdag' - 'lørdag'
- 'Søndag' - 'søndag'

View File

@@ -1,15 +1,58 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n# Fehler: Frontmatter enthält Fehler\n\nPfad: `%2$s`\n\n**%3$s ** \n\n```\n%4$s\n```" FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n# Fehler: Frontmatter enthält Fehler\n\nPfad: `%2$s`\n\n**%3$s ** \n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ice'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1ies'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2ves'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE: INFLECTOR_UNCOUNTABLE:
- 'equipment' - 'Ausstattung'
- 'Informationen' - 'Informationen'
- 'Reis' - 'Reis'
- 'Geld' - 'Geld'
- 'species' - 'Arten'
- 'series' - 'Serie'
- 'fish' - 'Fisch'
- 'sheep' - 'Schaf'
INFLECTOR_IRREGULAR: INFLECTOR_IRREGULAR:
'person': 'Personen' 'person': 'Personen'
'man': 'Menschen' 'man': 'Menschen'
@@ -26,6 +69,7 @@ GRAV:
BAD_DATE: Falsches Datum BAD_DATE: Falsches Datum
AGO: her AGO: her
FROM_NOW: ab jetzt FROM_NOW: ab jetzt
JUST_NOW: jetzt gerade
SECOND: Sekunde SECOND: Sekunde
MINUTE: Minute MINUTE: Minute
HOUR: Stunde HOUR: Stunde
@@ -81,3 +125,20 @@ GRAV:
- 'Freitag' - 'Freitag'
- 'Samstag' - 'Samstag'
- 'Sonntag' - 'Sonntag'
CRON:
EVERY: jede
EVERY_HOUR: jede Stunde
EVERY_MINUTE: Jede Minute
EVERY_DAY_OF_WEEK: jeden Tag der Woche
EVERY_DAY_OF_MONTH: jeden Tag des Monats
EVERY_MONTH: jeden Monat
TEXT_PERIOD: Alle <b />
TEXT_MINS: ' bei <b /> Minuten nach der vollen Stunde (n)'
TEXT_TIME: ' bei <b />:<b />'
TEXT_DOW: ' auf <b />'
TEXT_MONTH: ' von <b />'
TEXT_DOM: ' auf <b />'
ERROR1: Der Tag %s wird nicht unterstützt!
ERROR2: Ungültige Anzahl von Elementen
ERROR3: jquery_element sollte in den jqCron Einstellungen gesetzt werden
ERROR4: Unbekannter Ausdruck

View File

@@ -99,6 +99,8 @@ GRAV:
MISSING_REQUIRED_FIELD: Missing required field: MISSING_REQUIRED_FIELD: Missing required field:
MONTHS_OF_THE_YEAR: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] MONTHS_OF_THE_YEAR: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
DAYS_OF_THE_WEEK: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] DAYS_OF_THE_WEEK: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
YES: "Yes"
NO: "No"
CRON: CRON:
EVERY: every EVERY: every
EVERY_HOUR: every hour EVERY_HOUR: every hour

View File

@@ -23,6 +23,7 @@ GRAV:
BAD_DATE: Fecha errónea BAD_DATE: Fecha errónea
AGO: antes AGO: antes
FROM_NOW: desde ahora FROM_NOW: desde ahora
JUST_NOW: hace un momento
SECOND: segundo SECOND: segundo
MINUTE: minuto MINUTE: minuto
HOUR: hora HOUR: hora
@@ -32,12 +33,10 @@ GRAV:
YEAR: año YEAR: año
DECADE: década DECADE: década
SEC: seg SEC: seg
MIN: min
HR: h HR: h
WK: sem WK: sem
MO: mes MO: mes
YR: año YR: año
DEC: dec
SECOND_PLURAL: segundos SECOND_PLURAL: segundos
MINUTE_PLURAL: minutos MINUTE_PLURAL: minutos
HOUR_PLURAL: horas HOUR_PLURAL: horas
@@ -47,7 +46,6 @@ GRAV:
YEAR_PLURAL: años YEAR_PLURAL: años
DECADE_PLURAL: décadas DECADE_PLURAL: décadas
SEC_PLURAL: segs SEC_PLURAL: segs
MIN_PLURAL: mins
HR_PLURAL: hs HR_PLURAL: hs
WK_PLURAL: sem WK_PLURAL: sem
MO_PLURAL: mes MO_PLURAL: mes
@@ -78,3 +76,20 @@ GRAV:
- 'Viernes' - 'Viernes'
- 'Sábado' - 'Sábado'
- 'Domingo' - 'Domingo'
CRON:
EVERY: cada
EVERY_HOUR: cada hora
EVERY_MINUTE: cada minuto
EVERY_DAY_OF_WEEK: cada día de la semana
EVERY_DAY_OF_MONTH: cada día del mes
EVERY_MONTH: cada mes
TEXT_PERIOD: Cada <b />
TEXT_MINS: ' a <b /> minuto(s) despues de la hora'
TEXT_TIME: ' a <b />:<b />'
TEXT_DOW: ' en <b />'
TEXT_MONTH: ' de<b />'
TEXT_DOM: ' en<b />'
ERROR1: La etiqueta %s no está soportada!
ERROR2: El número de elementos es erroneo
ERROR3: El jquery_element debería establecerse en la configuración del jqCron
ERROR4: Expresión no reconocida

View File

@@ -1,11 +1,30 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: "---\npealkiri: %1$s\n---\n\n# Viga: vigane Frontmatter'i\n\nasukoht: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```" FRONTMATTER_ERROR_PAGE: "---\npealkiri: %1$s\n---\n\n# Viga: vigane Frontmatter'i\n\nasukoht: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_UNCOUNTABLE:
- 'equipment'
- 'informatsioon'
- 'rice'
- 'money'
- 'species'
- 'series'
- 'kala'
- 'lammas'
INFLECTOR_IRREGULAR:
'person': 'inimesed'
'man': 'mees'
'child': 'lapsed'
INFLECTOR_ORDINALS:
'default': '.'
'first': '.'
'second': '.'
'third': '.'
NICETIME: NICETIME:
NO_DATE_PROVIDED: Kuupäev määramata NO_DATE_PROVIDED: Kuupäev määramata
BAD_DATE: Vigane kuupäev BAD_DATE: Vigane kuupäev
AGO: tagasi AGO: tagasi
FROM_NOW: praegusest FROM_NOW: praegusest
JUST_NOW: just nüüd
SECOND: sekund SECOND: sekund
MINUTE: minut MINUTE: minut
HOUR: tundi HOUR: tundi
@@ -15,7 +34,6 @@ GRAV:
YEAR: aasta YEAR: aasta
DECADE: 10 aastat DECADE: 10 aastat
SEC: sek SEC: sek
MIN: min
HR: t HR: t
WK: näd WK: näd
MO: k. MO: k.
@@ -61,3 +79,7 @@ GRAV:
- 'reede' - 'reede'
- 'laupäev' - 'laupäev'
- 'pühapäev' - 'pühapäev'
CRON:
EVERY: iga
EVERY_MONTH: iga kuu
TEXT_PERIOD: Iga <b />

View File

@@ -15,7 +15,6 @@ GRAV:
YEAR: urtea YEAR: urtea
DECADE: hamarkada DECADE: hamarkada
SEC: seg SEC: seg
MIN: min
HR: h HR: h
WK: ast WK: ast
MO: hil MO: hil

View File

@@ -33,7 +33,6 @@ GRAV:
MIN_PLURAL: دقیقه MIN_PLURAL: دقیقه
HR_PLURAL: ساعت HR_PLURAL: ساعت
WK_PLURAL: هفته WK_PLURAL: هفته
MO_PLURAL: mos
YR_PLURAL: سال YR_PLURAL: سال
DEC_PLURAL: دهه DEC_PLURAL: دهه
FORM: FORM:

View File

@@ -1,11 +1,74 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: "---\notsikko: %1$s\n---\n\n# Virhe: Virheellinen Frontmatter\n\nPolku: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```" FRONTMATTER_ERROR_PAGE: "---\notsikko: %1$s\n---\n\n# Virhe: Virheellinen Frontmatter\n\nPolku: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE:
- 'equipment'
- 'information'
- 'riisi'
- 'raha'
- 'lajit'
- 'series'
- 'kala'
- 'lammas'
INFLECTOR_IRREGULAR:
'person': 'ihmiset'
'man': 'miehet'
'child': 'lapset'
'sex': 'sukupuoli'
INFLECTOR_ORDINALS:
'default': '.'
'first': '.'
'second': '.'
'third': '.'
NICETIME: NICETIME:
NO_DATE_PROVIDED: Päivämäärää ei annettu NO_DATE_PROVIDED: Päivämäärää ei annettu
BAD_DATE: Virheellinen päivämäärä BAD_DATE: Virheellinen päivämäärä
AGO: sitten AGO: sitten
FROM_NOW: tästä lähtien FROM_NOW: tästä lähtien
JUST_NOW: juuri nyt
SECOND: sekuntti SECOND: sekuntti
MINUTE: minuutti MINUTE: minuutti
HOUR: tunti HOUR: tunti
@@ -61,3 +124,11 @@ GRAV:
- 'Perjantai' - 'Perjantai'
- 'Lauantai' - 'Lauantai'
- 'Sunnuntai' - 'Sunnuntai'
CRON:
EVERY: joka
EVERY_HOUR: joka tunti
EVERY_MINUTE: joka minuutti
EVERY_DAY_OF_WEEK: viikon jokaisena päivänä
EVERY_DAY_OF_MONTH: kuukauden jokaisena päivänä
EVERY_MONTH: joka kuukausi
TEXT_PERIOD: Joka <b />

View File

@@ -1,87 +1,54 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: | FRONTMATTER_ERROR_PAGE: "---\ntitre: %1$s\n---\n\n# Erreur : Frontmatter invalide\n\nChemin: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
---
title: %1$s
---
# Erreur : Frontmatter invalide
Path: `%2$s`
**%3$s**
```
%4$s
```
INFLECTOR_PLURALS: INFLECTOR_PLURALS:
/(quiz)$/i: '\1zes' '/(quiz)$/i': '\1zes'
/^(ox)$/i: '\1en' '/^(ox)$/i': '\1en'
"/([m|l])ouse$/i": '\1ice' '/([m|l])ouse$/i': '\1ice'
/(matr|vert|ind)ix|ex$/i: '\1ices' '/(matr|vert|ind)ix|ex$/i': '\1ices'
/(x|ch|ss|sh)$/i: '\1es' '/(x|ch|ss|sh)$/i': '\1es'
"/([^aeiouy]|qu)ies$/i": '\1y' '/([^aeiouy]|qu)ies$/i': '\1y'
"/([^aeiouy]|qu)y$/i": '\1ies' '/([^aeiouy]|qu)y$/i': '\1ies'
/(hive)$/i: '\1s' '/(hive)$/i': '\1s'
"/(?:([^f])fe|([lr])f)$/i": '\1\2ves' '/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
/sis$/i: ses '/sis$/i': 'ses'
"/([ti])um$/i": '\1a' '/([ti])um$/i': '\1a'
/(buffal|tomat)o$/i: '\1oes' '/(buffal|tomat)o$/i': '\1es'
/(bu)s$/i: '\1ses' '/(bu)s$/i': 'Bus'
/(alias|status)/i: '\1es' '/(alias|status)/i': 'alias|status'
/(octop|vir)us$/i: '\1i' '/(ax|test)is$/i': '\1s'
/(ax|test)is$/i: '\1es' '/s$/i': 's'
/s$/i: s '/$/': 's'
/$/: s
INFLECTOR_SINGULAR: INFLECTOR_SINGULAR:
/(quiz)zes$/i: '\1' '/(quiz)zes$/i': '\1'
/(matr)ices$/i: '\1ix' '/(alias|status)es$/i': '\1'
/(vert|ind)ices$/i: '\1ex' '/([octop|vir])i$/i': '\1us'
/^(ox)en/i: '\1'
/(alias|status)es$/i: '\1'
"/([octop|vir])i$/i": '\1us'
/(cris|ax|test)es$/i: '\1is'
/(shoe)s$/i: '\1'
/(o)es$/i: '\1'
/(bus)es$/i: '\1'
"/([m|l])ice$/i": '\1ouse'
/(x|ch|ss|sh)es$/i: '\1'
/(m)ovies$/i: '\1ovie'
/(s)eries$/i: '\1eries'
"/([^aeiouy]|qu)ies$/i": '\1y'
"/([lr])ves$/i": '\1f'
/(tive)s$/i: '\1'
/(hive)s$/i: '\1'
"/([^f])ves$/i": '\1fe'
/(^analy)ses$/i: '\1sis'
/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i: '\1\2sis'
"/([ti])a$/i": '\1um'
/(n)ews$/i: '\1ews'
INFLECTOR_UNCOUNTABLE: INFLECTOR_UNCOUNTABLE:
- équipement - 'équipement'
- informations - 'information'
- riz - 'riz'
- argent - 'argent'
- espèces - 'espèces'
- séries - 'séries'
- poisson - 'poisson'
- mouton - 'mouton'
INFLECTOR_IRREGULAR: INFLECTOR_IRREGULAR:
person: personnes 'person': 'personnes'
man: hommes 'man': 'hommes'
child: enfants 'child': 'enfants'
sex: sexes 'sex': 'sexes'
move: déplacements 'move': 'déplacements'
INFLECTOR_ORDINALS: INFLECTOR_ORDINALS:
default: ème 'default': 'ème'
first: er 'first': 'er'
second: ème 'second': 'ème'
third: ème 'third': 'ème'
NICETIME: NICETIME:
NO_DATE_PROVIDED: Aucune date fournie NO_DATE_PROVIDED: Aucune date fournie
BAD_DATE: Date erronée BAD_DATE: Date erronée
AGO: plus tôt AGO: plus tôt
FROM_NOW: à partir de maintenant FROM_NOW: à partir de maintenant
JUST_NOW: à l'instant
SECOND: seconde SECOND: seconde
MINUTE: minute MINUTE: minute
HOUR: heure HOUR: heure
@@ -113,27 +80,44 @@ GRAV:
YR_PLURAL: a YR_PLURAL: a
DEC_PLURAL: décs DEC_PLURAL: décs
FORM: FORM:
VALIDATION_FAIL: '<b>La validation a échoué :</b>' VALIDATION_FAIL: <b>La validation a échoué :</b>
INVALID_INPUT: Saisie non valide INVALID_INPUT: Saisie non valide
MISSING_REQUIRED_FIELD: 'Champ obligatoire manquant :' MISSING_REQUIRED_FIELD: 'Champ obligatoire manquant :'
MONTHS_OF_THE_YEAR: MONTHS_OF_THE_YEAR:
- Janvier - 'Janvier'
- Février - 'Février'
- Mars - 'Mars'
- Avril - 'Avril'
- Mai - 'Mai'
- Juin - 'Juin'
- Juillet - 'Juillet'
- Août - 'Août'
- Septembre - 'Septembre'
- Octobre - 'Octobre'
- Novembre - 'Novembre'
- Décembre - 'Décembre'
DAYS_OF_THE_WEEK: DAYS_OF_THE_WEEK:
- Lundi - 'Lundi'
- Mardi - 'Mardi'
- Mercredi - 'Mercredi'
- Jeudi - 'Jeudi'
- Vendredi - 'Vendredi'
- Samedi - 'Samedi'
- Dimanche - 'Dimanche'
CRON:
EVERY: chaque
EVERY_HOUR: toutes les heures
EVERY_MINUTE: chaque minute
EVERY_DAY_OF_WEEK: tous les jours de la semaine
EVERY_DAY_OF_MONTH: tous les jours du mois
EVERY_MONTH: chaque mois
TEXT_PERIOD: Chaque<b/>
TEXT_MINS: ' à <b /> minute(s) après l''heure'
TEXT_TIME: ' à<b/>:<b/>'
TEXT_DOW: ' sur <b/>'
TEXT_MONTH: ' de <b />'
TEXT_DOM: ' sur <b/>'
ERROR1: La balise %s n'est pas supportée!
ERROR2: Nombre invalide d'éléments
ERROR3: L'élément jquery_element doit être défini dans les paramètres jqCron
ERROR4: Expression non reconnue

View File

@@ -1,20 +1,20 @@
--- ---
GRAV: GRAV:
INFLECTOR_UNCOUNTABLE: INFLECTOR_UNCOUNTABLE:
- oprema - 'oprema'
- informacije - 'informacije'
- riža - 'riža'
- novac - 'novac'
- vrsta - 'vrsta'
- serija - 'serija'
- riba - 'riba'
- ovca - 'ovca'
INFLECTOR_IRREGULAR: INFLECTOR_IRREGULAR:
person: osobe 'person': 'osobe'
man: ljudi 'man': 'ljudi'
child: djeca 'child': 'djeca'
sex: spolovi 'sex': 'spolovi'
move: Pomakni 'move': 'Pomakni'
NICETIME: NICETIME:
NO_DATE_PROVIDED: Datum nije upisan NO_DATE_PROVIDED: Datum nije upisan
BAD_DATE: Pogrešan datum BAD_DATE: Pogrešan datum
@@ -50,27 +50,27 @@ GRAV:
YR_PLURAL: g YR_PLURAL: g
DEC_PLURAL: des DEC_PLURAL: des
FORM: FORM:
VALIDATION_FAIL: '<b>Validacija nije uspjela:</b>' VALIDATION_FAIL: <b>Validacija nije uspjela:</b>
INVALID_INPUT: Pogrešan unos u INVALID_INPUT: Pogrešan unos u
MISSING_REQUIRED_FIELD: 'Nedostaje obavezno polje:' MISSING_REQUIRED_FIELD: 'Nedostaje obavezno polje:'
MONTHS_OF_THE_YEAR: MONTHS_OF_THE_YEAR:
- Siječanj - 'Siječanj'
- Veljača - 'Veljača'
- Ožujak - 'Ožujak'
- Travanj - 'Travanj'
- Svibanj - 'Svibanj'
- Lipanj - 'Lipanj'
- Srpanj - 'Srpanj'
- Kolovoz - 'Kolovoz'
- Rujan - 'Rujan'
- Listopad - 'Listopad'
- Studeni - 'Studeni'
- Prosinac - 'Prosinac'
DAYS_OF_THE_WEEK: DAYS_OF_THE_WEEK:
- Ponedjeljak - 'Ponedjeljak'
- Utorak - 'Utorak'
- Srijeda - 'Srijeda'
- Četvrtak - 'Četvrtak'
- Petak - 'Petak'
- Subota - 'Subota'
- Nedjelja - 'Nedjelja'

View File

@@ -1,49 +1,6 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: "---\ncím: %1$s\n---\n\n# Hiba: Érvénytelen Frontmatter\n\nElérési út: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```" FRONTMATTER_ERROR_PAGE: "---\ncím: %1$s\n---\n\n# Hiba: Érvénytelen Frontmatter\n\nElérési út: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE: INFLECTOR_UNCOUNTABLE:
- 'felszerelés' - 'felszerelés'
- 'információ' - 'információ'
@@ -69,6 +26,7 @@ GRAV:
BAD_DATE: Hibás dátum BAD_DATE: Hibás dátum
AGO: elteltével AGO: elteltével
FROM_NOW: mostantól FROM_NOW: mostantól
JUST_NOW: épp most
SECOND: másodperc SECOND: másodperc
MINUTE: perc MINUTE: perc
HOUR: óra HOUR: óra
@@ -124,3 +82,16 @@ GRAV:
- 'péntek' - 'péntek'
- 'szombat' - 'szombat'
- 'vasárnap' - 'vasárnap'
CRON:
EVERY: minden
EVERY_HOUR: óránként
EVERY_MINUTE: percenként
EVERY_DAY_OF_WEEK: a hét minden napján
EVERY_DAY_OF_MONTH: a hónap minden napján
EVERY_MONTH: minden hónapban
TEXT_PERIOD: Minden <b />
TEXT_MINS: '<b /> perccel az óra elteltével'
ERROR1: A %s címke nem engedélyezett!
ERROR2: Hibás elemszám
ERROR3: A jquery_element-et a jqCron beállítsokban kell meghatározni
ERROR4: Ismeretlen kifejezés

View File

@@ -1,11 +1,27 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: "---\njudul: %1$s\n---\n\n# Error: Frontmatter Tidak Valid\n\nLokasi Path: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```" FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Error: Frontmatter tidak valid\n\nLokasi: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_UNCOUNTABLE:
- 'peralatan'
- 'informasi'
- 'nasi'
- 'uang'
- 'spesies'
- 'rangkaian'
- 'ikan'
- 'domba'
INFLECTOR_IRREGULAR:
'person': 'orang-orang'
'man': 'laki-laki'
'child': 'anak-anak'
'sex': 'jenis kelamin'
'move': 'pindahkan'
NICETIME: NICETIME:
NO_DATE_PROVIDED: Tanggal tidak ada NO_DATE_PROVIDED: Tanggal tidak tersedia
BAD_DATE: Format tanggal salah BAD_DATE: Format tanggal salah
AGO: yang lalu AGO: yang lalu
FROM_NOW: sejak sekarang FROM_NOW: dari saat ini
JUST_NOW: baru saja
SECOND: detik SECOND: detik
MINUTE: menit MINUTE: menit
HOUR: jam HOUR: jam
@@ -17,7 +33,7 @@ GRAV:
SEC: dtk SEC: dtk
MIN: mnt MIN: mnt
HR: j HR: j
WK: mgg WK: mng
MO: bln MO: bln
YR: thn YR: thn
DEC: desimal DEC: desimal
@@ -61,3 +77,19 @@ GRAV:
- 'Jumat' - 'Jumat'
- 'Sabtu' - 'Sabtu'
- 'Minggu' - 'Minggu'
CRON:
EVERY: Setiap
EVERY_HOUR: Setiap jam
EVERY_MINUTE: Setiap menit
EVERY_DAY_OF_WEEK: Setiap hari selama seminggu
EVERY_DAY_OF_MONTH: pada tanggal setiap bulannya
EVERY_MONTH: setiap bulan
TEXT_PERIOD: Setiap <b />
TEXT_TIME: ' pada <b />:<b />'
TEXT_DOW: ' pada <b />'
TEXT_MONTH: ' pada <b />'
TEXT_DOM: ' pada <b />'
ERROR1: Tag %s tidak didukung!
ERROR2: Jumlah elemen tidak valid
ERROR3: jquery_element harus ditetapkan ke pengaturan jqCron
ERROR4: Ekspresi tidak dikenali

80
system/languages/is.yaml Normal file
View File

@@ -0,0 +1,80 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitill: %1$s\n---\n\n# Villa: Ógilt efni á forsíðu\n\nSlóð: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_UNCOUNTABLE:
- 'equipment'
- 'upplýsingar'
- 'rice'
- 'money'
- 'species'
- 'series'
- 'fish'
- 'sheep'
NICETIME:
NO_DATE_PROVIDED: Engin dagsetning gefin
BAD_DATE: Röng dagsetning
AGO: síðan
JUST_NOW: í þessu
SECOND: sekúndu
MINUTE: mínútu
HOUR: klukkustund
DAY: degi
WEEK: viku
MONTH: mánuði
YEAR: ári
DECADE: áratug
SEC: sek
MIN: mín
HR: klst
WK: vk
MO: mán
YR: ár
DEC: árat
SECOND_PLURAL: sekúndum
MINUTE_PLURAL: mínútum
HOUR_PLURAL: klukkustundum
DAY_PLURAL: dögum
WEEK_PLURAL: vikum
MONTH_PLURAL: mánuðum
YEAR_PLURAL: árum
DECADE_PLURAL: áratugum
SEC_PLURAL: sek
MIN_PLURAL: mín
HR_PLURAL: klst
WK_PLURAL: vik
MO_PLURAL: mán
YR_PLURAL: árum
DEC_PLURAL: árat
FORM:
VALIDATION_FAIL: <b>Sannvottun mistókst:</b>
INVALID_INPUT: Ógilt inntak í
MISSING_REQUIRED_FIELD: 'Vantar nauðsynlegan reit:'
MONTHS_OF_THE_YEAR:
- 'janúar'
- 'Febrúar'
- 'Mars'
- 'Apríl'
- 'Maí'
- 'Júní'
- 'Júlí'
- 'Ágúst'
- 'September'
- 'Október'
- 'Nóvember'
- 'Desember'
DAYS_OF_THE_WEEK:
- 'Mánudagur'
- 'Þriðjudagur'
- 'Miðvikudagur'
- 'Fimmtudagur'
- 'Föstudagur'
- 'Laugardagur'
- 'Sunnudagur'
CRON:
TEXT_TIME: ' á <b />:<b />'
TEXT_DOW: ' á <b />'
TEXT_MONTH: ' af <b />'
TEXT_DOM: ' á <b />'
ERROR1: Merkið %s er ekki stutt!
ERROR3: Það ætti að setja jquery_element inn í stillingar jqCron
ERROR4: Óþekkt segð

View File

@@ -1,11 +1,32 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: "---Titolo: %1$s---# Errore: Frontmatter non valido: '%2$s' * *%3$s * * ' '%4$s ' '" FRONTMATTER_ERROR_PAGE: "---Titolo: %1$s---# Errore: Frontmatter non valido: '%2$s' * *%3$s * * ' '%4$s ' '"
INFLECTOR_UNCOUNTABLE:
- 'dotazione'
- 'informazione'
- 'riso'
- 'denaro'
- 'specie'
- 'serie'
- 'pesce'
- 'pecora'
INFLECTOR_IRREGULAR:
'person': 'persone'
'man': 'uomini'
'child': 'bambino'
'sex': 'sessi'
'move': 'sposta'
INFLECTOR_ORDINALS:
'default': '°'
'first': '°'
'second': 'o'
'third': 'o'
NICETIME: NICETIME:
NO_DATE_PROVIDED: Nessuna data fornita NO_DATE_PROVIDED: Nessuna data fornita
BAD_DATE: Data non valida BAD_DATE: Data non valida
AGO: fa AGO: fa
FROM_NOW: da adesso FROM_NOW: da adesso
JUST_NOW: ora
SECOND: secondo SECOND: secondo
MINUTE: minuto MINUTE: minuto
HOUR: ora HOUR: ora
@@ -37,27 +58,44 @@ GRAV:
YR_PLURAL: anni YR_PLURAL: anni
DEC_PLURAL: decenni DEC_PLURAL: decenni
FORM: FORM:
VALIDATION_FAIL: '<b>Validazione fallita:</b>' VALIDATION_FAIL: <b>Validazione fallita:</b>
INVALID_INPUT: Input non valido in INVALID_INPUT: Input non valido in
MISSING_REQUIRED_FIELD: 'Campo richiesto mancante:' MISSING_REQUIRED_FIELD: 'Campo richiesto mancante:'
MONTHS_OF_THE_YEAR: MONTHS_OF_THE_YEAR:
- Gennaio - 'Gennaio'
- Febbraio - 'Febbraio'
- Marzo - 'Marzo'
- Aprile - 'Aprile'
- Maggio - 'Maggio'
- Giugno - 'Giugno'
- Luglio - 'Luglio'
- Agosto - 'Agosto'
- Settembre - 'Settembre'
- Ottobre - 'Ottobre'
- Novembre - 'Novembre'
- Dicembre - 'Dicembre'
DAYS_OF_THE_WEEK: DAYS_OF_THE_WEEK:
- Lunedì - 'Lunedì'
- Martedì - 'Martedì'
- Mercoledì - 'Mercoledì'
- Giovedì - 'Giovedì'
- Venerdì - 'Venerdì'
- Sabato - 'Sabato'
- Domenica - 'Domenica'
CRON:
EVERY: ogni
EVERY_HOUR: ogni ora
EVERY_MINUTE: ogni minuto
EVERY_DAY_OF_WEEK: ogni giorno della settimana
EVERY_DAY_OF_MONTH: ogni giorno del mese
EVERY_MONTH: ogni mese
TEXT_PERIOD: Ogni <b />
TEXT_MINS: ' a <b /> minuto(i) dall''inizio dell''ora'
TEXT_TIME: ' alle <b />:<b />'
TEXT_DOW: ' su <b />'
TEXT_MONTH: ' di <b />'
TEXT_DOM: ' di <b />'
ERROR1: Il tag %s non è supportato!
ERROR2: Numero di elementi non valido
ERROR3: Il jquery_element deve essere impostato nelle impostazioni di jqCron
ERROR4: Espressione non riconosciuta

View File

@@ -1,26 +1,15 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Error: Invalid Frontmatter\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS: []
INFLECTOR_SINGULAR: []
INFLECTOR_UNCOUNTABLE: []
INFLECTOR_IRREGULAR: INFLECTOR_IRREGULAR:
'person': 'みんな' 'person': 'みんな'
'man': '人' 'man': '人'
'child': '子供' 'child': '子供'
'sex': '性別' 'sex': '性別'
'move': '移動' 'move': '移動'
INFLECTOR_ORDINALS: []
NICETIME: NICETIME:
NO_DATE_PROVIDED: 日付が設定されていません NO_DATE_PROVIDED: 日付が設定されていません
BAD_DATE: 不正な日付 BAD_DATE: 不正な日付
AGO: AGO:
FROM_NOW: from now
SECOND: SECOND:
MINUTE: MINUTE:
HOUR: HOUR:
@@ -35,7 +24,6 @@ GRAV:
WK: WK:
MO: MO:
YR: YR:
DEC: dec
SECOND_PLURAL: SECOND_PLURAL:
MINUTE_PLURAL: MINUTE_PLURAL:
HOUR_PLURAL: HOUR_PLURAL:
@@ -54,6 +42,25 @@ GRAV:
FORM: FORM:
VALIDATION_FAIL: <b>バリデーション失敗 :</b> VALIDATION_FAIL: <b>バリデーション失敗 :</b>
INVALID_INPUT: 不正な入力: INVALID_INPUT: 不正な入力:
MISSING_REQUIRED_FIELD: 必須項目が入力されていません: MISSING_REQUIRED_FIELD: '必須項目が入力されていません:'
MONTHS_OF_THE_YEAR: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'] MONTHS_OF_THE_YEAR:
DAYS_OF_THE_WEEK: ['月', '火', '水', '木', '金', '土', '日'] - '1月'
- '2月'
- '3月'
- '4月'
- '5月'
- '6月'
- '7月'
- '8月'
- '9月'
- '10月'
- '11月'
- '12月'
DAYS_OF_THE_WEEK:
- '月'
- '火'
- '水'
- '木'
- '金'
- '土'
- '日'

View File

@@ -1,17 +1,75 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitel: %1$s\n---\n\n# Fout: ongeldige frontmatter\n\nPad: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```" FRONTMATTER_ERROR_PAGE: "---\ntitel: %1$s\n---\n\n# Fout: ongeldige frontmatter\n\nPad: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE:
- 'uitrusting'
- 'informatie'
- 'rijst'
- 'geld'
- 'soorten'
- 'reeks'
- 'vis'
- 'schaap'
INFLECTOR_IRREGULAR: INFLECTOR_IRREGULAR:
'person': 'personen' 'person': 'personen'
'man': 'mensen' 'man': 'mensen'
'child': 'kinderen' 'child': 'kinderen'
'sex': 'geslacht' 'sex': 'geslacht'
'move': 'verplaatsen' 'move': 'verplaatsen'
INFLECTOR_ORDINALS:
'default': 'th'
'first': 'st'
'second': 'nd'
'third': 'rd'
NICETIME: NICETIME:
NO_DATE_PROVIDED: geen datum opgegeven NO_DATE_PROVIDED: geen datum opgegeven
BAD_DATE: Datumformaat onjuist BAD_DATE: Datumformaat onjuist
AGO: geleden AGO: geleden
FROM_NOW: vanaf nu FROM_NOW: vanaf nu
JUST_NOW: zojuist
SECOND: seconde SECOND: seconde
MINUTE: minuut MINUTE: minuut
HOUR: uur HOUR: uur
@@ -23,10 +81,10 @@ GRAV:
SEC: s SEC: s
MIN: min MIN: min
HR: u HR: u
WK: wk WK: week
MO: ma MO: ma
YR: j YR: j
DEC: dec DEC: decennia
SECOND_PLURAL: seconden SECOND_PLURAL: seconden
MINUTE_PLURAL: minuten MINUTE_PLURAL: minuten
HOUR_PLURAL: uren HOUR_PLURAL: uren
@@ -47,18 +105,18 @@ GRAV:
INVALID_INPUT: Ongeldige invoer in INVALID_INPUT: Ongeldige invoer in
MISSING_REQUIRED_FIELD: 'Ontbrekend verplicht veld:' MISSING_REQUIRED_FIELD: 'Ontbrekend verplicht veld:'
MONTHS_OF_THE_YEAR: MONTHS_OF_THE_YEAR:
- 'januari' - 'Januari'
- 'februari' - 'Februari'
- 'maart' - 'Maart'
- 'april' - 'April'
- 'mei' - 'Mei'
- 'juni' - 'Juni'
- 'juli' - 'Juli'
- 'augustus' - 'Augustus'
- 'september' - 'September'
- 'oktober' - 'Oktober'
- 'november' - 'November'
- 'december' - 'December'
DAYS_OF_THE_WEEK: DAYS_OF_THE_WEEK:
- 'Maandag' - 'Maandag'
- 'Dinsdag' - 'Dinsdag'
@@ -67,3 +125,20 @@ GRAV:
- 'Vrijdag' - 'Vrijdag'
- 'Zaterdag' - 'Zaterdag'
- 'Zondag' - 'Zondag'
CRON:
EVERY: elke
EVERY_HOUR: elk uur
EVERY_MINUTE: elke minuut
EVERY_DAY_OF_WEEK: elke dag van de week
EVERY_DAY_OF_MONTH: elke dag van de maand
EVERY_MONTH: elke maand
TEXT_PERIOD: Elke <b />
TEXT_MINS: ' <b /> minuten te laat'
TEXT_TIME: ' op <b />:<b />'
TEXT_DOW: ' op <b />'
TEXT_MONTH: ' van <b />'
TEXT_DOM: ' op <b />'
ERROR1: De tag %s wordt niet ondersteund!
ERROR2: Slecht aantal elementen
ERROR3: Het jquery_element moet ingesteld worden in de jqCron instellingen
ERROR4: Onbekende expressie

View File

@@ -1,9 +1,6 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: "---\nTittel: %1$s\n---\n\n# Feilmelding: Ugyldig Frontmatter\n\nSti: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```" FRONTMATTER_ERROR_PAGE: "---\nTittel: %1$s\n---\n\n# Feilmelding: Ugyldig Frontmatter\n\nSti: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
INFLECTOR_UNCOUNTABLE: INFLECTOR_UNCOUNTABLE:
- 'utstyr' - 'utstyr'
- 'informasjon' - 'informasjon'
@@ -33,7 +30,6 @@ GRAV:
YEAR: år YEAR: år
DECADE: tiår DECADE: tiår
SEC: sek SEC: sek
MIN: min
HR: t HR: t
WK: uke WK: uke
MO: MO:

View File

@@ -15,7 +15,6 @@ GRAV:
YEAR: rok YEAR: rok
DECADE: dekada DECADE: dekada
SEC: sek SEC: sek
MIN: min
HR: godz HR: godz
WK: tydz WK: tydz
MO: m-c MO: m-c

View File

@@ -35,3 +35,12 @@ GRAV:
- 'Outubro' - 'Outubro'
- 'Novembro' - 'Novembro'
- 'Dezembro' - 'Dezembro'
INFLECTOR_UNCOUNTABLE:
- 'equipment'
- 'information'
- 'arroz'
- 'money'
- 'species'
- 'series'
- 'fish'
- 'sheep'

View File

@@ -1,50 +1,27 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: | FRONTMATTER_ERROR_PAGE: "---\nTitlu: %1$s\n---\n# Eroare: Frontmatter este invalid\n\nCalea: `%2$s`\n\n**%3$s**\n\n```\n%4$s"
---
Titlu: %1$s
---
# Eroare: Frontmatter este invalid
Calea: `%2$s`
**%3$s**
```
%4$s
INFLECTOR_PLURALS:
/(quiz)$/i: '\1zes'
/^(ox)$/i: '\1en'
"/([m|l])ouse$/i": '\1ice'
/(matr|vert|ind)ix|ex$/i: '\1ices'
/(x|ch|ss|sh)$/i: '\1es'
"/([^aeiouy]|qu)ies$/i": '\1y'
"/([^aeiouy]|qu)y$/i": '\1ies'
/(hive)$/i: '\1s'
"/(?:([^f])fe|([lr])f)$/i": '\1\2ves'
/sis$/i: ses
"/([ti])um$/i": '\1a'
/(buffal|tomat)o$/i: '\1oes'
INFLECTOR_UNCOUNTABLE: INFLECTOR_UNCOUNTABLE:
- echipament - 'echipament'
- informaţie - 'informaţie'
- orez - 'orez'
- bani - 'bani'
- specii - 'specii'
- serii - 'serii'
- peşte - 'peşte'
- oaie - 'oaie'
INFLECTOR_IRREGULAR: INFLECTOR_IRREGULAR:
person: persoane 'person': 'persoane'
man: bărbați 'man': 'bărbați'
child: copii 'child': 'copii'
sex: sexe 'sex': 'sexe'
move: mutări 'move': 'mutări'
NICETIME: NICETIME:
NO_DATE_PROVIDED: Nu există o dată prevăzută NO_DATE_PROVIDED: Nu există o dată prevăzută
BAD_DATE: Dată incorectă BAD_DATE: Dată incorectă
AGO: în urmă AGO: în urmă
FROM_NOW: de acum FROM_NOW: de acum
JUST_NOW: chiar acum
SECOND: secundă SECOND: secundă
MINUTE: minut MINUTE: minut
HOUR: oră HOUR: oră
@@ -53,8 +30,8 @@ GRAV:
MONTH: lună MONTH: lună
YEAR: an YEAR: an
DECADE: decadă DECADE: decadă
SEC: sec SEC: secunde
MIN: min MIN: minute
HR: oră HR: oră
WK: săpt WK: săpt
MO: lună MO: lună
@@ -76,27 +53,44 @@ GRAV:
YR_PLURAL: ani YR_PLURAL: ani
DEC_PLURAL: decenii DEC_PLURAL: decenii
FORM: FORM:
VALIDATION_FAIL: '<b>Validare nereușită</b>' VALIDATION_FAIL: <b>Validare nereușită</b>
INVALID_INPUT: Date incorecte în INVALID_INPUT: Date incorecte în
MISSING_REQUIRED_FIELD: 'Câmp obligatoriu lipsă:' MISSING_REQUIRED_FIELD: 'Câmp obligatoriu lipsă:'
MONTHS_OF_THE_YEAR: MONTHS_OF_THE_YEAR:
- Ianuarie - 'Ianuarie'
- Februarie - 'Februarie'
- Martie - 'Martie'
- Aprilie - 'Aprilie'
- Mai - 'Mai'
- Iunie - 'Iunie'
- Iulie - 'Iulie'
- August - 'August'
- Septembrie - 'Septembrie'
- Octombrie - 'Octombrie'
- Noiembrie - 'Noiembrie'
- Decembrie - 'Decembrie'
DAYS_OF_THE_WEEK: DAYS_OF_THE_WEEK:
- Luni - 'Luni'
- Marți - 'Marți'
- Miercuri - 'Miercuri'
- Joi - 'Joi'
- Vineri - 'Vineri'
- Sâmbătă - 'Sâmbătă'
- Duminică - 'Duminică'
CRON:
EVERY: la fiecare
EVERY_HOUR: la fiecare oră
EVERY_MINUTE: la fiecare minut
EVERY_DAY_OF_WEEK: fiecare zi a săptămânii
EVERY_DAY_OF_MONTH: fiecare zi a lunii
EVERY_MONTH: fiecare lună
TEXT_PERIOD: Fiecare <b />
TEXT_MINS: ' la <b /> minut(e) ale fiecărei ore'
TEXT_TIME: ' la <b />:<b />'
TEXT_DOW: ' pe <b />'
TEXT_MONTH: 'al(e) <b />'
TEXT_DOM: ' pe <b />'
ERROR1: Eticheta %s nu este acceptată!
ERROR2: Număr nevalid de elemente
ERROR3: jquery_element ar trebui setat în opțiunile jqCron
ERROR4: Expresie necunoscută

View File

@@ -1,17 +1,32 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Ошибка: недопустимое содержимое\n\nПуть: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```" FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Ошибка: недопустимое содержимое Frontmatter\n\nПуть: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_UNCOUNTABLE:
- 'экипировка'
- 'информация'
- 'рис'
- 'деньги'
- 'виды'
- 'серии'
- 'рыба'
- 'овца'
INFLECTOR_IRREGULAR: INFLECTOR_IRREGULAR:
'person': 'люди' 'person': 'люди'
'man': 'человек' 'man': 'человек'
'child': 'ребенок' 'child': 'ребенок'
'sex': 'пол' 'sex': 'пол'
'move': 'движется' 'move': 'движется'
INFLECTOR_ORDINALS:
'default': 'й'
'first': 'й'
'second': 'й'
'third': 'й'
NICETIME: NICETIME:
NO_DATE_PROVIDED: Дата не указана NO_DATE_PROVIDED: Дата не указана
BAD_DATE: Неверная дата BAD_DATE: Неверная дата
AGO: назад AGO: назад
FROM_NOW: теперь FROM_NOW: теперь
JUST_NOW: только что
SECOND: секунда SECOND: секунда
MINUTE: минута MINUTE: минута
HOUR: час HOUR: час
@@ -67,3 +82,20 @@ GRAV:
- 'пятница' - 'пятница'
- 'суббота' - 'суббота'
- 'воскресенье' - 'воскресенье'
CRON:
EVERY: раз в
EVERY_HOUR: раз в час
EVERY_MINUTE: раз в минуту
EVERY_DAY_OF_WEEK: каждый день недели
EVERY_DAY_OF_MONTH: каждый день недели
EVERY_MONTH: раз в месяц
TEXT_PERIOD: Каждый <b />
TEXT_MINS: ' в <b /> минуте(ах) за час'
TEXT_TIME: ' в <b />:<b />'
TEXT_DOW: ' на <b />'
TEXT_MONTH: ' из <b />'
TEXT_DOM: ' на <b />'
ERROR1: Тег %s не поддерживается!
ERROR2: Неверное количество элементов
ERROR3: jquery_element должен быть установлен в настройки jqCron
ERROR4: Выражение не распознано

View File

@@ -1,10 +1,75 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Chyba: Chybný frontmatter\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE:
- 'vybavenie'
- 'informácie'
- 'ryža'
- 'peniaze'
- 'druhy'
- 'séria'
- 'ryba'
- 'ovce'
INFLECTOR_IRREGULAR:
'person': 'ľudia'
'man': 'muži'
'child': 'deti'
'sex': 'pohlavia'
'move': 'pohyby'
INFLECTOR_ORDINALS:
'default': '.'
'first': '.'
'second': '.'
'third': '.'
NICETIME: NICETIME:
NO_DATE_PROVIDED: Neposkytnutý žiaden dátum NO_DATE_PROVIDED: Neposkytnutý žiaden dátum
BAD_DATE: Nesprávny dátum BAD_DATE: Nesprávny dátum
AGO: pred AGO: pred
FROM_NOW: odteraz FROM_NOW: odteraz
JUST_NOW: práve teraz
SECOND: sekunda SECOND: sekunda
MINUTE: minúta MINUTE: minúta
HOUR: hodina HOUR: hodina
@@ -60,3 +125,20 @@ GRAV:
- 'Piatok' - 'Piatok'
- 'Sobota' - 'Sobota'
- 'Nedeľa' - 'Nedeľa'
CRON:
EVERY: každý
EVERY_HOUR: každú hodinu
EVERY_MINUTE: každú minútu
EVERY_DAY_OF_WEEK: každý deň v týždni
EVERY_DAY_OF_MONTH: každý deň v mesiaci
EVERY_MONTH: každý mesiac
TEXT_PERIOD: Každý <b />
TEXT_MINS: ' at <b /> minute(s) past the hour'
TEXT_TIME: ' at <b />:<b />'
TEXT_DOW: ' on <b />'
TEXT_MONTH: ' of <b />'
TEXT_DOM: ' on <b />'
ERROR1: Tag %s nieje podporovaný!
ERROR2: Chybný počet položiek
ERROR3: jquery_element musí byť nastavený v nastaveniach pre jqCron
ERROR4: Neznámy výraz

View File

@@ -15,7 +15,6 @@ GRAV:
YEAR: leto YEAR: leto
DECADE: desetletje DECADE: desetletje
SEC: sek SEC: sek
MIN: min
HR: ur HR: ur
WK: T. WK: T.
MO: m MO: m

View File

@@ -1,6 +1,17 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: "--- titel: %1$s --- # Fel: Ogiltig Frontmatter-sökväg: `%2$s` **%3$s** ``` %4$s ```" FRONTMATTER_ERROR_PAGE: "--- titel: %1$s --- # Fel: Ogiltig Frontmatter-sökväg: `%2$s` **%3$s** ``` %4$s ```"
INFLECTOR_UNCOUNTABLE:
- 'utrustning'
- 'information'
- 'ris'
- 'pengar'
- 'arter'
- 'serier'
- 'fisk'
- 'får'
INFLECTOR_IRREGULAR:
'person': 'personer'
NICETIME: NICETIME:
NO_DATE_PROVIDED: Inget datum har angivits NO_DATE_PROVIDED: Inget datum har angivits
BAD_DATE: Ogiltigt datum BAD_DATE: Ogiltigt datum
@@ -15,12 +26,10 @@ GRAV:
YEAR: år YEAR: år
DECADE: årtionde DECADE: årtionde
SEC: sek SEC: sek
MIN: min
HR: t HR: t
WK: v WK: v
MO: m MO: m
YR: år YR: år
DEC: dec
SECOND_PLURAL: sekunder SECOND_PLURAL: sekunder
MINUTE_PLURAL: minuter MINUTE_PLURAL: minuter
HOUR_PLURAL: timmar HOUR_PLURAL: timmar

View File

@@ -1,19 +1,6 @@
--- ---
GRAV: GRAV:
FRONTMATTER_ERROR_PAGE: | FRONTMATTER_ERROR_PAGE: "---\nชื่อเรื่อง: %1$s\n---\n\n# ข้อผิดพลาด: Invalid Frontmatter\n\nPath: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
---
ชื่อเรื่อง: %1$s
---
# ข้อผิดพลาด: Invalid Frontmatter
Path: `%2$s`
**%3$s**
```
%4$s
```
NICETIME: NICETIME:
NO_DATE_PROVIDED: ไม่มีวันที่ให้ NO_DATE_PROVIDED: ไม่มีวันที่ให้
BAD_DATE: รูปแบบวันที่ผิด BAD_DATE: รูปแบบวันที่ผิด
@@ -30,10 +17,6 @@ GRAV:
SEC: วิ SEC: วิ
MIN: นาที MIN: นาที
HR: ชม. HR: ชม.
WK: wk
MO: mo
YR: yr
DEC: dec
SECOND_PLURAL: วินาที SECOND_PLURAL: วินาที
MINUTE_PLURAL: นาที MINUTE_PLURAL: นาที
HOUR_PLURAL: ชั่วโมง HOUR_PLURAL: ชั่วโมง
@@ -45,32 +28,29 @@ GRAV:
SEC_PLURAL: วินาที SEC_PLURAL: วินาที
MIN_PLURAL: นาที MIN_PLURAL: นาที
HR_PLURAL: ชั่วโมง HR_PLURAL: ชั่วโมง
WK_PLURAL: wks
MO_PLURAL: mos
YR_PLURAL: ปี YR_PLURAL: ปี
DEC_PLURAL: decs
FORM: FORM:
VALIDATION_FAIL: '<b>ตรวจสอบล้มเหลว: </b>' VALIDATION_FAIL: '<b>ตรวจสอบล้มเหลว: </b>'
INVALID_INPUT: ป้อนข้อมูลไม่ถูกต้องใน INVALID_INPUT: ป้อนข้อมูลไม่ถูกต้องใน
MISSING_REQUIRED_FIELD: 'ขาดข้อมูลที่จำเป็น:' MISSING_REQUIRED_FIELD: 'ขาดข้อมูลที่จำเป็น:'
MONTHS_OF_THE_YEAR: MONTHS_OF_THE_YEAR:
- มกราคม - 'มกราคม'
- กุมภาพันธ์ - 'กุมภาพันธ์'
- มีนาคม - 'มีนาคม'
- เมษายน - 'เมษายน'
- พฤษภาคม - 'พฤษภาคม'
- มิถุนายน - 'มิถุนายน'
- กรกฏาคม - 'กรกฏาคม'
- สิงหาคม - 'สิงหาคม'
- กันยายน - 'กันยายน'
- ตุลาคม - 'ตุลาคม'
- พฤศจิกายน - 'พฤศจิกายน'
- ธันวาคม - 'ธันวาคม'
DAYS_OF_THE_WEEK: DAYS_OF_THE_WEEK:
- จันทร์ - 'จันทร์'
- อังคาร - 'อังคาร'
- พุธ - 'พุธ'
- พฤหัสบดี - 'พฤหัสบดี'
- ศุกร์ - 'ศุกร์'
- เสาร์ - 'เสาร์'
- อาทิตย์ - 'อาทิตย์'

View File

@@ -0,0 +1,62 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# 錯誤: 不正確的 Frontmatter\n\n路徑 `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
NICETIME:
NO_DATE_PROVIDED: 沒有提供日期
BAD_DATE: 錯誤日期
AGO: 之前
FROM_NOW: 之後
JUST_NOW: 剛剛
SECOND:
MINUTE:
HOUR: 小時
DAY:
WEEK:
MONTH:
YEAR:
DECADE: 十年
SEC:
MIN:
HR: 小時
WK:
MO:
YR:
DEC: 十年
SECOND_PLURAL:
MINUTE_PLURAL:
HOUR_PLURAL: 小時
DAY_PLURAL:
WEEK_PLURAL:
MONTH_PLURAL:
YEAR_PLURAL:
DECADE_PLURAL: 十年
SEC_PLURAL:
MIN_PLURAL:
HR_PLURAL:
WK_PLURAL:
MO_PLURAL:
YR_PLURAL:
DEC_PLURAL: 十年
FORM:
MISSING_REQUIRED_FIELD: 遺漏必填欄位:
MONTHS_OF_THE_YEAR:
- '一月'
- '二月'
- '三月'
- '四月'
- '五月'
- '六月'
- '七月'
- '八月'
- '九月'
- '十月'
- '十一月'
- '十二月'
DAYS_OF_THE_WEEK:
- '星期一'
- '星期二'
- '星期三'
- '星期四'
- '星期五'
- '星期六'
- '星期日'

144
system/languages/zh.yaml Normal file
View File

@@ -0,0 +1,144 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\n标题: %1$s\n---\n\n# 错误:无效参数\n\n位置 `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE:
- '装备'
- '信息'
- '大米'
- '钱'
- '物种'
- '系列'
- '鱼'
- '羊'
INFLECTOR_IRREGULAR:
'person': '人员'
'man': '男人'
'child': '儿童'
'sex': '性别'
'move': '移动'
INFLECTOR_ORDINALS:
'default': 'th'
'first': 'st'
'second': 'md'
'third': 'rd'
NICETIME:
NO_DATE_PROVIDED: 无日期信息
BAD_DATE: 无效日期
AGO:
FROM_NOW: 距今
JUST_NOW: 刚刚
SECOND:
MINUTE: 分钟
HOUR: 小时
DAY:
WEEK:
MONTH:
YEAR:
DECADE: 十年
SEC:
MIN: 分钟
HR: 小时
WK:
MO:
YR:
DEC: 年代
SECOND_PLURAL:
MINUTE_PLURAL:
HOUR_PLURAL: 小时
DAY_PLURAL:
WEEK_PLURAL:
MONTH_PLURAL:
YEAR_PLURAL:
DECADE_PLURAL: 十年
SEC_PLURAL:
MIN_PLURAL:
HR_PLURAL:
WK_PLURAL:
MO_PLURAL:
YR_PLURAL:
DEC_PLURAL: 年代
FORM:
VALIDATION_FAIL: <b>验证失败:</b>
INVALID_INPUT: 无效输入
MISSING_REQUIRED_FIELD: 必填字段缺失:
MONTHS_OF_THE_YEAR:
- '1月'
- '2月'
- '3月'
- '4月'
- '5月'
- '6月'
- '7月'
- '8月'
- '9月'
- '10月'
- '11月'
- '12月'
DAYS_OF_THE_WEEK:
- '星期一'
- '星期二'
- '星期三'
- '星期四'
- '星期五'
- '星期六'
- '星期日'
CRON:
EVERY: 每隔
EVERY_HOUR: 每小时
EVERY_MINUTE: 每分钟
EVERY_DAY_OF_WEEK: 一周中的每一天
EVERY_DAY_OF_MONTH: 月份中的每一天
EVERY_MONTH: 每月
TEXT_PERIOD: 所有 <b />
TEXT_MINS: ' 在 <b /> 小时过后的分钟'
TEXT_TIME: ' 在 <b />:<b />'
TEXT_DOW: ' on <b />'
TEXT_MONTH: ' of <b />'
TEXT_DOM: ' on <b />'
ERROR1: 不支持分享类型 %s
ERROR2: 无效数字
ERROR3: 请在 jqCron 设置中设定 jquery_element
ERROR4: 无法识别表达式

View File

@@ -1,9 +1,9 @@
<?php <?php
/** /**
* @package Grav.Core * @package Grav\Core
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -17,11 +17,21 @@ if (is_file($_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . $_SERVER['SCRIPT_N
return false; return false;
} }
$grav_index = 'index.php';
/* Check the GRAV_BASEDIR environment variable and use if set */
$grav_basedir = getenv('GRAV_BASEDIR') ?: '';
if ($grav_basedir) {
$grav_index = ltrim($grav_basedir, '/') . DIRECTORY_SEPARATOR . $grav_index;
$grav_basedir = DIRECTORY_SEPARATOR . trim($grav_basedir, DIRECTORY_SEPARATOR);
define('GRAV_ROOT', str_replace(DIRECTORY_SEPARATOR, '/', getcwd()) . $grav_basedir);
}
$_SERVER = array_merge($_SERVER, $_ENV); $_SERVER = array_merge($_SERVER, $_ENV);
$_SERVER['SCRIPT_FILENAME'] = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'index.php'; $_SERVER['SCRIPT_FILENAME'] = $_SERVER['DOCUMENT_ROOT'] . $grav_basedir .DIRECTORY_SEPARATOR . 'index.php';
$_SERVER['SCRIPT_NAME'] = DIRECTORY_SEPARATOR . 'index.php'; $_SERVER['SCRIPT_NAME'] = $grav_basedir . DIRECTORY_SEPARATOR . 'index.php';
$_SERVER['PHP_SELF'] = DIRECTORY_SEPARATOR . 'index.php'; $_SERVER['PHP_SELF'] = $grav_basedir . DIRECTORY_SEPARATOR . 'index.php';
error_log(sprintf('%s:%d [%d]: %s', $_SERVER['REMOTE_ADDR'], $_SERVER['REMOTE_PORT'], http_response_code(), $_SERVER['REQUEST_URI']), 4); error_log(sprintf('%s:%d [%d]: %s', $_SERVER['REMOTE_ADDR'], $_SERVER['REMOTE_PORT'], http_response_code(), $_SERVER['REQUEST_URI']), 4);
require 'index.php'; require $grav_index;

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common * @package Grav\Common
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -36,12 +37,6 @@ class Assets extends PropertyObject
/** @const Regex to match JavaScript files */ /** @const Regex to match JavaScript files */
const JS_REGEX = '/.\.js$/i'; const JS_REGEX = '/.\.js$/i';
/**
* @const Regex to match <script> or <style> tag when adding inline style/script. Note that this only supports a
* single tag, so the check is greedy to avoid issues in JS.
*/
const HTML_TAG_REGEX = '#(<([A-Z][A-Z0-9]*)>)+(.*)(<\/\2>)#is';
protected $assets_dir; protected $assets_dir;
protected $assets_url; protected $assets_url;
@@ -50,8 +45,10 @@ class Assets extends PropertyObject
// Config Options // Config Options
protected $css_pipeline; protected $css_pipeline;
protected $css_pipeline_include_externals;
protected $css_pipeline_before_excludes; protected $css_pipeline_before_excludes;
protected $js_pipeline; protected $js_pipeline;
protected $js_pipeline_include_externals;
protected $js_pipeline_before_excludes; protected $js_pipeline_before_excludes;
protected $pipeline_options = []; protected $pipeline_options = [];
@@ -122,7 +119,7 @@ class Assets extends PropertyObject
* It automatically detects the asset type (JavaScript, CSS or collection). * It automatically detects the asset type (JavaScript, CSS or collection).
* You may add more than one asset passing an array as argument. * You may add more than one asset passing an array as argument.
* *
* @param $asset * @param array|string $asset
* @return $this * @return $this
*/ */
public function add($asset) public function add($asset)
@@ -175,7 +172,8 @@ class Assets extends PropertyObject
// If pipeline disabled, set to position if provided, else after // If pipeline disabled, set to position if provided, else after
if (isset($options['pipeline'])) { if (isset($options['pipeline'])) {
if ($options['pipeline'] === false) { if ($options['pipeline'] === false) {
$excludes = strtolower($type . '_pipeline_before_excludes'); $exclude_type = ($type === $this::JS_TYPE || $type === $this::INLINE_JS_TYPE) ? $this::JS_TYPE : $this::CSS_TYPE;
$excludes = strtolower($exclude_type . '_pipeline_before_excludes');
if ($this->{$excludes}) { if ($this->{$excludes}) {
$default = 'after'; $default = 'after';
} else { } else {
@@ -269,6 +267,22 @@ class Assets extends PropertyObject
protected function filterAssets($assets, $key, $value, $sort = false) protected function filterAssets($assets, $key, $value, $sort = false)
{ {
$results = array_filter($assets, function($asset) use ($key, $value) { $results = array_filter($assets, function($asset) use ($key, $value) {
if ($key === 'position' && $value === 'pipeline') {
$type = $asset->getType();
if ($asset->getRemote() && $this->{$type . '_pipeline_include_externals'} === false && $asset['position'] === 'pipeline' ) {
if ($this->{$type . '_pipeline_before_excludes'}) {
$asset->setPosition('after');
} else {
$asset->setPosition('before');
}
return false;
}
}
if ($asset[$key] === $value) return true; if ($asset[$key] === $value) return true;
return false; return false;
}); });
@@ -297,11 +311,9 @@ class Assets extends PropertyObject
$before_output = ''; $before_output = '';
$pipeline_output = ''; $pipeline_output = '';
$after_output = ''; $after_output = '';
$no_pipeline = [];
$assets = 'assets_' . $type; $assets = 'assets_' . $type;
$pipeline_enabled = $type . '_pipeline'; $pipeline_enabled = $type . '_pipeline';
$before_excludes = $type . '_pipeline_before_excludes';
$render_pipeline = 'render' . ucfirst($type); $render_pipeline = 'render' . ucfirst($type);
$group_assets = $this->filterAssets($this->$assets, 'group', $group); $group_assets = $this->filterAssets($this->$assets, 'group', $group);
@@ -314,22 +326,13 @@ class Assets extends PropertyObject
$options = array_merge($this->pipeline_options, ['timestamp' => $this->timestamp]); $options = array_merge($this->pipeline_options, ['timestamp' => $this->timestamp]);
$pipeline = new Pipeline($options); $pipeline = new Pipeline($options);
$pipeline_output = $pipeline->$render_pipeline($pipeline_assets, $group, $attributes, $no_pipeline); $pipeline_output = $pipeline->$render_pipeline($pipeline_assets, $group, $attributes);
} else { } else {
foreach ($pipeline_assets as $asset) { foreach ($pipeline_assets as $asset) {
$pipeline_output .= $asset->render(); $pipeline_output .= $asset->render();
} }
} }
// Handle stuff that couldn't be pipelined
if (!empty($no_pipeline)) {
if ($this->{$before_excludes}) {
$after_assets = array_merge($after_assets, $no_pipeline);
} else {
$before_assets = array_merge($before_assets, $no_pipeline);
}
}
// Before Pipeline // Before Pipeline
foreach ($before_assets as $asset) { foreach ($before_assets as $asset) {
$before_output .= $asset->render(); $before_output .= $asset->render();

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Assets * @package Grav\Common\Assets
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -13,17 +14,16 @@ use Grav\Common\Grav;
use Grav\Common\Uri; use Grav\Common\Uri;
use Grav\Common\Utils; use Grav\Common\Utils;
use Grav\Framework\Object\PropertyObject; use Grav\Framework\Object\PropertyObject;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
abstract class BaseAsset extends PropertyObject abstract class BaseAsset extends PropertyObject
{ {
use AssetUtilsTrait; use AssetUtilsTrait;
const CSS_ASSET = true; protected const CSS_ASSET = true;
const JS_ASSET = false; protected const JS_ASSET = false;
/** @const Regex to match CSS import content */ /** @const Regex to match CSS import content */
const CSS_IMPORT_REGEX = '{@import(.*?);}'; protected const CSS_IMPORT_REGEX = '{@import(.*?);}';
protected $asset; protected $asset;
@@ -78,10 +78,13 @@ abstract class BaseAsset extends PropertyObject
} }
} }
// Force priority to be an int
$this->priority = (int) $this->priority;
// Do some special stuff for CSS/JS (not inline) // Do some special stuff for CSS/JS (not inline)
if (!Utils::startsWith($this->getType(), 'inline')) { if (!Utils::startsWith($this->getType(), 'inline')) {
$this->base_url = rtrim($uri->rootUrl($config->get('system.absolute_urls')), '/') . '/'; $this->base_url = rtrim($uri->rootUrl($config->get('system.absolute_urls')), '/') . '/';
$this->remote = $this->isRemoteLink($asset); $this->remote = static::isRemoteLink($asset);
// Move this to render? // Move this to render?
if (!$this->remote) { if (!$this->remote) {
@@ -129,6 +132,12 @@ abstract class BaseAsset extends PropertyObject
return $this->remote; return $this->remote;
} }
public function setPosition($position)
{
$this->position = $position;
return $this;
}
/** /**
* *
@@ -153,7 +162,6 @@ abstract class BaseAsset extends PropertyObject
* Build local links including grav asset shortcodes * Build local links including grav asset shortcodes
* *
* @param string $asset the asset string reference * @param string $asset the asset string reference
* @param bool $absolute build absolute asset link
* *
* @return string the final link url to the asset * @return string the final link url to the asset
*/ */
@@ -175,4 +183,16 @@ abstract class BaseAsset extends PropertyObject
{ {
return ['type' => $this->getType(), 'elements' => $this->getElements()]; return ['type' => $this->getType(), 'elements' => $this->getElements()];
} }
/**
* Placeholder for AssetUtilsTrait method
*
* @param string $file
* @param string $dir
* @param bool $local
*/
protected function cssRewrite($file, $dir, $local)
{
return;
}
} }

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Assets * @package Grav\Common\Assets
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -12,7 +13,6 @@ use Grav\Common\Utils;
class Css extends BaseAsset class Css extends BaseAsset
{ {
public function __construct(array $elements = [], $key = null) public function __construct(array $elements = [], $key = null)
{ {
$base_options = [ $base_options = [

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Assets * @package Grav\Common\Assets
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Assets * @package Grav\Common\Assets
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Assets * @package Grav\Common\Assets
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Assets * @package Grav\Common\Assets
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -20,17 +21,19 @@ class Pipeline extends PropertyObject
{ {
use AssetUtilsTrait; use AssetUtilsTrait;
const CSS_ASSET = true; protected const CSS_ASSET = true;
const JS_ASSET = false; protected const JS_ASSET = false;
/** @const Regex to match CSS urls */ /** @const Regex to match CSS urls */
const CSS_URL_REGEX = '{url\(([\'\"]?)(.*?)\1\)}'; protected const CSS_URL_REGEX = '{url\(([\'\"]?)(.*?)\1\)}';
/** @const Regex to match CSS sourcemap comments */ /** @const Regex to match CSS sourcemap comments */
const CSS_SOURCEMAP_REGEX = '{\/\*# (.*?) \*\/}'; protected const CSS_SOURCEMAP_REGEX = '{\/\*# (.*?) \*\/}';
/** @const Regex to match CSS import content */ /** @const Regex to match CSS import content */
const CSS_IMPORT_REGEX = '{@import(.*?);}'; protected const CSS_IMPORT_REGEX = '{@import(.*?);}';
protected const FIRST_FORWARDSLASH_REGEX = '{^\/{1}\w}';
protected $css_minify; protected $css_minify;
protected $css_minify_windows; protected $css_minify_windows;
@@ -47,9 +50,6 @@ class Pipeline extends PropertyObject
protected $query; protected $query;
protected $asset; protected $asset;
protected $css_pipeline_include_externals;
protected $js_pipeline_include_externals;
/** /**
* Closure used by the pipeline to fetch assets. * Closure used by the pipeline to fetch assets.
* *
@@ -88,11 +88,10 @@ class Pipeline extends PropertyObject
* @param array $assets * @param array $assets
* @param string $group * @param string $group
* @param array $attributes * @param array $attributes
* @param array $no_pipeline
* *
* @return bool|string URL or generated content if available, else false * @return bool|string URL or generated content if available, else false
*/ */
public function renderCss($assets, $group, $attributes = [], &$no_pipeline = []) public function renderCss($assets, $group, $attributes = [])
{ {
// temporary list of assets to pipeline // temporary list of assets to pipeline
$inline_group = false; $inline_group = false;
@@ -116,21 +115,13 @@ class Pipeline extends PropertyObject
if (file_exists($this->assets_dir . $file)) { if (file_exists($this->assets_dir . $file)) {
$buffer = file_get_contents($this->assets_dir . $file) . "\n"; $buffer = file_get_contents($this->assets_dir . $file) . "\n";
} else { } else {
foreach ($assets as $id => $asset) {
if ($this->css_pipeline_include_externals === false && $asset->getRemote()) {
$no_pipeline[$id] = $asset;
unset($assets[$id]);
}
}
//if nothing found get out of here! //if nothing found get out of here!
if (empty($assets) && empty($no_pipeline)) { if (empty($assets)) {
return false; return false;
} }
// Concatenate files // Concatenate files
$buffer = $this->gatherLinks($assets, self::CSS_ASSET, $no_pipeline); $buffer = $this->gatherLinks($assets, self::CSS_ASSET);
// Minify if required // Minify if required
if ($this->shouldMinify('css')) { if ($this->shouldMinify('css')) {
@@ -140,7 +131,7 @@ class Pipeline extends PropertyObject
} }
// Write file // Write file
if (\strlen(trim($buffer)) > 0) { if (trim($buffer) !== '') {
file_put_contents($this->assets_dir . $file, $buffer); file_put_contents($this->assets_dir . $file, $buffer);
} }
} }
@@ -161,11 +152,10 @@ class Pipeline extends PropertyObject
* @param array $assets * @param array $assets
* @param string $group * @param string $group
* @param array $attributes * @param array $attributes
* @param array $no_pipeline
* *
* @return bool|string URL or generated content if available, else false * @return bool|string URL or generated content if available, else false
*/ */
public function renderJs($assets, $group, $attributes = [], &$no_pipeline = []) public function renderJs($assets, $group, $attributes = [])
{ {
// temporary list of assets to pipeline // temporary list of assets to pipeline
$inline_group = false; $inline_group = false;
@@ -189,21 +179,13 @@ class Pipeline extends PropertyObject
if (file_exists($this->assets_dir . $file)) { if (file_exists($this->assets_dir . $file)) {
$buffer = file_get_contents($this->assets_dir . $file) . "\n"; $buffer = file_get_contents($this->assets_dir . $file) . "\n";
} else { } else {
foreach ($assets as $id => $asset) {
if ($this->js_pipeline_include_externals === false && $asset->getRemote()) {
$no_pipeline[$id] = $asset;
unset($assets[$id]);
}
}
//if nothing found get out of here! //if nothing found get out of here!
if (empty($assets) && empty($no_pipeline)) { if (empty($assets)) {
return false; return false;
} }
// Concatenate files // Concatenate files
$buffer = $this->gatherLinks($assets, self::JS_ASSET, $no_pipeline); $buffer = $this->gatherLinks($assets, self::JS_ASSET);
// Minify if required // Minify if required
if ($this->shouldMinify('js')) { if ($this->shouldMinify('js')) {
@@ -213,16 +195,16 @@ class Pipeline extends PropertyObject
} }
// Write file // Write file
if (\strlen(trim($buffer)) > 0) { if (trim($buffer) !== '') {
file_put_contents($this->assets_dir . $file, $buffer); file_put_contents($this->assets_dir . $file, $buffer);
} }
} }
if ($inline_group) { if ($inline_group) {
$output = "<script" . $this->renderAttributes(). ">\n" . $buffer . "\n</script>\n"; $output = '<script' . $this->renderAttributes(). ">\n" . $buffer . "\n</script>\n";
} else { } else {
$this->asset = $relative_path; $this->asset = $relative_path;
$output = "<script src=\"" . $relative_path . $this->renderQueryString() . "\"" . $this->renderAttributes() . "></script>\n"; $output = '<script src="' . $relative_path . $this->renderQueryString() . '"' . $this->renderAttributes() . "></script>\n";
} }
return $output; return $output;
@@ -234,7 +216,7 @@ class Pipeline extends PropertyObject
* *
* @param string $file the css source file * @param string $file the css source file
* @param string $dir , $local relative path to the css file * @param string $dir , $local relative path to the css file
* @param boolean $local is this a local or remote asset * @param bool $local is this a local or remote asset
* *
* @return mixed * @return mixed
*/ */
@@ -249,14 +231,22 @@ class Pipeline extends PropertyObject
$old_url = $matches[2]; $old_url = $matches[2];
// Ensure link is not rooted to webserver, a data URL, or to a remote host // Ensure link is not rooted to web server, a data URL, or to a remote host
if (Utils::startsWith($old_url, '/') || Utils::startsWith($old_url, 'data:') || $this->isRemoteLink($old_url)) { if (preg_match(self::FIRST_FORWARDSLASH_REGEX, $old_url) || Utils::startsWith($old_url, 'data:') || $this->isRemoteLink($old_url)) {
return $matches[0]; return $matches[0];
} }
$new_url = ($local ? $this->base_url: '') . ltrim(Utils::normalizePath($dir . '/' . $old_url), '/'); // clean leading /
$old_url = Utils::normalizePath($dir . '/' . $old_url);
if (preg_match(self::FIRST_FORWARDSLASH_REGEX, $old_url)) {
$old_url = ltrim($old_url, '/');
}
return str_replace($old_url, $new_url, $matches[0]); $new_url = ($local ? $this->base_url: '') . $old_url;
$fixed = str_replace($matches[2], $new_url, $matches[0]);
return $fixed;
}, $file); }, $file);
return $file; return $file;

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Assets.Traits * @package Grav\Common\Assets\Traits
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -24,7 +25,7 @@ trait AssetUtilsTrait
{ {
$base = Grav::instance()['uri']->rootUrl(true); $base = Grav::instance()['uri']->rootUrl(true);
// sanity check for local URLs with absolute URL's enabled // Sanity check for local URLs with absolute URL's enabled
if (Utils::startsWith($link, $base)) { if (Utils::startsWith($link, $base)) {
return false; return false;
} }
@@ -37,11 +38,10 @@ trait AssetUtilsTrait
* *
* @param array $assets * @param array $assets
* @param bool $css * @param bool $css
* @param array $no_pipeline
* *
* @return string * @return string
*/ */
protected function gatherLinks(array $assets, $css = true, &$no_pipeline = []) protected function gatherLinks(array $assets, $css = true)
{ {
$buffer = ''; $buffer = '';
@@ -52,12 +52,12 @@ trait AssetUtilsTrait
$link = $asset->getAsset(); $link = $asset->getAsset();
$relative_path = $link; $relative_path = $link;
if ($this->isRemoteLink($link)) { if (static::isRemoteLink($link)) {
$local = false; $local = false;
if (0 === strpos($link, '//')) { if (0 === strpos($link, '//')) {
$link = 'http:' . $link; $link = 'http:' . $link;
} }
$relative_dir = dirname($relative_path); $relative_dir = \dirname($relative_path);
} else { } else {
// Fix to remove relative dir if grav is in one // Fix to remove relative dir if grav is in one
if (($this->base_url !== '/') && Utils::startsWith($relative_path, $this->base_url)) { if (($this->base_url !== '/') && Utils::startsWith($relative_path, $this->base_url)) {
@@ -65,7 +65,7 @@ trait AssetUtilsTrait
$relative_path = ltrim(preg_replace($base_url, '/', $link, 1), '/'); $relative_path = ltrim(preg_replace($base_url, '/', $link, 1), '/');
} }
$relative_dir = dirname($relative_path); $relative_dir = \dirname($relative_path);
$link = ROOT_DIR . $relative_path; $link = ROOT_DIR . $relative_path;
} }
@@ -73,9 +73,6 @@ trait AssetUtilsTrait
// No file found, skip it... // No file found, skip it...
if ($file === false) { if ($file === false) {
if (!$local) { // Assume we coudln't download this file for some reason assume it's not pipeline compatible
$no_pipeline[$id] = $asset;
}
continue; continue;
} }
@@ -112,7 +109,7 @@ trait AssetUtilsTrait
{ {
$imports = []; $imports = [];
$file = (string)preg_replace_callback(self::CSS_IMPORT_REGEX, function ($matches) { $file = (string)preg_replace_callback(self::CSS_IMPORT_REGEX, function ($matches) use (&$imports) {
$imports[] = $matches[0]; $imports[] = $matches[0];
return ''; return '';
@@ -125,8 +122,6 @@ trait AssetUtilsTrait
* *
* Build an HTML attribute string from an array. * Build an HTML attribute string from an array.
* *
* @param array $attributes
*
* @return string * @return string
*/ */
protected function renderAttributes() protected function renderAttributes()
@@ -157,6 +152,7 @@ trait AssetUtilsTrait
/** /**
* Render Querystring * Render Querystring
* *
* @param string $asset
* @return string * @return string
*/ */
protected function renderQueryString($asset = null) protected function renderQueryString($asset = null)

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Assets.Traits * @package Grav\Common\Assets\Traits
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -13,24 +14,31 @@ use Grav\Common\Assets;
trait LegacyAssetsTrait trait LegacyAssetsTrait
{ {
/**
* @param array $args
* @param string $type
* @return array
*/
protected function unifyLegacyArguments($args, $type = Assets::CSS_TYPE) protected function unifyLegacyArguments($args, $type = Assets::CSS_TYPE)
{ {
// First argument is always the asset // First argument is always the asset
array_shift($args); array_shift($args);
if (\count($args) === 0) { if (count($args) === 0) {
return []; return [];
} }
if (\count($args) === 1 && \is_array($args[0])) { // New options array format
if (count($args) === 1 && is_array($args[0])) {
return $args[0]; return $args[0];
} }
// Handle obscure case where options array is mixed with a priority
if (count($args) === 2 && is_array($args[0]) && is_int($args[1])) {
$arguments = $args[0];
$arguments['priority'] = $args[1];
return $arguments;
}
switch ($type) { switch ($type) {
case(Assets::INLINE_CSS_TYPE):
$defaults = ['priority' => null, 'group' => null];
$arguments = $this->createArgumentsFromLegacy($args, $defaults);
break;
case(Assets::JS_TYPE): case(Assets::JS_TYPE):
$defaults = ['priority' => null, 'pipeline' => true, 'loading' => null, 'group' => null]; $defaults = ['priority' => null, 'pipeline' => true, 'loading' => null, 'group' => null];
$arguments = $this->createArgumentsFromLegacy($args, $defaults); $arguments = $this->createArgumentsFromLegacy($args, $defaults);
@@ -43,12 +51,21 @@ trait LegacyAssetsTrait
// special case to handle old attributes being passed in // special case to handle old attributes being passed in
if (isset($arguments['attributes'])) { if (isset($arguments['attributes'])) {
$old_attributes = $arguments['attributes']; $old_attributes = $arguments['attributes'];
if (is_array($old_attributes)) {
$arguments = array_merge($arguments, $old_attributes); $arguments = array_merge($arguments, $old_attributes);
} else {
$arguments['type'] = $old_attributes;
}
} }
unset($arguments['attributes']); unset($arguments['attributes']);
break; break;
case(Assets::INLINE_CSS_TYPE):
$defaults = ['priority' => null, 'group' => null];
$arguments = $this->createArgumentsFromLegacy($args, $defaults);
break;
default: default:
case(Assets::CSS_TYPE): case(Assets::CSS_TYPE):
$defaults = ['priority' => null, 'pipeline' => true, 'group' => null, 'loading' => null]; $defaults = ['priority' => null, 'pipeline' => true, 'group' => null, 'loading' => null];
@@ -76,34 +93,36 @@ trait LegacyAssetsTrait
/** /**
* Convenience wrapper for async loading of JavaScript * Convenience wrapper for async loading of JavaScript
* *
* @param $asset * @param string|array $asset
* @param int $priority * @param int $priority
* @param bool $pipeline * @param bool $pipeline
* @param string $group name of the group * @param string $group name of the group
* *
* @deprecated Please use dynamic method with ['loading' => 'async']
*
* @return \Grav\Common\Assets * @return \Grav\Common\Assets
* @deprecated Please use dynamic method with ['loading' => 'async'].
*/ */
public function addAsyncJs($asset, $priority = 10, $pipeline = true, $group = 'head') public function addAsyncJs($asset, $priority = 10, $pipeline = true, $group = 'head')
{ {
user_error(__CLASS__ . '::' . __FUNCTION__ . '() is deprecated since Grav 1.6, use dynamic method with [\'loading\' => \'async\']', E_USER_DEPRECATED);
return $this->addJs($asset, $priority, $pipeline, 'async', $group); return $this->addJs($asset, $priority, $pipeline, 'async', $group);
} }
/** /**
* Convenience wrapper for deferred loading of JavaScript * Convenience wrapper for deferred loading of JavaScript
* *
* @param $asset * @param string|array $asset
* @param int $priority * @param int $priority
* @param bool $pipeline * @param bool $pipeline
* @param string $group name of the group * @param string $group name of the group
* *
* @deprecated Please use dynamic method with ['loading' => 'defer']
*
* @return \Grav\Common\Assets * @return \Grav\Common\Assets
* @deprecated Please use dynamic method with ['loading' => 'defer'].
*/ */
public function addDeferJs($asset, $priority = 10, $pipeline = true, $group = 'head') public function addDeferJs($asset, $priority = 10, $pipeline = true, $group = 'head')
{ {
user_error(__CLASS__ . '::' . __FUNCTION__ . '() is deprecated since Grav 1.6, use dynamic method with [\'loading\' => \'defer\']', E_USER_DEPRECATED);
return $this->addJs($asset, $priority, $pipeline, 'defer', $group); return $this->addJs($asset, $priority, $pipeline, 'defer', $group);
} }

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Assets.Traits * @package Grav\Common\Assets\Traits
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -15,7 +16,7 @@ trait TestingAssetsTrait
/** /**
* Determines if an asset exists as a collection, CSS or JS reference * Determines if an asset exists as a collection, CSS or JS reference
* *
* @param $asset * @param string $asset
* *
* @return bool * @return bool
*/ */
@@ -37,13 +38,14 @@ trait TestingAssetsTrait
/** /**
* Set the array of collections explicitly * Set the array of collections explicitly
* *
* @param $collections * @param array $collections
* *
* @return $this * @return $this
*/ */
public function setCollection($collections) public function setCollection($collections)
{ {
$this->collections = $collections; $this->collections = $collections;
return $this; return $this;
} }
@@ -88,7 +90,7 @@ trait TestingAssetsTrait
/** /**
* Set the whole array of CSS assets * Set the whole array of CSS assets
* *
* @param $css * @param array $css
* *
* @return $this * @return $this
*/ */
@@ -102,7 +104,7 @@ trait TestingAssetsTrait
/** /**
* Set the whole array of JS assets * Set the whole array of JS assets
* *
* @param $js * @param array $js
* *
* @return $this * @return $this
*/ */
@@ -150,7 +152,7 @@ trait TestingAssetsTrait
/** /**
* Sets the state of CSS Pipeline * Sets the state of CSS Pipeline
* *
* @param boolean $value * @param bool $value
* *
* @return $this * @return $this
*/ */
@@ -164,7 +166,7 @@ trait TestingAssetsTrait
/** /**
* Sets the state of JS Pipeline * Sets the state of JS Pipeline
* *
* @param boolean $value * @param bool $value
* *
* @return $this * @return $this
*/ */
@@ -217,7 +219,7 @@ trait TestingAssetsTrait
/** /**
* Explicitly set's a timestamp for assets * Explicitly set's a timestamp for assets
* *
* @param $value * @param string|int $value
*/ */
public function setTimestamp($value) public function setTimestamp($value)
{ {

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Backup * @package Grav\Common\Backup
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -17,13 +18,14 @@ use Grav\Common\Utils;
use Grav\Common\Grav; use Grav\Common\Grav;
use RocketTheme\Toolbox\Event\Event; use RocketTheme\Toolbox\Event\Event;
use RocketTheme\Toolbox\Event\EventDispatcher; use RocketTheme\Toolbox\Event\EventDispatcher;
use RocketTheme\Toolbox\File\JsonFile;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator; use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
class Backups class Backups
{ {
const BACKUP_FILENAME_REGEXZ = "#(.*)--(\d*).zip#"; protected const BACKUP_FILENAME_REGEXZ = "#(.*)--(\d*).zip#";
const BACKUP_DATE_FORMAT = 'YmdHis'; protected const BACKUP_DATE_FORMAT = 'YmdHis';
protected static $backup_dir; protected static $backup_dir;
@@ -39,7 +41,7 @@ class Backups
public function setup() public function setup()
{ {
if (is_null(static::$backup_dir)) { if (null === static::$backup_dir) {
static::$backup_dir = Grav::instance()['locator']->findResource('backup://', true, true); static::$backup_dir = Grav::instance()['locator']->findResource('backup://', true, true);
Folder::create(static::$backup_dir); Folder::create(static::$backup_dir);
} }
@@ -53,14 +55,15 @@ class Backups
/** @var Inflector $inflector */ /** @var Inflector $inflector */
$inflector = Grav::instance()['inflector']; $inflector = Grav::instance()['inflector'];
foreach ($this->getBackupProfiles() as $id => $profile) { foreach (static::getBackupProfiles() as $id => $profile) {
$at = $profile['schedule_at']; $at = $profile['schedule_at'];
$name = $inflector->hyphenize($profile['name']); $name = $inflector::hyphenize($profile['name']);
$logs = 'logs/backup-' . $name . '.out'; $logs = 'logs/backup-' . $name . '.out';
/** @var Job $job */ /** @var Job $job */
$job = $scheduler->addFunction('Grav\Common\Backup\Backups::backup', [$id], $name ); $job = $scheduler->addFunction('Grav\Common\Backup\Backups::backup', [$id], $name );
$job->at($at); $job->at($at);
$job->output($logs); $job->output($logs);
$job->backlink('/tools/backups');
} }
} }
@@ -86,7 +89,7 @@ class Backups
public function getBackupNames() public function getBackupNames()
{ {
return array_column($this->getBackupProfiles(), 'name'); return array_column(static::getBackupProfiles(), 'name');
} }
public static function getTotalBackupsSize() public static function getTotalBackupsSize()
@@ -99,7 +102,7 @@ class Backups
public static function getAvailableBackups($force = false) public static function getAvailableBackups($force = false)
{ {
if ($force || is_null(static::$backups)) { if ($force || null === static::$backups) {
static::$backups = []; static::$backups = [];
$backups_itr = new \GlobIterator(static::$backup_dir . '/*.zip', \FilesystemIterator::KEY_AS_FILENAME); $backups_itr = new \GlobIterator(static::$backup_dir . '/*.zip', \FilesystemIterator::KEY_AS_FILENAME);
$inflector = Grav::instance()['inflector']; $inflector = Grav::instance()['inflector'];
@@ -165,7 +168,7 @@ class Backups
} }
if (!file_exists($backup_root)) { if (!file_exists($backup_root)) {
throw new \RuntimeException("Backup location: " . $backup_root . ' does not exist...'); throw new \RuntimeException("Backup location: {$backup_root} does not exist...");
} }
$options = [ $options = [
@@ -192,7 +195,7 @@ class Backups
} }
// Log the backup // Log the backup
Grav::instance()['log']->error('Backup Created: ' . $destination); Grav::instance()['log']->notice('Backup Created: ' . $destination);
// Fire Finished event // Fire Finished event
Grav::instance()->fireEvent('onBackupFinished', new Event(['backup' => $destination])); Grav::instance()->fireEvent('onBackupFinished', new Event(['backup' => $destination]));
@@ -200,6 +203,14 @@ class Backups
// Purge anything required // Purge anything required
static::purge(); static::purge();
// Log
$log = JsonFile::instance(Grav::instance()['locator']->findResource("log://backup.log", true, true));
$log->content([
'time' => time(),
'location' => $destination
]);
$log->save();
return $destination; return $destination;
} }
@@ -245,6 +256,6 @@ class Backups
protected static function convertExclude($exclude) protected static function convertExclude($exclude)
{ {
$lines = preg_split("/[\s,]+/", $exclude); $lines = preg_split("/[\s,]+/", $exclude);
return array_map('trim', $lines, array_fill(0,count($lines),'/')); return array_map('trim', $lines, array_fill(0, \count($lines), '/'));
} }
} }

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common * @package Grav\Common
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -113,7 +114,7 @@ class Browser
{ {
$version = explode('.', $this->getLongVersion()); $version = explode('.', $this->getLongVersion());
return intval($version[0]); return (int)$version[0];
} }
/** /**
@@ -134,4 +135,15 @@ class Browser
return true; return true;
} }
/**
* Determine if “Do Not Track” is set by browser
* @see https://www.w3.org/TR/tracking-dnt/
*
* @return bool
*/
public function isTrackable(): bool
{
return !(isset($_SERVER['HTTP_DNT']) && $_SERVER['HTTP_DNT'] === '1');
}
} }

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common * @package Grav\Common
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -11,15 +12,16 @@ namespace Grav\Common;
use \Doctrine\Common\Cache as DoctrineCache; use \Doctrine\Common\Cache as DoctrineCache;
use Grav\Common\Config\Config; use Grav\Common\Config\Config;
use Grav\Common\Filesystem\Folder; use Grav\Common\Filesystem\Folder;
use Grav\Common\Scheduler\Scheduler;
use Psr\SimpleCache\CacheInterface;
use RocketTheme\Toolbox\Event\Event; use RocketTheme\Toolbox\Event\Event;
use RocketTheme\Toolbox\Event\EventDispatcher;
/** /**
* The GravCache object is used throughout Grav to store and retrieve cached data. * The GravCache object is used throughout Grav to store and retrieve cached data.
* It uses DoctrineCache library and supports a variety of caching mechanisms. Those include: * It uses DoctrineCache library and supports a variety of caching mechanisms. Those include:
* *
* APCu * APCu
* APC
* XCache
* RedisCache * RedisCache
* MemCache * MemCache
* MemCacheD * MemCacheD
@@ -43,6 +45,11 @@ class Cache extends Getters
*/ */
protected $driver; protected $driver;
/**
* @var CacheInterface
*/
protected $simpleCache;
protected $driver_name; protected $driver_name;
protected $driver_setting; protected $driver_setting;
@@ -117,7 +124,7 @@ class Cache extends Getters
$this->config = $grav['config']; $this->config = $grav['config'];
$this->now = time(); $this->now = time();
if (is_null($this->enabled)) { if (null === $this->enabled) {
$this->enabled = (bool)$this->config->get('system.cache.enabled'); $this->enabled = (bool)$this->config->get('system.cache.enabled');
} }
@@ -139,6 +146,28 @@ class Cache extends Getters
$dispatcher->addListener('onSchedulerInitialized', [$this, 'onSchedulerInitialized']); $dispatcher->addListener('onSchedulerInitialized', [$this, 'onSchedulerInitialized']);
} }
/**
* @return CacheInterface
*/
public function getSimpleCache()
{
if (null === $this->simpleCache) {
$cache = new \Grav\Framework\Cache\Adapter\DoctrineCache($this->driver, '', $this->getLifetime());
// Disable cache key validation.
$cache->setValidation(false);
$this->simpleCache = $cache;
}
return $this->simpleCache;
}
/**
* Deletes the old out of date file-based caches
*
* @return int
*/
public function purgeOldCache() public function purgeOldCache()
{ {
$cache_dir = dirname($this->cache_dir); $cache_dir = dirname($this->cache_dir);
@@ -147,7 +176,7 @@ class Cache extends Getters
foreach (new \DirectoryIterator($cache_dir) as $file) { foreach (new \DirectoryIterator($cache_dir) as $file) {
$dir = $file->getBasename(); $dir = $file->getBasename();
if ($file->isDot() || $file->isFile() || $dir === $current) { if ($dir === $current || $file->isDot() || $file->isFile()) {
continue; continue;
} }
@@ -161,11 +190,11 @@ class Cache extends Getters
/** /**
* Public accessor to set the enabled state of the cache * Public accessor to set the enabled state of the cache
* *
* @param $enabled * @param bool|int $enabled
*/ */
public function setEnabled($enabled) public function setEnabled($enabled)
{ {
$this->enabled = (bool) $enabled; $this->enabled = (bool)$enabled;
} }
/** /**
@@ -202,19 +231,15 @@ class Cache extends Getters
// CLI compatibility requires a non-volatile cache driver // CLI compatibility requires a non-volatile cache driver
if ($this->config->get('system.cache.cli_compatibility') && ( if ($this->config->get('system.cache.cli_compatibility') && (
$setting == 'auto' || $this->isVolatileDriver($setting))) { $setting === 'auto' || $this->isVolatileDriver($setting))) {
$setting = $driver_name; $setting = $driver_name;
} }
if (!$setting || $setting == 'auto') { if (!$setting || $setting === 'auto') {
if (extension_loaded('apcu')) { if (extension_loaded('apcu')) {
$driver_name = 'apcu'; $driver_name = 'apcu';
} elseif (extension_loaded('apc')) {
$driver_name = 'apc';
} elseif (extension_loaded('wincache')) { } elseif (extension_loaded('wincache')) {
$driver_name = 'wincache'; $driver_name = 'wincache';
} elseif (extension_loaded('xcache')) {
$driver_name = 'xcache';
} }
} else { } else {
$driver_name = $setting; $driver_name = $setting;
@@ -224,9 +249,6 @@ class Cache extends Getters
switch ($driver_name) { switch ($driver_name) {
case 'apc': case 'apc':
$driver = new DoctrineCache\ApcCache();
break;
case 'apcu': case 'apcu':
$driver = new DoctrineCache\ApcuCache(); $driver = new DoctrineCache\ApcuCache();
break; break;
@@ -235,27 +257,32 @@ class Cache extends Getters
$driver = new DoctrineCache\WinCacheCache(); $driver = new DoctrineCache\WinCacheCache();
break; break;
case 'xcache':
$driver = new DoctrineCache\XcacheCache();
break;
case 'memcache': case 'memcache':
if (extension_loaded('memcache')) {
$memcache = new \Memcache(); $memcache = new \Memcache();
$memcache->connect($this->config->get('system.cache.memcache.server', 'localhost'), $memcache->connect($this->config->get('system.cache.memcache.server', 'localhost'),
$this->config->get('system.cache.memcache.port', 11211)); $this->config->get('system.cache.memcache.port', 11211));
$driver = new DoctrineCache\MemcacheCache(); $driver = new DoctrineCache\MemcacheCache();
$driver->setMemcache($memcache); $driver->setMemcache($memcache);
} else {
throw new \LogicException('Memcache PHP extension has not been installed');
}
break; break;
case 'memcached': case 'memcached':
if (extension_loaded('memcached')) {
$memcached = new \Memcached(); $memcached = new \Memcached();
$memcached->addServer($this->config->get('system.cache.memcached.server', 'localhost'), $memcached->addServer($this->config->get('system.cache.memcached.server', 'localhost'),
$this->config->get('system.cache.memcached.port', 11211)); $this->config->get('system.cache.memcached.port', 11211));
$driver = new DoctrineCache\MemcachedCache(); $driver = new DoctrineCache\MemcachedCache();
$driver->setMemcached($memcached); $driver->setMemcached($memcached);
} else {
throw new \LogicException('Memcached PHP extension has not been installed');
}
break; break;
case 'redis': case 'redis':
if (extension_loaded('redis')) {
$redis = new \Redis(); $redis = new \Redis();
$socket = $this->config->get('system.cache.redis.socket', false); $socket = $this->config->get('system.cache.redis.socket', false);
$password = $this->config->get('system.cache.redis.password', false); $password = $this->config->get('system.cache.redis.password', false);
@@ -274,6 +301,9 @@ class Cache extends Getters
$driver = new DoctrineCache\RedisCache(); $driver = new DoctrineCache\RedisCache();
$driver->setRedis($redis); $driver->setRedis($redis);
} else {
throw new \LogicException('Redis PHP extension has not been installed');
}
break; break;
default: default:
@@ -295,9 +325,9 @@ class Cache extends Getters
{ {
if ($this->enabled) { if ($this->enabled) {
return $this->driver->fetch($id); return $this->driver->fetch($id);
} else {
return false;
} }
return false;
} }
/** /**
@@ -328,6 +358,7 @@ class Cache extends Getters
if ($this->enabled) { if ($this->enabled) {
return $this->driver->delete($id); return $this->driver->delete($id);
} }
return false; return false;
} }
@@ -341,6 +372,7 @@ class Cache extends Getters
if ($this->enabled) { if ($this->enabled) {
return $this->driver->deleteAll(); return $this->driver->deleteAll();
} }
return false; return false;
} }
@@ -355,6 +387,7 @@ class Cache extends Getters
if ($this->enabled) { if ($this->enabled) {
return $this->driver->contains(($id)); return $this->driver->contains(($id));
} }
return false; return false;
} }
@@ -404,6 +437,9 @@ class Cache extends Getters
case 'tmp-only': case 'tmp-only':
$remove_paths = self::$tmp_remove; $remove_paths = self::$tmp_remove;
break; break;
case 'invalidate':
$remove_paths = [];
break;
default: default:
if (Grav::instance()['config']->get('system.cache.clear_images_by_default')) { if (Grav::instance()['config']->get('system.cache.clear_images_by_default')) {
$remove_paths = self::$standard_remove; $remove_paths = self::$standard_remove;
@@ -459,7 +495,7 @@ class Cache extends Getters
$output[] = ''; $output[] = '';
if (($remove == 'all' || $remove == 'standard') && file_exists($user_config)) { if (($remove === 'all' || $remove === 'standard') && file_exists($user_config)) {
touch($user_config); touch($user_config);
$output[] = '<red>Touched: </red>' . $user_config; $output[] = '<red>Touched: </red>' . $user_config;
@@ -477,6 +513,23 @@ class Cache extends Getters
return $output; return $output;
} }
public static function invalidateCache()
{
$user_config = USER_DIR . 'config/system.yaml';
if (file_exists($user_config)) {
touch($user_config);
}
// Clear stat cache
@clearstatcache();
// Clear opcache
if (function_exists('opcache_reset')) {
@opcache_reset();
}
}
/** /**
* Set the cache lifetime programmatically * Set the cache lifetime programmatically
@@ -489,7 +542,7 @@ class Cache extends Getters
return; return;
} }
$interval = $future - $this->now; $interval = (int)($future - $this->now);
if ($interval > 0 && $interval < $this->getLifetime()) { if ($interval > 0 && $interval < $this->getLifetime()) {
$this->lifetime = $interval; $this->lifetime = $interval;
} }
@@ -504,7 +557,7 @@ class Cache extends Getters
public function getLifetime() public function getLifetime()
{ {
if ($this->lifetime === null) { if ($this->lifetime === null) {
$this->lifetime = $this->config->get('system.cache.lifetime') ?: 604800; // 1 week default $this->lifetime = (int)($this->config->get('system.cache.lifetime') ?: 604800); // 1 week default
} }
return $this->lifetime; return $this->lifetime;
@@ -533,24 +586,41 @@ class Cache extends Getters
/** /**
* is this driver a volatile driver in that it resides in PHP process memory * is this driver a volatile driver in that it resides in PHP process memory
* *
* @param $setting * @param string $setting
* @return bool * @return bool
*/ */
public function isVolatileDriver($setting) public function isVolatileDriver($setting)
{ {
if (in_array($setting, ['apc', 'apcu', 'xcache', 'wincache'])) { if (in_array($setting, ['apc', 'apcu', 'xcache', 'wincache'])) {
return true; return true;
} else {
return false;
}
} }
return false;
}
/**
* Static function to call as a scheduled Job to purge old Doctrine files
*/
public static function purgeJob() public static function purgeJob()
{ {
/** @var Cache $cache */
$cache = Grav::instance()['cache']; $cache = Grav::instance()['cache'];
$deleted_folders = $cache->purgeOldCache(); $deleted_folders = $cache->purgeOldCache();
$msg = 'Purged ' . $deleted_folders . ' old cache folders...';
return $msg; echo 'Purged ' . $deleted_folders . ' old cache folders...';
}
/**
* Static function to call as a scheduled Job to clear Grav cache
*
* @param string $type
*/
public static function clearJob($type)
{
$result = static::clearCache($type);
static::invalidateCache();
echo strip_tags(implode("\n", $result));
} }
public function onSchedulerInitialized(Event $event) public function onSchedulerInitialized(Event $event)
@@ -559,13 +629,26 @@ class Cache extends Getters
$scheduler = $event['scheduler']; $scheduler = $event['scheduler'];
$config = Grav::instance()['config']; $config = Grav::instance()['config'];
// File Cache Purge
$at = $config->get('system.cache.purge_at'); $at = $config->get('system.cache.purge_at');
$name = 'cache-purge'; $name = 'cache-purge';
$logs = 'logs/' . $name . '.out'; $logs = 'logs/' . $name . '.out';
$job = $scheduler->addFunction('Grav\Common\Cache::purgeJob', null, $name ); $job = $scheduler->addFunction('Grav\Common\Cache::purgeJob', [], $name );
$job->at($at); $job->at($at);
$job->output($logs); $job->output($logs);
$job->backlink('/config/system#caching');
// Cache Clear
$at = $config->get('system.cache.clear_at');
$clear_type = $config->get('system.cache.clear_job_type');
$name = 'cache-clear';
$logs = 'logs/' . $name . '.out';
$job = $scheduler->addFunction('Grav\Common\Cache::clearJob', [$clear_type], $name );
$job->at($at);
$job->output($logs);
$job->backlink('/config/system#caching');
} }

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common * @package Grav\Common
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -46,7 +47,7 @@ class Composer
$composer = static::getComposerLocation(); $composer = static::getComposerLocation();
if ($composer !== static::DEFAULT_PATH && is_executable($composer)) { if ($composer !== static::DEFAULT_PATH && is_executable($composer)) {
$file = fopen($composer, 'r'); $file = fopen($composer, 'rb');
$firstLine = fgets($file); $firstLine = fgets($file);
fclose($file); fclose($file);

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Config * @package Grav\Common\Config
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -198,9 +199,7 @@ abstract class CompiledBase
$cache = include $filename; $cache = include $filename;
if ( if (
!\is_array($cache) !\is_array($cache)
|| !isset($cache['checksum']) || !isset($cache['checksum'], $cache['data'], $cache['@class'])
|| !isset($cache['data'])
|| !isset($cache['@class'])
|| $cache['@class'] !== \get_class($this) || $cache['@class'] !== \get_class($this)
) { ) {
return false; return false;

View File

@@ -1,27 +1,30 @@
<?php <?php
/** /**
* @package Grav.Common.Config * @package Grav\Common\Config
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
namespace Grav\Common\Config; namespace Grav\Common\Config;
use Grav\Common\Data\Blueprint; use Grav\Common\Data\Blueprint;
use Grav\Common\Data\BlueprintSchema; use Grav\Common\Data\BlueprintSchema;
use Grav\Common\Grav; use Grav\Common\Grav;
/**
* Class CompiledBlueprints
* @package Grav\Common\Config
*/
class CompiledBlueprints extends CompiledBase class CompiledBlueprints extends CompiledBase
{ {
/** public function __construct($cacheFolder, array $files, $path)
* @var int Version number for the compiled file. {
*/ parent::__construct($cacheFolder, $files, $path);
public $version = 2;
/** $this->version = 2;
* @var BlueprintSchema Blueprints object. }
*/
protected $object;
/** /**
* Returns checksum from the configuration files. * Returns checksum from the configuration files.

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Config * @package Grav\Common\Config
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -12,16 +13,6 @@ use Grav\Common\File\CompiledYamlFile;
class CompiledConfig extends CompiledBase class CompiledConfig extends CompiledBase
{ {
/**
* @var int Version number for the compiled file.
*/
public $version = 1;
/**
* @var Config Configuration object.
*/
protected $object;
/** /**
* @var callable Blueprints loader. * @var callable Blueprints loader.
*/ */
@@ -32,6 +23,13 @@ class CompiledConfig extends CompiledBase
*/ */
protected $withDefaults; protected $withDefaults;
public function __construct($cacheFolder, array $files, $path)
{
parent::__construct($cacheFolder, $files, $path);
$this->version = 1;
}
/** /**
* Set blueprints for the configuration. * Set blueprints for the configuration.
* *

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Config * @package Grav\Common\Config
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -12,15 +13,12 @@ use Grav\Common\File\CompiledYamlFile;
class CompiledLanguages extends CompiledBase class CompiledLanguages extends CompiledBase
{ {
/** public function __construct($cacheFolder, array $files, $path)
* @var int Version number for the compiled file. {
*/ parent::__construct($cacheFolder, $files, $path);
public $version = 1;
/** $this->version = 1;
* @var Languages Configuration object. }
*/
protected $object;
/** /**
* Create configuration object. * Create configuration object.

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Config * @package Grav\Common\Config
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -18,14 +19,22 @@ class Config extends Data
{ {
public $environment; public $environment;
/** @var string */
protected $key;
/** @var string */ /** @var string */
protected $checksum; protected $checksum;
protected $modified = false; /** @var int */
protected $timestamp = 0; protected $timestamp = 0;
/** @var bool */
protected $modified = false;
public function key() public function key()
{ {
return $this->checksum(); if (null === $this->key) {
$this->key = md5($this->checksum . $this->timestamp);
}
return $this->key;
} }
public function checksum($checksum = null) public function checksum($checksum = null)
@@ -100,14 +109,13 @@ class Config extends Data
} }
} }
// Override the media.upload_limit based on PHP values // Legacy value - Override the media.upload_limit based on PHP values
$upload_limit = Utils::getUploadLimit(); $this->items['system']['media']['upload_limit'] = Utils::getUploadLimit();
$this->items['system']['media']['upload_limit'] = $upload_limit > 0 ? $upload_limit : 1024*1024*1024;
} }
/** /**
* @return mixed * @return mixed
* @deprecated * @deprecated 1.5 Use Grav::instance()['languages'] instead.
*/ */
public function getLanguages() public function getLanguages()
{ {

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Config * @package Grav\Common\Config
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Config * @package Grav\Common\Config
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -13,6 +14,22 @@ use Grav\Common\Utils;
class Languages extends Data class Languages extends Data
{ {
/**
* @var string|null
*/
protected $checksum;
/**
* @var string|null
*/
protected $modified;
/**
* @var string|null
*/
protected $timestamp;
public function checksum($checksum = null) public function checksum($checksum = null)
{ {
if ($checksum !== null) { if ($checksum !== null) {

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Config * @package Grav\Common\Config
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -12,11 +13,23 @@ use Grav\Common\File\CompiledYamlFile;
use Grav\Common\Data\Data; use Grav\Common\Data\Data;
use Grav\Common\Utils; use Grav\Common\Utils;
use Pimple\Container; use Pimple\Container;
use RocketTheme\Toolbox\File\YamlFile; use Psr\Http\Message\ServerRequestInterface;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator; use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
class Setup extends Data class Setup extends Data
{ {
/**
* @var array Environment aliases normalized to lower case.
*/
public static $environments = [
'' => 'unknown',
'127.0.0.1' => 'localhost',
'::1' => 'localhost'
];
/**
* @var string Current environment normalized to lower case.
*/
public static $environment; public static $environment;
protected $streams = [ protected $streams = [
@@ -120,6 +133,13 @@ class Setup extends Data
'' => ['user://pages'] '' => ['user://pages']
] ]
], ],
'user-data' => [
'type' => 'Stream',
'force' => true,
'prefixes' => [
'' => ['user://data']
]
],
'account' => [ 'account' => [
'type' => 'ReadOnlyStream', 'type' => 'ReadOnlyStream',
'prefixes' => [ 'prefixes' => [
@@ -133,11 +153,25 @@ class Setup extends Data
*/ */
public function __construct($container) public function __construct($container)
{ {
$environment = static::$environment ?? $container['uri']->environment() ?: 'localhost'; // If no environment is set, make sure we get one (CLI or hostname).
if (!static::$environment) {
if (\defined('GRAV_CLI')) {
static::$environment = 'cli';
} else {
/** @var ServerRequestInterface $request */
$request = $container['request'];
$host = $request->getUri()->getHost();
static::$environment = Utils::substrToString($host, ':');
}
}
// Resolve server aliases to the proper environment.
$environment = $this->environments[static::$environment] ?? static::$environment;
// Pre-load setup.php which contains our initial configuration. // Pre-load setup.php which contains our initial configuration.
// Configuration may contain dynamic parts, which is why we need to always load it. // Configuration may contain dynamic parts, which is why we need to always load it.
// If "GRAVE_SETUP_PATH" has been defined, use it, otherwise use defaults. // If "GRAV_SETUP_PATH" has been defined, use it, otherwise use defaults.
$file = \defined('GRAV_SETUP_PATH') ? GRAV_SETUP_PATH : GRAV_ROOT . '/setup.php'; $file = \defined('GRAV_SETUP_PATH') ? GRAV_SETUP_PATH : GRAV_ROOT . '/setup.php';
$setup = is_file($file) ? (array) include $file : []; $setup = is_file($file) ? (array) include $file : [];
@@ -151,8 +185,8 @@ class Setup extends Data
parent::__construct($setup); parent::__construct($setup);
// Set up environment. // Set up environment.
$this->def('environment', $environment ?: 'cli'); $this->def('environment', $environment);
$this->def('streams.schemes.environment.prefixes', ['' => $environment ? ["user://{$environment}"] : []]); $this->def('streams.schemes.environment.prefixes', ['' => ["user://{$this->get('environment')}"]]);
} }
/** /**
@@ -272,7 +306,7 @@ class Setup extends Data
// Create security.yaml if it doesn't exist. // Create security.yaml if it doesn't exist.
$filename = $locator->findResource('config://security.yaml', true, true); $filename = $locator->findResource('config://security.yaml', true, true);
$security_file = CompiledYamlFile::instance($filename); $security_file = CompiledYamlFile::instance($filename);
$security_content = $security_file->content(); $security_content = (array)$security_file->content();
if (!isset($security_content['salt'])) { if (!isset($security_content['salt'])) {
$security_content = array_merge($security_content, ['salt' => Utils::generateRandomString(14)]); $security_content = array_merge($security_content, ['salt' => Utils::generateRandomString(14)]);

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Data * @package Grav\Common\Data
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -10,7 +11,7 @@ namespace Grav\Common\Data;
use Grav\Common\File\CompiledYamlFile; use Grav\Common\File\CompiledYamlFile;
use Grav\Common\Grav; use Grav\Common\Grav;
use Grav\Common\User\User; use Grav\Common\User\Interfaces\UserInterface;
use RocketTheme\Toolbox\Blueprints\BlueprintForm; use RocketTheme\Toolbox\Blueprints\BlueprintForm;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator; use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
@@ -24,6 +25,18 @@ class Blueprint extends BlueprintForm
/** @var BlueprintSchema */ /** @var BlueprintSchema */
protected $blueprintSchema; protected $blueprintSchema;
/** @var array */
protected $defaults;
protected $handlers = [];
public function __clone()
{
if ($this->blueprintSchema) {
$this->blueprintSchema = clone $this->blueprintSchema;
}
}
public function setScope($scope) public function setScope($scope)
{ {
$this->scope = $scope; $this->scope = $scope;
@@ -55,7 +68,60 @@ class Blueprint extends BlueprintForm
{ {
$this->initInternals(); $this->initInternals();
return $this->blueprintSchema->getDefaults(); if (null === $this->defaults) {
$this->defaults = $this->blueprintSchema->getDefaults();
}
return $this->defaults;
}
/**
* Initialize blueprints with its dynamic fields.
*
* @return $this
*/
public function init()
{
foreach ($this->dynamic as $key => $data) {
// Locate field.
$path = explode('/', $key);
$current = &$this->items;
foreach ($path as $field) {
if (\is_object($current)) {
// Handle objects.
if (!isset($current->{$field})) {
$current->{$field} = [];
}
$current = &$current->{$field};
} else {
// Handle arrays and scalars.
if (!\is_array($current)) {
$current = [$field => []];
} elseif (!isset($current[$field])) {
$current[$field] = [];
}
$current = &$current[$field];
}
}
// Set dynamic property.
foreach ($data as $property => $call) {
$action = $call['action'];
$method = 'dynamic' . ucfirst($action);
if (isset($this->handlers[$action])) {
$callable = $this->handlers[$action];
$callable($current, $property, $call);
} elseif (method_exists($this, $method)) {
$this->{$method}($current, $property, $call);
}
}
}
return $this;
} }
/** /**
@@ -74,6 +140,20 @@ class Blueprint extends BlueprintForm
return $this->blueprintSchema->mergeData($data1, $data2, $name, $separator); return $this->blueprintSchema->mergeData($data1, $data2, $name, $separator);
} }
/**
* Process data coming from a form.
*
* @param array $data
* @param array $toggles
* @return array
*/
public function processForm(array $data, array $toggles = [])
{
$this->initInternals();
return $this->blueprintSchema->processForm($data, $toggles);
}
/** /**
* Return data fields that do not exist in blueprints. * Return data fields that do not exist in blueprints.
* *
@@ -105,15 +185,32 @@ class Blueprint extends BlueprintForm
* Filter data by using blueprints. * Filter data by using blueprints.
* *
* @param array $data * @param array $data
* @param bool $missingValuesAsNull
* @param bool $keepEmptyValues
* @return array * @return array
*/ */
public function filter(array $data) public function filter(array $data, bool $missingValuesAsNull = false, bool $keepEmptyValues = false)
{ {
$this->initInternals(); $this->initInternals();
return $this->blueprintSchema->filter($data); return $this->blueprintSchema->filter($data, $missingValuesAsNull, $keepEmptyValues);
} }
/**
* Flatten data by using blueprints.
*
* @param array $data
* @return array
*/
public function flattenData(array $data)
{
$this->initInternals();
return $this->blueprintSchema->flattenData($data);
}
/** /**
* Return blueprint data schema. * Return blueprint data schema.
* *
@@ -126,6 +223,11 @@ class Blueprint extends BlueprintForm
return $this->blueprintSchema; return $this->blueprintSchema;
} }
public function addDynamicHandler(string $name, callable $callable): void
{
$this->handlers[$name] = $callable;
}
/** /**
* Initialize validator. * Initialize validator.
*/ */
@@ -142,6 +244,7 @@ class Blueprint extends BlueprintForm
$this->blueprintSchema->embed('', $this->items); $this->blueprintSchema->embed('', $this->items);
$this->blueprintSchema->init(); $this->blueprintSchema->init();
$this->defaults = null;
} }
} }
@@ -268,24 +371,22 @@ class Blueprint extends BlueprintForm
*/ */
protected function dynamicSecurity(array &$field, $property, array &$call) protected function dynamicSecurity(array &$field, $property, array &$call)
{ {
if ($property) { if ($property || !empty($field['validate']['ignore'])) {
return; return;
} }
$grav = Grav::instance(); $grav = Grav::instance();
$actions = (array)$call['params']; $actions = (array)$call['params'];
/** @var User $user */ /** @var UserInterface|null $user */
if (isset($grav['user'])) { $user = $grav['user'] ?? null;
$user = Grav::instance()['user'] ?? null;
foreach ($actions as $action) { foreach ($actions as $action) {
if (!$user->authorize($action)) { if (!$user || !$user->authorize($action)) {
$this->addPropertyRecursive($field, 'validate', ['ignore' => true]); $this->addPropertyRecursive($field, 'validate', ['ignore' => true]);
return; return;
} }
} }
} }
}
/** /**
* @param array $field * @param array $field

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Data * @package Grav\Common\Data
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -52,7 +53,7 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
public function validate(array $data) public function validate(array $data)
{ {
try { try {
$messages = $this->validateArray($data, $this->nested); $messages = $this->validateArray($data, $this->nested, $this->items['']['form'] ?? []);
} catch (\RuntimeException $e) { } catch (\RuntimeException $e) {
throw (new ValidationException($e->getMessage(), $e->getCode(), $e))->setMessages(); throw (new ValidationException($e->getMessage(), $e->getCode(), $e))->setMessages();
@@ -63,44 +64,95 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
} }
} }
/**
* @param array $data
* @param array $toggles
* @return array
*/
public function processForm(array $data, array $toggles = [])
{
return $this->processFormRecursive($data, $toggles, $this->nested);
}
/** /**
* Filter data by using blueprints. * Filter data by using blueprints.
* *
* @param array $data Incoming data, for example from a form. * @param array $data Incoming data, for example from a form.
* @param bool $missingValuesAsNull Include missing values as nulls. * @param bool $missingValuesAsNull Include missing values as nulls.
* @param bool $keepEmptyValues Include empty values.
* @return array * @return array
*/ */
public function filter(array $data, $missingValuesAsNull = false) public function filter(array $data, $missingValuesAsNull = false, $keepEmptyValues = false)
{ {
return $this->filterArray($data, $this->nested, $missingValuesAsNull); return $this->filterArray($data, $this->nested, $missingValuesAsNull, $keepEmptyValues);
}
/**
* Flatten data by using blueprints.
*
* @param array $data Data to be flattened.
* @return array
*/
public function flattenData(array $data)
{
return $this->flattenArray($data, $this->nested, '');
} }
/** /**
* @param array $data * @param array $data
* @param array $rules * @param array $rules
* @param string $prefix
* @return array
*/
protected function flattenArray(array $data, array $rules, string $prefix)
{
$array = [];
foreach ($data as $key => $field) {
$val = $rules[$key] ?? $rules['*'] ?? null;
$rule = is_string($val) ? $this->items[$val] : null;
if ($rule || isset($val['*'])) {
// Item has been defined in blueprints.
$array[$prefix.$key] = $field;
} elseif (is_array($field) && is_array($val)) {
// Array has been defined in blueprints.
$array += $this->flattenArray($field, $val, $prefix . $key . '.');
} else {
// Undefined/extra item.
$array[$prefix.$key] = $field;
}
}
return $array;
}
/**
* @param array $data
* @param array $rules
* @param array $parent
* @return array * @return array
* @throws \RuntimeException * @throws \RuntimeException
*/ */
protected function validateArray(array $data, array $rules) protected function validateArray(array $data, array $rules, array $parent)
{ {
$messages = $this->checkRequired($data, $rules); $messages = $this->checkRequired($data, $rules);
foreach ($data as $key => $field) { foreach ($data as $key => $child) {
$val = $rules[$key] ?? $rules['*'] ?? null; $val = $rules[$key] ?? $rules['*'] ?? null;
$rule = \is_string($val) ? $this->items[$val] : null; $rule = \is_string($val) ? $this->items[$val] : null;
if ($rule) { if ($rule) {
// Item has been defined in blueprints. // Item has been defined in blueprints.
if (!empty($rule['validate']['ignore'])) { if (!empty($rule['disabled']) || !empty($rule['validate']['ignore'])) {
// Skip validation in the ignored field. // Skip validation in the ignored field.
continue; continue;
} }
$messages += Validation::validate($field, $rule); $messages += Validation::validate($child, $rule);
} elseif (\is_array($field) && \is_array($val)) { } elseif (\is_array($child) && \is_array($val)) {
// Array has been defined in blueprints. // Array has been defined in blueprints.
$messages += $this->validateArray($field, $val); $messages += $this->validateArray($child, $val, $rule ?? []);
} elseif (isset($rules['validation']) && $rules['validation'] === 'strict') { } elseif (isset($parent['validation']) && $parent['validation'] === 'strict') {
// Undefined/extra item. // Undefined/extra item.
throw new \RuntimeException(sprintf('%s is not defined in blueprints', $key)); throw new \RuntimeException(sprintf('%s is not defined in blueprints', $key));
} }
@@ -113,9 +165,10 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
* @param array $data * @param array $data
* @param array $rules * @param array $rules
* @param bool $missingValuesAsNull * @param bool $missingValuesAsNull
* @param bool $keepEmptyValues
* @return array * @return array
*/ */
protected function filterArray(array $data, array $rules, $missingValuesAsNull) protected function filterArray(array $data, array $rules, $missingValuesAsNull, $keepEmptyValues)
{ {
$results = []; $results = [];
@@ -126,8 +179,8 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
$val = $rules[$key] ?? $rules['*'] ?? null; $val = $rules[$key] ?? $rules['*'] ?? null;
$rule = \is_string($val) ? $this->items[$val] : null; $rule = \is_string($val) ? $this->items[$val] : null;
if (empty($rule['validate']['ignore'])) { if (empty($rule['disabled']) && empty($rule['validate']['ignore'])) {
$results[$key] = null; continue;
} }
} }
} }
@@ -139,25 +192,71 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
if ($rule) { if ($rule) {
// Item has been defined in blueprints. // Item has been defined in blueprints.
if (!empty($rule['validate']['ignore'])) { if (!empty($rule['disabled']) || !empty($rule['validate']['ignore'])) {
// Skip any data in the ignored field. // Skip any data in the ignored field.
unset($results[$key]);
continue; continue;
} }
$field = Validation::filter($field, $rule); $field = Validation::filter($field, $rule);
} elseif (\is_array($field) && \is_array($val)) { } elseif (\is_array($field) && \is_array($val)) {
// Array has been defined in blueprints. // Array has been defined in blueprints.
$field = $this->filterArray($field, $val, $missingValuesAsNull); $field = $this->filterArray($field, $val, $missingValuesAsNull, $keepEmptyValues);
} elseif (isset($rules['validation']) && $rules['validation'] === 'strict') { } elseif (isset($rules['validation']) && $rules['validation'] === 'strict') {
$field = null; // Skip any extra data.
continue;
} }
if (null !== $field && (!\is_array($field) || !empty($field))) { if ($keepEmptyValues || (null !== $field && (!\is_array($field) || !empty($field)))) {
$results[$key] = $field; $results[$key] = $field;
} }
} }
return $results; return $results ?: null;
}
/**
* @param array|null $data
* @param array $toggles
* @param array $nested
* @return array|null
*/
protected function processFormRecursive(?array $data, array $toggles, array $nested)
{
foreach ($nested as $key => $value) {
if ($key === '') {
continue;
}
if ($key === '*') {
// TODO: Add support to collections.
continue;
}
if (is_array($value)) {
// Recursively fetch the items.
$data[$key] = $this->processFormRecursive($data[$key] ?? null, $toggles[$key] ?? [], $value);
} else {
$field = $this->get($value);
// Do not add the field if:
if (
// Not an input field
!$field
// Field has been disabled
|| !empty($field['disabled'])
// Field validation is set to be ignored
|| !empty($field['validate']['ignore'])
// Field is toggleable and the toggle is turned off
|| (!empty($field['toggleable']) && empty($toggles[$key]))
) {
continue;
}
if (!isset($data[$key])) {
$data[$key] = null;
}
}
}
return $data;
} }
/** /**
@@ -177,7 +276,7 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
$field = $this->items[$field]; $field = $this->items[$field];
// Skip ignored field, it will not be required. // Skip ignored field, it will not be required.
if (!empty($field['validate']['ignore'])) { if (!empty($field['disabled']) || !empty($field['validate']['ignore'])) {
continue; continue;
} }

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Data * @package Grav\Common\Data
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -38,7 +39,8 @@ class Blueprints
public function get($type) public function get($type)
{ {
if (!isset($this->instances[$type])) { if (!isset($this->instances[$type])) {
$this->instances[$type] = $this->loadFile($type); $blueprint = $this->loadFile($type);
$this->instances[$type] = $blueprint;
} }
return $this->instances[$type]; return $this->instances[$type];
@@ -98,6 +100,15 @@ class Blueprints
$blueprint->setContext($this->search); $blueprint->setContext($this->search);
} }
return $blueprint->load()->init(); try {
$blueprint->load()->init();
} catch (\RuntimeException $e) {
$log = Grav::instance()['log'];
$log->error(sprintf('Blueprint %s cannot be loaded: %s', $name, $e->getMessage()));
throw $e;
}
return $blueprint;
} }
} }

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Data * @package Grav\Common\Data
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -25,12 +26,18 @@ class Data implements DataInterface, \ArrayAccess, \Countable, \JsonSerializable
/** @var array */ /** @var array */
protected $items; protected $items;
/** @var Blueprints */ /** @var Blueprint */
protected $blueprints; protected $blueprints;
/** @var File */ /** @var File */
protected $storage; protected $storage;
/** @var bool */
private $missingValuesAsNull = false;
/** @var bool */
private $keepEmptyValues = true;
/** /**
* @param array $items * @param array $items
* @param Blueprint|callable $blueprints * @param Blueprint|callable $blueprints
@@ -41,6 +48,28 @@ class Data implements DataInterface, \ArrayAccess, \Countable, \JsonSerializable
$this->blueprints = $blueprints; $this->blueprints = $blueprints;
} }
/**
* @param bool $value
* @return $this
*/
public function setKeepEmptyValues(bool $value)
{
$this->keepEmptyValues = $value;
return $this;
}
/**
* @param bool $value
* @return $this
*/
public function setMissingValuesAsNull(bool $value)
{
$this->missingValuesAsNull = $value;
return $this;
}
/** /**
* Get value by using dot notation for nested arrays/objects. * Get value by using dot notation for nested arrays/objects.
* *
@@ -197,11 +226,14 @@ class Data implements DataInterface, \ArrayAccess, \Countable, \JsonSerializable
/** /**
* @return $this * @return $this
* Filter all items by using blueprints.
*/ */
public function filter() public function filter()
{ {
$this->items = $this->blueprints()->filter($this->items); $args = func_get_args();
$missingValuesAsNull = (bool)(array_shift($args) ?? $this->missingValuesAsNull);
$keepEmptyValues = (bool)(array_shift($args) ?? $this->keepEmptyValues);
$this->items = $this->blueprints()->filter($this->items, $missingValuesAsNull, $keepEmptyValues);
return $this; return $this;
} }

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Data * @package Grav\Common\Data
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Data * @package Grav\Common\Data
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -11,35 +12,32 @@ namespace Grav\Common\Data;
use Grav\Common\Grav; use Grav\Common\Grav;
use Grav\Common\Utils; use Grav\Common\Utils;
use Grav\Common\Yaml; use Grav\Common\Yaml;
use RocketTheme\Toolbox\Compat\Yaml\Yaml as FallbackYaml;
class Validation class Validation
{ {
/** /**
* Validate value against a blueprint field definition. * Validate value against a blueprint field definition.
* *
* @param $value * @param mixed $value
* @param array $field * @param array $field
* @return array * @return array
*/ */
public static function validate($value, array $field) public static function validate($value, array $field)
{ {
$messages = [];
$validate = isset($field['validate']) ? (array) $field['validate'] : [];
// Validate type with fallback type text.
$type = (string) isset($validate['type']) ? $validate['type'] : $field['type'];
$method = 'type' . str_replace('-', '_', $type);
// If value isn't required, we will stop validation if empty value is given.
if ((empty($validate['required']) || (isset($validate['required']) && $validate['required'] !== true)) && ($value === null || $value === '' || (($field['type'] === 'checkbox' || $field['type'] === 'switch') && $value == false))) {
return $messages;
}
if (!isset($field['type'])) { if (!isset($field['type'])) {
$field['type'] = 'text'; $field['type'] = 'text';
} }
$validate = (array)($field['validate'] ?? null);
$type = $validate['type'] ?? $field['type'];
$required = $validate['required'] ?? false;
// If value isn't required, we will stop validation if empty value is given.
if ($required !== true && ($value === null || $value === '' || (($field['type'] === 'checkbox' || $field['type'] === 'switch') && $value == false))
) {
return [];
}
// Get language class. // Get language class.
$language = Grav::instance()['language']; $language = Grav::instance()['language'];
@@ -49,17 +47,17 @@ class Validation
: $language->translate('GRAV.FORM.INVALID_INPUT', null, true) . ' "' . $language->translate($name) . '"'; : $language->translate('GRAV.FORM.INVALID_INPUT', null, true) . ' "' . $language->translate($name) . '"';
// Validate type with fallback type text.
$method = 'type' . str_replace('-', '_', $type);
// If this is a YAML field validate/filter as such // If this is a YAML field validate/filter as such
if ($type !== 'yaml' && isset($field['yaml']) && $field['yaml'] === true) { if (isset($field['yaml']) && $field['yaml'] === true) {
$method = 'typeYaml'; $method = 'typeYaml';
} }
if (method_exists(__CLASS__, $method)) { $messages = [];
$success = self::$method($value, $validate, $field);
} else {
$success = true;
}
$success = method_exists(__CLASS__, $method) ? self::$method($value, $validate, $field) : true;
if (!$success) { if (!$success) {
$messages[$field['name']][] = $message; $messages[$field['name']][] = $message;
} }
@@ -89,7 +87,7 @@ class Validation
*/ */
public static function filter($value, array $field) public static function filter($value, array $field)
{ {
$validate = isset($field['validate']) ? (array) $field['validate'] : []; $validate = (array)($field['filter'] ?? $field['validate'] ?? null);
// If value isn't required, we will return null if empty value is given. // If value isn't required, we will return null if empty value is given.
if (($value === null || $value === '') && empty($validate['required'])) { if (($value === null || $value === '') && empty($validate['required'])) {
@@ -99,19 +97,17 @@ class Validation
if (!isset($field['type'])) { if (!isset($field['type'])) {
$field['type'] = 'text'; $field['type'] = 'text';
} }
$type = $field['filter']['type'] ?? $field['validate']['type'] ?? $field['type'];
// Validate type with fallback type text.
$type = (string) isset($field['validate']['type']) ? $field['validate']['type'] : $field['type'];
$method = 'filter' . ucfirst(str_replace('-', '_', $type)); $method = 'filter' . ucfirst(str_replace('-', '_', $type));
// If this is a YAML field validate/filter as such // If this is a YAML field validate/filter as such
if ($type !== 'yaml' && isset($field['yaml']) && $field['yaml'] === true) { if (isset($field['yaml']) && $field['yaml'] === true) {
$method = 'filterYaml'; $method = 'filterYaml';
} }
if (!method_exists(__CLASS__, $method)) { if (!method_exists(__CLASS__, $method)) {
$method = 'filterText'; $method = isset($field['array']) && $field['array'] === true ? 'filterArray' : 'filterText';
} }
return self::$method($value, $validate, $field); return self::$method($value, $validate, $field);
@@ -133,6 +129,10 @@ class Validation
$value = (string)$value; $value = (string)$value;
if (!empty($params['trim'])) {
$value = trim($value);
}
if (isset($params['min']) && \strlen($value) < $params['min']) { if (isset($params['min']) && \strlen($value) < $params['min']) {
return false; return false;
} }
@@ -155,9 +155,31 @@ class Validation
protected static function filterText($value, array $params, array $field) protected static function filterText($value, array $params, array $field)
{ {
if (!\is_string($value) && !is_numeric($value)) {
return '';
}
if (!empty($params['trim'])) {
$value = trim($value);
}
return (string) $value; return (string) $value;
} }
/**
* @param mixed $value
* @param array $params
* @param array $field
* @return string|null
*/
protected static function filterCheckbox($value, array $params, array $field)
{
$value = (string)$value;
$field_value = (string)($field['value'] ?? '1');
return $value === $field_value ? $value : null;
}
protected static function filterCommaList($value, array $params, array $field) protected static function filterCommaList($value, array $params, array $field)
{ {
return \is_array($value) ? $value : preg_split('/\s*,\s*/', $value, -1, PREG_SPLIT_NO_EMPTY); return \is_array($value) ? $value : preg_split('/\s*,\s*/', $value, -1, PREG_SPLIT_NO_EMPTY);
@@ -253,8 +275,8 @@ class Validation
*/ */
public static function typeCheckbox($value, array $params, array $field) public static function typeCheckbox($value, array $params, array $field)
{ {
$value = (string) $value; $value = (string)$value;
$field_value = (string) ($field['value'] ?? '1'); $field_value = (string)($field['value'] ?? '1');
return $value === $field_value; return $value === $field_value;
} }
@@ -282,6 +304,10 @@ class Validation
*/ */
public static function typeToggle($value, array $params, array $field) public static function typeToggle($value, array $params, array $field)
{ {
if (\is_bool($value)) {
$value = (int)$value;
}
return self::typeArray((array) $value, $params, $field); return self::typeArray((array) $value, $params, $field);
} }
@@ -295,12 +321,12 @@ class Validation
*/ */
public static function typeFile($value, array $params, array $field) public static function typeFile($value, array $params, array $field)
{ {
return self::typeArray((array) $value, $params, $field); return self::typeArray((array)$value, $params, $field);
} }
protected static function filterFile($value, array $params, array $field) protected static function filterFile($value, array $params, array $field)
{ {
return (array) $value; return (array)$value;
} }
/** /**
@@ -560,10 +586,22 @@ class Validation
} }
} }
$options = isset($field['options']) ? array_keys($field['options']) : []; // If creating new values is allowed, no further checks are needed.
$values = isset($field['use']) && $field['use'] === 'keys' ? array_keys($value) : $value; if (!empty($field['selectize']['create'])) {
return true;
}
return !($options && array_diff($values, $options)); $options = $field['options'] ?? [];
$use = $field['use'] ?? 'values';
if (empty($field['selectize']) || empty($field['multiple'])) {
$options = array_keys($options);
}
if ($use === 'keys') {
$value = array_keys($value);
}
return !($options && array_diff($value, $options));
} }
protected static function filterArray($value, $params, $field) protected static function filterArray($value, $params, $field)
@@ -597,11 +635,15 @@ class Validation
if (isset($field['ignore_empty']) && Utils::isPositive($field['ignore_empty'])) { if (isset($field['ignore_empty']) && Utils::isPositive($field['ignore_empty'])) {
foreach ($values as $key => $val) { foreach ($values as $key => $val) {
if ($val === '') {
unset($values[$key]);
} elseif (\is_array($val)) {
foreach ($val as $inner_key => $inner_value) { foreach ($val as $inner_key => $inner_value) {
if ($inner_value == '') { if ($inner_value === '') {
unset($val[$inner_key]); unset($val[$inner_key]);
} }
} }
}
$values[$key] = $val; $values[$key] = $val;
} }
@@ -662,6 +704,23 @@ class Validation
return $value; return $value;
} }
/**
* Input value which can be ignored.
*
* @param mixed $value Value to be validated.
* @param array $params Validation parameters.
* @param array $field Blueprint for the field.
* @return bool True if validation succeeded.
*/
public static function typeUnset($value, array $params, array $field)
{
return true;
}
public static function filterUnset($value, array $params, array $field)
{
return null;
}
// HTML5 attributes (min, max and range are handled inside the types) // HTML5 attributes (min, max and range are handled inside the types)
@@ -729,20 +788,17 @@ class Validation
public static function validateInt($value, $params) public static function validateInt($value, $params)
{ {
return is_numeric($value) && (int) $value == $value; return is_numeric($value) && (int)$value == $value;
} }
protected static function filterInt($value, $params) protected static function filterInt($value, $params)
{ {
return (int) $value; return (int)$value;
} }
public static function validateArray($value, $params) public static function validateArray($value, $params)
{ {
return \is_array($value) return \is_array($value) || ($value instanceof \ArrayAccess && $value instanceof \Traversable && $value instanceof \Countable);
|| ($value instanceof \ArrayAccess
&& $value instanceof \Traversable
&& $value instanceof \Countable);
} }
public static function filterItem_List($value, $params) public static function filterItem_List($value, $params)

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Data * @package Grav\Common\Data
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */

View File

@@ -1,14 +1,16 @@
<?php <?php
/** /**
* @package Grav.Common * @package Grav\Common
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
namespace Grav\Common; namespace Grav\Common;
use DebugBar\DataCollector\ConfigCollector; use DebugBar\DataCollector\ConfigCollector;
use DebugBar\DataCollector\DataCollectorInterface;
use DebugBar\DataCollector\ExceptionsCollector; use DebugBar\DataCollector\ExceptionsCollector;
use DebugBar\DataCollector\MemoryCollector; use DebugBar\DataCollector\MemoryCollector;
use DebugBar\DataCollector\MessagesCollector; use DebugBar\DataCollector\MessagesCollector;
@@ -19,6 +21,9 @@ use DebugBar\DebugBar;
use DebugBar\JavascriptRenderer; use DebugBar\JavascriptRenderer;
use DebugBar\StandardDebugBar; use DebugBar\StandardDebugBar;
use Grav\Common\Config\Config; use Grav\Common\Config\Config;
use Grav\Common\Processors\ProcessorInterface;
use Twig\Template;
use Twig\TemplateWrapper;
class Debugger class Debugger
{ {
@@ -37,10 +42,12 @@ class Debugger
/** @var bool */ /** @var bool */
protected $enabled; protected $enabled;
protected $initialized = false;
/** @var array */ /** @var array */
protected $timers = []; protected $timers = [];
/** @var string[] $deprecations */ /** @var array $deprecations */
protected $deprecations = []; protected $deprecations = [];
/** @var callable */ /** @var callable */
@@ -84,13 +91,18 @@ class Debugger
*/ */
public function init() public function init()
{ {
if ($this->initialized) {
return $this;
}
$this->grav = Grav::instance(); $this->grav = Grav::instance();
$this->config = $this->grav['config']; $this->config = $this->grav['config'];
// Enable/disable debugger based on configuration. // Enable/disable debugger based on configuration.
$this->enabled = $this->config->get('system.debugger.enabled'); $this->enabled = (bool)$this->config->get('system.debugger.enabled');
if ($this->enabled()) { if ($this->enabled()) {
$this->initialized = true;
$plugins_config = (array)$this->config->get('plugins'); $plugins_config = (array)$this->config->get('plugins');
@@ -112,12 +124,12 @@ class Debugger
* *
* @param bool $state If null, the method returns the enabled value. If set, the method sets the enabled state * @param bool $state If null, the method returns the enabled value. If set, the method sets the enabled state
* *
* @return null * @return bool
*/ */
public function enabled($state = null) public function enabled($state = null)
{ {
if ($state !== null) { if ($state !== null) {
$this->enabled = $state; $this->enabled = (bool)$state;
} }
return $this->enabled; return $this->enabled;
@@ -173,7 +185,7 @@ class Debugger
/** /**
* Adds a data collector * Adds a data collector
* *
* @param $collector * @param DataCollectorInterface $collector
* *
* @return $this * @return $this
* @throws \DebugBar\DebugBarException * @throws \DebugBar\DebugBarException
@@ -188,9 +200,9 @@ class Debugger
/** /**
* Returns a data collector * Returns a data collector
* *
* @param $collector * @param DataCollectorInterface $collector
* *
* @return \DebugBar\DataCollector\DataCollectorInterface * @return DataCollectorInterface
* @throws \DebugBar\DebugBarException * @throws \DebugBar\DebugBarException
*/ */
public function getCollector($collector) public function getCollector($collector)
@@ -262,7 +274,7 @@ class Debugger
*/ */
public function startTimer($name, $description = null) public function startTimer($name, $description = null)
{ {
if ($name[0] === '_' || $this->enabled()) { if (strpos($name, '_') === 0 || $this->enabled()) {
$this->debugbar['time']->startMeasure($name, $description); $this->debugbar['time']->startMeasure($name, $description);
$this->timers[] = $name; $this->timers[] = $name;
} }
@@ -279,7 +291,7 @@ class Debugger
*/ */
public function stopTimer($name) public function stopTimer($name)
{ {
if (\in_array($name, $this->timers, true) && ($name[0] === '_' || $this->enabled())) { if (\in_array($name, $this->timers, true) && (strpos($name, '_') === 0 || $this->enabled())) {
$this->debugbar['time']->stopMeasure($name); $this->debugbar['time']->stopMeasure($name);
} }
@@ -289,7 +301,7 @@ class Debugger
/** /**
* Dump variables into the Messages tab of the Debug Bar * Dump variables into the Messages tab of the Debug Bar
* *
* @param $message * @param mixed $message
* @param string $label * @param string $label
* @param bool $isString * @param bool $isString
* *
@@ -312,7 +324,7 @@ class Debugger
*/ */
public function addException(\Exception $e) public function addException(\Exception $e)
{ {
if ($this->enabled()) { if ($this->initialized && $this->enabled()) {
$this->debugbar['exceptions']->addException($e); $this->debugbar['exceptions']->addException($e);
} }
@@ -335,7 +347,7 @@ class Debugger
*/ */
public function deprecatedErrorHandler($errno, $errstr, $errfile, $errline) public function deprecatedErrorHandler($errno, $errstr, $errfile, $errline)
{ {
if ($errno !== E_USER_DEPRECATED) { if ($errno !== E_USER_DEPRECATED && $errno !== E_DEPRECATED) {
if ($this->errorHandler) { if ($this->errorHandler) {
return \call_user_func($this->errorHandler, $errno, $errstr, $errfile, $errline); return \call_user_func($this->errorHandler, $errno, $errstr, $errfile, $errline);
} }
@@ -347,57 +359,183 @@ class Debugger
return true; return true;
} }
$backtrace = debug_backtrace(false); // Figure out error scope from the error.
$scope = 'unknown';
if (stripos($errstr, 'grav') !== false) {
$scope = 'grav';
} elseif (strpos($errfile, '/twig/') !== false) {
$scope = 'twig';
} elseif (stripos($errfile, '/yaml/') !== false) {
$scope = 'yaml';
} elseif (strpos($errfile, '/vendor/') !== false) {
$scope = 'vendor';
}
// Clean up backtrace to make it more useful.
$backtrace = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT);
// Skip current call. // Skip current call.
array_shift($backtrace); array_shift($backtrace);
// Find yaml file where the error happened.
if ($scope === 'yaml') {
foreach ($backtrace as $current) {
if (isset($current['args'])) {
foreach ($current['args'] as $arg) {
if ($arg instanceof \SplFileInfo) {
$arg = $arg->getPathname();
}
if (\is_string($arg) && preg_match('/.+\.(yaml|md)$/i', $arg)) {
$errfile = $arg;
$errline = 0;
break 2;
}
}
}
}
}
// Filter arguments.
$cut = 0;
$previous = null;
foreach ($backtrace as $i => &$current) {
if (isset($current['args'])) {
$args = [];
foreach ($current['args'] as $arg) {
if (\is_string($arg)) {
$arg = "'" . $arg . "'";
if (mb_strlen($arg) > 100) {
$arg = 'string';
}
} elseif (\is_bool($arg)) {
$arg = $arg ? 'true' : 'false';
} elseif (\is_scalar($arg)) {
$arg = $arg;
} elseif (\is_object($arg)) {
$arg = get_class($arg) . ' $object';
} elseif (\is_array($arg)) {
$arg = '$array';
} else {
$arg = '$object';
}
$args[] = $arg;
}
$current['args'] = $args;
}
$object = $current['object'] ?? null;
unset($current['object']);
$reflection = null;
if ($object instanceof TemplateWrapper) {
$reflection = new \ReflectionObject($object);
$property = $reflection->getProperty('template');
$property->setAccessible(true);
$object = $property->getValue($object);
}
if ($object instanceof Template) {
$file = $current['file'] ?? null;
if (preg_match('`(Template.php|TemplateWrapper.php)$`', $file)) {
$current = null;
continue;
}
$debugInfo = $object->getDebugInfo();
$line = 1;
if (!$reflection) {
foreach ($debugInfo as $codeLine => $templateLine) {
if ($codeLine <= $current['line']) {
$line = $templateLine;
break;
}
}
}
$src = $object->getSourceContext();
//$code = preg_split('/\r\n|\r|\n/', $src->getCode());
//$current['twig']['twig'] = trim($code[$line - 1]);
$current['twig']['file'] = $src->getPath();
$current['twig']['line'] = $line;
$prevFile = $previous['file'] ?? null;
if ($prevFile && $file === $prevFile) {
$prevLine = $previous['line'];
$line = 1;
foreach ($debugInfo as $codeLine => $templateLine) {
if ($codeLine <= $prevLine) {
$line = $templateLine;
break;
}
}
//$previous['twig']['twig'] = trim($code[$line - 1]);
$previous['twig']['file'] = $src->getPath();
$previous['twig']['line'] = $line;
}
$cut = $i;
} elseif ($object instanceof ProcessorInterface) {
$cut = $cut ?: $i;
break;
}
$previous = &$backtrace[$i];
}
unset($current);
if ($cut) {
$backtrace = array_slice($backtrace, 0, $cut + 1);
}
$backtrace = array_values(array_filter($backtrace));
// Skip vendor libraries and the method where error was triggered. // Skip vendor libraries and the method where error was triggered.
while ($current = array_shift($backtrace)) { foreach ($backtrace as $i => $current) {
if (isset($current['file']) && strpos($current['file'], 'vendor') !== false) { if (!isset($current['file'])) {
continue;
}
if (strpos($current['file'], '/vendor/') !== false) {
$cut = $i + 1;
continue; continue;
} }
if (isset($current['function']) && ($current['function'] === 'user_error' || $current['function'] === 'trigger_error')) { if (isset($current['function']) && ($current['function'] === 'user_error' || $current['function'] === 'trigger_error')) {
$current = array_shift($backtrace); $cut = $i + 1;
continue;
} }
break; break;
} }
// Add back last call. if ($cut) {
array_unshift($backtrace, $current); $backtrace = array_slice($backtrace, $cut);
}
$backtrace = array_values(array_filter($backtrace));
// Filter arguments. $current = reset($backtrace);
foreach ($backtrace as &$current) {
if (isset($current['args'])) {
$args = [];
foreach ($current['args'] as $arg) {
if (\is_string($arg)) {
$args[] = "'" . $arg . "'";
} elseif (\is_bool($arg)) {
$args[] = $arg ? 'true' : 'false';
} elseif (\is_scalar($arg)) {
$args[] = $arg;
} elseif (\is_object($arg)) {
$args[] = get_class($arg) . ' $object';
} elseif (\is_array($arg)) {
$args[] = '$array';
} else {
$args[] = '$object';
}
}
$current['args'] = $args;
}
}
unset($current);
$this->deprecations[] = [ // If the issue happened inside twig file, change the file and line to match that file.
$file = $current['twig']['file'] ?? '';
if ($file) {
$errfile = $file;
$errline = $current['twig']['line'] ?? 0;
}
$deprecation = [
'scope' => $scope,
'message' => $errstr, 'message' => $errstr,
'file' => $errfile, 'file' => $errfile,
'line' => $errline, 'line' => $errline,
'trace' => $backtrace, 'trace' => $backtrace,
'count' => 1
]; ];
$this->deprecations[] = $deprecation;
// Do not pass forward. // Do not pass forward.
return true; return true;
} }
@@ -422,20 +560,10 @@ class Debugger
protected function getDepracatedMessage($deprecated) protected function getDepracatedMessage($deprecated)
{ {
$scope = 'unknown'; $scope = $deprecated['scope'];
if (stripos($deprecated['message'], 'grav') !== false) {
$scope = 'grav';
} elseif (!isset($deprecated['file'])) {
$scope = 'unknown';
} elseif (stripos($deprecated['file'], 'twig') !== false) {
$scope = 'twig';
} elseif (stripos($deprecated['file'], 'yaml') !== false) {
$scope = 'yaml';
} elseif (stripos($deprecated['file'], 'vendor') !== false) {
$scope = 'vendor';
}
$trace = []; $trace = [];
if (isset($deprecated['trace'])) {
foreach ($deprecated['trace'] as $current) { foreach ($deprecated['trace'] as $current) {
$class = $current['class'] ?? ''; $class = $current['class'] ?? '';
$type = $current['type'] ?? ''; $type = $current['type'] ?? '';
@@ -446,14 +574,23 @@ class Debugger
unset($current['class'], $current['type'], $current['function'], $current['args']); unset($current['class'], $current['type'], $current['function'], $current['args']);
if (isset($current['twig'])) {
$trace[] = $current['twig'];
} else {
$trace[] = ['call' => $class . $type . $function] + $current; $trace[] = ['call' => $class . $type . $function] + $current;
} }
}
}
$array = [
'message' => $deprecated['message'],
'file' => $deprecated['file'],
'line' => $deprecated['line'],
'trace' => $trace
];
return [ return [
[ array_filter($array),
'message' => $deprecated['message'],
'trace' => $trace
],
$scope $scope
]; ];
} }
@@ -464,6 +601,6 @@ class Debugger
return ''; return '';
} }
return $trace['function'] . '(' . implode(', ', $trace['args']) . ')'; return $trace['function'] . '(' . implode(', ', $trace['args'] ?? []) . ')';
} }
} }

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Errors * @package Grav\Common\Errors
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -18,6 +19,13 @@ class BareHandler extends Handler
*/ */
public function handle() public function handle()
{ {
$inspector = $this->getInspector();
$code = $inspector->getException()->getCode();
if ( ($code >= 400) && ($code < 600) )
{
$this->getRun()->sendHttpCode($code);
}
return Handler::QUIT; return Handler::QUIT;
} }

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Errors * @package Grav\Common\Errors
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -17,11 +18,11 @@ class Errors
{ {
$grav = Grav::instance(); $grav = Grav::instance();
$config = $grav['config']->get('system.errors'); $config = $grav['config']->get('system.errors');
$jsonRequest = $_SERVER && isset($_SERVER['HTTP_ACCEPT']) && $_SERVER['HTTP_ACCEPT'] == 'application/json'; $jsonRequest = $_SERVER && isset($_SERVER['HTTP_ACCEPT']) && $_SERVER['HTTP_ACCEPT'] === 'application/json';
// Setup Whoops-based error handler // Setup Whoops-based error handler
$system = new SystemFacade; $system = new SystemFacade;
$whoops = new \Whoops\Run($system); $whoops = new Whoops\Run($system);
$verbosity = 1; $verbosity = 1;
@@ -49,18 +50,9 @@ class Errors
break; break;
} }
if (method_exists('Whoops\Util\Misc', 'isAjaxRequest')) { //Whoops 2.0
if (Whoops\Util\Misc::isAjaxRequest() || $jsonRequest) { if (Whoops\Util\Misc::isAjaxRequest() || $jsonRequest) {
$whoops->pushHandler(new Whoops\Handler\JsonResponseHandler); $whoops->pushHandler(new Whoops\Handler\JsonResponseHandler);
} }
} elseif (function_exists('Whoops\isAjaxRequest')) { //Whoops 2.0.0-alpha
if (Whoops\isAjaxRequest() || $jsonRequest) {
$whoops->pushHandler(new Whoops\Handler\JsonResponseHandler);
}
} else { //Whoops 1.x
$json_page = new Whoops\Handler\JsonResponseHandler;
$json_page->onlyForAjaxRequests(true);
}
if (isset($config['log']) && $config['log']) { if (isset($config['log']) && $config['log']) {
$logger = $grav['log']; $logger = $grav['log'];
@@ -70,7 +62,7 @@ class Errors
} catch (\Exception $e) { } catch (\Exception $e) {
echo $e; echo $e;
} }
}, 'log'); });
} }
$whoops->register(); $whoops->register();

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Errors * @package Grav\Common\Errors
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -20,7 +21,7 @@ class SimplePageHandler extends Handler
public function __construct() public function __construct()
{ {
// Add the default, local resource search path: // Add the default, local resource search path:
$this->searchPaths[] = __DIR__ . "/Resources"; $this->searchPaths[] = __DIR__ . '/Resources';
} }
/** /**
@@ -31,10 +32,14 @@ class SimplePageHandler extends Handler
$inspector = $this->getInspector(); $inspector = $this->getInspector();
$helper = new TemplateHelper(); $helper = new TemplateHelper();
$templateFile = $this->getResource("layout.html.php"); $templateFile = $this->getResource('layout.html.php');
$cssFile = $this->getResource("error.css"); $cssFile = $this->getResource('error.css');
$code = $inspector->getException()->getCode(); $code = $inspector->getException()->getCode();
if ( ($code >= 400) && ($code < 600) )
{
$this->getRun()->sendHttpCode($code);
}
$message = $inspector->getException()->getMessage(); $message = $inspector->getException()->getMessage();
if ($inspector->getException() instanceof \ErrorException) { if ($inspector->getException() instanceof \ErrorException) {
@@ -42,9 +47,9 @@ class SimplePageHandler extends Handler
} }
$vars = array( $vars = array(
"stylesheet" => file_get_contents($cssFile), 'stylesheet' => file_get_contents($cssFile),
"code" => $code, 'code' => $code,
"message" => filter_var(rawurldecode($message), FILTER_SANITIZE_STRING), 'message' => filter_var(rawurldecode($message), FILTER_SANITIZE_STRING),
); );
$helper->setVariables($vars); $helper->setVariables($vars);
@@ -54,7 +59,7 @@ class SimplePageHandler extends Handler
} }
/** /**
* @param $resource * @param string $resource
* *
* @return string * @return string
* @throws \RuntimeException * @throws \RuntimeException
@@ -70,7 +75,7 @@ class SimplePageHandler extends Handler
// Search through available search paths, until we find the // Search through available search paths, until we find the
// resource we're after: // resource we're after:
foreach ($this->searchPaths as $path) { foreach ($this->searchPaths as $path) {
$fullPath = $path . "/$resource"; $fullPath = "{$path}/{$resource}";
if (is_file($fullPath)) { if (is_file($fullPath)) {
// Cache the result: // Cache the result:

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.Errors * @package Grav\Common\Errors
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.File * @package Grav\Common\File
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -82,4 +83,28 @@ trait CompiledFile
return parent::content($var); return parent::content($var);
} }
/**
* Serialize file.
*/
public function __sleep()
{
return [
'filename',
'extension',
'raw',
'content',
'settings'
];
}
/**
* Unserialize file.
*/
public function __wakeup()
{
if (!isset(static::$instances[$this->filename])) {
static::$instances[$this->filename] = $this;
}
}
} }

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.File * @package Grav\Common\File
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -23,6 +24,6 @@ class CompiledJsonFile extends JsonFile
*/ */
protected function decode($var, $assoc = true) protected function decode($var, $assoc = true)
{ {
return (array) json_decode($var, $assoc); return (array)json_decode($var, $assoc);
} }
} }

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.File * @package Grav\Common\File
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.File * @package Grav\Common\File
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */

View File

@@ -1,13 +1,16 @@
<?php <?php
/** /**
* @package Grav.Common.FileSystem * @package Grav\Common\Filesystem
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
namespace Grav\Common\Filesystem; namespace Grav\Common\Filesystem;
use Grav\Common\Utils;
abstract class Archiver abstract class Archiver
{ {
protected $options = [ protected $options = [
@@ -19,11 +22,11 @@ abstract class Archiver
public static function create($compression) public static function create($compression)
{ {
if ($compression == 'zip') { if ($compression === 'zip') {
return new ZipArchiver();
} else {
return new ZipArchiver(); return new ZipArchiver();
} }
return new ZipArchiver();
} }
public function setArchive($archive_file) public function setArchive($archive_file)
@@ -34,6 +37,11 @@ abstract class Archiver
public function setOptions($options) public function setOptions($options)
{ {
// Set infinite PHP execution time if possible.
if (function_exists('set_time_limit') && !Utils::isFunctionDisabled('set_time_limit')) {
set_time_limit(0);
}
$this->options = $options + $this->options; $this->options = $options + $this->options;
return $this; return $this;
} }

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.FileSystem * @package Grav\Common\Filesystem
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -21,6 +22,10 @@ abstract class Folder
*/ */
public static function lastModifiedFolder($path) public static function lastModifiedFolder($path)
{ {
if (!file_exists($path)) {
return 0;
}
$last_modified = 0; $last_modified = 0;
/** @var UniformResourceLocator $locator */ /** @var UniformResourceLocator $locator */
@@ -55,6 +60,10 @@ abstract class Folder
*/ */
public static function lastModifiedFile($path, $extensions = 'md|yaml') public static function lastModifiedFile($path, $extensions = 'md|yaml')
{ {
if (!file_exists($path)) {
return 0;
}
$last_modified = 0; $last_modified = 0;
/** @var UniformResourceLocator $locator */ /** @var UniformResourceLocator $locator */
@@ -86,14 +95,16 @@ abstract class Folder
/** /**
* Recursively md5 hash all files in a path * Recursively md5 hash all files in a path
* *
* @param $path * @param string $path
* @return string * @return string
*/ */
public static function hashAllFiles($path) public static function hashAllFiles($path)
{ {
$flags = \RecursiveDirectoryIterator::SKIP_DOTS;
$files = []; $files = [];
if (file_exists($path)) {
$flags = \RecursiveDirectoryIterator::SKIP_DOTS;
/** @var UniformResourceLocator $locator */ /** @var UniformResourceLocator $locator */
$locator = Grav::instance()['locator']; $locator = Grav::instance()['locator'];
if ($locator->isStream($path)) { if ($locator->isStream($path)) {
@@ -107,6 +118,7 @@ abstract class Folder
foreach ($iterator as $file) { foreach ($iterator as $file) {
$files[] = $file->getPathname() . '?'. $file->getMTime(); $files[] = $file->getPathname() . '?'. $file->getMTime();
} }
}
return md5(serialize($files)); return md5(serialize($files));
} }
@@ -141,6 +153,7 @@ abstract class Folder
*/ */
public static function getRelativePathDotDot($path, $base) public static function getRelativePathDotDot($path, $base)
{ {
// Normalize paths.
$base = preg_replace('![\\\/]+!', '/', $base); $base = preg_replace('![\\\/]+!', '/', $base);
$path = preg_replace('![\\\/]+!', '/', $path); $path = preg_replace('![\\\/]+!', '/', $path);
@@ -148,8 +161,8 @@ abstract class Folder
return ''; return '';
} }
$baseParts = explode('/', isset($base[0]) && '/' === $base[0] ? substr($base, 1) : $base); $baseParts = explode('/', ltrim($base, '/'));
$pathParts = explode('/', isset($path[0]) && '/' === $path[0] ? substr($path, 1) : $path); $pathParts = explode('/', ltrim($path, '/'));
array_pop($baseParts); array_pop($baseParts);
$lastPart = array_pop($pathParts); $lastPart = array_pop($pathParts);
@@ -164,7 +177,7 @@ abstract class Folder
$path = str_repeat('../', count($baseParts)) . implode('/', $pathParts); $path = str_repeat('../', count($baseParts)) . implode('/', $pathParts);
return '' === $path return '' === $path
|| '/' === $path[0] || strpos($path, '/') === 0
|| false !== ($colonPos = strpos($path, ':')) && ($colonPos < ($slashPos = strpos($path, '/')) || false === $slashPos) || false !== ($colonPos = strpos($path, ':')) && ($colonPos < ($slashPos = strpos($path, '/')) || false === $slashPos)
? "./$path" : $path; ? "./$path" : $path;
} }
@@ -197,16 +210,19 @@ abstract class Folder
if ($path === false) { if ($path === false) {
throw new \RuntimeException("Path doesn't exist."); throw new \RuntimeException("Path doesn't exist.");
} }
if (!file_exists($path)) {
return [];
}
$compare = isset($params['compare']) ? 'get' . $params['compare'] : null; $compare = isset($params['compare']) ? 'get' . $params['compare'] : null;
$pattern = isset($params['pattern']) ? $params['pattern'] : null; $pattern = $params['pattern'] ?? null;
$filters = isset($params['filters']) ? $params['filters'] : null; $filters = $params['filters'] ?? null;
$recursive = isset($params['recursive']) ? $params['recursive'] : true; $recursive = $params['recursive'] ?? true;
$levels = isset($params['levels']) ? $params['levels'] : -1; $levels = $params['levels'] ?? -1;
$key = isset($params['key']) ? 'get' . $params['key'] : null; $key = isset($params['key']) ? 'get' . $params['key'] : null;
$value = isset($params['value']) ? 'get' . $params['value'] : ($recursive ? 'getSubPathname' : 'getFilename'); $value = 'get' . ($params['value'] ?? ($recursive ? 'SubPathname' : 'Filename'));
$folders = isset($params['folders']) ? $params['folders'] : true; $folders = $params['folders'] ?? true;
$files = isset($params['files']) ? $params['files'] : true; $files = $params['files'] ?? true;
/** @var UniformResourceLocator $locator */ /** @var UniformResourceLocator $locator */
$locator = Grav::instance()['locator']; $locator = Grav::instance()['locator'];
@@ -233,7 +249,7 @@ abstract class Folder
/** @var \RecursiveDirectoryIterator $file */ /** @var \RecursiveDirectoryIterator $file */
foreach ($iterator as $file) { foreach ($iterator as $file) {
// Ignore hidden files. // Ignore hidden files.
if ($file->getFilename()[0] === '.') { if (strpos($file->getFilename(), '.') === 0 && $file->isFile()) {
continue; continue;
} }
if (!$folders && $file->isDir()) { if (!$folders && $file->isDir()) {
@@ -255,7 +271,7 @@ abstract class Folder
if (isset($filters['value'])) { if (isset($filters['value'])) {
$filter = $filters['value']; $filter = $filters['value'];
if (is_callable($filter)) { if (is_callable($filter)) {
$filePath = call_user_func($filter, $file); $filePath = $filter($file);
} else { } else {
$filePath = preg_replace($filter, '', $filePath); $filePath = preg_replace($filter, '', $filePath);
} }
@@ -316,7 +332,7 @@ abstract class Folder
if (!$success) { if (!$success) {
$error = error_get_last(); $error = error_get_last();
throw new \RuntimeException($error['message']); throw new \RuntimeException($error['message'] ?? 'Unknown error');
} }
// Make sure that the change will be detected when caching. // Make sure that the change will be detected when caching.
@@ -416,23 +432,27 @@ abstract class Folder
*/ */
public static function create($folder) public static function create($folder)
{ {
if (is_dir($folder)) { // Silence error for open_basedir; should fail in mkdir instead.
if (@is_dir($folder)) {
return; return;
} }
$success = @mkdir($folder, 0777, true); $success = @mkdir($folder, 0777, true);
if (!$success) { if (!$success) {
$error = error_get_last(); // Take yet another look, make sure that the folder doesn't exist.
throw new \RuntimeException($error['message']); clearstatcache(true, $folder);
if (!@is_dir($folder)) {
throw new \RuntimeException(sprintf('Unable to create directory: %s', $folder));
}
} }
} }
/** /**
* Recursive copy of one directory to another * Recursive copy of one directory to another
* *
* @param $src * @param string $src
* @param $dest * @param string $dest
* *
* @return bool * @return bool
* @throws \RuntimeException * @throws \RuntimeException
@@ -448,7 +468,7 @@ abstract class Folder
// If the destination directory does not exist create it // If the destination directory does not exist create it
if (!is_dir($dest)) { if (!is_dir($dest)) {
static::mkdir($dest); static::create($dest);
} }
// Open the source directory to read in files // Open the source directory to read in files

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.FileSystem * @package Grav\Common\Filesystem
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -38,7 +39,7 @@ class RecursiveDirectoryFilterIterator extends \RecursiveFilterIterator
*/ */
public function accept() public function accept()
{ {
/** @var $file \SplFileInfo */ /** @var \SplFileInfo $file */
$file = $this->current(); $file = $this->current();
$filename = $file->getFilename(); $filename = $file->getFilename();
$relative_filename = str_replace($this::$root . '/', '', $file->getPathname()); $relative_filename = str_replace($this::$root . '/', '', $file->getPathname());
@@ -56,7 +57,11 @@ class RecursiveDirectoryFilterIterator extends \RecursiveFilterIterator
return false; return false;
} }
public function getChildren() { public function getChildren()
return new self($this->getInnerIterator()->getChildren(), $this::$root, $this::$ignore_folders, $this::$ignore_files); {
/** @var RecursiveDirectoryFilterIterator $iterator */
$iterator = $this->getInnerIterator();
return new self($iterator->getChildren(), $this::$root, $this::$ignore_folders, $this::$ignore_files);
} }
} }

View File

@@ -1,8 +1,9 @@
<?php <?php
/** /**
* @package Grav.Common.FileSystem * @package Grav\Common\Filesystem
* *
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details. * @license MIT License; see LICENSE file for details.
*/ */
@@ -38,12 +39,9 @@ class RecursiveFolderFilterIterator extends \RecursiveFilterIterator
*/ */
public function accept() public function accept()
{ {
/** @var $current \SplFileInfo */ /** @var \SplFileInfo $current */
$current = $this->current(); $current = $this->current();
if ($current->isDir() && !in_array($current->getFilename(), $this::$ignore_folders, true)) { return $current->isDir() && !in_array($current->getFilename(), $this::$ignore_folders, true);
return true;
}
return false;
} }
} }

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