null
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