1

我开发了一个类似博客的存档功能(你知道,来自功能模块)。我想编辑 .module 文件,以便将视图模板(捆绑在功能中)自动加载到主题中。有没有办法做到这一点?

4

3 回答 3

1

在一般层面上:您应该认为“功能=模块”并将主题留给......主题!这并不意味着您不应该在您的功能中包含模板,而是您应该评估您构建的模板是否适合您的功能的一般用途,或者它是否特定于您当前使用的主题。如果是后一种情况,则不应将模板文件与该功能一起打包,而应将其与主题一起保留。想想视图模块是如何工作的,就明白我的意思了。

【可能你已经意识到了这一点,也考虑到了这点,那么就直接无视上面的吧。我之所以考虑写它是因为您的句子“我希望 tpl.php 实际上可用于该功能以使用它(就像它位于活动主题文件夹中一样)”让我感到惊讶,因为通用模板并不存在于主题文件夹,但在他们的模块一中,而且视图已经提供了一个“通用”模板。]

也就是说,您通常告诉drupal 使用给定模板的方式是通过hook_theme()在您的模块中实现。在这种情况下 - 虽然 - 假设您将覆盖由您应该实现的视图定义的模板hook_theme_registry_alter()

有人实际上已经这样做了。以下是链接页面的代码片段:

function MYMODULE_theme_registry_alter(&$theme_registry) {
  $my_path = drupal_get_path('module', 'MYMODULE');
  $hooks = array('node');  // you can do this to any number of template theme hooks
  // insert our module
  foreach ($hooks as $h) {
    _MYMODULE_insert_after_first_element($theme_registry[$h]['theme paths'], $my_path);
  }
}

function _MYMODULE_insert_after_first_element(&$a, $element) {
  $first_element = array_shift($a);
  array_unshift($a, $first_element, $element);
}

当然,您将不得不为您的视图而不是节点更改主题注册表(原始示例指的是 CCK 类型)。

与在 views_ui 中使用模板一样,我不确定在安装功能时功能模块是否已经清空了主题缓存(在这种情况下,您应该可以继续使用)。如果没有,您可以通过从安装文件中调用cache_clear_all()来手动触发它。如果清空整个缓存太多,您应该深入查看视图模块,了解如何相对于单个视图刷新缓存。

希望这可以帮助!

于 2009-12-08T14:40:16.657 回答
1

尝试将此添加到您的功能 .module 文件中

/**
 * Implementation of hook_theme_registry_alter().
 */
function MYMODULE_theme_registry_alter(&$theme_registry) {
  $theme_registry['theme paths']['views'] = drupal_get_path('module', 'MYMODULE');
}

在 .install 文件上使用这个

/**
 * Implementation of hook_enable().
 */
function MYMODULE_enable() {
  drupal_rebuild_theme_registry();
}
于 2010-01-19T23:43:57.513 回答
0

这是我声明存储在“custom_module”的“模板”文件夹中的视图模板的片段:

/**
 * Implements hook_theme_registry_alter().
 */
function custom_module_theme_registry_alter(&$theme_registry) {
  $extension   = '.tpl.php';
  $module_path = drupal_get_path('module', 'custom_module');
  $files       = file_scan_directory($module_path . '/templates', '/' . preg_quote($extension) . '$/');

  foreach ($files as $file) {
    $template = drupal_basename($file->filename, $extension);
    $theme    = str_replace('-', '_', $template);
    list($base_theme, $specific) = explode('__', $theme, 2);

    // Don't override base theme.
    if (!empty($specific) && isset($theme_registry[$base_theme])) {
      $theme_info = array(
        'template'   => $template,
        'path'       => drupal_dirname($file->uri),
        'variables'  => $theme_registry[$base_theme]['variables'],
        'base hook'  => $base_theme,
        // Other available value: theme_engine.
        'type'       => 'module',
        'theme path' => $module_path,
      );

      $theme_registry[$theme] = $theme_info;
    }
  }
}

希望它可以帮助某人。

于 2015-01-27T10:26:26.657 回答