2001-03-10 11:07:52 +00:00
< ? php
2012-06-14 09:07:35 +00:00
2002-04-14 19:34:04 +00:00
/**
2003-12-08 06:32:19 +00:00
* @ file
2004-07-22 16:06:54 +00:00
* The theme system , which controls the output of Drupal .
2003-12-08 06:32:19 +00:00
*
* The theme system allows for nearly all output of the Drupal system to be
* customized by user themes .
*/
2001-10-20 13:35:12 +00:00
2019-04-16 05:38:27 +00:00
use Drupal\Core\Url ;
2014-08-13 21:01:36 +00:00
use Drupal\Component\Serialization\Json ;
2015-06-23 16:24:29 +00:00
use Drupal\Component\Utility\Crypt ;
2014-12-12 09:08:12 +00:00
use Drupal\Component\Utility\Html ;
2015-10-01 23:25:03 +00:00
use Drupal\Component\Render\MarkupInterface ;
2016-05-16 11:57:36 +00:00
use Drupal\Core\Cache\CacheableDependencyInterface ;
2013-05-07 09:47:19 +00:00
use Drupal\Core\Config\Config ;
2014-04-09 08:49:22 +00:00
use Drupal\Core\Config\StorageException ;
2016-05-16 11:57:36 +00:00
use Drupal\Core\Render\AttachmentsInterface ;
use Drupal\Core\Render\BubbleableMetadata ;
Issue #2572929 by dawehner, pwolanin, mikeker, xjm, stefan.r, David_Rothstein, hussainweb, lauriii, Wim Leers, catch, chx, alexpott: Document lack of auto-escape in theme functions and add a theme autoescape helper function
2015-09-26 15:50:12 +00:00
use Drupal\Core\Render\RenderableInterface ;
2012-09-04 13:32:47 +00:00
use Drupal\Core\Template\Attribute ;
2013-05-07 09:47:19 +00:00
use Drupal\Core\Theme\ThemeSettings ;
2013-06-12 15:57:44 +00:00
use Drupal\Component\Utility\NestedArray ;
Issue #1939062 by steveoliver, mdrummond, jenlampton, hussainweb, Cottser, joelpittet, jerdavis, ekl1773, dale42, drupalninja99, gabesullice, c4rl: Convert theme_item_list() to Twig.
2014-02-07 04:24:53 +00:00
use Drupal\Core\Render\Element ;
2015-10-01 23:25:03 +00:00
use Drupal\Core\Render\Markup ;
2018-11-22 08:40:04 +00:00
use Drupal\Core\Utility\TableSort ;
2012-06-14 09:07:35 +00:00
2007-12-31 08:54:37 +00:00
/**
2010-10-08 05:07:53 +00:00
* @ defgroup content_flags Content markers
2005-01-30 09:53:19 +00:00
* @ {
2014-08-10 21:44:18 +00:00
* Markers used by mark . html . twig and node_mark () to designate content .
*
* @ see mark . html . twig
* @ see node_mark ()
2005-01-30 09:53:19 +00:00
*/
2008-05-26 17:12:55 +00:00
/**
* Mark content as read .
*/
2011-11-29 09:56:53 +00:00
const MARK_READ = 0 ;
2008-05-26 17:12:55 +00:00
/**
* Mark content as being new .
*/
2011-11-29 09:56:53 +00:00
const MARK_NEW = 1 ;
2008-05-26 17:12:55 +00:00
/**
* Mark content as being updated .
*/
2011-11-29 09:56:53 +00:00
const MARK_UPDATED = 2 ;
2008-05-26 17:12:55 +00:00
2012-09-26 18:26:15 +00:00
/**
* A responsive table class ; hide table cell on narrow devices .
*
* Indicates that a column has medium priority and thus can be hidden on narrow
* width devices and shown on medium + width devices ( i . e . tablets and desktops ) .
*/
const RESPONSIVE_PRIORITY_MEDIUM = 'priority-medium' ;
/**
* A responsive table class ; only show table cell on wide devices .
*
* Indicates that a column has low priority and thus can be hidden on narrow
* and medium viewports and shown on wide devices ( i . e . desktops ) .
*/
const RESPONSIVE_PRIORITY_LOW = 'priority-low' ;
2005-01-30 09:53:19 +00:00
/**
2012-05-17 12:58:49 +00:00
* @ } End of " defgroup content_flags " .
2005-01-30 09:53:19 +00:00
*/
2007-04-06 13:27:23 +00:00
/**
2013-01-10 23:50:55 +00:00
* Gets the theme registry .
2010-07-21 00:27:24 +00:00
*
2012-04-24 01:57:26 +00:00
* @ param bool $complete
2011-10-02 19:14:51 +00:00
* Optional boolean to indicate whether to return the complete theme registry
2012-06-14 09:07:35 +00:00
* array or an instance of the Drupal\Core\Utility\ThemeRegistry class .
* If TRUE , the complete theme registry array will be returned . This is useful
* if you want to foreach over the whole registry , use array_ * functions or
* inspect it in a debugger . If FALSE , an instance of the
* Drupal\Core\Utility\ThemeRegistry class will be returned , this provides an
* ArrayObject which allows it to be accessed with array syntax and isset (),
* and should be more lightweight than the full registry . Defaults to TRUE .
2011-10-02 19:14:51 +00:00
*
2008-09-15 20:48:10 +00:00
* @ return
2012-06-14 09:07:35 +00:00
* The complete theme registry array , or an instance of the
* Drupal\Core\Utility\ThemeRegistry class .
2007-04-06 13:27:23 +00:00
*/
2011-10-02 19:14:51 +00:00
function theme_get_registry ( $complete = TRUE ) {
2013-11-16 21:30:33 +00:00
$theme_registry = \Drupal :: service ( 'theme.registry' );
2011-10-02 19:14:51 +00:00
if ( $complete ) {
2013-11-16 21:30:33 +00:00
return $theme_registry -> get ();
2007-04-06 13:27:23 +00:00
}
else {
2013-11-16 21:30:33 +00:00
return $theme_registry -> getRuntime ();
2007-04-06 13:27:23 +00:00
}
}
2015-12-21 12:21:30 +00:00
/**
* Returns an array of default theme features .
*
Issue #2659940 by almaudoh, alexpott, phenaproxima, Jo Fitzgerald, markcarver, oriol_e9g, dawehner, dsnopek, jibran, larowlan: Extension System, Part III: ThemeExtensionList and ThemeEngineExtensionList
2018-11-29 12:15:17 +00:00
* @ see \Drupal\Core\Extension\ThemeExtensionList :: $defaults
2015-12-21 12:21:30 +00:00
*/
function _system_default_theme_features () {
2017-03-04 01:20:24 +00:00
return [
2015-12-21 12:21:30 +00:00
'favicon' ,
'logo' ,
'node_user_picture' ,
'comment_user_picture' ,
'comment_user_verification' ,
2017-03-04 01:20:24 +00:00
];
2015-12-21 12:21:30 +00:00
}
2007-04-06 13:27:23 +00:00
/**
2013-01-10 23:50:55 +00:00
* Forces the system to rebuild the theme registry .
*
* This function should be called when modules are added to the system , or when
* a dynamic system needs to add more theme hooks .
2007-04-06 13:27:23 +00:00
*/
2008-08-02 19:01:02 +00:00
function drupal_theme_rebuild () {
2013-11-16 21:30:33 +00:00
\Drupal :: service ( 'theme.registry' ) -> reset ();
2007-04-06 13:27:23 +00:00
}
2007-07-03 18:48:41 +00:00
/**
2013-01-10 23:50:55 +00:00
* Allows themes and / or theme engines to discover overridden theme functions .
2007-07-03 18:48:41 +00:00
*
2015-05-13 10:07:51 +00:00
* @ param array $cache
2007-07-03 18:48:41 +00:00
* The existing cache of theme hooks to test against .
2015-05-13 10:07:51 +00:00
* @ param array $prefixes
2007-07-03 18:48:41 +00:00
* An array of prefixes to test , in reverse order of importance .
*
2015-05-13 10:07:51 +00:00
* @ return array
2007-07-03 18:48:41 +00:00
* The functions found , suitable for returning from hook_theme ;
*/
function drupal_find_theme_functions ( $cache , $prefixes ) {
2015-05-13 10:07:51 +00:00
$implementations = [];
2016-09-01 11:58:10 +00:00
$grouped_functions = \Drupal :: service ( 'theme.registry' ) -> getPrefixGroupedUserFunctions ( $prefixes );
2007-07-03 18:48:41 +00:00
foreach ( $cache as $hook => $info ) {
foreach ( $prefixes as $prefix ) {
2010-03-21 04:05:24 +00:00
// Find theme functions that implement possible "suggestion" variants of
// registered theme hooks and add those as new registered theme hooks.
// The 'pattern' key defines a common prefix that all suggestions must
// start with. The default is the name of the hook followed by '__'. An
// 'base hook' key is added to each entry made for a found suggestion,
// so that common functionality can be implemented for all suggestions of
2011-05-22 13:01:34 +00:00
// the same base hook. To keep things simple, deep hierarchy of
2010-03-21 04:05:24 +00:00
// suggestions is not supported: each suggestion's 'base hook' key
// refers to a base hook, not to another suggestion, and all suggestions
// are found using the base hook's pattern, not a pattern from an
// intermediary suggestion.
2010-01-03 01:16:07 +00:00
$pattern = isset ( $info [ 'pattern' ]) ? $info [ 'pattern' ] : ( $hook . '__' );
2016-06-23 09:50:41 +00:00
// Grep only the functions which are within the prefix group.
list ( $first_prefix ,) = explode ( '_' , $prefix , 2 );
if ( ! isset ( $info [ 'base hook' ]) && ! empty ( $pattern ) && isset ( $grouped_functions [ $first_prefix ])) {
$matches = preg_grep ( '/^' . $prefix . '_' . $pattern . '/' , $grouped_functions [ $first_prefix ]);
2007-07-03 18:48:41 +00:00
if ( $matches ) {
foreach ( $matches as $match ) {
2011-05-22 13:01:34 +00:00
$new_hook = substr ( $match , strlen ( $prefix ) + 1 );
2009-10-23 22:24:19 +00:00
$arg_name = isset ( $info [ 'variables' ]) ? 'variables' : 'render element' ;
2017-03-04 01:20:24 +00:00
$implementations [ $new_hook ] = [
2007-07-03 18:48:41 +00:00
'function' => $match ,
2009-10-23 22:24:19 +00:00
$arg_name => $info [ $arg_name ],
2010-03-21 04:05:24 +00:00
'base hook' => $hook ,
2017-03-04 01:20:24 +00:00
];
2007-07-03 18:48:41 +00:00
}
}
}
2010-03-21 04:05:24 +00:00
// Find theme functions that implement registered theme hooks and include
// that in what is returned so that the registry knows that the theme has
// this implementation.
2008-04-14 17:48:46 +00:00
if ( function_exists ( $prefix . '_' . $hook )) {
2017-03-04 01:20:24 +00:00
$implementations [ $hook ] = [
2008-04-14 17:48:46 +00:00
'function' => $prefix . '_' . $hook ,
2017-03-04 01:20:24 +00:00
];
2007-07-03 18:48:41 +00:00
}
}
}
2010-03-21 04:05:24 +00:00
return $implementations ;
2007-07-03 18:48:41 +00:00
}
/**
2013-01-10 23:50:55 +00:00
* Allows themes and / or theme engines to easily discover overridden templates .
2007-07-03 18:48:41 +00:00
*
* @ param $cache
* The existing cache of theme hooks to test against .
* @ param $extension
* The extension that these templates will have .
* @ param $path
* The path to search .
*/
function drupal_find_theme_templates ( $cache , $extension , $path ) {
2017-03-04 01:20:24 +00:00
$implementations = [];
2007-07-03 18:48:41 +00:00
2008-01-21 21:47:08 +00:00
// Collect paths to all sub-themes grouped by base themes. These will be
// used for filtering. This allows base themes to have sub-themes in its
// folder hierarchy without affecting the base themes template discovery.
2017-03-04 01:20:24 +00:00
$theme_paths = [];
2015-01-13 10:17:01 +00:00
foreach ( \Drupal :: service ( 'theme_handler' ) -> listInfo () as $theme_info ) {
2008-01-21 21:47:08 +00:00
if ( ! empty ( $theme_info -> base_theme )) {
2014-03-11 17:19:24 +00:00
$theme_paths [ $theme_info -> base_theme ][ $theme_info -> getName ()] = $theme_info -> getPath ();
2008-01-21 21:47:08 +00:00
}
}
foreach ( $theme_paths as $basetheme => $subthemes ) {
foreach ( $subthemes as $subtheme => $subtheme_path ) {
if ( isset ( $theme_paths [ $subtheme ])) {
$theme_paths [ $basetheme ] = array_merge ( $theme_paths [ $basetheme ], $theme_paths [ $subtheme ]);
}
2008-01-09 22:01:29 +00:00
}
}
2014-08-21 16:53:03 +00:00
$theme = \Drupal :: theme () -> getActiveTheme () -> getName ();
2017-03-04 01:20:24 +00:00
$subtheme_paths = isset ( $theme_paths [ $theme ]) ? $theme_paths [ $theme ] : [];
2008-01-09 22:01:29 +00:00
2008-01-21 21:47:08 +00:00
// Escape the periods in the extension.
2009-05-24 17:39:35 +00:00
$regex = '/' . str_replace ( '.' , '\.' , $extension ) . '$/' ;
2010-03-21 04:05:24 +00:00
// Get a listing of all template files in the path to search.
Issue #3035312 by kim.pepper, andypost, martin107, yogeshmpawar, naveenvalecha, pguillard, Berdir, dww, claudiu.cristea, jibran, Mile23: Move file_scan_directory() to file_system service
2019-07-24 10:29:08 +00:00
$files = [];
if ( is_dir ( $path )) {
$files = \Drupal :: service ( 'file_system' ) -> scanDirectory ( $path , $regex , [ 'key' => 'filename' ]);
}
2010-03-21 04:05:24 +00:00
// Find templates that implement registered theme hooks and include that in
// what is returned so that the registry knows that the theme has this
// implementation.
2007-07-03 18:48:41 +00:00
foreach ( $files as $template => $file ) {
2008-01-21 21:47:08 +00:00
// Ignore sub-theme templates for the current theme.
2009-08-17 19:14:42 +00:00
if ( strpos ( $file -> uri , str_replace ( $subtheme_paths , '' , $file -> uri )) !== 0 ) {
2008-01-09 22:01:29 +00:00
continue ;
}
2013-01-30 03:11:25 +00:00
// Remove the extension from the filename.
$template = str_replace ( $extension , '' , $template );
2007-08-16 13:59:41 +00:00
// Transform - in filenames to _ to match function naming scheme
// for the purposes of searching.
$hook = strtr ( $template , '-' , '_' );
if ( isset ( $cache [ $hook ])) {
2017-03-04 01:20:24 +00:00
$implementations [ $hook ] = [
2007-08-26 07:46:11 +00:00
'template' => $template ,
2009-08-17 19:14:42 +00:00
'path' => dirname ( $file -> uri ),
2017-03-04 01:20:24 +00:00
];
2007-07-03 18:48:41 +00:00
}
2011-10-27 03:52:26 +00:00
// Match templates based on the 'template' filename.
foreach ( $cache as $hook => $info ) {
if ( isset ( $info [ 'template' ])) {
2017-03-13 16:32:24 +00:00
if ( $template === $info [ 'template' ]) {
2017-03-04 01:20:24 +00:00
$implementations [ $hook ] = [
2011-10-27 03:52:26 +00:00
'template' => $template ,
'path' => dirname ( $file -> uri ),
2017-03-04 01:20:24 +00:00
];
2011-10-27 03:52:26 +00:00
}
}
}
2007-07-03 18:48:41 +00:00
}
2010-03-21 04:05:24 +00:00
// Find templates that implement possible "suggestion" variants of registered
2010-03-26 17:14:46 +00:00
// theme hooks and add those as new registered theme hooks. See
2010-03-21 04:05:24 +00:00
// drupal_find_theme_functions() for more information about suggestions and
// the use of 'pattern' and 'base hook'.
2007-07-03 18:48:41 +00:00
$patterns = array_keys ( $files );
foreach ( $cache as $hook => $info ) {
2010-01-03 01:16:07 +00:00
$pattern = isset ( $info [ 'pattern' ]) ? $info [ 'pattern' ] : ( $hook . '__' );
2010-03-21 04:05:24 +00:00
if ( ! isset ( $info [ 'base hook' ]) && ! empty ( $pattern )) {
2007-08-16 13:59:41 +00:00
// Transform _ in pattern to - to match file naming scheme
// for the purposes of searching.
2010-01-03 01:16:07 +00:00
$pattern = strtr ( $pattern , '_' , '-' );
2007-08-16 13:59:41 +00:00
2008-04-14 17:48:46 +00:00
$matches = preg_grep ( '/^' . $pattern . '/' , $patterns );
2007-07-03 18:48:41 +00:00
if ( $matches ) {
foreach ( $matches as $match ) {
2012-11-03 17:36:10 +00:00
$file = $match ;
2013-01-30 03:11:25 +00:00
// Remove the extension from the filename.
$file = str_replace ( $extension , '' , $file );
2013-01-10 23:50:55 +00:00
// Put the underscores back in for the hook name and register this
// pattern.
2009-10-23 22:24:19 +00:00
$arg_name = isset ( $info [ 'variables' ]) ? 'variables' : 'render element' ;
2017-03-04 01:20:24 +00:00
$implementations [ strtr ( $file , '-' , '_' )] = [
2007-08-26 07:46:11 +00:00
'template' => $file ,
2009-08-17 19:14:42 +00:00
'path' => dirname ( $files [ $match ] -> uri ),
2009-10-23 22:24:19 +00:00
$arg_name => $info [ $arg_name ],
2010-03-21 04:05:24 +00:00
'base hook' => $hook ,
2017-03-04 01:20:24 +00:00
];
2007-07-03 18:48:41 +00:00
}
}
}
}
2010-03-21 04:05:24 +00:00
return $implementations ;
2007-07-03 18:48:41 +00:00
}
2004-08-20 07:51:27 +00:00
/**
2013-01-10 23:50:55 +00:00
* Retrieves a setting for the current theme or for a given theme .
2004-08-20 07:51:27 +00:00
*
2010-02-17 08:50:49 +00:00
* The final setting is obtained from the last value found in the following
* sources :
* - the saved values from the global theme settings form
* - the saved values from the theme ' s settings form
* To only retrieve the default global theme setting , an empty string should be
* given for $theme .
2004-08-20 07:51:27 +00:00
*
* @ param $setting_name
2010-07-21 00:27:24 +00:00
* The name of the setting to be retrieved .
2009-10-14 10:56:35 +00:00
* @ param $theme
2010-07-21 00:27:24 +00:00
* The name of a given theme ; defaults to the current theme .
*
2004-08-20 07:51:27 +00:00
* @ return
* The value of the requested setting , NULL if the setting does not exist .
*/
2009-10-14 10:56:35 +00:00
function theme_get_setting ( $setting_name , $theme = NULL ) {
2014-11-26 21:31:55 +00:00
/** @var \Drupal\Core\Theme\ThemeSettings[] $cache */
2017-03-04 01:20:24 +00:00
$cache = & drupal_static ( __FUNCTION__ , []);
2004-08-20 07:51:27 +00:00
2009-10-14 10:56:35 +00:00
// If no key is given, use the current theme if we can determine it.
2010-09-26 23:31:36 +00:00
if ( ! isset ( $theme )) {
2014-08-21 16:53:03 +00:00
$theme = \Drupal :: theme () -> getActiveTheme () -> getName ();
2009-10-14 10:56:35 +00:00
}
2004-08-20 07:51:27 +00:00
2009-10-14 10:56:35 +00:00
if ( empty ( $cache [ $theme ])) {
2013-05-07 09:47:19 +00:00
// Create a theme settings object.
$cache [ $theme ] = new ThemeSettings ( $theme );
2014-11-26 21:31:55 +00:00
// Get the global settings from configuration.
$cache [ $theme ] -> setData ( \Drupal :: config ( 'system.theme.global' ) -> get ());
2009-10-14 10:56:35 +00:00
2015-01-13 10:17:01 +00:00
// Get the values for the theme-specific settings from the .info.yml files
// of the theme and all its base themes.
2014-11-26 21:31:55 +00:00
$themes = \Drupal :: service ( 'theme_handler' ) -> listInfo ();
if ( isset ( $themes [ $theme ])) {
2009-10-14 10:56:35 +00:00
$theme_object = $themes [ $theme ];
2014-04-09 08:49:22 +00:00
// Retrieve configured theme-specific settings, if any.
try {
if ( $theme_settings = \Drupal :: config ( $theme . '.settings' ) -> get ()) {
$cache [ $theme ] -> merge ( $theme_settings );
}
}
catch ( StorageException $e ) {
}
2009-10-14 10:56:35 +00:00
2010-03-26 12:45:20 +00:00
// If the theme does not support a particular feature, override the global
// setting and set the value to NULL.
if ( ! empty ( $theme_object -> info [ 'features' ])) {
2013-05-07 09:47:19 +00:00
foreach ( _system_default_theme_features () as $feature ) {
2010-03-26 12:45:20 +00:00
if ( ! in_array ( $feature , $theme_object -> info [ 'features' ])) {
2013-05-07 09:47:19 +00:00
$cache [ $theme ] -> set ( 'features.' . $feature , NULL );
2010-03-26 12:45:20 +00:00
}
}
}
2009-10-14 10:56:35 +00:00
// Generate the path to the logo image.
Issue #2005546 by mdrummond, joelpittet, Manuel Garcia, lauriii, lokapujya, epari.siva, hosef, rpayanm, emma.maria, HOG, zetagraph, wmortada, rteijeiro, Cottser, hussainweb, madhavvyas: Use branding block in place of page template branding variables (site name, slogan, site logo)
2015-09-10 07:42:29 +00:00
if ( $cache [ $theme ] -> get ( 'logo.use_default' )) {
Issue #1507896 by b0unty, tuutti, Jeff Burnz, LewisNyman, tameeshb, realityloop, cbanman, umarzaffer, manumilou, mgifford, mducharme, oakulm, lauriii, alexpott, joelpittet, MaskyS, markcarver, xjm: Allow theme developers to add the default logo filename to the theme's .info.yml
2018-05-11 09:54:22 +00:00
$logo = \Drupal :: service ( 'theme.initialization' ) -> getActiveThemeByName ( $theme ) -> getLogo ();
$cache [ $theme ] -> set ( 'logo.url' , file_url_transform_relative ( file_create_url ( $logo )));
Issue #2005546 by mdrummond, joelpittet, Manuel Garcia, lauriii, lokapujya, epari.siva, hosef, rpayanm, emma.maria, HOG, zetagraph, wmortada, rteijeiro, Cottser, hussainweb, madhavvyas: Use branding block in place of page template branding variables (site name, slogan, site logo)
2015-09-10 07:42:29 +00:00
}
elseif ( $logo_path = $cache [ $theme ] -> get ( 'logo.path' )) {
2016-01-15 04:20:55 +00:00
$cache [ $theme ] -> set ( 'logo.url' , file_url_transform_relative ( file_create_url ( $logo_path )));
2005-05-25 06:03:18 +00:00
}
2009-10-14 10:56:35 +00:00
// Generate the path to the favicon.
2013-05-07 09:47:19 +00:00
if ( $cache [ $theme ] -> get ( 'features.favicon' )) {
$favicon_path = $cache [ $theme ] -> get ( 'favicon.path' );
if ( $cache [ $theme ] -> get ( 'favicon.use_default' )) {
2014-03-11 17:19:24 +00:00
if ( file_exists ( $favicon = $theme_object -> getPath () . '/favicon.ico' )) {
2016-01-15 04:20:55 +00:00
$cache [ $theme ] -> set ( 'favicon.url' , file_url_transform_relative ( file_create_url ( $favicon )));
2009-10-14 10:56:35 +00:00
}
else {
2016-01-15 04:20:55 +00:00
$cache [ $theme ] -> set ( 'favicon.url' , file_url_transform_relative ( file_create_url ( 'core/misc/favicon.ico' )));
2009-10-14 10:56:35 +00:00
}
}
2013-05-07 09:47:19 +00:00
elseif ( $favicon_path ) {
2016-01-15 04:20:55 +00:00
$cache [ $theme ] -> set ( 'favicon.url' , file_url_transform_relative ( file_create_url ( $favicon_path )));
2009-10-14 10:56:35 +00:00
}
else {
2013-05-07 09:47:19 +00:00
$cache [ $theme ] -> set ( 'features.favicon' , FALSE );
2009-10-14 10:56:35 +00:00
}
2007-05-22 19:56:00 +00:00
}
2005-05-25 06:03:18 +00:00
}
2004-08-20 07:51:27 +00:00
}
2013-05-07 09:47:19 +00:00
return $cache [ $theme ] -> get ( $setting_name );
}
Issue #2572929 by dawehner, pwolanin, mikeker, xjm, stefan.r, David_Rothstein, hussainweb, lauriii, Wim Leers, catch, chx, alexpott: Document lack of auto-escape in theme functions and add a theme autoescape helper function
2015-09-26 15:50:12 +00:00
/**
* Escapes and renders variables for theme functions .
*
* This method is used in theme functions to ensure that the result is safe for
* output inside HTML fragments . This mimics the behavior of the auto - escape
* functionality in Twig .
*
* Note : This function should be kept in sync with
* \Drupal\Core\Template\TwigExtension :: escapeFilter () .
*
* @ param mixed $arg
* The string , object , or render array to escape if needed .
*
* @ return string
* The rendered string , safe for use in HTML . The string is not safe when used
* as any part of an HTML attribute name or value .
*
* @ throws \Exception
* Thrown when an object is passed in which cannot be printed .
*
* @ see \Drupal\Core\Template\TwigExtension :: escapeFilter ()
*
* @ todo Discuss deprecating this in https :// www . drupal . org / node / 2575081.
* @ todo Refactor this to keep it in sync with Twig filtering in
* https :// www . drupal . org / node / 2575065
*/
function theme_render_and_autoescape ( $arg ) {
2016-05-16 11:57:36 +00:00
// If it's a renderable, then it'll be up to the generated render array it
// returns to contain the necessary cacheability & attachment metadata. If
// it doesn't implement CacheableDependencyInterface or AttachmentsInterface
// then there is nothing to do here.
if ( ! ( $arg instanceof RenderableInterface ) && ( $arg instanceof CacheableDependencyInterface || $arg instanceof AttachmentsInterface )) {
$arg_bubbleable = [];
BubbleableMetadata :: createFromObject ( $arg )
-> applyTo ( $arg_bubbleable );
\Drupal :: service ( 'renderer' ) -> render ( $arg_bubbleable );
}
2015-10-09 15:39:35 +00:00
if ( $arg instanceof MarkupInterface ) {
Issue #2572929 by dawehner, pwolanin, mikeker, xjm, stefan.r, David_Rothstein, hussainweb, lauriii, Wim Leers, catch, chx, alexpott: Document lack of auto-escape in theme functions and add a theme autoescape helper function
2015-09-26 15:50:12 +00:00
return ( string ) $arg ;
}
$return = NULL ;
if ( is_scalar ( $arg )) {
$return = ( string ) $arg ;
}
elseif ( is_object ( $arg )) {
if ( $arg instanceof RenderableInterface ) {
$arg = $arg -> toRenderable ();
}
elseif ( method_exists ( $arg , '__toString' )) {
$return = ( string ) $arg ;
}
// You can't throw exceptions in the magic PHP __toString methods, see
2016-01-05 14:31:39 +00:00
// http://php.net/manual/language.oop5.magic.php#object.tostring so
Issue #2572929 by dawehner, pwolanin, mikeker, xjm, stefan.r, David_Rothstein, hussainweb, lauriii, Wim Leers, catch, chx, alexpott: Document lack of auto-escape in theme functions and add a theme autoescape helper function
2015-09-26 15:50:12 +00:00
// we also support a toString method.
elseif ( method_exists ( $arg , 'toString' )) {
$return = $arg -> toString ();
}
else {
2015-11-25 09:49:13 +00:00
throw new \Exception ( 'Object of type ' . get_class ( $arg ) . ' cannot be printed.' );
Issue #2572929 by dawehner, pwolanin, mikeker, xjm, stefan.r, David_Rothstein, hussainweb, lauriii, Wim Leers, catch, chx, alexpott: Document lack of auto-escape in theme functions and add a theme autoescape helper function
2015-09-26 15:50:12 +00:00
}
}
// We have a string or an object converted to a string: Escape it!
if ( isset ( $return )) {
2016-02-25 07:22:51 +00:00
return $return instanceof MarkupInterface ? $return : Html :: escape ( $return );
Issue #2572929 by dawehner, pwolanin, mikeker, xjm, stefan.r, David_Rothstein, hussainweb, lauriii, Wim Leers, catch, chx, alexpott: Document lack of auto-escape in theme functions and add a theme autoescape helper function
2015-09-26 15:50:12 +00:00
}
// This is a normal render array, which is safe by definition, with special
// simple cases already handled.
// Early return if this element was pre-rendered (no need to re-render).
if ( isset ( $arg [ '#printed' ]) && $arg [ '#printed' ] == TRUE && isset ( $arg [ '#markup' ]) && strlen ( $arg [ '#markup' ]) > 0 ) {
return ( string ) $arg [ '#markup' ];
}
$arg [ '#printed' ] = FALSE ;
return ( string ) \Drupal :: service ( 'renderer' ) -> render ( $arg );
}
2013-05-07 09:47:19 +00:00
/**
* Converts theme settings to configuration .
*
* @ see system_theme_settings_submit ()
*
* @ param array $theme_settings
* An array of theme settings from system setting form or a Drupal 7 variable .
2017-11-16 15:00:40 +00:00
* @ param \Drupal\Core\Config\Config $config
2013-05-07 09:47:19 +00:00
* The configuration object to update .
*
* @ return
* The Config object with updated data .
*/
function theme_settings_convert_to_config ( array $theme_settings , Config $config ) {
foreach ( $theme_settings as $key => $value ) {
if ( $key == 'default_logo' ) {
$config -> set ( 'logo.use_default' , $value );
}
2015-11-28 15:50:23 +00:00
elseif ( $key == 'logo_path' ) {
2013-05-07 09:47:19 +00:00
$config -> set ( 'logo.path' , $value );
}
2015-11-28 15:50:23 +00:00
elseif ( $key == 'default_favicon' ) {
2013-05-07 09:47:19 +00:00
$config -> set ( 'favicon.use_default' , $value );
}
2015-11-28 15:50:23 +00:00
elseif ( $key == 'favicon_path' ) {
2013-05-07 09:47:19 +00:00
$config -> set ( 'favicon.path' , $value );
}
2015-11-28 15:50:23 +00:00
elseif ( $key == 'favicon_mimetype' ) {
2013-05-07 09:47:19 +00:00
$config -> set ( 'favicon.mimetype' , $value );
}
2015-11-28 15:50:23 +00:00
elseif ( substr ( $key , 0 , 7 ) == 'toggle_' ) {
2018-05-08 16:23:11 +00:00
$config -> set ( 'features.' . mb_substr ( $key , 7 ), $value );
2013-05-07 09:47:19 +00:00
}
2017-03-04 01:20:24 +00:00
elseif ( ! in_array ( $key , [ 'theme' , 'logo_upload' ])) {
2013-05-07 09:47:19 +00:00
$config -> set ( $key , $value );
}
}
return $config ;
2004-08-20 07:51:27 +00:00
}
2012-01-31 05:17:24 +00:00
/**
2014-08-24 20:46:18 +00:00
* Prepares variables for time templates .
*
* Default template : time . html . twig .
2013-02-16 23:29:53 +00:00
*
* @ param array $variables
2013-03-13 05:04:27 +00:00
* An associative array possibly containing :
2013-02-16 23:29:53 +00:00
* - attributes [ 'timestamp' ] :
* - timestamp :
* - text :
2012-01-31 05:17:24 +00:00
*/
2014-08-24 20:46:18 +00:00
function template_preprocess_time ( & $variables ) {
2019-01-01 19:15:24 +00:00
/** @var \Drupal\Core\Datetime\DateFormatterInterface $date_formatter */
$date_formatter = \Drupal :: service ( 'date.formatter' );
2012-01-31 05:17:24 +00:00
// Format the 'datetime' attribute based on the timestamp.
// @see http://www.w3.org/TR/html5-author/the-time-element.html#attr-time-datetime
if ( ! isset ( $variables [ 'attributes' ][ 'datetime' ]) && isset ( $variables [ 'timestamp' ])) {
2019-01-01 19:15:24 +00:00
$variables [ 'attributes' ][ 'datetime' ] = $date_formatter -> format ( $variables [ 'timestamp' ], 'html_datetime' , '' , 'UTC' );
2012-01-31 05:17:24 +00:00
}
// If no text was provided, try to auto-generate it.
if ( ! isset ( $variables [ 'text' ])) {
// Format and use a human-readable version of the timestamp, if any.
if ( isset ( $variables [ 'timestamp' ])) {
2019-01-01 19:15:24 +00:00
$variables [ 'text' ] = $date_formatter -> format ( $variables [ 'timestamp' ]);
2012-01-31 05:17:24 +00:00
}
// Otherwise, use the literal datetime attribute.
elseif ( isset ( $variables [ 'attributes' ][ 'datetime' ])) {
$variables [ 'text' ] = $variables [ 'attributes' ][ 'datetime' ];
}
}
}
2014-08-29 04:42:51 +00:00
/**
* Prepares variables for datetime form element templates .
*
* The datetime form element serves as a wrapper around the date element type ,
* which creates a date and a time component for a date .
*
* Default template : datetime - form . html . twig .
*
* @ param array $variables
* An associative array containing :
* - element : An associative array containing the properties of the element .
* Properties used : #title, #value, #options, #description, #required,
* #attributes.
*
* @ see form_process_datetime ()
*/
function template_preprocess_datetime_form ( & $variables ) {
$element = $variables [ 'element' ];
2017-03-04 01:20:24 +00:00
$variables [ 'attributes' ] = [];
Issue #3072906 by bnjmnm, zrpnr, Wim Leers, lauriii, catch, mpdonadio, xjm, rainbreaw, andrewmacpherson, mgifford, anevins, jhedstrom: Deprecate and remove jQuery UI datepicker
2019-10-30 16:39:14 +00:00
2014-08-29 04:42:51 +00:00
if ( isset ( $element [ '#id' ])) {
$variables [ 'attributes' ][ 'id' ] = $element [ '#id' ];
}
if ( ! empty ( $element [ '#attributes' ][ 'class' ])) {
$variables [ 'attributes' ][ 'class' ] = ( array ) $element [ '#attributes' ][ 'class' ];
}
$variables [ 'content' ] = $element ;
Issue #3072906 by bnjmnm, zrpnr, Wim Leers, lauriii, catch, mpdonadio, xjm, rainbreaw, andrewmacpherson, mgifford, anevins, jhedstrom: Deprecate and remove jQuery UI datepicker
2019-10-30 16:39:14 +00:00
// Add instructional text describing the required date and time formats.
// This will be hidden on JavaScript-enabled browsers that have a native
// datepicker.
if ( ! empty ( $element [ '#date_date_format' ])) {
$placeholder_date = 'YYYY-MM-DD' ;
$variables [ 'attributes' ][ 'data-drupal-field-elements' ] = 'date' . ( $element [ '#date_time_element' ] === 'none' ? '' : '-time' );
$date_format = is_array ( $element [ '#date_date_format' ]) ? $element [ '#date_date_format' ][ 0 ] : date ( $element [ '#date_date_format' ]);
$variables [ 'content' ][ 'date' ][ '#attributes' ][ 'placeholder' ] = $placeholder_date ;
$help_date = t ( 'Enter the date using the format @placeholder_date (e.g., @date_format).' , [ '@date_format' => $date_format , '@placeholder_date' => $placeholder_date ]);
$variables [ 'content' ][ 'date' ][ '#attributes' ][ 'data-help' ] = $help_date ;
// Include time formatting instructions when a time input is present.
if ( ! empty ( $element [ '#date_time_format' ])) {
$placeholder_time = 'hh:mm:ss' ;
$time_format = is_array ( $element [ '#date_time_format' ]) ? $element [ '#date_time_format' ][ 0 ] : date ( $element [ '#date_time_format' ]);
$variables [ 'content' ][ 'time' ][ '#attributes' ][ 'placeholder' ] = $placeholder_time ;
$help_time = t ( 'Enter the time using the format @placeholder_time (e.g., @time_format).' , [ '@time_format' => $time_format , '@placeholder_time' => $placeholder_time ]);
$variables [ 'content' ][ 'time' ][ '#attributes' ][ 'data-help' ] = $help_time ;
}
}
2014-08-29 04:42:51 +00:00
}
/**
* Prepares variables for datetime form wrapper templates .
*
* Default template : datetime - wrapper . html . twig .
*
* @ param array $variables
* An associative array containing :
* - element : An associative array containing the properties of the element .
* Properties used : #title, #children, #required, #attributes.
*/
function template_preprocess_datetime_wrapper ( & $variables ) {
$element = $variables [ 'element' ];
if ( ! empty ( $element [ '#title' ])) {
$variables [ 'title' ] = $element [ '#title' ];
Issue #2652850 by tstoeckler, mohit_aghera, idebr, hchonov, mbovan, rodrigoaguilera, jwilson3, pguillard, espurnes, dravenk, ainarend, handkerchief, alexpott: Title for details form elements is not set as '#markup' and it will be escaped, but all other form elements use '#markup' and are not escaped
2018-06-22 12:33:12 +00:00
// If the element title is a string, wrap it a render array so that markup
// will not be escaped (but XSS-filtered).
if ( is_string ( $variables [ 'title' ]) && $variables [ 'title' ] !== '' ) {
$variables [ 'title' ] = [ '#markup' => $variables [ 'title' ]];
}
2014-08-29 04:42:51 +00:00
}
2015-10-06 05:32:45 +00:00
// Suppress error messages.
Issue #1493324 by tim.plunkett, dmsmidt, mgifford, bleen18, davidhernandez, crasx, mparker17, stefan.r, YesCT, joelpittet, tstoeckler, larowlan, vijaycs85, swentel, rpayanm, Bojhan, LewisNyman, emma.maria, BarisW, njbarrett, rteijeiro, nod_, sun, joshtaylor, mrjmd, webchick, marcvangend, kattekrab, SKAUGHT, bowersox, andrewmacpherson, Manjit.Singh, RavindraSingh, Wim Leers, BLadwin, aspilicious, mortendk, mausolos, jessebeach, Gábor Hojtsy, anandps, falcon03, franz, andypost, rooby, rootwork, Cottser, Xano: Inline form errors for accessibility and UX
2015-06-12 13:54:11 +00:00
$variables [ 'errors' ] = NULL ;
Issue #1918994 by Tim Bozeman, mgifford, mpdonadio, vprocessor, sun, xjm, falcon03, nabiyllin, rteijeiro, cwarsaw, yoroy, andymartha, jessebeach, lauriii, jhedstrom, andypost, Bojhan, cilefen, aaronbauman, sugaroverflow: Improve Datetime and Daterange Widget accessibility
2017-03-03 16:03:40 +00:00
$variables [ 'description' ] = NULL ;
2014-08-29 04:42:51 +00:00
if ( ! empty ( $element [ '#description' ])) {
Issue #1918994 by Tim Bozeman, mgifford, mpdonadio, vprocessor, sun, xjm, falcon03, nabiyllin, rteijeiro, cwarsaw, yoroy, andymartha, jessebeach, lauriii, jhedstrom, andypost, Bojhan, cilefen, aaronbauman, sugaroverflow: Improve Datetime and Daterange Widget accessibility
2017-03-03 16:03:40 +00:00
$description_attributes = [];
if ( ! empty ( $element [ '#id' ])) {
$description_attributes [ 'id' ] = $element [ '#id' ] . '--description' ;
}
Issue #3072906 by bnjmnm, zrpnr, Wim Leers, lauriii, catch, mpdonadio, xjm, rainbreaw, andrewmacpherson, mgifford, anevins, jhedstrom: Deprecate and remove jQuery UI datepicker
2019-10-30 16:39:14 +00:00
$description_attributes [ 'data-drupal-field-elements' ] = 'description' ;
2014-08-29 04:42:51 +00:00
$variables [ 'description' ] = $element [ '#description' ];
Issue #1918994 by Tim Bozeman, mgifford, mpdonadio, vprocessor, sun, xjm, falcon03, nabiyllin, rteijeiro, cwarsaw, yoroy, andymartha, jessebeach, lauriii, jhedstrom, andypost, Bojhan, cilefen, aaronbauman, sugaroverflow: Improve Datetime and Daterange Widget accessibility
2017-03-03 16:03:40 +00:00
$variables [ 'description_attributes' ] = new Attribute ( $description_attributes );
2014-08-29 04:42:51 +00:00
}
2014-09-17 23:16:41 +00:00
$variables [ 'required' ] = FALSE ;
2015-08-04 10:54:55 +00:00
// For required datetime fields 'form-required' & 'js-form-required' classes
// are appended to the label attributes.
2014-08-29 04:42:51 +00:00
if ( ! empty ( $element [ '#required' ])) {
2014-09-17 23:16:41 +00:00
$variables [ 'required' ] = TRUE ;
2014-08-29 04:42:51 +00:00
}
$variables [ 'content' ] = $element [ '#children' ];
}
2003-11-09 23:27:22 +00:00
/**
2014-02-07 04:28:14 +00:00
* Prepares variables for links templates .
2004-07-22 16:06:54 +00:00
*
2014-02-07 04:28:14 +00:00
* Default template : links . html . twig .
*
2016-04-29 08:53:52 +00:00
* Unfortunately links templates duplicate the " active " class handling of l ()
* and LinkGenerator :: generate () because it needs to be able to set the " active "
Issue #2546248 by scythian, XaviP, darrenwh, mikebell_, ingaro, urbanlegend, jhodgdon, davidhernandez, andypost, joelpittet, emma.maria, cdykstra, Cottser, LewisNyman, joachim: Use consistent style to mention HTML tags in code comments
2016-05-26 19:12:15 +00:00
* class not on the links themselves ( < a > tags ), but on the list items ( < li >
2016-04-29 08:53:52 +00:00
* tags ) that contain the links . This is necessary for CSS to be able to style
* list items differently when the link is active , since CSS does not yet allow
* one to style list items only if it contains a certain element with a certain
* class . I . e . we cannot yet convert this jQuery selector to a CSS selector :
* jQuery ( 'li:has("a.is-active")' )
*
2014-02-07 04:28:14 +00:00
* @ param array $variables
2009-10-09 01:00:08 +00:00
* An associative array containing :
2016-01-26 05:35:39 +00:00
* - links : An array of links to be themed . Each link should be itself an
* array , with the following elements :
2010-10-30 03:57:20 +00:00
* - title : The link text .
2016-04-26 13:00:14 +00:00
* - url : ( optional ) The \Drupal\Core\Url object to link to . If omitted , no
* anchor tag is printed out .
2013-01-10 23:50:55 +00:00
* - attributes : ( optional ) Attributes for the anchor , or for the < span >
* tag used in its place if no 'href' is supplied . If element 'class' is
2011-10-24 05:30:36 +00:00
* included , it must be an array of one or more class names .
2013-01-10 23:50:55 +00:00
* If the 'href' element is supplied , the entire link array is passed to
* l () as its $options parameter .
2016-04-26 13:00:14 +00:00
* - attributes : A keyed array of attributes for the < ul > containing the list
* of links .
2014-02-07 04:28:14 +00:00
* - set_active_class : ( optional ) Whether each link should compare the
2014-01-23 18:04:41 +00:00
* route_name + route_parameters or href ( path ), language and query options
Issue #2713451 by dimaro, Vinay15, ashishdalvi, Apoorv.mathur2003, er.pushpinderrana, singh_haneet, chgasparoto, mayurjadhav, kanav_7, jhodgdon, joachim, Wim Leers: Update docs in template_preprocess_links()
2018-07-26 07:09:08 +00:00
* to the current URL , to determine whether the link is " active " . If so ,
* attributes will be added to the HTML elements for both the link and the
* list item that contains it , which will result in an " is-active " class
* being added to both . The class is added via JavaScript for authenticated
* users ( in the active - link library ), and via PHP for anonymous users ( in
* the \Drupal\Core\EventSubscriber\ActiveLinkResponseFilter class ) .
2013-01-10 23:50:55 +00:00
* - heading : ( optional ) A heading to precede the links . May be an
* associative array or a string . If it ' s an array , it can have the
* following elements :
2010-10-30 03:57:20 +00:00
* - text : The heading text .
* - level : The heading level ( e . g . 'h2' , 'h3' ) .
2014-09-09 09:34:37 +00:00
* - attributes : ( optional ) An array of the CSS attributes for the heading .
2009-10-09 01:00:08 +00:00
* When using a string it will be used as the text of the heading and the
2010-10-30 03:57:20 +00:00
* level will default to 'h2' . Headings should be used on navigation menus
* and any list of links that consistently appears on multiple pages . To
2013-06-17 19:58:27 +00:00
* make the heading invisible use the 'visually-hidden' CSS class . Do not
2014-07-16 11:31:36 +00:00
* use 'display:none' , which removes it from screen readers and assistive
* technology . Headings allow screen reader and keyboard only users to
2010-10-30 03:57:20 +00:00
* navigate to or skip the links . See
* http :// juicystudio . com / article / screen - readers - display - none . php and
* http :// www . w3 . org / TR / WCAG - TECHS / H42 . html for more information .
2014-01-23 18:04:41 +00:00
*
2014-09-28 07:21:34 +00:00
* @ see \Drupal\Core\Utility\LinkGenerator
2014-01-23 18:04:41 +00:00
* @ see \Drupal\Core\Utility\LinkGenerator :: generate ()
2014-10-16 12:36:06 +00:00
* @ see system_page_attachments ()
2003-12-08 06:32:19 +00:00
*/
2014-02-07 04:28:14 +00:00
function template_preprocess_links ( & $variables ) {
2009-10-09 01:00:08 +00:00
$links = $variables [ 'links' ];
2014-02-07 04:28:14 +00:00
$heading = & $variables [ 'heading' ];
2006-05-18 14:58:57 +00:00
2011-12-19 10:45:52 +00:00
if ( ! empty ( $links )) {
// Prepend the heading to the list, if any.
2009-08-31 19:50:18 +00:00
if ( ! empty ( $heading )) {
Issue #2546248 by scythian, XaviP, darrenwh, mikebell_, ingaro, urbanlegend, jhodgdon, davidhernandez, andypost, joelpittet, emma.maria, cdykstra, Cottser, LewisNyman, joachim: Use consistent style to mention HTML tags in code comments
2016-05-26 19:12:15 +00:00
// Convert a string heading into an array, using a <h2> tag by default.
2009-08-31 19:50:18 +00:00
if ( is_string ( $heading )) {
2017-03-04 01:20:24 +00:00
$heading = [ 'text' => $heading ];
2009-08-31 19:50:18 +00:00
}
2011-12-19 10:45:52 +00:00
// Merge in default array properties into $heading.
2017-03-04 01:20:24 +00:00
$heading += [
2011-12-19 10:45:52 +00:00
'level' => 'h2' ,
2017-03-04 01:20:24 +00:00
'attributes' => [],
];
2014-02-07 04:28:14 +00:00
// Convert the attributes array into an Attribute object.
$heading [ 'attributes' ] = new Attribute ( $heading [ 'attributes' ]);
2009-08-24 00:34:11 +00:00
}
2017-03-04 01:20:24 +00:00
$variables [ 'links' ] = [];
2006-05-18 14:58:57 +00:00
foreach ( $links as $key => $link ) {
2017-03-04 01:20:24 +00:00
$item = [];
$link += [
2013-12-14 21:13:17 +00:00
'ajax' => NULL ,
2014-10-09 06:39:37 +00:00
'url' => NULL ,
2017-03-04 01:20:24 +00:00
];
2013-11-15 13:09:50 +00:00
2017-03-04 01:20:24 +00:00
$li_attributes = [];
2014-10-09 06:39:37 +00:00
$keys = [ 'title' , 'url' ];
2017-03-04 01:20:24 +00:00
$link_element = [
2013-11-15 13:09:50 +00:00
'#type' => 'link' ,
2014-12-13 20:44:18 +00:00
'#title' => $link [ 'title' ],
2014-02-28 10:43:51 +00:00
'#options' => array_diff_key ( $link , array_combine ( $keys , $keys )),
2014-10-09 06:39:37 +00:00
'#url' => $link [ 'url' ],
2013-12-14 21:13:17 +00:00
'#ajax' => $link [ 'ajax' ],
2017-03-04 01:20:24 +00:00
];
2013-11-06 19:45:16 +00:00
2014-01-23 18:04:41 +00:00
// Handle links and ensure that the active class is added on the LIs, but
Issue #2713451 by dimaro, Vinay15, ashishdalvi, Apoorv.mathur2003, er.pushpinderrana, singh_haneet, chgasparoto, mayurjadhav, kanav_7, jhodgdon, joachim, Wim Leers: Update docs in template_preprocess_links()
2018-07-26 07:09:08 +00:00
// only if the 'set_active_class' option is not empty. Links templates
// duplicate the "is-active" class handling of l() and
// LinkGenerator::generate() because they need to be able to set the
// "is-active" class not on the links themselves (<a> tags), but on the
// list items (<li> tags) that contain the links. This is necessary for
// CSS to be able to style list items differently when the link is active,
// since CSS does not yet allow one to style list items only if they
// contain a certain element with a certain class. That is, we cannot yet
// convert this jQuery selector to a CSS selector:
// jQuery('li:has("a.is-active")')
2014-10-09 06:39:37 +00:00
if ( isset ( $link [ 'url' ])) {
2014-01-23 18:04:41 +00:00
if ( ! empty ( $variables [ 'set_active_class' ])) {
2014-01-04 12:23:36 +00:00
2014-01-23 18:04:41 +00:00
// Also enable set_active_class for the contained link.
$link_element [ '#options' ][ 'set_active_class' ] = TRUE ;
2014-01-04 12:23:36 +00:00
2014-01-23 18:04:41 +00:00
if ( ! empty ( $link [ 'language' ])) {
2014-10-13 09:10:32 +00:00
$li_attributes [ 'hreflang' ] = $link [ 'language' ] -> getId ();
2014-01-23 18:04:41 +00:00
}
// Add a "data-drupal-link-query" attribute to let the
// drupal.active-link library know the query in a standardized manner.
Issue #2713451 by dimaro, Vinay15, ashishdalvi, Apoorv.mathur2003, er.pushpinderrana, singh_haneet, chgasparoto, mayurjadhav, kanav_7, jhodgdon, joachim, Wim Leers: Update docs in template_preprocess_links()
2018-07-26 07:09:08 +00:00
// Only add the data- attribute. The "is-active" class will be
// calculated using JavaScript, to prevent breaking the render cache.
2014-01-23 18:04:41 +00:00
if ( ! empty ( $link [ 'query' ])) {
$query = $link [ 'query' ];
ksort ( $query );
$li_attributes [ 'data-drupal-link-query' ] = Json :: encode ( $query );
}
2014-10-09 06:39:37 +00:00
/** @var \Drupal\Core\Url $url */
$url = $link [ 'url' ];
if ( $url -> isRouted ()) {
// Add a "data-drupal-link-system-path" attribute to let the
Issue #2713451 by dimaro, Vinay15, ashishdalvi, Apoorv.mathur2003, er.pushpinderrana, singh_haneet, chgasparoto, mayurjadhav, kanav_7, jhodgdon, joachim, Wim Leers: Update docs in template_preprocess_links()
2018-07-26 07:09:08 +00:00
// drupal.active-link library know the path in a standardized
// manner. Only add the data- attribute. The "is-active" class will
// be calculated using JavaScript, to prevent breaking the render
// cache.
2014-10-09 06:39:37 +00:00
$system_path = $url -> getInternalPath ();
// @todo System path is deprecated - use the route name and parameters.
// Special case for the front page.
$li_attributes [ 'data-drupal-link-system-path' ] = $system_path == '' ? '<front>' : $system_path ;
2014-01-23 18:04:41 +00:00
}
2014-01-06 22:00:22 +00:00
}
2014-01-23 18:04:41 +00:00
2014-02-07 04:28:14 +00:00
$item [ 'link' ] = $link_element ;
2014-01-06 22:00:22 +00:00
}
2014-02-07 04:28:14 +00:00
2011-12-19 10:45:52 +00:00
// Handle title-only text items.
2015-03-09 15:57:27 +00:00
$item [ 'text' ] = $link [ 'title' ];
2014-02-07 04:28:14 +00:00
if ( isset ( $link [ 'attributes' ])) {
$item [ 'text_attributes' ] = new Attribute ( $link [ 'attributes' ]);
2006-05-18 14:58:57 +00:00
}
2006-08-30 07:37:14 +00:00
2014-02-07 04:28:14 +00:00
// Handle list item attributes.
$item [ 'attributes' ] = new Attribute ( $li_attributes );
2006-08-30 07:37:14 +00:00
2014-02-07 04:28:14 +00:00
// Add the item to the list of links.
2014-10-21 09:27:22 +00:00
$variables [ 'links' ][ $key ] = $item ;
2014-02-07 04:28:14 +00:00
}
2005-11-03 19:33:37 +00:00
}
2003-11-08 11:56:33 +00:00
}
2003-02-09 17:39:40 +00:00
2003-11-09 23:27:22 +00:00
/**
Issue #1939068 by joelpittet, tlattimore, Cottser, chrisjlee, rteijeiro, mdrummond, drupalninja99, jenlampton, shanethehat, InternetDevels, DamienMcKenna, gavin.hughes, carsonevans, ezeedub: Convert theme_image() to Twig.
2014-03-24 18:05:12 +00:00
* Prepares variables for image templates .
2003-12-08 06:32:19 +00:00
*
Issue #1939068 by joelpittet, tlattimore, Cottser, chrisjlee, rteijeiro, mdrummond, drupalninja99, jenlampton, shanethehat, InternetDevels, DamienMcKenna, gavin.hughes, carsonevans, ezeedub: Convert theme_image() to Twig.
2014-03-24 18:05:12 +00:00
* Default template : image . html . twig .
*
* @ param array $variables
2009-10-09 01:00:08 +00:00
* An associative array containing :
2011-11-25 03:09:40 +00:00
* - uri : Either the path of the image file ( relative to base_path ()) or a
2009-10-09 01:00:08 +00:00
* full URL .
2010-09-22 03:24:09 +00:00
* - width : The width of the image ( if known ) .
* - height : The height of the image ( if known ) .
2010-04-30 20:07:03 +00:00
* - alt : The alternative text for text - based browsers . HTML 4 and XHTML 1.0
* always require an alt attribute . The HTML 5 draft allows the alt
* attribute to be omitted in some cases . Therefore , this variable defaults
* to an empty string , but can be set to NULL for the attribute to be
* omitted . Usually , neither omission nor an empty string satisfies
2013-01-10 23:50:55 +00:00
* accessibility requirements , so it is strongly encouraged for code
2015-12-10 14:19:31 +00:00
* building variables for image . html . twig templates to pass a meaningful
* value for this variable .
2010-04-30 20:07:03 +00:00
* - http :// www . w3 . org / TR / REC - html40 / struct / objects . html #h-13.8
* - http :// www . w3 . org / TR / xhtml1 / dtds . html
* - http :// dev . w3 . org / html5 / spec / Overview . html #alt
2009-10-09 01:00:08 +00:00
* - title : The title text is displayed when the image is hovered in some
* popular browsers .
* - attributes : Associative array of attributes to be placed in the img tag .
2014-09-23 05:09:41 +00:00
* - srcset : Array of multiple URIs and sizes / multipliers .
2014-09-22 09:27:47 +00:00
* - sizes : The sizes attribute for viewport - based selection of images .
* - http :// www . whatwg . org / specs / web - apps / current - work / multipage / embedded - content . html #introduction-3:viewport-based-selection-2
2003-12-08 06:32:19 +00:00
*/
Issue #1939068 by joelpittet, tlattimore, Cottser, chrisjlee, rteijeiro, mdrummond, drupalninja99, jenlampton, shanethehat, InternetDevels, DamienMcKenna, gavin.hughes, carsonevans, ezeedub: Convert theme_image() to Twig.
2014-03-24 18:05:12 +00:00
function template_preprocess_image ( & $variables ) {
2014-09-23 05:09:41 +00:00
if ( ! empty ( $variables [ 'uri' ])) {
2016-01-15 04:20:55 +00:00
$variables [ 'attributes' ][ 'src' ] = file_url_transform_relative ( file_create_url ( $variables [ 'uri' ]));
2014-09-23 05:09:41 +00:00
}
// Generate a srcset attribute conforming to the spec at
// http://www.w3.org/html/wg/drafts/html/master/embedded-content.html#attr-img-srcset
if ( ! empty ( $variables [ 'srcset' ])) {
2017-03-04 01:20:24 +00:00
$srcset = [];
2014-09-23 05:09:41 +00:00
foreach ( $variables [ 'srcset' ] as $src ) {
// URI is mandatory.
2016-01-15 04:20:55 +00:00
$source = file_url_transform_relative ( file_create_url ( $src [ 'uri' ]));
2014-09-23 05:09:41 +00:00
if ( isset ( $src [ 'width' ]) && ! empty ( $src [ 'width' ])) {
$source .= ' ' . $src [ 'width' ];
}
elseif ( isset ( $src [ 'multiplier' ]) && ! empty ( $src [ 'multiplier' ])) {
$source .= ' ' . $src [ 'multiplier' ];
}
$srcset [] = $source ;
}
$variables [ 'attributes' ][ 'srcset' ] = implode ( ', ' , $srcset );
}
2009-10-09 01:00:08 +00:00
2017-03-04 01:20:24 +00:00
foreach ([ 'width' , 'height' , 'alt' , 'title' , 'sizes' ] as $key ) {
2010-09-22 03:24:09 +00:00
if ( isset ( $variables [ $key ])) {
2014-09-12 15:58:23 +00:00
// If the property has already been defined in the attributes,
// do not override, including NULL.
if ( array_key_exists ( $key , $variables [ 'attributes' ])) {
continue ;
}
Issue #1939068 by joelpittet, tlattimore, Cottser, chrisjlee, rteijeiro, mdrummond, drupalninja99, jenlampton, shanethehat, InternetDevels, DamienMcKenna, gavin.hughes, carsonevans, ezeedub: Convert theme_image() to Twig.
2014-03-24 18:05:12 +00:00
$variables [ 'attributes' ][ $key ] = $variables [ $key ];
2010-04-30 12:53:47 +00:00
}
2004-08-04 20:40:01 +00:00
}
2003-11-08 11:56:33 +00:00
}
2003-02-09 17:39:40 +00:00
2003-11-13 19:52:54 +00:00
/**
Issue #1939008 by sun, joelpittet, gnuget, Gokul N K, sphism, drupalninja99, c4rl, Cottser, mdrummond, long wave, steveoliver, andypost, Fabianx | jenlampton: Convert theme_table() to Twig.
2014-05-04 07:07:44 +00:00
* Prepares variables for table templates .
2004-07-22 16:06:54 +00:00
*
Issue #1939008 by sun, joelpittet, gnuget, Gokul N K, sphism, drupalninja99, c4rl, Cottser, mdrummond, long wave, steveoliver, andypost, Fabianx | jenlampton: Convert theme_table() to Twig.
2014-05-04 07:07:44 +00:00
* Default template : table . html . twig .
*
* @ param array $variables
2009-10-09 01:00:08 +00:00
* An associative array containing :
* - header : An array containing the table headers . Each element of the array
* can be either a localized string or an associative array with the
* following keys :
2015-06-13 01:12:16 +00:00
* - data : The localized title of the table column , as a string or render
* array .
2014-07-11 22:46:29 +00:00
* - field : The database field represented in the table column ( required
2009-10-09 01:00:08 +00:00
* if user is to be able to sort on this column ) .
2014-07-11 22:46:29 +00:00
* - sort : A default sort order for this column ( " asc " or " desc " ) . Only
* one column should be given a default sort order because table sorting
* only applies to one column at a time .
Issue #109493 by drunken monkey, gnuget, robertDouglass, dhirendra.mishra, jhodgdon, jibran, chaby, aleevas, alexpott, DanChadwick, Dries, catch: tablesort should allow rendered tables to have columns that default to DESC when their header is clicked
2019-10-07 08:42:00 +00:00
* - initial_click_sort : Set the initial sort of the column when clicked .
* Defaults to " asc " .
2014-07-11 22:46:29 +00:00
* - class : An array of values for the 'class' attribute . In particular ,
* the least important columns that can be hidden on narrow and medium
* width screens should have a 'priority-low' class , referenced with the
* RESPONSIVE_PRIORITY_LOW constant . Columns that should be shown on
* medium + wide screens should be marked up with a class of
* 'priority-medium' , referenced by with the RESPONSIVE_PRIORITY_MEDIUM
* constant . Themes may hide columns with one of these two classes on
* narrow viewports to save horizontal space .
2009-10-09 01:00:08 +00:00
* - Any HTML attributes , such as " colspan " , to apply to the column header
* cell .
* - rows : An array of table rows . Every row is an array of cells , or an
* associative array with the following keys :
2014-07-11 22:46:29 +00:00
* - data : An array of cells .
2009-10-09 01:00:08 +00:00
* - Any HTML attributes , such as " class " , to apply to the table row .
2014-07-11 22:46:29 +00:00
* - no_striping : A Boolean indicating that the row should receive no
2010-09-11 00:03:42 +00:00
* 'even / odd' styling . Defaults to FALSE .
2009-10-09 01:00:08 +00:00
* Each cell can be either a string or an associative array with the
* following keys :
2015-06-13 01:12:16 +00:00
* - data : The string or render array to display in the table cell .
2014-07-11 22:46:29 +00:00
* - header : Indicates this cell is a header .
2009-10-09 01:00:08 +00:00
* - Any HTML attributes , such as " colspan " , to apply to the table cell .
* Here ' s an example for $rows :
2010-01-04 16:20:20 +00:00
* @ code
2009-10-09 01:00:08 +00:00
* $rows = array (
* // Simple row
2008-05-23 08:28:30 +00:00
* array (
2009-10-09 01:00:08 +00:00
* 'Cell 1' , 'Cell 2' , 'Cell 3'
2008-05-23 08:28:30 +00:00
* ),
2009-10-09 01:00:08 +00:00
* // Row with attributes on the row and some of its cells.
* array (
* 'data' => array ( 'Cell 1' , array ( 'data' => 'Cell 2' , 'colspan' => 2 )), 'class' => array ( 'funky' )
2014-07-11 22:46:29 +00:00
* ),
2009-10-09 01:00:08 +00:00
* );
2010-01-04 16:20:20 +00:00
* @ endcode
2014-07-11 22:46:29 +00:00
* - footer : An array of table rows which will be printed within a < tfoot >
* tag , in the same format as the rows element ( see above ) .
2009-10-09 01:00:08 +00:00
* - attributes : An array of HTML attributes to apply to the table tag .
* - caption : A localized string to use for the < caption > tag .
* - colgroups : An array of column groups . Each element of the array can be
* either :
* - An array of columns , each of which is an associative array of HTML
Issue #2546248 by scythian, XaviP, darrenwh, mikebell_, ingaro, urbanlegend, jhodgdon, davidhernandez, andypost, joelpittet, emma.maria, cdykstra, Cottser, LewisNyman, joachim: Use consistent style to mention HTML tags in code comments
2016-05-26 19:12:15 +00:00
* attributes applied to the < col > element .
* - An array of attributes applied to the < colgroup > element , which must
* include a " data " attribute . To add attributes to < col > elements ,
* set the " data " attribute with an array of columns , each of which is an
2009-10-09 01:00:08 +00:00
* associative array of HTML attributes .
* Here ' s an example for $colgroup :
2010-01-04 16:20:20 +00:00
* @ code
2009-10-09 01:00:08 +00:00
* $colgroup = array (
Issue #2546248 by scythian, XaviP, darrenwh, mikebell_, ingaro, urbanlegend, jhodgdon, davidhernandez, andypost, joelpittet, emma.maria, cdykstra, Cottser, LewisNyman, joachim: Use consistent style to mention HTML tags in code comments
2016-05-26 19:12:15 +00:00
* // <colgroup> with one <col> element.
2009-10-09 01:00:08 +00:00
* array (
2008-05-23 08:28:30 +00:00
* array (
Issue #2546248 by scythian, XaviP, darrenwh, mikebell_, ingaro, urbanlegend, jhodgdon, davidhernandez, andypost, joelpittet, emma.maria, cdykstra, Cottser, LewisNyman, joachim: Use consistent style to mention HTML tags in code comments
2016-05-26 19:12:15 +00:00
* 'class' => array ( 'funky' ), // Attribute for the <col> element.
2008-05-23 08:28:30 +00:00
* ),
* ),
Issue #2546248 by scythian, XaviP, darrenwh, mikebell_, ingaro, urbanlegend, jhodgdon, davidhernandez, andypost, joelpittet, emma.maria, cdykstra, Cottser, LewisNyman, joachim: Use consistent style to mention HTML tags in code comments
2016-05-26 19:12:15 +00:00
* // <colgroup> with attributes and inner <col> elements.
2009-10-09 01:00:08 +00:00
* array (
* 'data' => array (
* array (
Issue #2546248 by scythian, XaviP, darrenwh, mikebell_, ingaro, urbanlegend, jhodgdon, davidhernandez, andypost, joelpittet, emma.maria, cdykstra, Cottser, LewisNyman, joachim: Use consistent style to mention HTML tags in code comments
2016-05-26 19:12:15 +00:00
* 'class' => array ( 'funky' ), // Attribute for the <col> element.
2009-10-09 01:00:08 +00:00
* ),
* ),
Issue #2546248 by scythian, XaviP, darrenwh, mikebell_, ingaro, urbanlegend, jhodgdon, davidhernandez, andypost, joelpittet, emma.maria, cdykstra, Cottser, LewisNyman, joachim: Use consistent style to mention HTML tags in code comments
2016-05-26 19:12:15 +00:00
* 'class' => array ( 'jazzy' ), // Attribute for the <colgroup> element.
2009-10-09 01:00:08 +00:00
* ),
* );
2010-01-04 16:20:20 +00:00
* @ endcode
2009-10-09 01:00:08 +00:00
* These optional tags are used to group and set properties on columns
* within a table . For example , one may easily group three columns and
* apply same background style to all .
* - sticky : Use a " sticky " table header .
2009-12-02 14:56:32 +00:00
* - empty : The message to display in an extra row if table does not have any
* rows .
2003-12-08 06:32:19 +00:00
*/
Issue #1939008 by sun, joelpittet, gnuget, Gokul N K, sphism, drupalninja99, c4rl, Cottser, mdrummond, long wave, steveoliver, andypost, Fabianx | jenlampton: Convert theme_table() to Twig.
2014-05-04 07:07:44 +00:00
function template_preprocess_table ( & $variables ) {
2008-05-23 08:28:30 +00:00
// Format the table columns:
Issue #1939008 by sun, joelpittet, gnuget, Gokul N K, sphism, drupalninja99, c4rl, Cottser, mdrummond, long wave, steveoliver, andypost, Fabianx | jenlampton: Convert theme_table() to Twig.
2014-05-04 07:07:44 +00:00
if ( ! empty ( $variables [ 'colgroups' ])) {
foreach ( $variables [ 'colgroups' ] as & $colgroup ) {
2008-05-23 08:28:30 +00:00
// Check if we're dealing with a simple or complex column
if ( isset ( $colgroup [ 'data' ])) {
Issue #1939008 by sun, joelpittet, gnuget, Gokul N K, sphism, drupalninja99, c4rl, Cottser, mdrummond, long wave, steveoliver, andypost, Fabianx | jenlampton: Convert theme_table() to Twig.
2014-05-04 07:07:44 +00:00
$cols = $colgroup [ 'data' ];
unset ( $colgroup [ 'data' ]);
$colgroup_attributes = $colgroup ;
2008-05-23 08:28:30 +00:00
}
else {
$cols = $colgroup ;
2017-03-04 01:20:24 +00:00
$colgroup_attributes = [];
2008-05-23 08:28:30 +00:00
}
2017-03-04 01:20:24 +00:00
$colgroup = [];
Issue #1939008 by sun, joelpittet, gnuget, Gokul N K, sphism, drupalninja99, c4rl, Cottser, mdrummond, long wave, steveoliver, andypost, Fabianx | jenlampton: Convert theme_table() to Twig.
2014-05-04 07:07:44 +00:00
$colgroup [ 'attributes' ] = new Attribute ( $colgroup_attributes );
2017-03-04 01:20:24 +00:00
$colgroup [ 'cols' ] = [];
Issue #1939008 by sun, joelpittet, gnuget, Gokul N K, sphism, drupalninja99, c4rl, Cottser, mdrummond, long wave, steveoliver, andypost, Fabianx | jenlampton: Convert theme_table() to Twig.
2014-05-04 07:07:44 +00:00
// Build columns.
if ( is_array ( $cols ) && ! empty ( $cols )) {
foreach ( $cols as $col_key => $col ) {
$colgroup [ 'cols' ][ $col_key ][ 'attributes' ] = new Attribute ( $col );
2008-05-23 08:28:30 +00:00
}
}
}
}
Issue #1939008 by sun, joelpittet, gnuget, Gokul N K, sphism, drupalninja99, c4rl, Cottser, mdrummond, long wave, steveoliver, andypost, Fabianx | jenlampton: Convert theme_table() to Twig.
2014-05-04 07:07:44 +00:00
// Build an associative array of responsive classes keyed by column.
2017-03-04 01:20:24 +00:00
$responsive_classes = [];
Issue #1939008 by sun, joelpittet, gnuget, Gokul N K, sphism, drupalninja99, c4rl, Cottser, mdrummond, long wave, steveoliver, andypost, Fabianx | jenlampton: Convert theme_table() to Twig.
2014-05-04 07:07:44 +00:00
2004-07-22 16:06:54 +00:00
// Format the table header:
2017-03-04 01:20:24 +00:00
$ts = [];
2014-10-21 09:10:42 +00:00
$header_columns = 0 ;
Issue #1939008 by sun, joelpittet, gnuget, Gokul N K, sphism, drupalninja99, c4rl, Cottser, mdrummond, long wave, steveoliver, andypost, Fabianx | jenlampton: Convert theme_table() to Twig.
2014-05-04 07:07:44 +00:00
if ( ! empty ( $variables [ 'header' ])) {
2018-11-22 08:40:04 +00:00
$ts = TableSort :: getContextFromRequest ( $variables [ 'header' ], \Drupal :: request ());
Issue #1939008 by sun, joelpittet, gnuget, Gokul N K, sphism, drupalninja99, c4rl, Cottser, mdrummond, long wave, steveoliver, andypost, Fabianx | jenlampton: Convert theme_table() to Twig.
2014-05-04 07:07:44 +00:00
2014-07-08 10:35:20 +00:00
// Use a separate index with responsive classes as headers
// may be associative.
$responsive_index = - 1 ;
Issue #1939008 by sun, joelpittet, gnuget, Gokul N K, sphism, drupalninja99, c4rl, Cottser, mdrummond, long wave, steveoliver, andypost, Fabianx | jenlampton: Convert theme_table() to Twig.
2014-05-04 07:07:44 +00:00
foreach ( $variables [ 'header' ] as $col_key => $cell ) {
2014-07-08 10:35:20 +00:00
// Increase the responsive index.
$responsive_index ++ ;
2014-04-23 10:53:03 +00:00
if ( ! is_array ( $cell )) {
2014-10-21 09:10:42 +00:00
$header_columns ++ ;
2014-04-23 10:53:03 +00:00
$cell_content = $cell ;
Issue #1939008 by sun, joelpittet, gnuget, Gokul N K, sphism, drupalninja99, c4rl, Cottser, mdrummond, long wave, steveoliver, andypost, Fabianx | jenlampton: Convert theme_table() to Twig.
2014-05-04 07:07:44 +00:00
$cell_attributes = new Attribute ();
2014-04-23 10:53:03 +00:00
$is_header = TRUE ;
}
else {
2014-10-21 09:10:42 +00:00
if ( isset ( $cell [ 'colspan' ])) {
$header_columns += $cell [ 'colspan' ];
}
else {
$header_columns ++ ;
}
2014-04-23 10:53:03 +00:00
$cell_content = '' ;
if ( isset ( $cell [ 'data' ])) {
$cell_content = $cell [ 'data' ];
unset ( $cell [ 'data' ]);
2012-09-26 18:26:15 +00:00
}
2014-04-23 10:53:03 +00:00
// Flag the cell as a header or not and remove the flag.
$is_header = isset ( $cell [ 'header' ]) ? $cell [ 'header' ] : TRUE ;
unset ( $cell [ 'header' ]);
// Track responsive classes for each column as needed. Only the header
// cells for a column are marked up with the responsive classes by a
// module developer or themer. The responsive classes on the header cells
// must be transferred to the content cells.
if ( ! empty ( $cell [ 'class' ]) && is_array ( $cell [ 'class' ])) {
if ( in_array ( RESPONSIVE_PRIORITY_MEDIUM , $cell [ 'class' ])) {
2014-07-08 10:35:20 +00:00
$responsive_classes [ $responsive_index ] = RESPONSIVE_PRIORITY_MEDIUM ;
2014-04-23 10:53:03 +00:00
}
elseif ( in_array ( RESPONSIVE_PRIORITY_LOW , $cell [ 'class' ])) {
2014-07-08 10:35:20 +00:00
$responsive_classes [ $responsive_index ] = RESPONSIVE_PRIORITY_LOW ;
2014-04-23 10:53:03 +00:00
}
2012-09-26 18:26:15 +00:00
}
2014-04-23 10:53:03 +00:00
2018-11-22 08:40:04 +00:00
TableSort :: header ( $cell_content , $cell , $variables [ 'header' ], $ts );
2014-04-23 10:53:03 +00:00
Issue #109493 by drunken monkey, gnuget, robertDouglass, dhirendra.mishra, jhodgdon, jibran, chaby, aleevas, alexpott, DanChadwick, Dries, catch: tablesort should allow rendered tables to have columns that default to DESC when their header is clicked
2019-10-07 08:42:00 +00:00
// TableSort::header() removes the 'sort', 'initial_click_sort' and
// 'field' keys.
2014-04-23 10:53:03 +00:00
$cell_attributes = new Attribute ( $cell );
2012-09-26 18:26:15 +00:00
}
2017-03-04 01:20:24 +00:00
$variables [ 'header' ][ $col_key ] = [];
Issue #1939008 by sun, joelpittet, gnuget, Gokul N K, sphism, drupalninja99, c4rl, Cottser, mdrummond, long wave, steveoliver, andypost, Fabianx | jenlampton: Convert theme_table() to Twig.
2014-05-04 07:07:44 +00:00
$variables [ 'header' ][ $col_key ][ 'tag' ] = $is_header ? 'th' : 'td' ;
$variables [ 'header' ][ $col_key ][ 'attributes' ] = $cell_attributes ;
$variables [ 'header' ][ $col_key ][ 'content' ] = $cell_content ;
2003-11-13 19:52:54 +00:00
}
2007-03-27 05:13:55 +00:00
}
2014-10-21 09:10:42 +00:00
$variables [ 'header_columns' ] = $header_columns ;
2003-11-13 19:52:54 +00:00
2014-07-11 22:46:29 +00:00
// Rows and footer have the same structure.
2017-03-04 01:20:24 +00:00
$sections = [ 'rows' , 'footer' ];
2014-07-11 22:46:29 +00:00
foreach ( $sections as $section ) {
if ( ! empty ( $variables [ $section ])) {
foreach ( $variables [ $section ] as $row_key => $row ) {
2004-09-14 20:01:00 +00:00
$cells = $row ;
2017-03-04 01:20:24 +00:00
$row_attributes = [];
2014-06-09 01:04:12 +00:00
2014-07-11 22:46:29 +00:00
// Check if we're dealing with a simple or complex row
if ( isset ( $row [ 'data' ])) {
$cells = $row [ 'data' ];
2014-10-21 09:10:42 +00:00
$variables [ 'no_striping' ] = isset ( $row [ 'no_striping' ]) ? $row [ 'no_striping' ] : FALSE ;
2014-06-09 01:04:12 +00:00
2014-07-11 22:46:29 +00:00
// Set the attributes array and exclude 'data' and 'no_striping'.
$row_attributes = $row ;
unset ( $row_attributes [ 'data' ]);
unset ( $row_attributes [ 'no_striping' ]);
}
// Build row.
2017-03-04 01:20:24 +00:00
$variables [ $section ][ $row_key ] = [];
2014-07-11 22:46:29 +00:00
$variables [ $section ][ $row_key ][ 'attributes' ] = new Attribute ( $row_attributes );
2017-03-04 01:20:24 +00:00
$variables [ $section ][ $row_key ][ 'cells' ] = [];
2014-07-11 22:46:29 +00:00
if ( ! empty ( $cells )) {
// Reset the responsive index.
$responsive_index = - 1 ;
foreach ( $cells as $col_key => $cell ) {
// Increase the responsive index.
$responsive_index ++ ;
if ( ! is_array ( $cell )) {
$cell_content = $cell ;
2017-03-04 01:20:24 +00:00
$cell_attributes = [];
2014-07-11 22:46:29 +00:00
$is_header = FALSE ;
2014-04-23 10:53:03 +00:00
}
2014-07-11 22:46:29 +00:00
else {
$cell_content = '' ;
if ( isset ( $cell [ 'data' ])) {
$cell_content = $cell [ 'data' ];
unset ( $cell [ 'data' ]);
}
2014-04-23 10:53:03 +00:00
2014-07-11 22:46:29 +00:00
// Flag the cell as a header or not and remove the flag.
$is_header = ! empty ( $cell [ 'header' ]);
unset ( $cell [ 'header' ]);
2014-04-23 10:53:03 +00:00
2014-07-11 22:46:29 +00:00
$cell_attributes = $cell ;
2014-06-09 01:04:12 +00:00
}
2014-10-21 09:10:42 +00:00
// Active table sort information.
2014-07-11 22:46:29 +00:00
if ( isset ( $variables [ 'header' ][ $col_key ][ 'data' ]) && $variables [ 'header' ][ $col_key ][ 'data' ] == $ts [ 'name' ] && ! empty ( $variables [ 'header' ][ $col_key ][ 'field' ])) {
2014-10-21 09:10:42 +00:00
$variables [ $section ][ $row_key ][ 'cells' ][ $col_key ][ 'active_table_sort' ] = TRUE ;
2014-07-11 22:46:29 +00:00
}
// Copy RESPONSIVE_PRIORITY_LOW/RESPONSIVE_PRIORITY_MEDIUM
// class from header to cell as needed.
if ( isset ( $responsive_classes [ $responsive_index ])) {
$cell_attributes [ 'class' ][] = $responsive_classes [ $responsive_index ];
}
$variables [ $section ][ $row_key ][ 'cells' ][ $col_key ][ 'tag' ] = $is_header ? 'th' : 'td' ;
$variables [ $section ][ $row_key ][ 'cells' ][ $col_key ][ 'attributes' ] = new Attribute ( $cell_attributes );
$variables [ $section ][ $row_key ][ 'cells' ][ $col_key ][ 'content' ] = $cell_content ;
2014-06-09 01:04:12 +00:00
}
2007-06-28 09:11:06 +00:00
}
2003-11-13 19:52:54 +00:00
}
}
}
2015-02-04 10:21:13 +00:00
if ( empty ( $variables [ 'no_striping' ])) {
$variables [ 'attributes' ][ 'data-striping' ] = 1 ;
}
2003-11-13 19:52:54 +00:00
}
2012-11-16 13:05:26 +00:00
/**
Issue #1939062 by steveoliver, mdrummond, jenlampton, hussainweb, Cottser, joelpittet, jerdavis, ekl1773, dale42, drupalninja99, gabesullice, c4rl: Convert theme_item_list() to Twig.
2014-02-07 04:24:53 +00:00
* Prepares variables for item list templates .
*
* Default template : item - list . html . twig .
2012-11-16 13:05:26 +00:00
*
* @ param array $variables
Issue #1939062 by steveoliver, mdrummond, jenlampton, hussainweb, Cottser, joelpittet, jerdavis, ekl1773, dale42, drupalninja99, gabesullice, c4rl: Convert theme_item_list() to Twig.
2014-02-07 04:24:53 +00:00
* An associative array containing :
* - items : An array of items to be displayed in the list . Each item can be
* either a string or a render array . If #type, #theme, or #markup
* properties are not specified for child render arrays , they will be
* inherited from the parent list , allowing callers to specify larger
* nested lists without having to explicitly specify and repeat the
* render properties for all nested child lists .
* - title : A title to be prepended to the list .
* - list_type : The type of list to return ( e . g . " ul " , " ol " ) .
2016-04-26 12:18:15 +00:00
* - wrapper_attributes : HTML attributes to be applied to the list wrapper .
Issue #1939062 by steveoliver, mdrummond, jenlampton, hussainweb, Cottser, joelpittet, jerdavis, ekl1773, dale42, drupalninja99, gabesullice, c4rl: Convert theme_item_list() to Twig.
2014-02-07 04:24:53 +00:00
*
2015-05-24 20:08:46 +00:00
* @ see https :// www . drupal . org / node / 1842756
2012-11-16 13:05:26 +00:00
*/
function template_preprocess_item_list ( & $variables ) {
2015-10-05 10:45:49 +00:00
$variables [ 'wrapper_attributes' ] = new Attribute ( $variables [ 'wrapper_attributes' ]);
2012-11-16 13:05:26 +00:00
foreach ( $variables [ 'items' ] as & $item ) {
2017-03-04 01:20:24 +00:00
$attributes = [];
2012-11-16 13:05:26 +00:00
// If the item value is an array, then it is a render array.
if ( is_array ( $item )) {
Issue #1939062 by steveoliver, mdrummond, jenlampton, hussainweb, Cottser, joelpittet, jerdavis, ekl1773, dale42, drupalninja99, gabesullice, c4rl: Convert theme_item_list() to Twig.
2014-02-07 04:24:53 +00:00
// List items support attributes via the '#wrapper_attributes' property.
if ( isset ( $item [ '#wrapper_attributes' ])) {
$attributes = $item [ '#wrapper_attributes' ];
}
2012-11-16 13:05:26 +00:00
// Determine whether there are any child elements in the item that are not
// fully-specified render arrays. If there are any, then the child
// elements present nested lists and we automatically inherit the render
// array properties of the current list to them.
Issue #1939062 by steveoliver, mdrummond, jenlampton, hussainweb, Cottser, joelpittet, jerdavis, ekl1773, dale42, drupalninja99, gabesullice, c4rl: Convert theme_item_list() to Twig.
2014-02-07 04:24:53 +00:00
foreach ( Element :: children ( $item ) as $key ) {
2012-11-16 13:05:26 +00:00
$child = & $item [ $key ];
// If this child element does not specify how it can be rendered, then
// we need to inherit the render properties of the current list.
if ( ! isset ( $child [ '#type' ]) && ! isset ( $child [ '#theme' ]) && ! isset ( $child [ '#markup' ])) {
2014-12-11 10:35:52 +00:00
// Since item-list.html.twig supports both strings and render arrays
// as items, the items of the nested list may have been specified as
// the child elements of the nested list, instead of #items. For
2012-11-16 13:05:26 +00:00
// convenience, we automatically move them into #items.
if ( ! isset ( $child [ '#items' ])) {
2014-03-31 17:37:55 +00:00
// This is the same condition as in
// \Drupal\Core\Render\Element::children(), which cannot be used
// here, since it triggers an error on string values.
2012-11-16 13:05:26 +00:00
foreach ( $child as $child_key => $child_value ) {
if ( $child_key [ 0 ] !== '#' ) {
$child [ '#items' ][ $child_key ] = $child_value ;
unset ( $child [ $child_key ]);
}
}
}
// Lastly, inherit the original theme variables of the current list.
$child [ '#theme' ] = $variables [ 'theme_hook_original' ];
2013-06-22 19:49:22 +00:00
$child [ '#list_type' ] = $variables [ 'list_type' ];
2012-11-16 13:05:26 +00:00
}
}
}
Issue #1939062 by steveoliver, mdrummond, jenlampton, hussainweb, Cottser, joelpittet, jerdavis, ekl1773, dale42, drupalninja99, gabesullice, c4rl: Convert theme_item_list() to Twig.
2014-02-07 04:24:53 +00:00
// Set the item's value and attributes for the template.
2017-03-04 01:20:24 +00:00
$item = [
Issue #1939062 by steveoliver, mdrummond, jenlampton, hussainweb, Cottser, joelpittet, jerdavis, ekl1773, dale42, drupalninja99, gabesullice, c4rl: Convert theme_item_list() to Twig.
2014-02-07 04:24:53 +00:00
'value' => $item ,
'attributes' => new Attribute ( $attributes ),
2017-03-04 01:20:24 +00:00
];
2011-09-28 03:00:18 +00:00
}
2002-11-09 13:59:36 +00:00
}
2013-07-01 00:12:32 +00:00
/**
Issue #2152203 by joelpittet, InternetDevels, rteijeiro, steveoliver, hussainweb, shanethehat, jenlampton, kpa, AnythonyR, EVIIILJ, kgoel, Cottser, dsdeiz, hanpersand: Convert theme_container() to Twig.
2014-03-07 22:15:12 +00:00
* Prepares variables for container templates .
2013-07-01 00:12:32 +00:00
*
Issue #2152203 by joelpittet, InternetDevels, rteijeiro, steveoliver, hussainweb, shanethehat, jenlampton, kpa, AnythonyR, EVIIILJ, kgoel, Cottser, dsdeiz, hanpersand: Convert theme_container() to Twig.
2014-03-07 22:15:12 +00:00
* Default template : container . html . twig .
2013-07-01 00:12:32 +00:00
*
Issue #2152203 by joelpittet, InternetDevels, rteijeiro, steveoliver, hussainweb, shanethehat, jenlampton, kpa, AnythonyR, EVIIILJ, kgoel, Cottser, dsdeiz, hanpersand: Convert theme_container() to Twig.
2014-03-07 22:15:12 +00:00
* @ param array $variables
2013-07-01 00:12:32 +00:00
* An associative array containing :
* - element : An associative array containing the properties of the element .
* Properties used : #id, #attributes, #children.
*/
Issue #2152203 by joelpittet, InternetDevels, rteijeiro, steveoliver, hussainweb, shanethehat, jenlampton, kpa, AnythonyR, EVIIILJ, kgoel, Cottser, dsdeiz, hanpersand: Convert theme_container() to Twig.
2014-03-07 22:15:12 +00:00
function template_preprocess_container ( & $variables ) {
2014-09-26 10:54:02 +00:00
$variables [ 'has_parent' ] = FALSE ;
2013-07-01 00:12:32 +00:00
$element = $variables [ 'element' ];
2013-08-28 01:01:26 +00:00
// Ensure #attributes is set.
2017-03-04 01:20:24 +00:00
$element += [ '#attributes' => []];
2013-07-01 00:12:32 +00:00
// Special handling for form elements.
if ( isset ( $element [ '#array_parents' ])) {
// Assign an html ID.
if ( ! isset ( $element [ '#attributes' ][ 'id' ])) {
$element [ '#attributes' ][ 'id' ] = $element [ '#id' ];
}
2014-09-26 10:54:02 +00:00
$variables [ 'has_parent' ] = TRUE ;
2013-07-01 00:12:32 +00:00
}
Issue #2152203 by joelpittet, InternetDevels, rteijeiro, steveoliver, hussainweb, shanethehat, jenlampton, kpa, AnythonyR, EVIIILJ, kgoel, Cottser, dsdeiz, hanpersand: Convert theme_container() to Twig.
2014-03-07 22:15:12 +00:00
$variables [ 'children' ] = $element [ '#children' ];
$variables [ 'attributes' ] = $element [ '#attributes' ];
2013-07-01 00:12:32 +00:00
}
2014-09-02 09:28:33 +00:00
/**
Issue #2329505 by Cottser, SebCorbin, joelpittet, drupalninja99, jenlampton, longwave, aboros, trevorkjorlien, socketwench, shanethehat, mbrett5062, rteijeiro: Convert theme_task_list to Twig template.
2014-09-08 18:12:14 +00:00
* Prepares variables for maintenance task list templates .
Issue #1885564 by Cottser, SebCorbin, joelpittet, drupalninja99, jenlampton, longwave, aboros, trevorkjorlien, socketwench, shanethehat, mbrett5062, rteijeiro: Convert theme_task_list to Twig template.
2014-09-08 17:57:59 +00:00
*
2014-10-05 11:14:39 +00:00
* Default template : maintenance - task - list . html . twig .
Issue #2329505 by Cottser, SebCorbin, joelpittet, drupalninja99, jenlampton, longwave, aboros, trevorkjorlien, socketwench, shanethehat, mbrett5062, rteijeiro: Convert theme_task_list to Twig template.
2014-09-08 18:12:14 +00:00
*
* @ param array $variables
2014-09-02 09:28:33 +00:00
* An associative array containing :
* - items : An associative array of maintenance tasks .
* It 's the caller' s responsibility to ensure this array ' s items contain no
Issue #2546248 by scythian, XaviP, darrenwh, mikebell_, ingaro, urbanlegend, jhodgdon, davidhernandez, andypost, joelpittet, emma.maria, cdykstra, Cottser, LewisNyman, joachim: Use consistent style to mention HTML tags in code comments
2016-05-26 19:12:15 +00:00
* dangerous HTML such as < script > tags .
2014-09-02 09:28:33 +00:00
* - active : The key for the currently active maintenance task .
*/
2014-10-05 11:14:39 +00:00
function template_preprocess_maintenance_task_list ( & $variables ) {
2014-09-02 09:28:33 +00:00
$items = $variables [ 'items' ];
$active = $variables [ 'active' ];
$done = isset ( $items [ $active ]) || $active == NULL ;
foreach ( $items as $k => $item ) {
Issue #2329505 by Cottser, SebCorbin, joelpittet, drupalninja99, jenlampton, longwave, aboros, trevorkjorlien, socketwench, shanethehat, mbrett5062, rteijeiro: Convert theme_task_list to Twig template.
2014-09-08 18:12:14 +00:00
$variables [ 'tasks' ][ $k ][ 'item' ] = $item ;
$variables [ 'tasks' ][ $k ][ 'attributes' ] = new Attribute ();
2014-09-02 09:28:33 +00:00
if ( $active == $k ) {
Issue #2031641 by aburrows, lauriii, nlisgo, Pol, redsquid, tuutti, LewisNyman, akalata, agviu, kallehauge, _nolocation, rpayanm, saki007ster, mdrummond, RavindraSingh, brahmjeet789: Change active class to is-active
2015-04-16 14:25:55 +00:00
$variables [ 'tasks' ][ $k ][ 'attributes' ] -> addClass ( 'is-active' );
Issue #2329505 by Cottser, SebCorbin, joelpittet, drupalninja99, jenlampton, longwave, aboros, trevorkjorlien, socketwench, shanethehat, mbrett5062, rteijeiro: Convert theme_task_list to Twig template.
2014-09-08 18:12:14 +00:00
$variables [ 'tasks' ][ $k ][ 'status' ] = t ( 'active' );
2014-09-02 09:28:33 +00:00
$done = FALSE ;
}
else {
Issue #2329505 by Cottser, SebCorbin, joelpittet, drupalninja99, jenlampton, longwave, aboros, trevorkjorlien, socketwench, shanethehat, mbrett5062, rteijeiro: Convert theme_task_list to Twig template.
2014-09-08 18:12:14 +00:00
if ( $done ) {
$variables [ 'tasks' ][ $k ][ 'attributes' ] -> addClass ( 'done' );
$variables [ 'tasks' ][ $k ][ 'status' ] = t ( 'done' );
}
2014-09-02 09:28:33 +00:00
}
}
}
2007-04-27 07:42:54 +00:00
/**
2013-07-27 14:26:33 +00:00
* Adds a default set of helper variables for preprocessors and templates .
2011-02-19 01:07:00 +00:00
*
2018-01-06 04:45:59 +00:00
* This function is called for every theme hook . It is the first in the
* sequence of preprocessing functions called when preparing variables for a
* template .
2011-02-19 01:07:00 +00:00
*
2015-05-20 15:00:36 +00:00
* See the @ link themeable Default theme implementations topic @ endlink for
* details .
2007-08-28 11:35:34 +00:00
*/
2013-06-12 15:57:44 +00:00
function template_preprocess ( & $variables , $hook , $info ) {
2010-01-10 02:15:12 +00:00
// Merge in variables that don't depend on hook and don't change during a
// single page request.
// Use the advanced drupal_static() pattern, since this is called very often.
static $drupal_static_fast ;
if ( ! isset ( $drupal_static_fast )) {
$drupal_static_fast [ 'default_variables' ] = & drupal_static ( __FUNCTION__ );
}
$default_variables = & $drupal_static_fast [ 'default_variables' ];
2012-11-11 23:52:37 +00:00
if ( ! isset ( $default_variables )) {
2010-01-10 02:15:12 +00:00
$default_variables = _template_preprocess_default_variables ();
}
2013-06-12 15:57:44 +00:00
$variables += $default_variables ;
// When theming a render element, merge its #attributes into
// $variables['attributes'].
if ( isset ( $info [ 'render element' ])) {
$key = $info [ 'render element' ];
if ( isset ( $variables [ $key ][ '#attributes' ])) {
$variables [ 'attributes' ] = NestedArray :: mergeDeep ( $variables [ 'attributes' ], $variables [ $key ][ '#attributes' ]);
}
}
2010-01-10 02:15:12 +00:00
}
/**
2011-09-24 20:44:06 +00:00
* Returns hook - independent variables to template_preprocess () .
2010-01-10 02:15:12 +00:00
*/
function _template_preprocess_default_variables () {
// Variables that don't depend on a database connection.
2017-03-04 01:20:24 +00:00
$variables = [
'attributes' => [],
'title_attributes' => [],
'content_attributes' => [],
'title_prefix' => [],
'title_suffix' => [],
2010-04-23 05:21:19 +00:00
'db_is_active' => ! defined ( 'MAINTENANCE_MODE' ),
'is_admin' => FALSE ,
'logged_in' => FALSE ,
2017-03-04 01:20:24 +00:00
];
2010-01-10 02:15:12 +00:00
2012-11-11 23:52:37 +00:00
// Give modules a chance to alter the default template variables.
2014-02-24 10:10:52 +00:00
\Drupal :: moduleHandler () -> alter ( 'template_preprocess_default_variables' , $variables );
2012-11-11 23:52:37 +00:00
2015-08-20 11:05:59 +00:00
// Tell all templates where they are located.
$variables [ 'directory' ] = \Drupal :: theme () -> getActiveTheme () -> getPath ();
2010-01-10 02:15:12 +00:00
return $variables ;
2007-08-28 11:35:34 +00:00
}
2009-09-15 17:10:39 +00:00
/**
2013-05-24 16:41:26 +00:00
* Prepares variables for HTML document templates .
*
* Default template : html . html . twig .
*
* @ param array $variables
* An associative array containing :
* - page : A render element representing the page .
2009-09-15 17:10:39 +00:00
*/
function template_preprocess_html ( & $variables ) {
2014-11-14 10:43:20 +00:00
$variables [ 'page' ] = $variables [ 'html' ][ 'page' ];
unset ( $variables [ 'html' ][ 'page' ]);
$variables [ 'page_top' ] = NULL ;
if ( isset ( $variables [ 'html' ][ 'page_top' ])) {
$variables [ 'page_top' ] = $variables [ 'html' ][ 'page_top' ];
unset ( $variables [ 'html' ][ 'page_top' ]);
}
$variables [ 'page_bottom' ] = NULL ;
if ( isset ( $variables [ 'html' ][ 'page_bottom' ])) {
$variables [ 'page_bottom' ] = $variables [ 'html' ][ 'page_bottom' ];
unset ( $variables [ 'html' ][ 'page_bottom' ]);
}
2014-01-01 20:32:52 +00:00
2014-11-14 10:43:20 +00:00
$variables [ 'html_attributes' ] = new Attribute ();
Issue #2546248 by scythian, XaviP, darrenwh, mikebell_, ingaro, urbanlegend, jhodgdon, davidhernandez, andypost, joelpittet, emma.maria, cdykstra, Cottser, LewisNyman, joachim: Use consistent style to mention HTML tags in code comments
2016-05-26 19:12:15 +00:00
// <html> element attributes.
2014-11-14 10:43:20 +00:00
$language_interface = \Drupal :: languageManager () -> getCurrentLanguage ();
$variables [ 'html_attributes' ][ 'lang' ] = $language_interface -> getId ();
$variables [ 'html_attributes' ][ 'dir' ] = $language_interface -> getDirection ();
2012-04-18 18:30:50 +00:00
2014-11-14 10:43:20 +00:00
if ( isset ( $variables [ 'db_is_active' ]) && ! $variables [ 'db_is_active' ]) {
2015-04-18 15:48:42 +00:00
$variables [ 'db_offline' ] = TRUE ;
2014-11-14 10:43:20 +00:00
}
2009-09-15 17:10:39 +00:00
2015-01-12 13:19:07 +00:00
// Add a variable for the root path. This can be used to create a class and
// theme the page depending on the current path (e.g. node, admin, user) as
// well as more specific data like path-frontpage.
2016-04-29 11:02:20 +00:00
$is_front_page = \Drupal :: service ( 'path.matcher' ) -> isFrontPage ();
2015-01-18 09:36:35 +00:00
if ( $is_front_page ) {
2015-02-01 12:41:03 +00:00
$variables [ 'root_path' ] = FALSE ;
2015-01-18 09:36:35 +00:00
}
else {
2015-02-17 11:07:24 +00:00
$system_path = \Drupal :: service ( 'path.current' ) -> getPath ();
$variables [ 'root_path' ] = explode ( '/' , $system_path )[ 1 ];
2015-01-18 09:36:35 +00:00
}
2014-10-15 10:05:01 +00:00
2013-09-16 03:58:06 +00:00
$site_config = \Drupal :: config ( 'system.site' );
2009-09-15 17:10:39 +00:00
// Construct page title.
2015-08-19 10:29:44 +00:00
if ( isset ( $variables [ 'page' ][ '#title' ]) && is_array ( $variables [ 'page' ][ '#title' ])) {
// Do an early render if the title is a render array.
$variables [ 'page' ][ '#title' ] = ( string ) \Drupal :: service ( 'renderer' ) -> render ( $variables [ 'page' ][ '#title' ]);
}
2014-11-14 10:43:20 +00:00
if ( ! empty ( $variables [ 'page' ][ '#title' ])) {
2017-03-04 01:20:24 +00:00
$head_title = [
2015-09-03 22:37:10 +00:00
// Marking the title as safe since it has had the tags stripped.
2015-10-01 23:25:03 +00:00
'title' => Markup :: create ( trim ( strip_tags ( $variables [ 'page' ][ '#title' ]))),
2015-05-13 12:05:09 +00:00
'name' => $site_config -> get ( 'name' ),
2017-03-04 01:20:24 +00:00
];
2013-08-22 16:46:38 +00:00
}
2014-01-29 08:25:00 +00:00
// @todo Remove once views is not bypassing the view subscriber anymore.
2015-05-24 20:08:46 +00:00
// @see https://www.drupal.org/node/2068471
2015-01-18 09:36:35 +00:00
elseif ( $is_front_page ) {
2017-03-04 01:20:24 +00:00
$head_title = [
2014-01-29 08:25:00 +00:00
'title' => t ( 'Home' ),
2015-05-13 12:05:09 +00:00
'name' => $site_config -> get ( 'name' ),
2017-03-04 01:20:24 +00:00
];
2014-01-29 08:25:00 +00:00
}
2009-09-15 17:10:39 +00:00
else {
2015-05-13 12:05:09 +00:00
$head_title = [ 'name' => $site_config -> get ( 'name' )];
2012-07-02 17:20:33 +00:00
if ( $site_config -> get ( 'slogan' )) {
2015-05-13 12:05:09 +00:00
$head_title [ 'slogan' ] = strip_tags ( $site_config -> get ( 'slogan' ));
2009-09-15 17:10:39 +00:00
}
}
2013-08-16 20:36:55 +00:00
2015-05-13 12:05:09 +00:00
$variables [ 'head_title' ] = $head_title ;
2009-10-15 12:27:34 +00:00
2015-06-23 16:24:29 +00:00
// Create placeholder strings for these keys.
// @see \Drupal\Core\Render\HtmlResponseSubscriber
$types = [
2015-09-08 14:42:02 +00:00
'styles' => 'css' ,
'scripts' => 'js' ,
'scripts_bottom' => 'js-bottom' ,
'head' => 'head' ,
2015-06-23 16:24:29 +00:00
];
2015-09-08 14:42:02 +00:00
$variables [ 'placeholder_token' ] = Crypt :: randomBytesBase64 ( 55 );
foreach ( $types as $type => $placeholder_name ) {
2015-09-09 14:31:13 +00:00
$placeholder = '<' . $placeholder_name . '-placeholder token="' . $variables [ 'placeholder_token' ] . '">' ;
2015-09-08 14:42:02 +00:00
$variables [ '#attached' ][ 'html_response_attachment_placeholders' ][ $type ] = $placeholder ;
2012-06-05 12:46:23 +00:00
}
2009-09-15 17:10:39 +00:00
}
2007-08-28 11:35:34 +00:00
/**
2013-05-24 16:46:19 +00:00
* Prepares variables for the page template .
2007-08-28 11:35:34 +00:00
*
2013-05-24 16:46:19 +00:00
* Default template : page . html . twig .
*
2016-02-23 08:19:09 +00:00
* See the page . html . twig template for the list of variables .
2007-04-27 07:42:54 +00:00
*/
function template_preprocess_page ( & $variables ) {
2014-02-26 19:16:54 +00:00
$language_interface = \Drupal :: languageManager () -> getCurrentLanguage ();
2012-04-18 18:30:50 +00:00
2015-06-09 14:24:55 +00:00
foreach ( \Drupal :: theme () -> getActiveTheme () -> getRegions () as $region ) {
if ( ! isset ( $variables [ 'page' ][ $region ])) {
2017-03-04 01:20:24 +00:00
$variables [ 'page' ][ $region ] = [];
2009-10-18 05:28:43 +00:00
}
}
2018-08-13 10:13:36 +00:00
$variables [ 'base_path' ] = base_path ();
2019-04-16 05:38:27 +00:00
$variables [ 'front_page' ] = Url :: fromRoute ( '<front>' ) -> toString ();
2018-08-13 10:13:36 +00:00
$variables [ 'language' ] = $language_interface ;
2014-04-17 20:12:22 +00:00
2014-11-18 09:50:53 +00:00
// An exception might be thrown.
try {
$variables [ 'is_front' ] = \Drupal :: service ( 'path.matcher' ) -> isFrontPage ();
}
catch ( Exception $e ) {
// If the database is not yet available, set default values for these
// variables.
$variables [ 'is_front' ] = FALSE ;
$variables [ 'db_is_active' ] = FALSE ;
}
2013-08-16 20:36:55 +00:00
2014-06-24 12:39:26 +00:00
if ( $node = \Drupal :: routeMatch () -> getParameter ( 'node' )) {
2007-12-20 09:20:41 +00:00
$variables [ 'node' ] = $node ;
2007-04-27 07:42:54 +00:00
}
2009-04-15 20:45:46 +00:00
}
2010-09-05 02:21:38 +00:00
2009-04-15 20:45:46 +00:00
/**
2010-01-13 05:40:03 +00:00
* Generate an array of suggestions from path arguments .
*
2013-09-29 07:19:59 +00:00
* This is typically called for adding to the suggestions in
* hook_theme_suggestions_HOOK_alter () or adding to 'attributes' class key
* variables from within preprocess functions , when wanting to base the
* additional suggestions or classes on the path of the current page .
2009-04-15 20:45:46 +00:00
*
* @ param $args
2014-05-28 09:55:05 +00:00
* An array of path arguments .
2010-01-13 05:40:03 +00:00
* @ param $base
* A string identifying the base 'thing' from which more specific suggestions
* are derived . For example , 'page' or 'html' .
* @ param $delimiter
* The string used to delimit increasingly specific information . The default
* of '__' is appropriate for theme hook suggestions . '-' is appropriate for
* extra classes .
2009-04-15 20:45:46 +00:00
*
* @ return
2010-01-13 05:40:03 +00:00
* An array of suggestions , suitable for adding to
2013-09-29 07:19:59 +00:00
* hook_theme_suggestions_HOOK_alter () or to $variables [ 'attributes' ][ 'class' ]
* if the suggestions represent extra CSS classes .
2009-04-15 20:45:46 +00:00
*/
2010-01-13 05:40:03 +00:00
function theme_get_suggestions ( $args , $base , $delimiter = '__' ) {
2009-04-15 20:45:46 +00:00
2014-10-15 10:05:01 +00:00
// Build a list of suggested theme hooks in order of
2009-04-04 00:58:09 +00:00
// specificity. One suggestion is made for every element of the current path,
2009-04-24 08:09:18 +00:00
// though numeric elements are not carried to subsequent suggestions. For
2010-01-13 05:40:03 +00:00
// example, for $base='page', http://www.example.com/node/1/edit would result
2014-10-15 10:05:01 +00:00
// in the following suggestions:
2007-04-27 07:42:54 +00:00
//
2014-10-15 10:05:01 +00:00
// page__node
// page__node__%
// page__node__1
// page__node__edit
2009-04-15 20:45:46 +00:00
2017-03-04 01:20:24 +00:00
$suggestions = [];
2010-02-23 18:32:00 +00:00
$prefix = $base ;
2009-04-15 20:45:46 +00:00
foreach ( $args as $arg ) {
2011-01-03 08:02:11 +00:00
// Remove slashes or null per SA-CORE-2009-003 and change - (hyphen) to _
// (underscore).
//
// When we discover templates in @see drupal_find_theme_templates,
// hyphens (-) are converted to underscores (_) before the theme hook
// is registered. We do this because the hyphens used for delimiters
// in hook suggestions cannot be used in the function names of the
// associated preprocess functions. Any page templates designed to be used
// on paths that contain a hyphen are also registered with these hyphens
// converted to underscores so here we must convert any hyphens in path
// arguments to underscores here before fetching theme hook suggestions
// to ensure the templates are appropriately recognized.
2017-03-04 01:20:24 +00:00
$arg = str_replace ([ " / " , " \\ " , " \0 " , '-' ], [ '' , '' , '' , '_' ], $arg );
2009-08-13 03:05:54 +00:00
// The percent acts as a wildcard for numeric arguments since
// asterisks are not valid filename characters on many filesystems.
if ( is_numeric ( $arg )) {
2010-02-23 18:32:00 +00:00
$suggestions [] = $prefix . $delimiter . '%' ;
2009-08-13 03:05:54 +00:00
}
2010-02-23 18:32:00 +00:00
$suggestions [] = $prefix . $delimiter . $arg ;
2007-04-27 07:42:54 +00:00
if ( ! is_numeric ( $arg )) {
2010-02-23 18:32:00 +00:00
$prefix .= $delimiter . $arg ;
2007-04-27 07:42:54 +00:00
}
}
2015-02-13 17:21:07 +00:00
if ( \Drupal :: service ( 'path.matcher' ) -> isFrontPage ()) {
2010-02-23 18:32:00 +00:00
// Front templates should be based on root only, not prefixed arguments.
2010-01-13 05:40:03 +00:00
$suggestions [] = $base . $delimiter . 'front' ;
2007-04-27 07:42:54 +00:00
}
2009-04-04 00:58:09 +00:00
2009-04-15 20:45:46 +00:00
return $suggestions ;
2007-04-27 07:42:54 +00:00
}
2009-08-31 18:43:12 +00:00
/**
2014-12-11 10:35:52 +00:00
* Prepares variables for maintenance page templates .
2013-05-24 16:48:56 +00:00
*
* Default template : maintenance - page . html . twig .
2009-08-31 18:43:12 +00:00
*
2013-05-24 16:48:56 +00:00
* @ param array $variables
* An associative array containing :
* - content - An array of page content .
2013-12-15 17:57:31 +00:00
*
2014-10-16 12:36:06 +00:00
* @ see system_page_attachments ()
2009-08-31 18:43:12 +00:00
*/
function template_preprocess_maintenance_page ( & $variables ) {
2014-04-17 20:12:22 +00:00
// @todo Rename the templates to page--maintenance + page--install.
template_preprocess_page ( $variables );
2014-10-16 12:36:06 +00:00
// @see system_page_attachments()
2014-10-08 11:49:20 +00:00
$variables [ '#attached' ][ 'library' ][] = 'system/maintenance' ;
Issue #2005546 by mdrummond, joelpittet, Manuel Garcia, lauriii, lokapujya, epari.siva, hosef, rpayanm, emma.maria, HOG, zetagraph, wmortada, rteijeiro, Cottser, hussainweb, madhavvyas: Use branding block in place of page template branding variables (site name, slogan, site logo)
2015-09-10 07:42:29 +00:00
// Maintenance page and install page need branding info in variables because
// there is no blocks.
$site_config = \Drupal :: config ( 'system.site' );
$variables [ 'logo' ] = theme_get_setting ( 'logo.url' );
$variables [ 'site_name' ] = $site_config -> get ( 'name' );
$variables [ 'site_slogan' ] = $site_config -> get ( 'slogan' );
2015-09-30 13:00:49 +00:00
// Maintenance page and install page need page title in variable because there
// are no blocks.
$variables [ 'title' ] = $variables [ 'page' ][ '#title' ];
2010-02-25 20:57:39 +00:00
}
2013-06-27 19:03:01 +00:00
/**
* Prepares variables for install page templates .
*
* Default template : install - page . html . twig .
*
* @ param array $variables
* An associative array containing :
* - content - An array of page content .
*
* @ see template_preprocess_maintenance_page ()
*/
function template_preprocess_install_page ( & $variables ) {
template_preprocess_maintenance_page ( $variables );
2014-04-17 20:12:22 +00:00
2013-06-27 19:03:01 +00:00
// Override the site name that is displayed on the page, since Drupal is
// still in the process of being installed.
2015-05-13 12:05:09 +00:00
$distribution_name = drupal_install_profile_distribution_name ();
2014-03-14 10:49:27 +00:00
$variables [ 'site_name' ] = $distribution_name ;
2015-10-05 05:30:28 +00:00
$variables [ 'site_version' ] = drupal_install_profile_distribution_version ();
2013-06-27 19:03:01 +00:00
}
2009-10-05 02:43:01 +00:00
/**
2013-10-03 20:55:34 +00:00
* Prepares variables for region templates .
*
* Default template : region . html . twig .
2009-10-05 02:43:01 +00:00
*
2013-01-10 23:50:55 +00:00
* Prepares the values passed to the theme_region function to be passed into a
2009-10-05 02:43:01 +00:00
* pluggable template engine . Uses the region name to generate a template file
2013-10-03 20:55:34 +00:00
* suggestions .
2009-10-05 02:43:01 +00:00
*
2013-10-03 20:55:34 +00:00
* @ param array $variables
* An associative array containing :
* - elements : An associative array containing properties of the region .
2009-10-05 02:43:01 +00:00
*/
function template_preprocess_region ( & $variables ) {
// Create the $content variable that templates expect.
$variables [ 'content' ] = $variables [ 'elements' ][ '#children' ];
$variables [ 'region' ] = $variables [ 'elements' ][ '#region' ];
}
2012-09-11 15:08:58 +00:00
2014-03-25 11:19:33 +00:00
/**
* Prepares variables for field templates .
*
* Default template : field . html . twig .
*
* @ param array $variables
* An associative array containing :
* - element : A render element representing the field .
* - attributes : A string containing the attributes for the wrapping div .
* - title_attributes : A string containing the attributes for the title .
*/
function template_preprocess_field ( & $variables , $hook ) {
$element = $variables [ 'element' ];
Issue #2217731 by crowdcg, lauriii, davidhernandez, aczietlow, jjcarrion, mortendk, karolus, pakmanlh, LewisNyman, aboros, joshua.boltz: Move field classes out of preprocess and into templates
2014-12-22 16:21:53 +00:00
// Creating variables for the template.
$variables [ 'entity_type' ] = $element [ '#entity_type' ];
$variables [ 'field_name' ] = $element [ '#field_name' ];
$variables [ 'field_type' ] = $element [ '#field_type' ];
$variables [ 'label_display' ] = $element [ '#label_display' ];
2014-03-25 11:19:33 +00:00
$variables [ 'label_hidden' ] = ( $element [ '#label_display' ] == 'hidden' );
2014-03-28 20:41:42 +00:00
// Always set the field label - allow themes to decide whether to display it.
// In addition the label should be rendered but hidden to support screen
// readers.
2015-08-11 10:11:21 +00:00
$variables [ 'label' ] = $element [ '#title' ];
2014-03-25 11:19:33 +00:00
2015-09-25 14:54:05 +00:00
$variables [ 'multiple' ] = $element [ '#is_multiple' ];
Issue #2214241 by mortendk, mdrummond, lauriii, galooph, ShaunDychko, jjcarrion, b0unty, joelpittet, scor, amitgoyal, aboros, Manuel Garcia, hkirsman, BLadwin, hussainweb, sushilkr, emma.maria, nlisgo, yched, LewisNyman, davidhernandez, mikl, camoa, dman, dodorama: Field default markup - removing the divitis
2015-08-26 08:36:43 +00:00
2014-03-25 11:19:33 +00:00
static $default_attributes ;
if ( ! isset ( $default_attributes )) {
2016-04-27 10:18:44 +00:00
$default_attributes = new Attribute ();
2014-03-25 11:19:33 +00:00
}
Issue #2214241 by mortendk, mdrummond, lauriii, galooph, ShaunDychko, jjcarrion, b0unty, joelpittet, scor, amitgoyal, aboros, Manuel Garcia, hkirsman, BLadwin, hussainweb, sushilkr, emma.maria, nlisgo, yched, LewisNyman, davidhernandez, mikl, camoa, dman, dodorama: Field default markup - removing the divitis
2015-08-26 08:36:43 +00:00
// Merge attributes when a single-value field has a hidden label.
2015-12-29 12:51:58 +00:00
if ( $element [ '#label_display' ] == 'hidden' && ! $variables [ 'multiple' ] && ! empty ( $element [ '#items' ][ 0 ] -> _attributes )) {
Issue #2214241 by mortendk, mdrummond, lauriii, galooph, ShaunDychko, jjcarrion, b0unty, joelpittet, scor, amitgoyal, aboros, Manuel Garcia, hkirsman, BLadwin, hussainweb, sushilkr, emma.maria, nlisgo, yched, LewisNyman, davidhernandez, mikl, camoa, dman, dodorama: Field default markup - removing the divitis
2015-08-26 08:36:43 +00:00
$variables [ 'attributes' ] = NestedArray :: mergeDeep ( $variables [ 'attributes' ], ( array ) $element [ '#items' ][ 0 ] -> _attributes );
}
2014-10-07 12:17:40 +00:00
// We want other preprocess functions and the theme implementation to have
// fast access to the field item render arrays. The item render array keys
// (deltas) should always be numerically indexed starting from 0, and looping
2015-04-09 14:52:29 +00:00
// on those keys is faster than calling Element::children() or looping on all
2014-10-07 12:17:40 +00:00
// keys within $element, since that requires traversal of all element
// properties.
2017-03-04 01:20:24 +00:00
$variables [ 'items' ] = [];
2014-10-07 12:17:40 +00:00
$delta = 0 ;
while ( ! empty ( $element [ $delta ])) {
$variables [ 'items' ][ $delta ][ 'content' ] = $element [ $delta ];
// Modules (e.g., rdf.module) can add field item attributes (to
// $item->_attributes) within hook_entity_prepare_view(). Some field
// formatters move those attributes into some nested formatter-specific
// element in order have them rendered on the desired HTML element (e.g., on
// the <a> element of a field item being rendered as a link). Other field
// formatters leave them within $element['#items'][$delta]['_attributes'] to
// be rendered on the item wrappers provided by field.html.twig.
$variables [ 'items' ][ $delta ][ 'attributes' ] = ! empty ( $element [ '#items' ][ $delta ] -> _attributes ) ? new Attribute ( $element [ '#items' ][ $delta ] -> _attributes ) : clone ( $default_attributes );
$delta ++ ;
2014-03-25 11:19:33 +00:00
}
}
/**
* Prepares variables for individual form element templates .
*
* Default template : field - multiple - value - form . html . twig .
*
* Combines multiple values into a table with drag - n - drop reordering .
*
* @ param array $variables
* An associative array containing :
* - element : A render element representing the form element .
*/
function template_preprocess_field_multiple_value_form ( & $variables ) {
$element = $variables [ 'element' ];
$variables [ 'multiple' ] = $element [ '#cardinality_multiple' ];
2018-10-26 09:25:46 +00:00
$variables [ 'attributes' ] = $element [ '#attributes' ];
2014-03-25 11:19:33 +00:00
if ( $variables [ 'multiple' ]) {
2015-03-05 09:37:01 +00:00
$table_id = Html :: getUniqueId ( $element [ '#field_name' ] . '_values' );
2014-03-25 11:19:33 +00:00
$order_class = $element [ '#field_name' ] . '-delta-order' ;
2017-03-04 01:20:24 +00:00
$header_attributes = new Attribute ([ 'class' => [ 'label' ]]);
2014-08-26 17:25:49 +00:00
if ( ! empty ( $element [ '#required' ])) {
2015-08-04 10:54:55 +00:00
$header_attributes [ 'class' ][] = 'js-form-required' ;
2014-08-26 17:25:49 +00:00
$header_attributes [ 'class' ][] = 'form-required' ;
}
2017-03-04 01:20:24 +00:00
$header = [
[
'data' => [
2014-08-26 17:25:49 +00:00
'#prefix' => '<h4' . $header_attributes . '>' ,
2016-10-03 19:18:57 +00:00
'#markup' => $element [ '#title' ],
2014-03-25 11:19:33 +00:00
'#suffix' => '</h4>' ,
2017-03-04 01:20:24 +00:00
],
2014-03-25 11:19:33 +00:00
'colspan' => 2 ,
2017-03-04 01:20:24 +00:00
'class' => [ 'field-label' ],
],
t ( 'Order' , [], [ 'context' => 'Sort order' ]),
];
$rows = [];
2014-03-25 11:19:33 +00:00
// Sort items according to '_weight' (needed when the form comes back after
// preview or failed validation).
2017-03-04 01:20:24 +00:00
$items = [];
$variables [ 'button' ] = [];
2014-03-25 11:19:33 +00:00
foreach ( Element :: children ( $element ) as $key ) {
if ( $key === 'add_more' ) {
$variables [ 'button' ] = & $element [ $key ];
}
else {
$items [] = & $element [ $key ];
}
}
2014-07-07 12:01:38 +00:00
usort ( $items , '_field_multiple_value_form_sort_helper' );
2014-03-25 11:19:33 +00:00
// Add the items as table rows.
foreach ( $items as $item ) {
2017-03-04 01:20:24 +00:00
$item [ '_weight' ][ '#attributes' ][ 'class' ] = [ $order_class ];
2014-03-25 11:19:33 +00:00
// Remove weight form element from item render array so it can be rendered
// in a separate table column.
$delta_element = $item [ '_weight' ];
unset ( $item [ '_weight' ]);
2017-03-04 01:20:24 +00:00
$cells = [
[ 'data' => '' , 'class' => [ 'field-multiple-drag' ]],
[ 'data' => $item ],
[ 'data' => $delta_element , 'class' => [ 'delta-order' ]],
];
$rows [] = [
2014-03-25 11:19:33 +00:00
'data' => $cells ,
2017-03-04 01:20:24 +00:00
'class' => [ 'draggable' ],
];
2014-03-25 11:19:33 +00:00
}
2017-03-04 01:20:24 +00:00
$variables [ 'table' ] = [
2014-03-25 11:19:33 +00:00
'#type' => 'table' ,
'#header' => $header ,
'#rows' => $rows ,
2017-03-04 01:20:24 +00:00
'#attributes' => [
2014-03-25 11:19:33 +00:00
'id' => $table_id ,
2017-03-04 01:20:24 +00:00
'class' => [ 'field-multiple-table' ],
],
'#tabledrag' => [
[
2014-03-25 11:19:33 +00:00
'action' => 'order' ,
'relationship' => 'sibling' ,
'group' => $order_class ,
2017-03-04 01:20:24 +00:00
],
],
];
2014-03-25 11:19:33 +00:00
2015-10-05 06:11:14 +00:00
if ( ! empty ( $element [ '#description' ])) {
$description_id = $element [ '#attributes' ][ 'aria-describedby' ];
$description_attributes [ 'id' ] = $description_id ;
$variables [ 'description' ][ 'attributes' ] = new Attribute ( $description_attributes );
$variables [ 'description' ][ 'content' ] = $element [ '#description' ];
// Add the description's id to the table aria attributes.
$variables [ 'table' ][ '#attributes' ][ 'aria-describedby' ] = $element [ '#attributes' ][ 'aria-describedby' ];
}
2014-03-25 11:19:33 +00:00
}
else {
2017-03-04 01:20:24 +00:00
$variables [ 'elements' ] = [];
2014-03-25 11:19:33 +00:00
foreach ( Element :: children ( $element ) as $key ) {
$variables [ 'elements' ][] = $element [ $key ];
}
}
}
2014-08-23 22:00:26 +00:00
/**
* Prepares variables for breadcrumb templates .
*
* Default template : breadcrumb . html . twig .
*
* @ param array $variables
* An associative array containing :
* - links : A list of \Drupal\Core\Link objects which should be rendered .
*/
function template_preprocess_breadcrumb ( & $variables ) {
2017-03-04 01:20:24 +00:00
$variables [ 'breadcrumb' ] = [];
2014-08-26 05:27:50 +00:00
/** @var \Drupal\Core\Link $link */
foreach ( $variables [ 'links' ] as $key => $link ) {
2017-03-04 01:20:24 +00:00
$variables [ 'breadcrumb' ][ $key ] = [ 'text' => $link -> getText (), 'url' => $link -> getUrl () -> toString ()];
2014-08-23 22:00:26 +00:00
}
}
2019-11-26 23:13:19 +00:00
/**
* Prepares variables for pager templates .
*
* Default template : pager . html . twig .
*
* Menu callbacks that display paged query results should use #type => pager
* to retrieve a pager control so that users can view other results . Format a
* list of nearby pages with additional query results .
*
* @ param array $variables
* An associative array containing :
* - pager : A render element containing :
* - #tags: An array of labels for the controls in the pager.
* - #element: An optional integer to distinguish between multiple pagers on
* one page .
* - #parameters: An associative array of query string parameters to append
* to the pager links .
* - #route_parameters: An associative array of the route parameters.
* - #quantity: The number of pages in the list.
*/
function template_preprocess_pager ( & $variables ) {
$element = $variables [ 'pager' ][ '#element' ];
$parameters = $variables [ 'pager' ][ '#parameters' ];
$quantity = empty ( $variables [ 'pager' ][ '#quantity' ]) ? 0 : $variables [ 'pager' ][ '#quantity' ];
$route_name = $variables [ 'pager' ][ '#route_name' ];
$route_parameters = isset ( $variables [ 'pager' ][ '#route_parameters' ]) ? $variables [ 'pager' ][ '#route_parameters' ] : [];
/* @var $pager_manager \Drupal\Core\Pager\PagerManagerInterface */
$pager_manager = \Drupal :: service ( 'pager.manager' );
$pager = $pager_manager -> getPager ( $element );
// Nothing to do if there is no pager.
if ( ! isset ( $pager )) {
return ;
}
$pager_max = $pager -> getTotalPages ();
// Nothing to do if there is only one page.
if ( $pager_max <= 1 ) {
return ;
}
$tags = $variables [ 'pager' ][ '#tags' ];
// Calculate various markers within this pager piece:
// Middle is used to "center" pages around the current page.
$pager_middle = ceil ( $quantity / 2 );
$current_page = $pager -> getCurrentPage ();
// The current pager is the page we are currently paged to.
$pager_current = $current_page + 1 ;
// The first pager is the first page listed by this pager piece (re quantity).
$pager_first = $pager_current - $pager_middle + 1 ;
// The last is the last page listed by this pager piece (re quantity).
$pager_last = $pager_current + $quantity - $pager_middle ;
// End of marker calculations.
// Prepare for generation loop.
$i = $pager_first ;
if ( $pager_last > $pager_max ) {
// Adjust "center" if at end of query.
$i = $i + ( $pager_max - $pager_last );
$pager_last = $pager_max ;
}
if ( $i <= 0 ) {
// Adjust "center" if at start of query.
$pager_last = $pager_last + ( 1 - $i );
$i = 1 ;
}
// End of generation loop preparation.
// Create the "first" and "previous" links if we are not on the first page.
if ( $current_page > 0 ) {
$items [ 'first' ] = [];
$items [ 'first' ][ 'attributes' ] = new Attribute ();
$options = [
'query' => $pager_manager -> getUpdatedParameters ( $parameters , $element , 0 ),
];
$items [ 'first' ][ 'href' ] = Url :: fromRoute ( $route_name , $route_parameters , $options ) -> toString ();
if ( isset ( $tags [ 0 ])) {
$items [ 'first' ][ 'text' ] = $tags [ 0 ];
}
$items [ 'previous' ] = [];
$items [ 'previous' ][ 'attributes' ] = new Attribute ();
$options = [
'query' => $pager_manager -> getUpdatedParameters ( $parameters , $element , $current_page - 1 ),
];
$items [ 'previous' ][ 'href' ] = Url :: fromRoute ( $route_name , $route_parameters , $options ) -> toString ();
if ( isset ( $tags [ 1 ])) {
$items [ 'previous' ][ 'text' ] = $tags [ 1 ];
}
}
if ( $i != $pager_max ) {
// Add an ellipsis if there are further previous pages.
if ( $i > 1 ) {
$variables [ 'ellipses' ][ 'previous' ] = TRUE ;
}
// Now generate the actual pager piece.
for (; $i <= $pager_last && $i <= $pager_max ; $i ++ ) {
$options = [
'query' => $pager_manager -> getUpdatedParameters ( $parameters , $element , $i - 1 ),
];
$items [ 'pages' ][ $i ][ 'href' ] = Url :: fromRoute ( $route_name , $route_parameters , $options ) -> toString ();
$items [ 'pages' ][ $i ][ 'attributes' ] = new Attribute ();
if ( $i == $pager_current ) {
$variables [ 'current' ] = $i ;
}
}
// Add an ellipsis if there are further next pages.
if ( $i < $pager_max + 1 ) {
$variables [ 'ellipses' ][ 'next' ] = TRUE ;
}
}
// Create the "next" and "last" links if we are not on the last page.
if ( $current_page < ( $pager_max - 1 )) {
$items [ 'next' ] = [];
$items [ 'next' ][ 'attributes' ] = new Attribute ();
$options = [
'query' => $pager_manager -> getUpdatedParameters ( $parameters , $element , $current_page + 1 ),
];
$items [ 'next' ][ 'href' ] = Url :: fromRoute ( $route_name , $route_parameters , $options ) -> toString ();
if ( isset ( $tags [ 3 ])) {
$items [ 'next' ][ 'text' ] = $tags [ 3 ];
}
$items [ 'last' ] = [];
$items [ 'last' ][ 'attributes' ] = new Attribute ();
$options = [
'query' => $pager_manager -> getUpdatedParameters ( $parameters , $element , $pager_max - 1 ),
];
$items [ 'last' ][ 'href' ] = Url :: fromRoute ( $route_name , $route_parameters , $options ) -> toString ();
if ( isset ( $tags [ 4 ])) {
$items [ 'last' ][ 'text' ] = $tags [ 4 ];
}
}
$variables [ 'items' ] = $items ;
$variables [ 'heading_id' ] = Html :: getUniqueId ( 'pagination-heading' );
// The rendered link needs to play well with any other query parameter used
// on the page, like exposed filters, so for the cacheability all query
// parameters matter.
$variables [ '#cache' ][ 'contexts' ][] = 'url.query_args' ;
}
2014-07-07 12:01:38 +00:00
/**
* Callback for usort () within template_preprocess_field_multiple_value_form () .
*
* Sorts using [ '_weight' ][ '#value' ]
*/
function _field_multiple_value_form_sort_helper ( $a , $b ) {
$a_weight = ( is_array ( $a ) && isset ( $a [ '_weight' ][ '#value' ]) ? $a [ '_weight' ][ '#value' ] : 0 );
$b_weight = ( is_array ( $b ) && isset ( $b [ '_weight' ][ '#value' ]) ? $b [ '_weight' ][ '#value' ] : 0 );
return $a_weight - $b_weight ;
}
2012-09-11 15:08:58 +00:00
/**
* Provides theme registration for themes across . inc files .
*/
function drupal_common_theme () {
2017-03-04 01:20:24 +00:00
return [
2012-09-11 15:08:58 +00:00
// From theme.inc.
2017-03-04 01:20:24 +00:00
'html' => [
2014-11-14 10:43:20 +00:00
'render element' => 'html' ,
2017-03-04 01:20:24 +00:00
],
'page' => [
2012-09-11 15:08:58 +00:00
'render element' => 'page' ,
2017-03-04 01:20:24 +00:00
],
'page_title' => [
'variables' => [ 'title' => NULL ],
],
'region' => [
2012-09-11 15:08:58 +00:00
'render element' => 'elements' ,
2017-03-04 01:20:24 +00:00
],
'time' => [
'variables' => [ 'timestamp' => NULL , 'text' => NULL , 'attributes' => []],
],
'datetime_form' => [
2014-08-29 04:42:51 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
'datetime_wrapper' => [
2014-08-29 04:42:51 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
'status_messages' => [
2015-03-13 09:54:28 +00:00
'variables' => [ 'status_headings' => [], 'message_list' => NULL ],
2017-03-04 01:20:24 +00:00
],
'links' => [
'variables' => [ 'links' => [], 'attributes' => [ 'class' => [ 'links' ]], 'heading' => [], 'set_active_class' => FALSE ],
],
'dropbutton_wrapper' => [
'variables' => [ 'children' => NULL ],
],
'image' => [
2012-09-11 15:08:58 +00:00
// HTML 4 and XHTML 1.0 always require an alt attribute. The HTML 5 draft
// allows the alt attribute to be omitted in some cases. Therefore,
2015-12-10 14:19:31 +00:00
// default the alt attribute to an empty string, but allow code providing
// variables to image.html.twig templates to pass explicit NULL for it to
// be omitted. Usually, neither omission nor an empty string satisfies
// accessibility requirements, so it is strongly encouraged for code
// building variables for image.html.twig templates to pass a meaningful
// value for the alt variable.
2012-09-11 15:08:58 +00:00
// - http://www.w3.org/TR/REC-html40/struct/objects.html#h-13.8
// - http://www.w3.org/TR/xhtml1/dtds.html
// - http://dev.w3.org/html5/spec/Overview.html#alt
// The title attribute is optional in all cases, so it is omitted by
// default.
2017-03-04 01:20:24 +00:00
'variables' => [ 'uri' => NULL , 'width' => NULL , 'height' => NULL , 'alt' => '' , 'title' => NULL , 'attributes' => [], 'sizes' => NULL , 'srcset' => [], 'style_name' => NULL ],
],
'breadcrumb' => [
'variables' => [ 'links' => []],
],
'table' => [
'variables' => [ 'header' => NULL , 'rows' => NULL , 'footer' => NULL , 'attributes' => [], 'caption' => NULL , 'colgroups' => [], 'sticky' => FALSE , 'responsive' => TRUE , 'empty' => '' ],
],
'tablesort_indicator' => [
'variables' => [ 'style' => NULL ],
],
'mark' => [
'variables' => [ 'status' => MARK_NEW ],
],
'item_list' => [
'variables' => [ 'items' => [], 'title' => '' , 'list_type' => 'ul' , 'wrapper_attributes' => [], 'attributes' => [], 'empty' => NULL , 'context' => []],
],
'feed_icon' => [
'variables' => [ 'url' => NULL , 'title' => NULL ],
],
'progress_bar' => [
'variables' => [ 'label' => NULL , 'percent' => NULL , 'message' => NULL ],
],
'indentation' => [
'variables' => [ 'size' => 1 ],
],
2012-09-11 15:08:58 +00:00
// From theme.maintenance.inc.
2017-03-04 01:20:24 +00:00
'maintenance_page' => [
2014-04-17 20:12:22 +00:00
'render element' => 'page' ,
2017-03-04 01:20:24 +00:00
],
'install_page' => [
2014-04-17 20:12:22 +00:00
'render element' => 'page' ,
2017-03-04 01:20:24 +00:00
],
'maintenance_task_list' => [
'variables' => [ 'items' => NULL , 'active' => NULL , 'variant' => NULL ],
],
'authorize_report' => [
Issue #1885564 by joelpittet, SebCorbin, Cottser, mpdonadio, David_Rothstein, drupalninja99, jenlampton, lauriii, rteijeiro, mbrett5062, akalata, Devin Carlson, trevorkjorlien, longwave, socketwench, shanethehat, aboros: theme.maintenance.inc (authorize.php) - Convert theme_ functions to Twig
2015-08-11 22:54:49 +00:00
'variables' => [ 'messages' => [], 'attributes' => []],
'includes' => [ 'core/includes/theme.maintenance.inc' ],
'template' => 'authorize-report' ,
2017-03-04 01:20:24 +00:00
],
'pager' => [
2015-03-11 13:00:05 +00:00
'render element' => 'pager' ,
2017-03-04 01:20:24 +00:00
],
2012-09-11 15:08:58 +00:00
// From menu.inc.
2017-03-04 01:20:24 +00:00
'menu' => [
'variables' => [ 'menu_name' => NULL , 'items' => [], 'attributes' => []],
],
'menu_local_task' => [
2012-09-11 15:08:58 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
'menu_local_action' => [
2012-09-11 15:08:58 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
'menu_local_tasks' => [
'variables' => [ 'primary' => [], 'secondary' => []],
],
2012-09-11 15:08:58 +00:00
// From form.inc.
2017-03-04 01:20:24 +00:00
'input' => [
2013-01-10 05:45:55 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
'select' => [
2012-09-11 15:08:58 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
'fieldset' => [
2012-09-11 15:08:58 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
'details' => [
2012-11-27 07:06:47 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
'radios' => [
2012-09-11 15:08:58 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
'checkboxes' => [
2012-09-11 15:08:58 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
'form' => [
2012-09-11 15:08:58 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
'textarea' => [
2012-09-11 15:08:58 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
'form_element' => [
2012-09-11 15:08:58 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
'form_element_label' => [
2012-09-11 15:08:58 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
'vertical_tabs' => [
2012-09-11 15:08:58 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
'container' => [
2012-09-11 15:08:58 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
2014-03-25 11:19:33 +00:00
// From field system.
2017-03-04 01:20:24 +00:00
'field' => [
2014-03-25 11:19:33 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
'field_multiple_value_form' => [
2014-03-25 11:19:33 +00:00
'render element' => 'element' ,
2017-03-04 01:20:24 +00:00
],
];
2012-09-11 15:08:58 +00:00
}