Utils::url()
such as mailto:
, tel:
, etc.GRAV_ROOT
or GRAV_WEBROOT
when /
#3667MediaUploadTrait::checkFileMetadata()
on_events
REGEX pattern of Security::detectXss()
as it was not matching correctly.read_file()
Twig function could be used nefariously in content #GHSA-f8v5-jmfh-pr69decoding
attribute #3796bin/composer.phar
to latest 2.7.2
v3.6.4
#3713v1.0.7
that addresses an XSS issuebin/composer.phar
to latest 2.6.6
Inflector::ordinalize()
not working as expected #3759UserGroupObject
#3724Property 'jsmodule_pipeline_include_externals' does not exist in object
#3661too few arguments exception
in FlexObjects #3658modified
timestamp via a modified:
frontmatter entryphar
in the list of security.uploads_dangerous_extensions
system.languages.debug
now dumps Key -> Value to debugger #37522.6.4
#3748@import
to ensure paths are rewritten correctly in CSS pipeline #3750Utils::isDangerousFunction
Utils::isDangerousFunction
, handle double \\
in |map
twig filter to mitigate SSTI attackValidatoin::typeEmail()
isDangerousFunction
when $name
was a closure #3727system.languages.debug
option that adds a <span class="translate-debug"></span>
around strings translated with |t
. This can be styled by the theme as needed.filter
, map
, and reduce
Twig filters and functionsUtils::isDangerousFunction()
|map()
allowing code execution|reduce()
allowing code execution{% cache 'my-key' 600 %}
Truncator
class #3716FILTER_SANITIZE_STRING
input filter in favor of htmlspecialchars(strip_tags())
for PHP 8.2+GRAV_SANITIZE_STRING
constant to replace FILTER_SANITIZE_STRING
for PHP 8.2+Parsedown
class via ParseDownGravTrait
for PHP 8.2+Truncator
to not use deprecated mb_convert_encoding()
for PHP 8.2+mb_strpos()
deprecated for PHP 8.2+TwigDeferredExtension
to be PHP 8.2+ compatiblegetgrav/image
fork to take advantage of various PHP 8.2+ fixesUserGroupObject::groupNames
method in blueprints for PHP 8.2+files-upload
deprecated message as this is not going to be removedTwig
class variables used by admin to address deprecated messages for PHP 8.2+parse_url
to list of PHP functions supported in Twig ExtensionParsedown
to stop deprecation messages in PHP 8.2+timestamp: true|false
option for individual assetsaccount.yaml
that caused username to be disabled admin#2344email
validation that was failing on UTF-8 characters. Following best practices and now only check for @
and length.onBeforeSessionStart()
event to be used to store data lost during session regeneration (e.g. login)bin/composer.phar
to latest 2.4.4
version #3627onPageHeaders()
event to allow for header modification as neededsystem.pages.dirs
configuration option to allow for configurable paths, and multiple page pathsPages::getSimplePagesHash
which is useful for caching pages specific dataauthorize-*@:
support for Flex blueprints, e.g. authorize-disabled@: not delete
disables the field if user does not have access to delete objectflex-ignore@
to hide all the nested fields in the blueprintmultipart/form-data
content type in PUT and PATCH requests$environment
(string), $request
(PSR-7 ServerRequestInterface|null) and $uri
(PSR-7 Uri|null) to be used in setup.php
media.json
file in mediabin/grav install
command with arbitrary destination folder name|filter()
allowing code execution|replace_last(search, replace)
filterparseurl
Twig function to expose PHP's parse_url
functionUtils::url()
password
: 256email
: 320text
, url
, hidden
, commalist
: 2048text
(multiline), textarea
: 65536system.cache.gzip: true
resulted in "Fetch Failed" for PHP 8.0.17 and PHP 8.1.4 PHP issue #8218'mbstring' extension is not loaded
error, use Polyfill instead #3504Utils::pathinfo()
and Utils::basename()
being too strict for legacy use #3542{{ media.html() }}
#3540account://
stream points to custom directoryUtils::url()
when path contains part of root|field_parent
to get parent field nameCall to undefined method
error when upgrading from Grav 1.6 #3523HtmlBlock
Utils::basename()
and Utils::pathinfo()
methodsFilesystem::basename()
and Filesystem::pathinfo()
to be unicode-safeUtils::basename()
and Utils::pathinfo()
everywheregzip
(application/x-gzip
)HtmlBlock
class{% script module 'theme://js/module.mjs' %}
{% link icon 'theme://images/favicon.png' priority: 20 with { type: 'image/png' } %}
HtmlBlock
support for {% style %}
, {% script %}
and {% link %}
tagsredirect_default_route
frontmatter header override:
;
YubiKey OTP
2-Factor authenticatorassets.link()
for external references. No pipeline supportassets.addJsModule()
with full pipeline supportUtils::getExtensionsByMime()
method to get all the registered extensions for the specific mime typeMedia::getRoute()
and Media::getRawRoute()
methods to get page route if availableMedium::getAlternatives()
to be able to list all the retina sizesUtils::download()
method to allow overrides on download name, mime and expires headeronPageFallBackUrl
event--env
and --lang
options having no effect if they aren't added before all the other optionsimports
and pipelining AssetsUserObject::getAccess()
after cloning the objectGrav::redirect()
to accept Route
classtranslated()
method to PageTranslateInterface
UserObject::isMyself()
methodUserObject::$isAuthorizedCallable
to allow $user->isAuthorized()
customizationsystem.session.secure_https: true
)Plugin::inheritedConfigOption()
function to access plugin specific functions for page overrides$name
parameter to Blueprint::flattenData()
method, useful for flattening repeating dataControllerResponseTrait
: Redirect response should be json if the extension is .json2022
FlexRelatedDirectoryTrait::getCollectionByProperty()
NotFoundException
having empty request.json
files in web server configsUserObject::$authorizeCallable
binding to the user objectFlexIndex::call()
to return null instead of failing to call undefined methodFlexObject::getDiff()
to see difference to the saved objectdump
instead of PHP's vardump
in side the {{ vardump(x) }}
Twig vardump functionroute
and request
to onPagesInitialized
eventPage::initialize()
FlexObject::getChanges()
: return changed lists and arrays as whole instead of just changed keys/valuesbin/grav server
|t(variable)
twig filter in adminFlexObject::getChanges()
always returning empty array400 Bad Request
instead of 500 Internal Server Error
$user->authorize()
now checks user groups before admin.super
, allowing deny rules to work properlyPermissionsReader
in PHP 7.3session_store_active
language option (#3464)ArrayAccess
in PHP 8.1:
Pages::referrerRoute()
to get the referrer route and languageUtils::uniqueId()
/ {{ unique_id() }}
utilities with length, prefix, and suffix supportUserObject::isMyself()
method to check if flex user is currently logged invalidate: options: key|ignore
SVG-Sanitizer
with MIT licensed DOM-Sanitizer
Uri::referrer()
now accepts third parameter, if set to true
, it returns route without base or language code #3411Folder::move()
throwing an error when target folder is changed by only appending characters to the end #3445$_original
variable in Flex Pages
|yaml
filter to convert input to YAMLroute
and request
to onPageNotFound
eventFlex Forms
flex-required@: not exists
and flex-required@: '!exists'
in blueprints$object->getOriginalData()
to get flex objects data before it was modified with update()
onDisplayErrorPage.[code]
event allowing better error pagescron
field for schedulertask
and action
inside JSON request bodyonPageTask
and onPageAction
events (defaults to null
)UserObject::$authorizeCallable
to allow $user->authorize()
customizationWarning: Undefined array key "SERVER_SOFTWARE" in index.php
#3408loadDirectoryConfig()
if configuration hasn't been saved #3409environment://
stream when it doesn't have configurationFlex Object
missing key field value when using FolderStorage
FlexForm
serializationflex-options@
in blueprints duplicating items in arrayMediaInterface
svgImageFunction()
that was causing broken outputlog://quarantine
URI::ip()
methodSimpleStorage
with no entriesFailed to save entry: Forbidden
when moving a page to a visible page #3389open_basedir()
error with some formsFlexDirectoryInterface
now extends FlexAuthorizeInterface
asset://
folder is missingcache.clear_images_by_default
to false
by defaultpathinfo()
twig filter in PHP7999999.
#3365onBlueprintCreated
event #3157addJs/addCss
call for remote support. #3358page
and output
properties to onOutputGenerated
and onOutputRendered
eventsimage://
stream #3333 #3349system.twig.undefined_functions = false
getgrav/grav-plugin-admin#2138MediaUploadTrait::checkFileMetadata()
methodexif_imagetype()
twig function$collection->withTranslated('de')
gregwar/Image
and gregwar/Cache
in-house to official getgrav/Image
and getgrav/Cache
packagist packages. This will help environments with very strict proxy setups that don't allow VCS setup. #3289$page->copy()
system.twig.safe_functions
) and filters (system.twig.safe_filters
)?_url=
in some redirectsimage://
stream #3285system.languages.session_store_active
not having any effect #3269system.pages.types
is not an array #2984set_time_limit
in Archiver
and GPM\Response
classes #3023Folder::move()
deleting the folder if you move folder into itself, created empty file insteadFlex Page
to itself causing the page to be lost #3227PageStorage
from detecting files as pagesUserIndex
not implementing UserCollectionInterface
onAdminAfterDelete
event call in Flex Pages
Media::hide()
method to hide files from mediaUtils::getPathFromToken()
method which works also with Flex Objects
FlexMediaTrait::getMediaField()
, which can be used to access custom media set in the blueprint fieldsFlexMediaTrait::getFieldSettings()
, which can be used to get media field settingsUtils::getPagePathFromToken()
now calls the more generic Utils::getPathFromToken()
SECURITY.md
to use security@getgrav.orgFlex
with @self/path
, @page
and @theme
destinations #3275$pages->find()
should never redirect #3266Page::activeChild()
throwing an error #3276Flex Page
CRUD ACL when creating a new page (needs Flex Objects plugin update) grav-plugin-flex-objects#115ControllerResponseTrait::createDownloadResponse()
methodblueprints/
to blueprints/pages/
folder #3255Theme::getFormFieldTypes()
just like in pluginsFlex Pages
for speedsystem.pages.redirect_default_route
and system.pages.redirect_trailing_slash
configuration options to accept redirect codetranslated()
in Flex Pages
Flex Pages
in site if multi-language support has been enabledFlexIndex::sortBy(['key' => 'ASC'])
having no effectpages://
stream resolves to multiple folders where the preferred folder doesn't existloading
#3251Uri::isValidExtension()
returning false positivespage.html
returning duplicated content with system.pages.redirect_default_route
turned on #3130Uncaught ValueError: Path cannot be empty
when failing to upload a file #3265Path cannot be empty
when viewing non-existent log file #3270onAdminSave
original page having empty header #3259Utils::arrayToQueryParams()
to convert an array into query paramsPagination
class to allow custom pagination query parametersystem/blueprints/user/account_new.yaml
FlexObject
, FlexCollection
and FlexIndex
classes to \Grav\Common\Flex
namespace (extend those instead of Framework or Generic classes)composer.phar
binary to latest version 2.0.9
system.yaml
$grav->getVersion()
or grav.version
in twig to get the current Grav version #3142$blueprint->flattenData()
to include every field, including those which have no dataFlexForm
constructor to reset the formcontent-security-policy
not being properly supported with http-equiv
+ support single quotesbackup
and security
commands to use styled output #3198Flex Pages
using only default language in frontend #106route()
and raw_route()
when getting translated pages #3184bin/gpm plugin uninstall
#3207type: int
<meta name="flattr:*" content="*">
to use name instead property #3010Pages::getCollection()
to match Grav 1.6 #3216destination: self@
used #3225FlexForm::setSubmitMethod()
to customize form submit actionbin/gpm uninstall
script not working because of bad typehint #3172login: visibility_requires_access
not working in pages #3176$flexPage->frontmatter()
method when setting valueonBlueprintCreated
event being called multiple times in Flex Pages
grav-plugin-flex-objects#97intl
extension has been enabled #3167ImageLoadingTrait
#3192self-upgrade
from CLI if you are on Grav 1.7.0 or 1.7.1bin/grav install -p myplugin
or -t mytheme
hebe.json
file to support custom folder structuresbin/gpm selfupgrade
if Grav was updated manuallyenvironment://
paths aren't streamsUnsupported option "curl" passed to "Symfony\Component\HttpClient\CurlHttpClient"
in bin/gpm selfupgrade
#3165site.taxonomies
contains a bad valuePage::template_format()
bin/gpm index
erroring out #3158bin/gpm selfupgrade
failing to report failed Grav update #3116bin/gpm selfupgrade
error on Call to undefined method
#3160lighttpd.conf
access-deny rule #1876Serializable
methods are now final and cannot be overridden)ETag
setting by default for 304 responsesFlexCollection::getDistinctValues()
to get all the assigned values from the fieldFlex Pages
method $page->header()
returns \Grav\Common\Page\Header
object, old Page
class still returns stdClass
ContentBlock
, AbstractFile
, FormTrait
, ObjectCollectionTrait
and ObjectTrait
PageObject::getLevelListing()
#3110--env
and --lang
support for bin/grav
, bin/gpm
and bin/plugin
console commands
--env
: -e
will not work anymore as it conflicts with some pluginsstart
and limit
in a Page Collectionsystem.custom_base_url
exif_read_data
in ImageFile
MarkdownFormatter
and Framework\File
classesFilesystem::normalize()
with dot-dot pathslanguages:translations: false
admin#1896Inflector
methods when translation is missing GRAV.INFLECTOR_*
translationsPage
object #3152system.language.translations: false
setup.php
being overridden by system/streams.yaml
#2450ERR_TOO_MANY_REDIRECTS
with HTTPS = 'On' #3155GRAV_ENVIRONMENT
by using environment variable or a constantGRAV_SETUP_PATH
by using environment variable (constant already worked)GRAV_ENVIRONMENTS_PATH
by using environment variable or a constantGRAV_ENVIRONMENT_PATH
by using environment variable or a constantbin/grav install
commandbin/gpm index
#3092PageObject::getOriginal()
call #3098Argument 1 passed to Grav\Common\User\DataUser\User::filterUsername() must be of the type string
#3101ImageFile::fixOrientation()
StaticResizeTrait::resize()
bad image height/width attributes if null
values are passed to the method{% script 'file.js' at 'bottom' %}
, replaces broken in
operator #3084?
is preceded with /
#2964FlexDirectoryInterface
interfacePageCollectionInterface::nonModular()
into PageCollectionInterface::pages()
and deprecated the old methodPageCollectionInterface::modular()
into PageCollectionInterface::modules()
and deprecated the old method'bin/composer.phar
to 2.0.2
which is all new and much fastersame_as
to Flex Objectsfunction_exists()
: Utils::functionExists()
compatibility
features turned off by default, upgrading from older versions will keep the settings on3.5.1
sid
to GPM when downloading a premium package via CLIJsonFormatter
options to be passed as a stringuser/env
folder #3072FlexObject::refresh()
method to make sure object is up to datetype: false
did not workprint_r()
in twigFlex Users
Flex Page
template causes the other language versions of that page to lose their content admin#1958header.admin.children_display_order
in Flex Pages to work just like with regular pagesUtils::isFunctionDisabled()
method if there are spaces in disable_functions
#3023CompiledFile
if the cached version is brokenconfig-default@
breaking on set #1972system://
stream is causing issues in Admin, making Media tab to disappear and possibly causing other issues #3072bin/grav yamllinter -a
and -f
not following symlinks #3080|safe_email
filter to return safe and escaped UTF-8 HTML #3072php-zip
is not enabled #3075Uri::getAllHeaders()
compatibility functionexternal.html.twig
, default.html.twig
, and modular.html.twig
FlexStorageInterface::getMetaData()
Security::sanitizeSVG()
creating an empty file if SVG file cannot be parsedextend@
to a parent streamStream::create()
methodonBlueprintCreated
event for Flex PagesonBlueprintCreated
firing multiple times recursivelyunset()
in ObjectProperty
classFlexObject::freeMedia()
method causing media to become nullFlex Form
making it impossible to set nested valuesFlex User
avatar when using folder storage, also allow multiple imagessvg_image()
twig function to make it easier to 'include' SVG source in TwigUtils::fullPath()
to get the full path to a file be it stream, relative, etc.themes
to cached blueprints and configurationFlex Pages
issue with getRoute()
returning path with language prefix for default language if set not to do thatFlex Pages
bug where reordering pages causes page content to disappear if default language uses wrong extension (.md
vs .en.md
)Flex Pages
bug where onAdminSave
passes page as $event['page']
instead of $event['object']
#2995Flex Pages
bug where changing a modular page template added duplicate file admin#1899Flex Pages
bug where renaming slug causes bad ordering range after save #2997noprocess
specific items only in Link/Image Excerpts, e.g. http://foo.com/page?id=foo&target=_blank&noprocess=id
#2954Language::getLanguageURLPrefix()
and Language::isIncludeDefaultLanguage()
methods when not using multi-languageLanguage::getDefault()
and Language::getLanguage()
to return false again because of plugin compatibility (updated docblocks)Excerpts::getExcerptsFromHtml
Assets
handlingCSS_IMPORTS_REGEX
breaking with complex URLs #2958CSS_IMPORT_REGEX
to local variable in AssetUtilsTrait::moveImports()
Media
onAfterCacheClear
eventCvsFormatter
to attempt to encode non-scalar variables into JSON before giving upcomposer.phar
to 2.0.0-dev
MediaUploadTrait::copyUploadedFile()
not adding uploaded media to the collectionTrying to get property 'username' of non-object
error in Flex flex-objects#62Page::topParent()
when dealing with first-level pagesFlex Page
authorization for groupsonAdminSave
and onAdminAfterSave
events when using Flex Pages
and Flex Users
flex-objects#58User Group
allowing bad group name to be saved admin#1917Language::getDefault()
returning false and not 'en'Excerpts::getExcerptFromHtml
Folder::hasChildren
to Folder::countChildren
Content Editor
option to user account blueprintFlex Page
not having correct form fields for the page typeFlex User
erroring out on save (thanks @mikebi42)Flex Object
request cache clear when saving objectsystem.pages.hide_empty_folders
#1925Flex Objects
(use Grav\Common\Flex\Types\GenericObject
instead of FlexObject
) flex-objects#37Flex Objects
flex-objects#34loading=lazy
attributes on images. Can be set in system.images.defaults
or per md image with ?loading=lazy
#2910PageCollection::all()
to mimic Pages classHTTP_X_Forwarded
headers (host disabled by default)PHPUserAgentParser
to 1.0.0&
errors in HTML when passed to Excerpts.php
Response::get()
used by GPM/Admin to use Symfony HttpClient v4.4 (composer install --nodev
required for Git installations)Excerpts::processLinkHtml()
methodFlex Pages
admin with PHP intl
extension enabled when using custom page orderFlex Page
changing to numeric-prefix flex-objects#56Flex Page
in admin does nothing flex-objects#55webp
image format in Page Media #1168Route::getBase()
methodFile
Pages::instances()
returning null values when using Flex Pages
#2889header.admin.children_display_order
setting being ignored in Admin #2881$pageCollection->batch()
and $pageCollection->order()
methodsFlex Users
when using folder storageTrying to access array offset on value of type null
PHP 7.4 error in Plugin.php
.jpeg
for cached images, rather use .jpg
Flex Pages
with 00.home
page not having ordering setFlex Pages
not updating empty content on save #2890Flex Object
with custom keyPlugin::config()
methodMediaTrait::freeMedia()
method to free media (and memory)Folder::hasChildren()
method to determine if a folder has child foldersContent-Encoding
handling in Apache when content compression is disabled #2619Flex User
when folder storage has been selectedControllerResponseTrait::createRedirectResponse()
HTTP_X_HTTP_METHOD_OVERRIDE
#2847Flex Users
$page->move()
methodSession::regenerateId()
method to properly prevent session fixation issuessystem.strict_mode.blueprint_compat
to maintain old validation: strict
behavior #1273isFirst()
, isLast()
, prevSibling()
, nextSibling()
and adjacentSibling()
Flex Page
#2837Flex Page
validation: strict
not working in blueprints (see system.strict_mode.blueprint_compat
setting) #1273Blueprint::extend()
and Blueprint::embed()
not initializing dynamic properties$plugin->autoload()
and $theme->autoload()
automatically when object gets initialized$grav->initializeCli()
methodonAdminRegisterPermissions
bin/plugin
commandFlexObject::triggerEvent()
not emitting events #2816bin/plugin
initialization$grav['flex']
to access all registered Flex Directories$grav->dispatchEvent()
method for PSR-14 eventsFlexRegisterEvent
which triggers when $grav['flex']
is being accessed the first timePluginsLoadedEvent
which triggers after plugins have been loaded but not yet initializedSessionStartEvent
which triggers when session is startedPermissionsRegisterEvent
which triggers when $grav['permissions']
is being accessed the first timeflatten_array
filter to form field validationsecurity@: or: [admin.super, admin.pages]
in blueprints (nested AND/OR mode support)validate: value_type: bool|int|float|string|trim
to array
to filter all the values inside the arrayurl()
takes now third parameter (true
) to return URL on non-existing file instead of returning falseStream
Flex Users
being stored with wrong filename, login issues #2785ignore_empty: true
not removing empty values in blueprint filtering{{ false|string }}
twig to return '0' instead of ''url()
failing if stream has extra slash in it (e.g. user:///data
)Blueprint::filter()
returning null instead of array if there is nothing to returnCannot use a scalar value as an array
error in Utils::arrayUnflattenDotNotation()
, ignore nested structure insteadRoute
instance in multi-site setupssystem.translations: false
breaking Inflector
methodssecurity@: admin.super
) fields causing Flex Objects
to lose data on saveFlex Pages
unserialize issues if Flex-Objects Plugin has not been installedisPage()
when using Flex PagesFlex Pages
|yaml_serialize
: added support for JsonSerializable
objects and other array-like objects2020
Flex Pages
only)-r <job-id>
option for Scheduler CLI command to force-run a job #2720Utils::isAssoc()
and Utils::isNegative()
helper methodsUserInterface::authorize()
to return null
having the same meaning as false
if access is denied because of no matching ruleFlexAuthorizeInterface::isAuthorized()
to return null
having the same meaning as false
if access is denied because of no matching ruleGrav\Common\Flex
Grav\Common\User\Group
in favor of $grav['user_groups']
, which contains Flex UserGroup collection$page->modular()
in favor of $page->isModule()
for better readability|array
filter to work with iterators and objects with toArray()
methodSimpleStorage
code to feature match the other storagesFlex Users
only)authorize()
function to work better with nested rule parametersFlex Pages
collection filteringFlex Pages
{{ grav.undefined }}
$object->getStorageKey()
interface as it was not a good idea, added getMasterKey()
for pagesFlex Pages
to Grav core and removed Flex Objects plugin dependencyUtils::simpleTemplate()
method for very simple variable templatingarray_diff()
twig functiontemplate_from_string()
twig functionScheduler
cron command check and more useful CLI informationFlex Users
: obey blueprints and allow Flex to be used in admin onlyFlex
to support custom site template paths{% cache %}
tag to not need unique key, and lifetime
is now optionalcomposer.phar
to latest 1.9.0
Symfony EventDispatcher
directly and not rockettheme/toolbox wrapperAccept:
header #2705Page::untranslatedLanguages()
not being symmetrical to Page::translatedLanguages()
Flex Pages
not calling onPageProcessed
event when cachedFlex Pages
Flex
templates in if Flex Objects
plugin isn't installedPageTranslateTrait::getAllLanguages()
and getAllLanguages()
to include default languageFlex Pages
Flex Pages
routing if using translated slugs or system.hide_in_urls
settingCSVFormatter::decode()
Route
class{% cache %}
Twig tag eliminating need for twigcache
extension.CsvFormatter::decode()
RouteFactory::createFromString()
Security::sanitizeSVG()
functionFlexStorageInterface::getStoragePath()
and getMediaPath()
can now return nullbin/grav page-system-validator [-r|--record] [-c|--check]
to test Flex PagesRoute
classSession::getFlashObject()
if Flex Form is being useddump()
Page::modular()
and Page::modularTwig()
returning null
for folders and other non-initialized pagesPages::dispatch()
calls (with redirect) when we really meant to call Pages::find()
FlexForm
: Fixed some compatibility issues with Form pluginFlex Pages
(Flex Objects plugin required)bin/grav yamllinter
CLI command by adding an option to find YAML Linting issues from the whole site or custom folder$page->summary()
always striping HTML tags if the summary was set by $page->setSummary()
Flex->getObject()
when using Flex Keybin/grav server
CLI command to easily run Symfony or PHP built-in webservershasFlexFeature()
method to test if FlexObject
or FlexCollection
implements a given featuregetFlexFeatures()
method to return all features that FlexObject
or FlexCollection
implementsFlexDirectory::update()
and FlexDirectory::remove()
FlexStorage::getMetaData()
to get updated object meta information for listed keysLanguage::getPageExtensions()
to get full list of supported page language extensions$grav->close()
method to properly terminate the request with a responsePages::getCollection()
methodsymfony server:start
Route
objects immutableFlexDirectory::getObject()
can now be called without any parameters to create a new objectcollection()
and evaluate()
logic from Page
class into Pages
classForm
not to use deleted flash object until the end of the request fixing issues with resetFlexForm
to allow multiple form instances with non-existing objectsFlexObject
search by using key
system.debugger.censored
to hide potentially sensitive informationsystem.languages.include_default_lang_file_extension
to keep default language in .md
files if set to false
.md
page to be assigned to the default language and to be listed in translated/untranslated page listLanguage::getFallbackPageExtensions()
to fall back only to default language instead of going through all languagesLanguage::getFallbackPageExtensions()
returning wrong file extensions when passing custom page extensionpages
field escaping issues, needs admin update, too admin#1990svg-image
issue with classes applied to all elements #3068samesite
cookie logic as it causes issues with PHP < 7.3 #309.travis.yml
due to GitHub API deprecated functionalityuser/config/versions.yaml
3.5.1
sid
to GPM when downloading a premium package via CLIgrav_cli
as referrer when using Response
from CLIself-upgrade
command #3013.htaccess
rule to block attempts to use Twig in the request URL.
to extension #3060{% cache %}
tag from Grav 1.7Utils::fullPath()
helper function from Grav 1.7{{ svg_image() }}
Twig function from Grav 1.7Folder::countChildren()
function from Grav 1.7{{ theme_var() }}
enhanced logic from Grav 1.7Excerpts
class with fixes and functionality from Grav 1.7onBlueprintCreated()
is initialized first404
error pageCaddyfile
to use new Caddy2 syntax + improved usabilityHTTP_X_Forwarded
headers (host disabled by default)PHPUserAgentParser
to 1.0.0Go
to version 1.13 in travis.yaml
X-Forwarded-Host
#2891Parsedown
1.6 and ParsedownExtra
0.7 into Grav\Framework\Parsedown
to allow fixesaliases.php
with references to direct \Parsedown
and \ParsedownExtra
referencesjQuery
to latest 3.4.1 version #2859stream_set_option
error with PHP 7.4 via Toolbox#28 #2850Pages::reset()
methodPages::baseRoute()
not picking up active language reliablyvalidation: strict
fix as it breaks sites, see #1273ConsoleCommand::setLanguage()
method to set language to be used from CLIConsoleCommand::initializeGrav()
method to properly set up Grav instance to be used from CLIConsoleCommand::initializePlugins()
method to properly set up all plugins to be used from CLIConsoleCommand::initializeThemes()
method to properly set up current theme to be used from CLIConsoleCommand::initializePages()
method to properly set up pages to be used from CLIbin/plugin
CLI calling $themes->init()
way too early (removed it, use above methods instead)$grav['page']
crashing CLIdefault_charset
is not utf-8
#2154str_replace()
in Uri::init()
#2754checkbox
field not being saved, requires also Form v4.0.2 #1225validation: strict
not working in blueprints #1273Data::filter()
removing empty fields (such as empty list) by default #2805Assets::addInlineJs()
parameter type mismatch between v1.5 and v1.6 #2659site.metadata
saving issues #2615{{ grav.undefined }}
CsvFormatter::decode()
Inflector::hyphenize
will now automatically trim dashes at beginning and end of a string.Folder::all()
so no longer fails if trying to copy non-existent dot file #2581test-plugins
script to phpstan-plugins
to be more explicit #2637system\router.php
#2627system\router.php
#2627Utils::getSupportedPageTypes()
to enforce html,htm
at the front of the list #2531GRAV_USER_INSTANCE
constant is already defined #2621$grav['user']
is not setMedia::add($name, null)
url()
returning wrong path if using stream with grav root path in it, eg: user-data://shop
when Grav is in /shop
url()
not returning a path to non-existing file (user-data://shop
=> /user/data/shop
) if it is set to fail gracefullyurl()
returning false on unknown streams, such as ftp://domain.com
, they should be treated as external URLpage@.self:
should allow modular pages if requestedFlexObject::exists()
failing sometimes just after the object has been saved"
and ,
properlyValidation.php
#2610FormTrait::getAllFlashes()
method to get all the available form flash objects for the formFormFlash
objectsFormFlashInterface
, changed constructor to take $config
arrayImageMedium::url()
if the image cache folder does not existRoute::withParam()
methodFormFlash
objects when there is no session initializedbin/plugin
not listing the plugins available (1c725c0
)TwigExtension::exifFunc()
#2518U0ils::pathPrefixedBYLanguageCode()
and trailing slash #2510Utils::Url()
not returning false
on failure. Added new optional fail_gracefully
3rd attribute to return string that caused failure #2524Route::withoutParams()
methodsPages::setCheckMethod()
method to override page configuration in Admin PluginCache::clearCache('invalidate')
parameter for just invalidating the cache without deleting any cached filesUserCollectionInderface
to extend Countable
to get the count of existing usershttps://crowdin.com/project/grav-core
$grav['route']
from being modified when the route instance gets modifiedavatar_url
provided by 3rd party providerslang
code lengths in Utils
and Session
detectionSimpleStorage
Flex::getDirectories()
if the first parameter is setbin/gpm info
commandValidation::filterCheckbox()
select
field with selectize.create
set to true git-sync#141YamlFormatter::decode()
to always return array #2494$grav['request']->getAttribute('route')->getExtension()
FlexCollection::filterBy()
methodUse Null Coalesce Operator
#2466FormTrait::render()
not providing config variablebin/grav clean
to clear cache/compiled
and user/config/security.yaml
bin/grav yamllinter
CLI command to find YAML Linting issues #2468FormTrait
backwards compatibility with existing formsUtils::getSubnet()
function for IPv4/IPv6 parsing #2465FormInterface
now implements RenderInterface
FormInterface::getTask()
method which reads the task from form.task
in the blueprintredirect_default_route
logic as it has issues with multi-lang #2459|contains
Twig filter on PHP 7.3priority
to be an integer and not throw error if invalid string passed #2461FlexForm
missing getter methods for defining form variablesUri::__toString()
outputredirect_default_route
logic as well as Uri::toArray()
to take into account root_path
and extension
Utils::normalizePath
to handle externals properly #2216Page::taxonomy
to be treated as strings #2446Grav['user']
not being available form#332Utils::parseSize()
#2394Blueprint::addDynamicHandler()
method to allow custom dynamic handlers, for example custom-options@: getCustomOptions
ClearCacheCommand
to ensure CLI GPM upgrades go smoothly@import
not being added to top of pipelined css #2440Scheduler
functionality for periodic jobsBackup
functionality with multiple backup profiles and scheduler integrationAssets Manager
to be more powerful and flexible{% throw 404 'Not Found' %}
twig tag (with custom code/message)Grav\Framework\File
classes for handling YAML, Markdown, JSON, INI and PHP serialized filesGrav\Framework\Collection\AbstractIndexCollection
classGrav\Framework\Object\ObjectIndex
classGrav\Framework\Flex
classessecurity@: admin.foobar
, scope@: object
or scope-ignore@: object
to any fieldUsers
for increased performance and capability (disabled by default)Grav\Framework\DI\Container
classGrav\Framework\RequestHandler\RequestHandler
classPage::httpResponseCode()
and Page::httpHeaders()
methodsGrav\Framework\Form\Interfaces\FormInterface
Grav\Framework\Form\Interfaces\FormFactoryInterface
Grav\Framework\Form\FormTrait
Page::forms()
method to get normalized list of all form headers defined in the pageonPageAction
, onPageTask
, onPageAction.{$action}
and onPageTask.{$task}
eventsBlueprint::processForm()
method to filter form inputsprocessMarkdown()
method from TwigExtension
to more general Utils
classMedia
(such as uploaded files)FlexObject
, including a way to render newly uploaded files before saving themFlexObject::getChanges()
to determine what fields change during an updatearrayDiffMultidimensional
, arrayIsAssociative
, arrayCombine
Util functions$grav['users']
service to allow custom user classes implementing UserInterface
LogViewer
helper class and CLI command: bin/grav logviewer
select()
and unselect()
methods to CollectionInterface
and its base classesorderBy()
and limit()
methods to ObjectCollectionInterface
and its base classesuser-data://
which is a writable stream (user://data
is not and should be avoided)/action:{$action}
(like task but used without nonce when only receiving data)onAction.{$action}
eventGrav\Framework\Form\FormFlash
class to contain AJAX uploaded files in more reliable wayGrav\Framework\Form\FormFlashFile
class which implements UploadedFileInterface
from PSR-7Grav\Framework\Filesystem\Filesystem
class with methods to manipulate stream URLs$grav['filesystem']
service using an instance of the new Filesystem
object{% render object layout: 'default' with { variable: true } %}
for Flex objects and collections$grav->setup()
to simplify CLI and custom access pointsCsvFormatter
and CsvFile
classespages.hide_empty_folders
if a folder has no valid .md
file available. Default behavior is false
for compatibility.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 missingUtils::arrayFlattenDotNotation()
and Utils::arrayUnflattenDotNotation()
helper methodsblueprint://pages
streamapc
and xcache
support, made apc
alias of apcu
|t
twig filter and t()
twig function4.2.3
User
class to Grav\Common\User\DataUser\User
with multiple improvements and small fixesUser
class now acts as a compatibility layer to older versions of Gravnew User()
, User::load()
, User::find()
and User::delete()
in favor of $grav['users']
serviceMedia
constructor has now support to not to initialize the media objectsFlexObjectInterface::getDefaultValue()
and FormInterface::getDefaultValue()
onPageContent()
event for every call to Page::content()
composer test-plugins
to test plugin issues with the current version of GravFlex::getObjects()
and Flex::getMixedCollection()
methods for co-mingled collectionsFlex::getObject()
methodFlexObjectInterface::search()
and FlexCollectionInterface::search()
methodssystem.media.upload_limit
with PHP's post_max_size
or upload_max_filesize
Grav\Common\Page\Medium\AbstractMedia
now use array traits instead of extending Grav\Common\Getters
Grav\Framework\Psr7
classes as Nyholm/psr7
decoratorscache-clear
scheduled job to go along with cache-purge
Grav\Framework\File\Formatter\FormatterInterface
to Grav\Framework\File\Interfaces\FileFormatterInterface
File::save()
to use a temporary file if file isn't locked|t
filter to better support admin |tu
style filter if in adminPageInterface
instead of Page
classbin/plugin
for existence and enabledmedia.upload_limit
referencesnicenumber
: do not use 0 + string casting hacklanguages.default_lang
option to override the default lang (usually first supported language)Content-Type: application/json
body support for PSR-7 ServerRequest
ZipArchive
$grav['cache']->getSimpleCache()
method for getting PSR-16 compatible cacheUtils::normalizePath()
to support non-protocol URLsPage::metadata
to allow rebuilding from automatically generated valuespage.types
field in system content configuration admin#1612$page->forms()
call, added $page->addForms()
ImageMedium
constructor warning when file does not existGrav\Common\User
class; added $user->update()
methodvalidate: trim: true
Grav\Framework\File\Formatter
classes to have abstract parent class and some useful methodsAccept:
headerAccept-Language:
headeridMap
Grav
container object to implement PSR-11 ContainerInterface
Processor
classes to implement PSR-15 MiddlewareInterface
Data
class to extend JsonSerializable
Video::preload()
methodsecurity.salt
rather than GRAV_ROOT
#2242xss_invalid_protocols
in Security
config #2250security.salt
checking now we use security.yaml
for other optionsLanguage
, Languages
, and LanguageCodes
classesonFatalException
event also on internal PHP errorsSystem
configuration blueprint with side-tabsTruncator::truncateWords
and Truncator::truncateLetters
when string not wrapped in tags #2432Undefined method closure::fields()
when getting avatar for user, thanks @Romarain #2422Utils::url()
method would append extra base_url
if URL already included itmkdir(...)
race conditionObtaining write lock failed on file...
onPageNotFound
event handlinge3fc4ce
)reset()
sredirect_trailing_slash
losing query string #2269Grav\Framework\Route::__toString()
returning relative URL, not relative routeappend_url_extension
inside of Page::templateFormat()
#2264Medium::relativePath()
for streamsObject
serialization breaking if overriding jsonSerialize()
methodYamlFormatter::decode()
when calling init_set()
with integerUri::hasStandardPort()
to support reverse proxy configurations #1786append_url_extension
from page header to set template format if set #2604Folder::doDelete($folder, false)
removing symlink when it should notscript
and style
Twig tags to use the new Assets
classesdeferred
Twig extensiononPageContent()
event for every call to Page::content()
User
unserialize to not to break the object if serialized data is not what expected302
when redirecting trailing slash #2155index.md
with some consistency fixes #2245Utils::getMimeByFilename()
, Utils::getMimeByLocalFile()
and Utils::checkFilename()
methodssecurity.yaml
Security
class for Grav security functionality including XSS checksbin/grav security
command to scan for security issuesxss()
Twig function to allow for XSS checks on strings and arraysonHttpPostFilter
event to allow plugins to globally clean up XSS in the forms and tasksDeprecated
tab to DebugBar to catch future incompatibilities with later Grav versions$page->slug()
to be called before $page->init()
without breaking the pagePage::translatedLanguages()
to use routes always #2163nicetime()
twig function{% script %}
, {% style %}
and {% switch %}
to be placed outside of blocksGrav\Common\Yaml
class which should be used instead of Symfony\Component\Yaml\Yaml
Uri::method()
to get current HTTP method (GET/POST etc)FormatterInterface
: Added getSupportedFileExtensions()
and getDefaultFileExtension()
methodsSimpleCache
key validationbin/grav install
command|string
, |int
, |bool
, |float
, |array
ObjectCollection::matching()
criteria expressions to behave more like in TwigLENGTH()
, LOWER()
, UPPER()
, LTRIM()
, RTRIM()
and TRIM()
Grav\Framework\File\Formatter
classes for encoding/decoding YAML, Markdown, JSON, INI and PHP serialized stringsGrav\Framework\Session
class to replace RocketTheme\Toolbox\Session\Session
Grav\Common\Media
interfaces and trait; use those in Page
and Media
classesGrav\Common\Page
interface to allow custom page types in the futurestrict_mode
settings in system.yaml
for compatibilityUtils::url()
to support query stringsmuted
and playsinline
support to videos #2124MediaTrait::clearMediaCache()
to allow cache to be clearedMediaTrait::getMediaCache()
to allow custom cachingsystem.session.options
camel-case
that includes numbers #2134|markdown
filter HTML safeContentBlock
serializationRoute::withQueryParam()
to accept array valuesnull
to be set as Page contentgetFilename
instead of getBasename
#2087truncateLetters()
#2007/user/images/
folder #2043errors.display
system property better in admin plugin admin#1452display:
option not handling integers properly admin#1452Uri::post()
and Uri::getConentType()
Medium:thumbnailExists()
function #1966authorized
support for 2FAarray_key_exists
instead of in_array + array_keys
#1991custom_base_url
always causing 404 errorsSORT_REGULAR
for better server compatibility #1910sortArrayByKey
logic into Utils::
class1.6.4
until a better solution for 1.8.0
compatibility can fe foundZipArchive
in GPM::Installer
|nicefilesize
Twig filter for pretty file (auto converts to bytes, kB, MB, GB, etc)regex_filter()
Twig function to values in arraysGrav\Framework\Uri
classesGrav\Framework\Uri
classes extending PSR-7 HTTP message UriInterface
implementationGrav\Framework\Route
classes to allow route/link manipulation$grav['uri]->getCurrentUri()
method to get Grav\Framework\Uri\Uri
instance for the current URL$grav['uri]->getCurrentRoute()
method to get Grav\Framework\Route\Route
instance for the current URLphp
version dependencies in GPM assets{% switch %}
twig tag for more elegant if statements{% markdown %}
twig tagCollection::toExtendedArray()
method that's particularly useful for Json output of data|yaml_encode
and |yaml_decode
Twig filter to convert to and from YAMLread_file()
Twig function to allow you to load and display a file in Twig (Supports streams and regular paths)Medium::exists()
method to check for file existenceurlFunc()
to Utils::url()
as its so darn handytheme_var
, header_var
and body_class
Twig functions for themesGrav\Framework\Cache
classes providing PSR-16 Simple Cache
implementationGrav\Framework\ContentBlock
classes for nested HTML blocks with CSS/JS assetsGrav\Framework\Object
classes for creating collections of objects|nicenumber
Twig filter{% try %} ... {% catch %} Error: {{ e.message }} {% endcatch %}
tag to allow basic exception handling inside Twig{% script %}
and {% style %}
tags for Twig templatesSession
initializationtheme_var()
option in page frontmatterclearstatcache
and opcache-reset
on Cache::clear()
Page.collection()
filtering support including ability to have non-published pages in collectionsswitch
field like a checkbox
modular
blueprint more flexibleUtils
class #1830getElement()
to get serialized value for a single propertyObjectPropertyTrait
: Added protected functions isPropertyLoaded()
, offsetLoad()
, offsetPrepare()
and offsetSerialize()
Grav\Framework\Cache
: Allow unlimited TTLsystem.session.initialize
to delay session initialization if needed by a pluginObjectInterface
Uri::convertUrl()
page-inject#8name=
, and all others use property=
#1849evaluate()
and evaluate_twig()
Twig functions that throws invalid template error|sort_by_key
twig filter if the input was null or not an arrayvundefined
error for version numbers in GPM form#222BadMethodCallException
thrown in GPM updates #1784&
to &
in Markdown linkspartials/metadata.html.twig
and partials/messages.html.twig
Medium::copy()
method to create a copy of a medium objectforce_lowercase_urls
functionality on routes and slugsitem-list
filter type to remove empty itemssetFlashCookieObject()
and getFlashCookieObject()
methods to Session
objectintl_enabled
option to disable PHP intl module collation when not neededsystem.custom_base_url
that were broken #1736Pages::addPage()
were not firing onPageProcessed()
event causing forms not to be processedPage::active()
and Page::activeChild()
to work with UTF-8 characters in the URL #1727modular.yaml
causing media to be ignored #1725case_insensitive_urls
option as it was causing issues with taxonomy #1733/
in CompileFile.php
#1693config.user
, it was broken and bad practiseclean cache
uses valid path #1745Uri
params like /id:3
field.multiple: true
to allow use of min/max options in checkboxes.validate
media_order
capability to manually order page media via a page header_url=$uri
portion of the the Nginx try_files
command admin#1244URI
class with numerous bug fixes, and optimizationssystem.media.upload_limit
with PHP's post_max_size
or upload_max_filesize
bin/grav clean
command to remove unnecessary vendor files (save some bytes)http_status_code
Twig function to allow setting HTTP status codes from Twig directly.$uri->toArray()
and (string)$uri
type
on Asstes::addInlineJs()
#1683GPM\InstallCommand::processPackage()
#1682Page::summary()
when using delimiter and multibyte UTF8 Characters #1644.json
thumbnail throwing error when adding media grav-plugin-admin#1156authorization
now requires a check for authenticated
- REQUIRED: Login v2.4.0
Page::summary()
to support size without HTML tags #1554natsort
on plugins to ensure consistent plugin load ordering across platforms #1614multilevel
field to handle Asset Collections #1201password
option #1620User
class #1632travis.yml
to add support for PHP 7.1 as well as 7.0.21 for test suitePage::summary()
#1554cache_control
system and page level property #1591clear_images_by_default
system property to stop cache clear events from removing processed images #1481onTwigLoader()
event to enable utilization of loader methodsTwig::addPath()
and Twig::prependPath()
methods to wrap loader methods and support namespacing #1604array_key_exists()
Twig function wrapperCollection::intersect()
method #1605session.timeout
field to be set to 0
via blueprints #1598Data::exists()
and Data::raw()
functions breaking if Data::file()
hasn't been called with non-null value$difference
#1563system.session.timeout
to 0 clears the session when the browser session ends #1538CODE_OF_CONDUCT.md
so everyone knows how to behave :)media()
Twig function to media_directory()
to avoid conflict with Page's media
objectsite.yaml
lower
and upper
Twig filterspathinfo()
Twig functionmedia.yaml
bin/grav install
instead of bin/gpm install
, and also when running on a non-skeleton site #1027process_twig
and frontmatter.yaml
Utils::getPagePathFromToken()
method which is used by various plugins (Admin, Forms, Downloads, etc.)hash
file-check methodmedia
and vardump
Twig functionsonOutputRendered()
back into Grav corePages::baseUrl()
, Pages::homeUrl()
and Pages::url()
functionsbase32_encode
, base32_decode
, base64_encode
, base64_decode
Twig filtersDebugger::getCaller()
to figure out where the method was called fromGrav\Framework\Collection
classes for creating collectionsFolder::move()
Twig::processSite()
to include custom contextInstaller::sophisticatedInstall()
#1447pwd_regex
and username_regex
system configuration options to allow format modificationsuser/accounts.yaml
overrides and implemented more robust theme initializationgetList()
method to do more powerful thingsancestor
helper methods in Page and Pages classes #1362parents
field and switched Page blueprints to use thisisajaxrequest()
Twig function #1400--all-yes
and --destination
options for bin/gpm direct-install
#1397language_codes
to Twig init to allow for easy language name/code/native-name lookupurl()
twig function to pass-through external linksdebugger: false
in page frontmatterdirect-installs
from official GPM. Can be configured in system.yaml
Utils::isValidUrl()
method|markdown(false)
filter to toggle block/line processing (default|true = block
)Page::folderExists()
methodTwig::evaluate()
now takes current environment and context into accountdirect-install
so it can be called via Admin pluginuser://accounts
folderPage::expires(0)
Admin #1009nonce_field()
Twig function causing validation errors Form #115Pages::getPagesCacheId()
Languages::resetFallbackPageExtensions()
regarding #1276Collection::merge()
method to allow merging of multiple collections #1258README.md
Page::collection()
returning array and not Collection object when header variable did not existContent-Encoding: identity
fix, and let you set cache: allow_webserver_gzip:
option to switch to identity
#548never_cache_twig
page option in system.yaml
and frontmatter. Allows dynamic Twig logic in regular and modular Twig templates #1244hash
cache check option and made dropdown more descriptive Admin #923Content-Encoding: none
. It should really be Content-Encoding: identity
insteadhash
method on page modifications detection.md
file #1211$_GET
parameters missing in Nginx (please update your nginx.conf) #1245Yaml::parse
direcly on a filename, now deprecatedarray_unique
Twig filter Admin #897remove
for onBeforeCacheClear
eventPage::blueprints()
call. Allows to access page.blueprints
from Twig in the frontendignore_empty
property to be used on array fields, if positive only save options with a valuepermissions
field in user accountrange(int start, int end, int step)
twig function to generate an array of numbers between start and end, inclusive![](image.jpg?derivatives=[640,1024,1440])
) #1147![Sepia Image](image://image.jpg?sepia)
)[Download PDF](user://data/pdf/my.pdf)
)onBeforeCacheClear
event to add custom paths to cache clearing processselfupdate
to the self-upgrade
bin/gpm
CLI commandwebserver-configs/htaccess.txt
with .htaccess
@page.modular
#1178publish_date
and unpublish_date
#1173)CompiledJsonFile
object to better handle Json files.User::find()
methodmessages
object into core Grav from login plugingetTaxonomyItemKeys
to the Taxonomy object #1124redirect_me
Twig function #1124intl
PHP extension is loaded, only these flags are available: https://secure.php.net/manual/en/collator.asort.php. Otherwise, you can use the PHP standard sorting flags (https://secure.php.net/manual/en/array.constants.php) #1169ssl
option when using GPM #1132html
, xml
, etc..) #1067Utils::getExtensionByMime()
and cleaned up Utils::getMimeByExtension
+ testscache.check.method: 'hash'
option in system.yaml
that checks all files + dates inclusivelysystem.images.auto_fix_orientation
.batch()
function to Page Collection classcache.redis.socket
setting that allow to pass a UNIX socket as redis serversystem.gpm.verify_peer
setting. This is sometimes necessary when receiving a "GPM Unable to Connect" error. More details in (#1053)curl
or fopen
as Response
connection method, via the new system.gpm.method
setting. By default this is set to 'auto' and gives priority to 'fopen' first, curl otherwise.1x
, 2x
, 3x
, etc names in the Retina derivatives cache files.Plugins::isPluginActiveAdmin()
to check if plugin route is active in Admin pluginCache::setEnabled
and Cache::getEnabled
to enable outside control of cache1.25.0
vendor/
folder)Uri::convertUrl()
functionverbosity
levels to system.error.display
to allow for system error messages #1091progress
method in the DirectInstall CommandResponse
class now handles better unsuccessful requests such as 404 and 401external
page types Admin #789param_sep
in the folder name admin #796bin/plugin
jpeg
file format support in Mediabin/gpm direct-install
command to install local and remote zip archivesonPageNotFound
event to fire after onPageInitialized
Folder::all()
base_url
now supports multi-site by path featurebin/plugin
to list plugins with commands faster by limiting the depth of recursionCache::clearCache()
tmp
folder at root. Accessible via stream tmp://
. Can be cleared with bin/grav clear --tmp-only
as well as --all
.LanguageCodes
so you can determine if a language is RTL or notcustom_base_url
in system configurationoverride
and force
options for Streams setupUtil::arrayFlatten()
static function@page.modular
Collection type #988self@
, page@
, taxonomy@
, root@
Collection syntax for cleaner YAML compatibility-y
to automate yes responses and -o
for update and selfupgrade to overwrite installations #985safe_email
Twig filter for greater security #998Utils::setDotNotation
to merge data, rather than just setImage::filter()
to the save
action to ensure they are applied last #984Truncator
code to be more reliable #1019*.md
are not confused with pages #995Memcached
connection #1020system.force_ssl
(Force SSL in the Admin System Config) #899Folder::delete
method to recursively remove files and folders and causing Upgrade to fail.id
attribute #956paramsRegex()
static to allow it to be called staticallywebserver-configs/nginx.conf
exampletype: email
field grav-plugin-email#31stable
onFatalException()
eventsystem/config/media.yaml
config into a types:
key which allows you delete default items.webserver-configs/nginx.conf
with try_files
fix from @mrhein and @rondlite #743memecache
and redis
#887Utils::normalizePath()
that was truncating 0's #882Page::rawRoute()
in blueprints for more reliable mulit-language supportzlib.output_compression
as well as mod_deflate
GZIP compressionValidation::typeX()
methods #626Page::relativePagePath()
when Page::$name
is not definedUri::processParams()
#859Uri::ip()
to static by default so it can be used in form fieldsSession
class with flash storagePage::getContentMeta()
now supports an optional key.Page::slug()
with empty string #580.gitignore
Grav's vendor folderGPM uninstall
of a plugin with Grav dependencyfilterFile
validation method always returns an array of files, behaving like multiple="multiple"
onBlueprintCreated
Page::cachePageContent()
form private to public so a page can be recached via plugin{'loading':'async'}
with Assets PipelinePage
field requiring a value #529bin/gpm version
commandPlugin::getBlueprint()
and Theme::getBlueprint()
methoddata-*@
format in blueprintsCACHE_DIR
references to use locatortwig.debug: true
by defaultextends@:
default syntax rather than the previous '@extends'
string that needed to be quoted in YAML. Also this new format allows for the defining of a context
which lets you define where to look for the base blueprint. Another new feature is the ability to extend from multiple blueprints.import@
syntax.unset@: true
syntax. To remove a field property you would use unset-<property>@: true
in your extended field definition, for example: unset-options@: true
.replace@: true
syntax for the whole field, and replace-<property>@: true
for a specific property.content
tab. This works for any field too, so you can extend a blueprint and add your own custom fields anywhere you wish! This is accomplished by using the new ordering@:
syntax with either an existing property name or an integer.config-<property>@
syntax. For example you can set a default for a field via config-default@: site.author.name
which will use the author.name value from the site.yaml
file as the default
value for this field.data-<property>@
syntax to call static methods to obtain values. For example: data-default@: '\Grav\Plugin\Admin::route'
. You can now even pass parameters to these methods.stable
and testing
channel. A new setting in system.gpm.releases
allow to switch between the two channels. Developers will be able to decide whether their resource is going to be in a pre-release state or stable. Only users who switch to the testing channel will be able to install a pre-release version.Processors
into individual classes to allow for easier modification and addition. Thanks to toovy for this work. - #745Utils::download()
method.languages
foldergpm: false
to the theme blueprint - #767node_modules
folder from backups to make them fasterbin/grav install
hasn't been run instead of throwing exception. Prevents "white page" errors if error display is offfrontmatter.yaml
file to set header frontmatter defaults. Especially useful for multilang scenarios - #775bin/grav newuser
CLI command. use bin/plugin login newuser
instead.webm
and ogv
video types to the default media types list.opcache.validate_timestamps=0
not detecting changes in compiled yaml and twig filesfind()
calling redirects via dispatch()
causing infinite loops - #781Page::contentMeta()
mechanism to store content-level meta data alongside contentstreams
blueprint from Admin plugin---
in YAML filesabsolute_urls
reverse_proxy
config option for issues with non-standard portsproxy_url
config option to support GPM behind proxy servers #639Pages::parentsRawRoutes()
methodbin/gpm info
CLI command with Changelog support #559jQuery 2.2.0
library to coreUri::convertUrl()
method to be more reliable + tests createdbase_uri
variables into Uri::init()
URI
to better support testingtwig_vars
to be exposed earlier and merged later$this
in Page constructor and init to allow chainingext-*
PHP requirements to composer.json
site.yaml
/tests
folder to deny's of all webserver-configs/*
filesUri::convertUrl()
bugsPages()
internal cache lookup not being unique enoughsite.redirects
and site.routes
being an empty listrotate
, flip
and fixOrientation
image medium methodscomposer create-project
as an additional installation method #585Page->topParent()
method to return top most parent of a pagetwig_first
processing (false by default)URI->host()
for session domainopen_basedir
when installing packages via GPMUtils::generateNonceString()
method to handle reverse proxiesbin/gpm index --installed-only
optiononPageContentProcessed()
event so it's fired more reliablyZipBackup
timeout to 10 minutes if possiblebin/grav sandbox
command to work with new webserver-config
folderdata:
page header was acting as publish_date:
saveConfig
to Themesmod_deflate
if gzip turned off7z
to media formatsselfupgrade
will now check PHP version requirementsfields
param in a list
fielduser/accounts
to .gitignore
iconv
polyfill library used by Symfony 2.8Page::copy()
and Page::move()
to support multiple moves at oncebin/grav sandbox
commandValidation->validate()
$container
available in setup.php
to fix multi-siteNestedArrayAccess
instead of DataMutatorTrait
classes
and id
on medium objects to set CSS valuesbin/plugin
umask_fix
property to system.yaml
config.theme.dropdown_enabled
append_url_extension
option to system config & page headersstate
property to allow disabling/banningPage.relativePagePath()
helper method|pad
Twig filter for strings (uses str_pad()
)lighttpd.conf
for Lightly web server/
URLs.nginx.conf
configuration file.htaccess
securitycomposer.phar
clearCache()
quality
functionality in media handlingbin/grav newuser
in favor of bin/plugin login new-user
system.pages.fallback_types
to system.media.allowed_fallback_types
generator
meta tagsystem.yaml
<style>
or <script>
scripts if no dataPlugins::get()
to ensure plugins exists@page: /route
@self.parent, @self.siblings, @self.descendants
+ more/en/english
)wrapped_site
system option for themes/plugins to usePage
object as event to onTwigPageVariables()
event hookData.items()
method to get all itemsMedium.meta
returns new Data object so null checks are possibletrue
values in User.authorize()
methodValidation
throwing an error if no label set|evaluate
Twig filter to evaluate a string as twig[30x]
codes to redirect URLsurl_taxonomy_filters
for page collections@root
page and recurse
flag for page collectionsremove
method to User objectmedia.yaml
to be treated as Page media fileserrors: display: false
by default in system.yaml
home_redirect
settings from system.yaml
media
as root twig object for consistency.htaccess
for increased securitysafeEmailFilter()
Twig filter not separating with ;
properlySVG
mimetypeCache-control: max-age
value formatnicetime
translations-y
option for 'Yes to all' in bin/gpm update
media
attribute to the Assets managermodulus
twig filterHTTP_HOST
before SERVER_NAME
(helpful with Nginx)DirectoryIndex
open_basedir
error in bin/gpm install
HTTP_HOST
getNativeName()
AudioMedium
for HTML5 audiocopy
method so new files are not lost (e.g. /css/custom.css
)convertUrl()
when used in markdown linksphpinfo()
method in case it is restricted by hosting provider&
) causing error in truncateHtml()
via Page.summary()
User.authorise()
to be backwards compabilestring
Twig filter to render as json_encoded stringauthorize
Twig filtermbstring
supportredirect
header for pagesdevelop
to master
debug
level on (was warning
)accounts/
folderbin/grav newuser
commandPages.all()
not returning modular pagesmarkdown_extra:
overriding markdown:extra:
settingURI
classunsupported_inline_types
is emptydefined
, rtrim
, ltrim
.htaccess
hardening (.htaccess
& htaccess.txt
)o
character in date formatsPage.active()
not triggering on homepagelanguage
to user blueprintdump()
methodPage.parent()
logic/
not matching active childrenheader.process
in page forms via the admin pluginset_time_limit
that might be disabled on some hostsnewuser
CLI command to create user accountsdefault
blueprint for all templatesuser
and system
language translation mergingGRAV_ROOT
in session identifierbody_classes
fieldvisiblity
toggle and help tooltips on new page formPage.unsetRoute()
method to allow admin to regenerate the routeUndefined offset: 1
exceptiontype
fieldcache_all
system setting + media cache()
methodUtils::arrayFilterRecursive()
methodInflector
from static to object and added multi-language supportuse
in VideoMedium
that was causing errorUser.authorise()
methodtranslations_fallback
onImageMediumSaved()
event (useful for post-image processing)Vary: Accept-Encoding
optionpageinit()
timingPage->routable()
now takes published()
state into accountLanguage->translate()
method taking string and arraybackup
command to include empty foldershttp_accept_language
settingtranslateArray()
language methoden
translations by default for plugins & themesbin/grav backup
command to mimic admin plugin location/namePage.rawRoute()
to get a consistent folder-based route to a pagePage.active()
and Page.activeChild()
methods to support route aliases.php
comments, .md
and .yaml
filesUtils::startsWith()
and Utils::endsWith()
now support needle arrayspageInitialized
eventenable_media_timestamp
not working properlyonBuildPagesInitialized
event for memory critical or time-consuming pluginssetSummary()
method for pagesMergeConfig()
logic for more controllast_modified
and etag
page headers by default (causing too much page caching)bin/gpm selfupgrade
to avoid issues with updated classesetag
and last_modified
headerscomposer
when available rather than Grv provided onePHP_BINARY
constant rather than php
executableconvertUrl()
method to Uri objectuninstall
+
in image filenamessize
back for Media objectsparseLinks
method to Plugins classstarts_with
and ends_with
Twig filtersUtils::rcopy
to Folder::rcopy
Folder::doDelete
onShutDown()
event..
page referencesbin/grav install
onBeforeDownload()
eventdownload()
and getMimeType()
methods to Utils classob_flush()
throwing errorselfupgrade
(Grav 0.9.21 and 0.9.22 will need to manually upgrade to this version)selfupgrade
when you are on latest versionsizes
attributes for custom retina image breakpointsaddAsyncJs()
and addDeferJs()
to Assets managernginx.conf
to ensure system assets are accessible#
breaking HTMLfirst()
and last()
to Iterator
classIterator.nth()
methodinstall
to automatically install _demo
content if found (w/backup)random_string
for generating random id valuesmarkdown
for on-the-fly markdown processingabsoluteUrl
to convert relative to absolute URLsprocessTemplate()
method to Twig object for on-the-fly processing of twig templatercopy()
and contains()
helper methods in Utilsparam_sep
variable to better support Apache on WindowsmergeConfig()
for pluginscomposer.phar
packagesite.yaml
so it can be configurablemergeConfig()
not falling back to defaultsaddInlineCss()
and addInlineJs()
Assets not working between Twig tagssrcset
image attributemergeConfig()
method to Plugin class to merge system + page header configurationdisable()
method to Plugin class to programmatically disable a pluginmarkdown_extra
system setting not getting picked upsetup.php
onPageContentRaw()
plugin event that processes before any page processingpage.content()
method to be more flexible and reliable.htaccess
url()
functionpublished
setting to have precedent of publish_date
and unpublish_date
onShutdown()
events not closing connections properly in php-fpm environmentstrue|false
state in page headerspublish_date
in page headers to automatically publish pageunpublish_date
in page headers to automatically unpublish pagedateRange()
capability for collectionssort: header.taxonomy.year
copy, nonVisible, modular, nonModular, published, nonPublished, nonRoutable
$collection->published()->visible()
uninstall
GPM command that was broken in last releaseundefined index
error when working with Collectionsuninstall
commandundefined
Twig functions and filters.html
template if error occurs on non-html pagescomposer.json
to deter API rate-limit errorsMedium
objectsself-upgrade
method of GPM commandupdate
install
commandbase_url
nicetime
date Twig filterclear-cache
functionality into Cache object required for Admin plugin@page
collection typeksort
and contains
Twig filtersgist
Twig function===
set_time_limit()
and put checks around ignore_user_abort
;
mailto:
)setup
CLI command to sandbox
sort_by_key
twig filtervisible()
and routable()
filters to page collectionstheme://
PHP stream for current themefile
modification checking rather than folder
@supports
tag compatibilitydetect
option to detect running environmentrandom
collection sort option.htaccess
including section on RewriteBase
which is needed for some hosting providers