| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 | <?php/** * @file * Variable API module. Extended API. *//** * Build generic variable information */function variable_build_info($type, $options) {  variable_module_include();  switch ($type) {    case 'variable':      return variable_build_list_info($options);    case 'group':    case 'type':      $info = variable_invoke_all('variable_' . $type . '_info');      drupal_alter('variable_' . $type . '_info', $info);      return $info;  }}/** * Build variable information */function variable_build_list_info($options) {  $variables = array();  foreach (module_implements('variable_info') as $module) {    $result = call_user_func($module . '_variable_info', $options);    if (isset($result) && is_array($result)) {      foreach ($result as $name => $variable) {        // Support name => title declarations        $variable = is_array($variable) ? $variable : array('title' => $variable);        $variable += array('name' => $name, 'module' => $module);        // Check variable name for multiple values        $multiple = NULL;        if (preg_match('/\[(\w+)\]/', $name, $matches)) {          $multiple = $matches[1];          $variable += array('type' => 'multiple');        }        $variable += array('group' => 'default', 'type' => 'default');        $variables[$name] = $variable + variable_get_type($variable['type']);        // Add this at the end so it doesn't override type properties        if (!empty($multiple)) {          $variables[$name] += array('multiple' => $multiple);        }      }    }  }  // Last chance for modules to alter variable info.  drupal_alter('variable_info', $variables, $options);  return $variables;}/** * Build multiple variables */function variable_build_multiple($variable, $options) {  // Invoke variable callbacks  if (!empty($variable['multiple callback'])) {    $variable['multiple'] = variable_callback($variable['multiple callback'], $variable, $options);  }  if (isset($variable['multiple'])) {    if (!is_array($variable['multiple'])) {      $variable['multiple'] = variable_option_list($variable['multiple'], $variable, $options);    }    $variable += array('children' => array(), 'repeat' => array());    // Build children variables with the name => value array    foreach ($variable['multiple'] as $key => $title) {      $name = preg_replace('/\[\w+\]/', $key, $variable['name']);      // Be careful to respect previously set properties, add but do not override.      $child = isset($variable['children'][$name]) ? $variable['children'][$name] : array();      $child += $variable['repeat'];      $child += array(        'name' => $name, 'index' => $key, 'title' => $title,        'type' => 'default', 'parent' => $variable['name'], 'module' => $variable['module'],      );      // Set default value from parent      if (isset($variable['default']) && is_array($variable['default']) && isset($variable['default'][$key])) {        $child += array('default' => $variable['default'][$key]);      }      $child += variable_get_type($child['type']);      $variable['children'][$name] = $child;    }  }  return $variable;}/** * Build variable with options */function variable_build_options($variable, $options) {  $variable = variable_build_variable($variable, $options);  if (isset($variable['options callback'])) {    $variable['options'] = variable_callback($variable['options callback'], $variable, $options);  }  if (!empty($variable['options']) && !is_array($variable['options'])) {    $variable['options'] = variable_option_list($variable['options'], $variable, $options);  }  return $variable;}/** * Build single variable * * Some variables may spawn into multiple ones */function variable_build_variable($variable, $options = array()) {  if (empty($variable['built'])) {    variable_include($variable);    // Mark as built so we don't build it again    $variable['built'] = TRUE;    $options = _variable_options($options);    $variable = _variable_variable($variable, $options);    // If the variable has a build callback, go for it    if (isset($variable['build callback'])) {      $variable = variable_callback($variable['build callback'], $variable, $options);    }  }  return $variable;}/** * Invoke variable callback * * @param $callback *   Function name to invoke or array with module and funcion in this order * @param $variable *   Array of variable information. * @param $options *   Options to pass to the callback * @param $module *   Optional module to include its '*.variable.inc' file if the function not found */function variable_callback($callback, $variable, $options = array()) {  if (is_array($callback)) {    list($module, $function) = $callback;  }  else {    $function = $callback;  }  if (!function_exists($function)) {    if (isset($module)) {      variable_module_include($module);    }    else {      variable_include($variable);    }  }  return call_user_func($function, $variable, $options);}/** * List variables for a group */function variable_list_group($group) {  $list = array();  foreach (variable_get_info() as $name => $variable) {    if ($variable['group'] == $group) {      $list[$name] = $variable;    }  }  return $list;}/** * List variables for a module */function variable_list_module($module) {  $list = array();  foreach (variable_get_info() as $name => $variable) {    if ($variable['module'] == $module) {      $list[$name] = $variable;    }  }  return $list;}/** * Fetch options for variable */function variable_option_list($type, $variable, $options) {  $cache = &drupal_static(__FUNCTION__);  if (isset($cache[$type])) {    return $cache[$type];  }  elseif ($info = variable_get_type($type)) {    if (isset($info['options callback'])) {      $info['options'] = variable_callback(array($info['module'], $info['options callback']), $variable, $options);    }    if (!empty($info['cache'])) {      $cache[$type] = $info['options'];    }    return $info['options'];  }  else {    return array();  }}/** * General function to include variable definitions for all modules */function variable_module_include($modules = NULL) {  static $core_modules = array('locale', 'forum', 'menu', 'node', 'system', 'taxonomy', 'translation', 'user');  static $included = array();  $modules = $modules ? (is_array($modules) ? $modules : array($modules)) : $core_modules;  foreach ($modules as $module) {    if (!isset($included[$module])) {      if (module_exists($module)) {        if (in_array($module, $core_modules)) {          $included[$module] = module_load_include('variable.inc', 'variable', 'includes/' . $module);        }        else {          $included[$module] = module_load_include('variable.inc', $module);        }      }    }  }}/** * Disable variables for module * * Store module variables so we can delete them if uninstalled */function variable_module_disable($module) {}/** * Disable variables for module * * Store module variables so we can delete them if uninstalled */function variable_module_enable($module) {  if ($variables = variable_list_module($module)) {    $list = variable_get('variable_module_list', array());    $list[$module] = variable_children($variables);    variable_set('variable_module_list', $list);  }}/** * Uninstall variables for module * * This will be called from variable_modules_uninstalled(), no need to implement it directly. */function variable_module_uninstall($module) {  $list = variable_get('variable_module_list', array());  if (isset($list[$module])) {    // This is a plain list of variables so we can use raw delete.    array_map('variable_delete', $list[$module]);    unset($list[$module]);    variable_set('variable_module_list', $list);  }}/** * Get value for multiple variable */function variable_multiple_get_value($variable, $options = array()) {  $variable = variable_build($variable, $options);  $values = array();  foreach ($variable['children'] as $child) {    $values[$child['index']] = variable_get_value($child, $options);  }  return $values;}/** * Get defaults for multiple variable */function variable_multiple_get_default($variable, $options = array()) {  $variable = variable_build($variable, $options);  $values = array();  foreach ($variable['children'] as $child) {    $values[$child['index']] = variable_get_default($child, $options);  }  return $values;}
 |