HTTP_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