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 ;
2020-02-03 12:36:42 +00:00
use Drupal\Core\Template\AttributeHelper ;
2013-05-07 09:47:19 +00:00
use Drupal\Core\Theme\ThemeSettings ;
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 ;
2023-11-11 11:44:36 +00:00
use Drupal\Core\Installer\InstallerKernel ;
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
*
Issue #2941148 by quietone, bruno.bicudo, ravi.shankar, Sweetchuck, beatrizrodrigues, lucienchalom, VitaliyB98, WagnerMelo, sophiavs, ankitjain28may, daffie, longwave, Sutharsan, borisson_, cosmicdreams, heykarthikwithu, catch: Fix Drupal.Commenting.FunctionComment.MissingReturnType
2022-09-27 09:58:26 +00:00
* @ return array | \Drupal\Core\Utility\ThemeRegistry
2012-06-14 09:07:35 +00:00
* The complete theme registry array , or an instance of the
* Drupal\Core\Utility\ThemeRegistry class .
2023-03-28 07:43:07 +00:00
*
* @ deprecated in drupal : 10.1 . 0 and is removed from drupal : 11.0 . 0. Use
* theme . registry service methods get () or getRuntime () instead .
*
* @ see https :// www . drupal . org / node / 3348850
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 ) {
2023-03-28 07:43:07 +00:00
@ trigger_error ( __FUNCTION__ . '() is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. Use theme.registry service method get() instead. See https://www.drupal.org/node/3348850' , E_USER_DEPRECATED );
2013-11-16 21:30:33 +00:00
return $theme_registry -> get ();
2007-04-06 13:27:23 +00:00
}
else {
2023-03-28 07:43:07 +00:00
@ trigger_error ( __FUNCTION__ . '() is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. Use theme.registry service method getRuntime() instead. See https://www.drupal.org/node/3348850' , E_USER_DEPRECATED );
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 .
2023-03-24 14:50:20 +00:00
*
* @ deprecated in drupal : 10.1 . 0 and is removed from drupal : 11.0 . 0. Use
* theme . registry service reset () method instead .
*
* @ see https :// www . drupal . org / node / 3348853
2007-04-06 13:27:23 +00:00
*/
2008-08-02 19:01:02 +00:00
function drupal_theme_rebuild () {
2023-03-24 14:50:20 +00:00
@ trigger_error ( __FUNCTION__ . '() is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. Use theme.registry service reset() method instead. See https://www.drupal.org/node/3348853' , E_USER_DEPRECATED );
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 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 ();
2021-11-15 02:19:43 +00:00
$subtheme_paths = $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.
2023-01-27 12:37:01 +00:00
if ( ! str_starts_with ( $file -> uri , str_replace ( $subtheme_paths , '' , $file -> uri ))) {
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
2022-02-07 11:13:47 +00:00
// hook_theme_suggestions_alter() for more information about suggestions and
2010-03-21 04:05:24 +00:00
// the use of 'pattern' and 'base hook'.
2007-07-03 18:48:41 +00:00
$patterns = array_keys ( $files );
foreach ( $cache as $hook => $info ) {
2021-11-15 02:19:43 +00:00
$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 .
*
Issue #2941148 by quietone, bruno.bicudo, ravi.shankar, Sweetchuck, beatrizrodrigues, lucienchalom, VitaliyB98, WagnerMelo, sophiavs, ankitjain28may, daffie, longwave, Sutharsan, borisson_, cosmicdreams, heykarthikwithu, catch: Fix Drupal.Commenting.FunctionComment.MissingReturnType
2022-09-27 09:58:26 +00:00
* @ return mixed
2004-08-20 07:51:27 +00:00
* 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
}
}
}
Issue #2669074 by kim.pepper, Berdir, gaydabura, andypost, ravi.shankar, KapilV, Wim Leers, bradjones1, nickolaj, alexpott, mondrake, 20th, yogeshmpawar, gaurav.kapoor, voleger, Pavan B S, Neslee Canil Pinto, aerozeppelin, Cameron Tod, daffie, dhruveshdtripathi, abramm, Nono95230, s.messaris, Mile23, claudiu.cristea, larowlan, catch, jibran, SpadXIII: Convert file_create_url() & file_url_transform_relative() to service, deprecate it
2021-07-09 13:18:01 +00:00
/** @var \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator */
$file_url_generator = \Drupal :: service ( 'file_url_generator' );
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 ();
Issue #2669074 by kim.pepper, Berdir, gaydabura, andypost, ravi.shankar, KapilV, Wim Leers, bradjones1, nickolaj, alexpott, mondrake, 20th, yogeshmpawar, gaurav.kapoor, voleger, Pavan B S, Neslee Canil Pinto, aerozeppelin, Cameron Tod, daffie, dhruveshdtripathi, abramm, Nono95230, s.messaris, Mile23, claudiu.cristea, larowlan, catch, jibran, SpadXIII: Convert file_create_url() & file_url_transform_relative() to service, deprecate it
2021-07-09 13:18:01 +00:00
$cache [ $theme ] -> set ( 'logo.url' , $file_url_generator -> generateString ( $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' )) {
Issue #2669074 by kim.pepper, Berdir, gaydabura, andypost, ravi.shankar, KapilV, Wim Leers, bradjones1, nickolaj, alexpott, mondrake, 20th, yogeshmpawar, gaurav.kapoor, voleger, Pavan B S, Neslee Canil Pinto, aerozeppelin, Cameron Tod, daffie, dhruveshdtripathi, abramm, Nono95230, s.messaris, Mile23, claudiu.cristea, larowlan, catch, jibran, SpadXIII: Convert file_create_url() & file_url_transform_relative() to service, deprecate it
2021-07-09 13:18:01 +00:00
$cache [ $theme ] -> set ( 'logo.url' , $file_url_generator -> generateString ( $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' )) {
Issue #2669074 by kim.pepper, Berdir, gaydabura, andypost, ravi.shankar, KapilV, Wim Leers, bradjones1, nickolaj, alexpott, mondrake, 20th, yogeshmpawar, gaurav.kapoor, voleger, Pavan B S, Neslee Canil Pinto, aerozeppelin, Cameron Tod, daffie, dhruveshdtripathi, abramm, Nono95230, s.messaris, Mile23, claudiu.cristea, larowlan, catch, jibran, SpadXIII: Convert file_create_url() & file_url_transform_relative() to service, deprecate it
2021-07-09 13:18:01 +00:00
$cache [ $theme ] -> set ( 'favicon.url' , $file_url_generator -> generateString ( $favicon ));
2009-10-14 10:56:35 +00:00
}
else {
Issue #2669074 by kim.pepper, Berdir, gaydabura, andypost, ravi.shankar, KapilV, Wim Leers, bradjones1, nickolaj, alexpott, mondrake, 20th, yogeshmpawar, gaurav.kapoor, voleger, Pavan B S, Neslee Canil Pinto, aerozeppelin, Cameron Tod, daffie, dhruveshdtripathi, abramm, Nono95230, s.messaris, Mile23, claudiu.cristea, larowlan, catch, jibran, SpadXIII: Convert file_create_url() & file_url_transform_relative() to service, deprecate it
2021-07-09 13:18:01 +00:00
$cache [ $theme ] -> set ( 'favicon.url' , $file_url_generator -> generateString ( 'core/misc/favicon.ico' ));
2009-10-14 10:56:35 +00:00
}
}
2013-05-07 09:47:19 +00:00
elseif ( $favicon_path ) {
Issue #2669074 by kim.pepper, Berdir, gaydabura, andypost, ravi.shankar, KapilV, Wim Leers, bradjones1, nickolaj, alexpott, mondrake, 20th, yogeshmpawar, gaurav.kapoor, voleger, Pavan B S, Neslee Canil Pinto, aerozeppelin, Cameron Tod, daffie, dhruveshdtripathi, abramm, Nono95230, s.messaris, Mile23, claudiu.cristea, larowlan, catch, jibran, SpadXIII: Convert file_create_url() & file_url_transform_relative() to service, deprecate it
2021-07-09 13:18:01 +00:00
$cache [ $theme ] -> set ( 'favicon.url' , $file_url_generator -> generateString ( $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 .
*
2023-02-14 15:26:19 +00:00
* @ deprecated in drupal : 10.1 . 0 and is removed from drupal : 11.0 . 0. There is no
* replacement . Theme engines must handle escaping by themselves .
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
*
2023-02-14 15:26:19 +00:00
* @ see https :// www . drupal . org / node / 3336253
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
*/
function theme_render_and_autoescape ( $arg ) {
2023-02-14 15:26:19 +00:00
@ trigger_error ( 'theme_render_and_autoescape() is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. There is no replacement. Theme engines must handle escaping by themselves. See https://www.drupal.org/node/3336253' , E_USER_DEPRECATED );
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 .
*
Issue #2941148 by quietone, bruno.bicudo, ravi.shankar, Sweetchuck, beatrizrodrigues, lucienchalom, VitaliyB98, WagnerMelo, sophiavs, ankitjain28may, daffie, longwave, Sutharsan, borisson_, cosmicdreams, heykarthikwithu, catch: Fix Drupal.Commenting.FunctionComment.MissingReturnType
2022-09-27 09:58:26 +00:00
* @ return \Drupal\Core\Config\Config
2013-05-07 09:47:19 +00:00
* 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 );
}
2024-01-08 10:48:04 +00:00
elseif ( str_starts_with ( $key , '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 :
2020-01-07 15:28:24 +00:00
* - links : An array of links to be themed . Each link itself is an array , with
* the following elements :
2010-10-30 03:57:20 +00:00
* - title : The link text .
2020-01-07 15:28:24 +00:00
* - url : ( optional ) The \Drupal\Core\Url object to link to . If the 'url'
* element is supplied , the 'title' and 'url' are used to generate a link
* through \Drupal :: linkGenerator () -> generate () . All data from the link
* array other than 'title' and 'url' are added as #options on
* the URL object . See \Drupal\Core\Url :: fromUri () for details on the
* options . If no 'url' is supplied , the 'title' is printed as plain text .
2013-01-10 23:50:55 +00:00
* - attributes : ( optional ) Attributes for the anchor , or for the < span >
2020-01-07 15:28:24 +00:00
* tag used in its place if no 'url' 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 .
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
2023-04-12 14:28:50 +00:00
* route_name + route_parameters or URL ( 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 ) {
Issue #2669074 by kim.pepper, Berdir, gaydabura, andypost, ravi.shankar, KapilV, Wim Leers, bradjones1, nickolaj, alexpott, mondrake, 20th, yogeshmpawar, gaurav.kapoor, voleger, Pavan B S, Neslee Canil Pinto, aerozeppelin, Cameron Tod, daffie, dhruveshdtripathi, abramm, Nono95230, s.messaris, Mile23, claudiu.cristea, larowlan, catch, jibran, SpadXIII: Convert file_create_url() & file_url_transform_relative() to service, deprecate it
2021-07-09 13:18:01 +00:00
/** @var \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator */
$file_url_generator = \Drupal :: service ( 'file_url_generator' );
2014-09-23 05:09:41 +00:00
if ( ! empty ( $variables [ 'uri' ])) {
Issue #2669074 by kim.pepper, Berdir, gaydabura, andypost, ravi.shankar, KapilV, Wim Leers, bradjones1, nickolaj, alexpott, mondrake, 20th, yogeshmpawar, gaurav.kapoor, voleger, Pavan B S, Neslee Canil Pinto, aerozeppelin, Cameron Tod, daffie, dhruveshdtripathi, abramm, Nono95230, s.messaris, Mile23, claudiu.cristea, larowlan, catch, jibran, SpadXIII: Convert file_create_url() & file_url_transform_relative() to service, deprecate it
2021-07-09 13:18:01 +00:00
$variables [ 'attributes' ][ 'src' ] = $file_url_generator -> generateString ( $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.
Issue #2669074 by kim.pepper, Berdir, gaydabura, andypost, ravi.shankar, KapilV, Wim Leers, bradjones1, nickolaj, alexpott, mondrake, 20th, yogeshmpawar, gaurav.kapoor, voleger, Pavan B S, Neslee Canil Pinto, aerozeppelin, Cameron Tod, daffie, dhruveshdtripathi, abramm, Nono95230, s.messaris, Mile23, claudiu.cristea, larowlan, catch, jibran, SpadXIII: Convert file_create_url() & file_url_transform_relative() to service, deprecate it
2021-07-09 13:18:01 +00:00
$source = $file_url_generator -> generateString ( $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.
2020-02-03 12:36:42 +00:00
if ( AttributeHelper :: attributeExists ( $key , $variables [ 'attributes' ])) {
2014-09-12 15:58:23 +00:00
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
}
2020-08-25 22:36:08 +00:00
2020-09-02 20:15:17 +00:00
// Without dimensions specified, layout shifts can occur,
// which are more noticeable on pages that take some time to load.
2020-09-08 04:26:53 +00:00
// As a result, only mark images as lazy load that have dimensions.
2020-09-25 17:53:12 +00:00
if ( isset ( $variables [ 'width' ], $variables [ 'height' ]) && ! isset ( $variables [ 'attributes' ][ 'loading' ])) {
2020-08-25 22:36:08 +00:00
$variables [ 'attributes' ][ 'loading' ] = 'lazy' ;
}
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.
2021-11-15 02:19:43 +00:00
$is_header = $cell [ 'header' ] ? ? TRUE ;
2014-04-23 10:53:03 +00:00
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' ];
2021-11-15 02:19:43 +00:00
$variables [ '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 ) {
2020-02-04 16:24:45 +00:00
if ( is_int ( $child_key ) || $child_key === '' || $child_key [ 0 ] !== '#' ) {
2012-11-16 13:05:26 +00:00
$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' ])) {
2020-02-03 12:36:42 +00:00
$variables [ 'attributes' ] = AttributeHelper :: mergeCollections ( $variables [ 'attributes' ], $variables [ $key ][ '#attributes' ]);
2013-06-12 15:57:44 +00:00
}
}
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' ])) {
Issue #3370946 by kunal.sachdev, lauriii, tim.plunkett, omkar.podey, alexpott, ckrina, smustgrave, larowlan, rkoller, hooroomoo, duadua: Page title should contextualize the local navigation
(cherry picked from commit ad606a8fb7eed1c59f5b28af8cc19e14cf6fb5ed)
2024-03-14 11:43:09 +00:00
$head_title = [];
// Marking the title as safe since it has had the tags stripped.
$head_title [ 'title' ] = Markup :: create ( trim ( strip_tags ( $variables [ 'page' ][ '#title' ])));
$maintenance_mode = defined ( 'MAINTENANCE_MODE' ) || \Drupal :: state () -> get ( 'system.maintenance_mode' );
$is_admin_route = ( bool ) \Drupal :: routeMatch () -> getRouteObject () ? -> getOption ( '_admin_route' );
if ( ! $maintenance_mode && $is_admin_route ) {
$base_route_title = \Drupal :: service ( 'base_route_title_resolver' ) -> getTitle ( \Drupal :: requestStack () -> getCurrentRequest (), \Drupal :: routeMatch () -> getRouteObject ());
if ( is_array ( $base_route_title )) {
$base_route_title = ( string ) \Drupal :: service ( 'renderer' ) -> render ( $base_route_title );
}
if ( $base_route_title ) {
// Marking the title as safe since it has had the tags stripped.
$base_route_title = Markup :: create ( trim ( strip_tags ( $base_route_title )));
// If the base route title is not the same as the current title, append it
// to the head title.
if (( string ) $base_route_title !== ( string ) $head_title [ 'title' ]) {
$head_title [ 'base_route_title' ] = $base_route_title ;
}
}
}
$head_title [ 'name' ] = $site_config -> get ( 'name' );
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
2023-03-01 13:34:25 +00:00
if (( $node = \Drupal :: routeMatch () -> getParameter ( 'node' )) || ( $node = \Drupal :: routeMatch () -> getParameter ( 'node_preview' ))) {
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
*
Issue #2941148 by quietone, bruno.bicudo, ravi.shankar, Sweetchuck, beatrizrodrigues, lucienchalom, VitaliyB98, WagnerMelo, sophiavs, ankitjain28may, daffie, longwave, Sutharsan, borisson_, cosmicdreams, heykarthikwithu, catch: Fix Drupal.Commenting.FunctionComment.MissingReturnType
2022-09-27 09:58:26 +00:00
* @ return array
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 ) {
2023-11-11 11:44:36 +00:00
$installer_active_task = NULL ;
if ( defined ( 'MAINTENANCE_MODE' ) && MAINTENANCE_MODE === 'install' && InstallerKernel :: installationAttempted ()) {
$installer_active_task = $GLOBALS [ 'install_state' ][ 'active_task' ];
}
2013-06-27 19:03:01 +00:00
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 ;
2023-11-11 11:44:36 +00:00
$variables [ 'site_version' ] = $installer_active_task ? 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 )) {
2020-02-03 12:36:42 +00:00
$variables [ 'attributes' ] = AttributeHelper :: mergeCollections ( $variables [ 'attributes' ], ( array ) $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
}
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 ];
2022-09-02 06:49:58 +00:00
// Modules can add field item attributes (to
2014-10-07 12:17:40 +00:00
// $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' => [
2023-03-09 09:53:11 +00:00
'#type' => 'html_tag' ,
'#tag' => 'h4' ,
'#value' => $element [ '#title' ],
'#attributes' => $header_attributes ,
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' ],
],
Issue #1038316 by tacituseu, vasike, heddn, Eyal Shalev, cchoe1, lauriii, siva01, perry.franken, sanfair, jan.stoeckler, anmolgoyal74, MRPRAVIN, scott.whittaker, dj1999, vytch, SpadXIII, GRO, samuel.seide, szato, Denisev, Munavijayalakshmi, ankithashetty, neclimdul, mayurjadhav, rgpublic, bartzaalberg, electrokate, Lal_, realityloop, ameymudras, linhnm, fabianfiorotto, Abhijith S, bleen, smustgrave, rogueturnip, alexpott: Allow for deletion of a single value of a multiple value field
2023-07-06 16:36:04 +00:00
[],
2017-03-04 01:20:24 +00:00
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' ]);
Issue #1038316 by tacituseu, vasike, heddn, Eyal Shalev, cchoe1, lauriii, siva01, perry.franken, sanfair, jan.stoeckler, anmolgoyal74, MRPRAVIN, scott.whittaker, dj1999, vytch, SpadXIII, GRO, samuel.seide, szato, Denisev, Munavijayalakshmi, ankithashetty, neclimdul, mayurjadhav, rgpublic, bartzaalberg, electrokate, Lal_, realityloop, ameymudras, linhnm, fabianfiorotto, Abhijith S, bleen, smustgrave, rogueturnip, alexpott: Allow for deletion of a single value of a multiple value field
2023-07-06 16:36:04 +00:00
// Render actions in a separate column.
$actions = [];
if ( isset ( $item [ '_actions' ])) {
$actions = $item [ '_actions' ];
unset ( $item [ '_actions' ]);
}
2017-03-04 01:20:24 +00:00
$cells = [
[ 'data' => '' , 'class' => [ 'field-multiple-drag' ]],
[ 'data' => $item ],
Issue #1038316 by tacituseu, vasike, heddn, Eyal Shalev, cchoe1, lauriii, siva01, perry.franken, sanfair, jan.stoeckler, anmolgoyal74, MRPRAVIN, scott.whittaker, dj1999, vytch, SpadXIII, GRO, samuel.seide, szato, Denisev, Munavijayalakshmi, ankithashetty, neclimdul, mayurjadhav, rgpublic, bartzaalberg, electrokate, Lal_, realityloop, ameymudras, linhnm, fabianfiorotto, Abhijith S, bleen, smustgrave, rogueturnip, alexpott: Allow for deletion of a single value of a multiple value field
2023-07-06 16:36:04 +00:00
[ 'data' => $actions ],
2017-03-04 01:20:24 +00:00
[ '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 .
2024-01-07 21:38:51 +00:00
* - #pagination_heading_level: An optional heading level for the pager.
2019-11-26 23:13:19 +00:00
* - #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' ];
2021-11-15 02:19:43 +00:00
$route_parameters = $variables [ 'pager' ][ '#route_parameters' ] ? ? [];
2019-11-26 23:13:19 +00:00
2021-05-20 20:47:18 +00:00
/** @var \Drupal\Core\Pager\PagerManagerInterface $pager_manager */
2019-11-26 23:13:19 +00:00
$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 ];
}
}
2023-06-02 07:25:42 +00:00
// 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 ;
2023-09-08 06:59:55 +00:00
$items [ 'pages' ][ $i ][ 'attributes' ] -> setAttribute ( 'aria-current' , 'page' );
2019-11-26 23:13:19 +00:00
}
}
2023-06-02 07:25:42 +00:00
// Add an ellipsis if there are further next pages.
if ( $i < $pager_max + 1 ) {
$variables [ 'ellipses' ][ 'next' ] = TRUE ;
}
2019-11-26 23:13:19 +00:00
// 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' );
2024-01-07 21:38:51 +00:00
$variables [ 'pagination_heading_level' ] = $variables [ 'pager' ][ '#pagination_heading_level' ] ? ? 'h4' ;
if ( ! preg_match ( '/^h[1-6]$/' , $variables [ 'pagination_heading_level' ])) {
$variables [ 'pagination_heading_level' ] = 'h4' ;
}
2019-11-26 23:13:19 +00:00
// 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' ;
}
2020-05-04 12:50:02 +00:00
/**
* Prepares variables for single local task link templates .
*
* Default template : menu - local - task . html . twig .
*
* @ param array $variables
* An associative array containing :
* - element : A render element containing :
* - #link: A menu link array with 'title', 'url', and (optionally)
* 'localized_options' keys .
* - #active: A boolean indicating whether the local task is active.
*/
function template_preprocess_menu_local_task ( & $variables ) {
$link = $variables [ 'element' ][ '#link' ];
$link += [
'localized_options' => [],
];
$link_text = $link [ 'title' ];
if ( ! empty ( $variables [ 'element' ][ '#active' ])) {
$variables [ 'is_active' ] = TRUE ;
}
$link [ 'localized_options' ][ 'set_active_class' ] = TRUE ;
$variables [ 'link' ] = [
'#type' => 'link' ,
'#title' => $link_text ,
'#url' => $link [ 'url' ],
'#options' => $link [ 'localized_options' ],
];
}
/**
* Prepares variables for single local action link templates .
*
* Default template : menu - local - action . html . twig .
*
* @ param array $variables
* An associative array containing :
* - element : A render element containing :
* - #link: A menu link array with 'title', 'url', and (optionally)
* 'localized_options' keys .
*/
function template_preprocess_menu_local_action ( & $variables ) {
$link = $variables [ 'element' ][ '#link' ];
$link += [
'localized_options' => [],
];
$link [ 'localized_options' ][ 'attributes' ][ 'class' ][] = 'button' ;
$link [ 'localized_options' ][ 'attributes' ][ 'class' ][] = 'button-action' ;
$link [ 'localized_options' ][ 'set_active_class' ] = TRUE ;
$variables [ 'link' ] = [
'#type' => 'link' ,
'#title' => $link [ 'title' ],
'#options' => $link [ 'localized_options' ],
'#url' => $link [ 'url' ],
];
}
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
],
'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
}