2002-01-13 13:18:48 +00:00
< ? php
2004-07-22 16:06:54 +00:00
/**
* @ file
* API for loading and interacting with Drupal modules .
*/
2007-05-25 12:46:46 +00:00
/**
2012-08-31 15:56:36 +00:00
* Loads a module include file .
2009-07-28 19:06:16 +00:00
*
2009-07-01 17:34:13 +00:00
* Examples :
* @ code
2009-07-10 04:58:08 +00:00
* // Load node.admin.inc from the node module.
2009-07-01 17:34:13 +00:00
* module_load_include ( 'inc' , 'node' , 'node.admin' );
2009-07-10 04:58:08 +00:00
* // Load content_types.inc from the node module.
2009-07-28 19:06:16 +00:00
* module_load_include ( 'inc' , 'node' , 'content_types' );
2009-07-01 17:34:13 +00:00
* @ endcode
2007-05-25 12:46:46 +00:00
*
2010-01-28 13:56:25 +00:00
* Do not use this function to load an install file , use module_load_install ()
* instead . Do not use this function in a global context since it requires
* Drupal to be fully bootstrapped , use require_once DRUPAL_ROOT . '/path/file'
2009-07-10 04:58:08 +00:00
* instead .
*
2007-05-25 12:46:46 +00:00
* @ param $type
* The include file ' s type ( file extension ) .
* @ param $module
* The module to which the include file belongs .
* @ param $name
2010-11-27 19:12:56 +00:00
* ( optional ) The base file name ( without the $type extension ) . If omitted ,
* $module is used ; i . e . , resulting in " $module . $type " by default .
2010-11-21 10:19:48 +00:00
*
Issue #697946 by voleger, pguillard, pillarsdotnet, andypost, alansaviolobo, alexpott, vaibhavjain, MerryHamster, sja112, kim.pepper, shaktik, ravi.shankar, Pooja Ganjage, daffie, Mile23, legolasbo, joelpittet, almaudoh, xjm, Berdir, scor: Properly deprecate module_load_include() and move it into \Drupal::moduleHandler() service
2022-01-06 10:01:52 +00:00
* @ return string | false
2010-11-21 10:19:48 +00:00
* The name of the included file , if successful ; FALSE otherwise .
2013-01-21 19:21:34 +00:00
*
Issue #697946 by voleger, pguillard, pillarsdotnet, andypost, alansaviolobo, alexpott, vaibhavjain, MerryHamster, sja112, kim.pepper, shaktik, ravi.shankar, Pooja Ganjage, daffie, Mile23, legolasbo, joelpittet, almaudoh, xjm, Berdir, scor: Properly deprecate module_load_include() and move it into \Drupal::moduleHandler() service
2022-01-06 10:01:52 +00:00
* @ deprecated in drupal : 9.4 . 0 and is removed from drupal : 11.0 . 0.
* Use \Drupal :: moduleHandler () -> loadInclude ( $module , $type , $name = NULL ) .
* Note that including code from uninstalled extensions is no longer
* supported .
*
* @ see https :// www . drupal . org / node / 2948698
2007-05-25 12:46:46 +00:00
*/
function module_load_include ( $type , $module , $name = NULL ) {
Issue #697946 by voleger, pguillard, pillarsdotnet, andypost, alansaviolobo, alexpott, vaibhavjain, MerryHamster, sja112, kim.pepper, shaktik, ravi.shankar, Pooja Ganjage, daffie, Mile23, legolasbo, joelpittet, almaudoh, xjm, Berdir, scor: Properly deprecate module_load_include() and move it into \Drupal::moduleHandler() service
2022-01-06 10:01:52 +00:00
@ trigger_error ( " module_load_include() is deprecated in drupal:9.4.0 and is removed from drupal:11.0.0. Instead, you should use \ Drupal::moduleHandler()->loadInclude(). Note that including code from uninstalled extensions is no longer supported. See https://www.drupal.org/project/drupal/issues/697946 " , E_USER_DEPRECATED );
2010-11-27 19:12:56 +00:00
if ( ! isset ( $name )) {
2007-05-25 12:46:46 +00:00
$name = $module ;
}
Issue #2347783 by kim.pepper, andypost, almaudoh, gumanist, aleevas, rodrigoaguilera, Berdir, saurabh-2k17, Spokje, dhirendra.mishra, alexpott, paulocs, izus, Wim Leers, KapilV, naveenvalecha, anmolgoyal74, subson, yo30, harsha012, mrinalini9, daffie, voleger, dww, fietserwin, tim.plunkett, joachim, larowlan: Deprecate drupal_get_path() and drupal_get_filename() and replace with ExtensionList::getPath() and ExtensionList::getPathname()
2021-07-15 10:20:33 +00:00
if ( \Drupal :: hasService ( 'extension.list.module' )) {
/** @var \Drupal\Core\Extension\ModuleExtensionList $module_list */
$module_list = \Drupal :: service ( 'extension.list.module' );
$file = DRUPAL_ROOT . '/' . $module_list -> getPath ( $module ) . " / $name . $type " ;
2008-09-20 20:22:25 +00:00
if ( is_file ( $file )) {
require_once $file ;
return $file ;
}
2007-05-25 12:46:46 +00:00
}
2008-09-20 20:22:25 +00:00
return FALSE ;
2007-05-25 12:46:46 +00:00
}
2012-10-09 20:32:40 +00:00
/**
* Sets weight of a particular module .
*
* The weight of uninstalled modules cannot be changed .
*
* @ param string $module
* The name of the module ( without the . module extension ) .
* @ param int $weight
* An integer representing the weight of the module .
*/
function module_set_weight ( $module , $weight ) {
2015-01-16 10:43:35 +00:00
$extension_config = \Drupal :: configFactory () -> getEditable ( 'core.extension' );
2014-04-02 07:05:28 +00:00
if ( $extension_config -> get ( " module. $module " ) !== NULL ) {
2015-05-05 10:47:16 +00:00
// Pre-cast the $weight to an integer so that we can save this without using
// schema. This is a performance improvement for module installation.
2014-04-02 07:05:28 +00:00
$extension_config
2015-05-05 10:47:16 +00:00
-> set ( " module. $module " , ( int ) $weight )
2014-04-02 07:05:28 +00:00
-> set ( 'module' , module_config_sort ( $extension_config -> get ( 'module' )))
2015-05-05 10:47:16 +00:00
-> save ( TRUE );
2013-01-21 19:21:34 +00:00
// Prepare the new module list, sorted by weight, including filenames.
2016-07-27 17:09:51 +00:00
// @see \Drupal\Core\Extension\ModuleInstaller::install()
2013-09-16 03:58:06 +00:00
$module_handler = \Drupal :: moduleHandler ();
2013-01-21 19:21:34 +00:00
$current_module_filenames = $module_handler -> getModuleList ();
$current_modules = array_fill_keys ( array_keys ( $current_module_filenames ), 0 );
2014-04-02 07:05:28 +00:00
$current_modules = module_config_sort ( array_merge ( $current_modules , $extension_config -> get ( 'module' )));
2017-03-04 01:20:24 +00:00
$module_filenames = [];
2013-01-21 19:21:34 +00:00
foreach ( $current_modules as $name => $weight ) {
$module_filenames [ $name ] = $current_module_filenames [ $name ];
}
// Update the module list in the extension handler.
$module_handler -> setModuleList ( $module_filenames );
2012-10-09 20:32:40 +00:00
return ;
}
}
/**
* Sorts the configured list of enabled modules .
*
* The list of enabled modules is expected to be ordered by weight and name .
* The list is always sorted on write to avoid the overhead on read .
*
* @ param array $data
* An array of module configuration data .
*
* @ return array
* An array of module configuration data sorted by weight and name .
*/
function module_config_sort ( $data ) {
// PHP array sorting functions such as uasort() do not work with both keys and
// values at the same time, so we achieve weight and name sorting by computing
// strings with both information concatenated (weight first, name second) and
// use that as a regular string sort reference list via array_multisort(),
// compound of "[sign-as-integer][padded-integer-weight][name]"; e.g., given
// two modules and weights (spaces added for clarity):
// - Block with weight -5: 0 0000000000000000005 block
// - Node with weight 0: 1 0000000000000000000 node
2017-03-04 01:20:24 +00:00
$sort = [];
2012-10-09 20:32:40 +00:00
foreach ( $data as $name => $weight ) {
// Prefix negative weights with 0, positive weights with 1.
// +/- signs cannot be used, since + (ASCII 43) is before - (ASCII 45).
$prefix = ( int ) ( $weight >= 0 );
// The maximum weight is PHP_INT_MAX, so pad all weights to 19 digits.
$sort [] = $prefix . sprintf ( '%019d' , abs ( $weight )) . $name ;
}
array_multisort ( $sort , SORT_STRING , $data );
return $data ;
}