我开发了一个类似博客的存档功能(你知道,来自功能模块)。我想编辑 .module 文件,以便将视图模板(捆绑在功能中)自动加载到主题中。有没有办法做到这一点?
3 回答
在一般层面上:您应该认为“功能=模块”并将主题留给......主题!这并不意味着您不应该在您的功能中包含模板,而是您应该评估您构建的模板是否适合您的功能的一般用途,或者它是否特定于您当前使用的主题。如果是后一种情况,则不应将模板文件与该功能一起打包,而应将其与主题一起保留。想想视图模块是如何工作的,就明白我的意思了。
【可能你已经意识到了这一点,也考虑到了这点,那么就直接无视上面的吧。我之所以考虑写它是因为您的句子“我希望 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()来手动触发它。如果清空整个缓存太多,您应该深入查看视图模块,了解如何相对于单个视图刷新缓存。
希望这可以帮助!
尝试将此添加到您的功能 .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();
}
这是我声明存储在“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;
}
}
}
希望它可以帮助某人。