在Drupal 7中,每个核心模块都有一个*.api.php文件,其中*是模块的名称.例如
modules/node/node.api.php
modules/path/path.api.php
Run Code Online (Sandbox Code Playgroud)
这些文件是为了什么?它们包含以函数开头的函数hook_,以及(我认为)模块调用的钩子的名称.例如
modules/system/system.api
Run Code Online (Sandbox Code Playgroud)
具有
function hook_entity_view($entity, $type, $view_mode, $langcode) {
$entity->content['my_additional_field'] = array(
'#markup' => $additional_field,
'#weight' => 10,
'#theme' => 'mymodule_my_additional_field',
);
}
Run Code Online (Sandbox Code Playgroud)
entity_view系统调用了一个钩子,您可以在自己的模块中实现,但是(它不会出现)hook_entity_view被调用.
这些功能是什么?它们是否曾被系统调用过?如果是的话,何时?如果没有,为什么他们在那里?
我遇到了与此处概述的相同问题,但下面的解决方案不起作用.我确实启用了"商品选项".
我也用这个钩子来改变价格,
function mectronic_get_amount_qty($price, $length) {
//print '<pre>P ' . print_r($price, 1) . '</pre>';
//print '<pre>L ' . print_r($length, 1) . '</pre>';
if ($length >= 1 && $length <= 5) return $price;
elseif ($length >= 6 && $length <= 10) return $price * (1 - 0.166666667);
elseif ($length > 10) return $price * (1 - 0.285714286);
}
Run Code Online (Sandbox Code Playgroud)
我试过了
$entity->commerce_pricing_attributes[$set_id['set_id']][$field_name] = $price;
Run Code Online (Sandbox Code Playgroud)
与#4一样,但它不起作用.
假设我有以下实现hook_menu():
function example_menu(){
$items = array();
$items['admin/recent-completions'] = array(
'title' => 'Recent Completions (Last 100)',
'page callback' => 'example_recent',
'access callback' => user_access('Administer content'),
'type' => MENU_NORMAL_ITEM,
'weight' => -50
);
return $items;
}
Run Code Online (Sandbox Code Playgroud)
如何为页面回调创建模板而不是返回字符串?
什么将 Drupal Hook 与特定模块联系起来?
在 Drupal 7 中,每个核心模块都有一个“api”文件
$ ls modules/*/*.api.php
modules/aggregator/aggregator.api.php modules/openid/openid.api.php
modules/block/block.api.php modules/overlay/overlay.api.php
modules/comment/comment.api.php modules/path/path.api.php
modules/contextual/contextual.api.php modules/rdf/rdf.api.php
modules/dashboard/dashboard.api.php modules/search/search.api.php
modules/field/field.api.php modules/shortcut/shortcut.api.php
modules/field_ui/field_ui.api.php modules/simpletest/simpletest.api.php
modules/file/file.api.php modules/system/system.api.php
modules/filter/filter.api.php modules/system/theme.api.php
modules/help/help.api.php modules/taxonomy/taxonomy.api.php
modules/image/image.api.php modules/trigger/trigger.api.php
modules/locale/locale.api.php modules/update/update.api.php
modules/menu/menu.api.php modules/user/user.api.php
modules/node/node.api.php
Run Code Online (Sandbox Code Playgroud)
这些文件中的每一个都包含一个从不 (?) 调用的函数,但记录了其他模块(包括第 3 方)可以实现的钩子的存在。
File: modules/path/path.api.php
function hook_path_delete($path) {
db_delete('mytable')
->condition('pid', $path['pid'])
->execute();
}
Run Code Online (Sandbox Code Playgroud)
我的问题:是什么将特定钩子与特定模块联系起来?为什么path_delete钩子包含在path.api.php文件中?为什么entity_view钩子包含在system.api.php文件中?这只是任意的,事后组织,还是 Drupal 系统中是否有将特定钩子与特定模块联系起来的东西?或者是其他东西?
在Drupal 7(和Drupal 6?)系统中,什么"开始"钩子调用过程,或"顶级"钩子调用位于何处?
正如我目前了解Drupal模块系统,任何模块都能够为另一个模块创建一个钩子来实现.这意味着Drupal的大部分执行都是为其他模块实现钩子的模块,这反过来又为其他模块提供了钩子来实现.
我不清楚的是,是否有一个初始的顶级钩子在引导程序中调用以启动此过程,或者是否有几个非模块调用启动钩子调用过程,或其他什么(道歉)这是模糊和新的,但就像我说我不明白)
我查看了这个_drupal_bootstrap_full功能,最后有一个很有希望
module_invoke_all('init');
Run Code Online (Sandbox Code Playgroud)
但是,我对该modules/文件夹的搜索只显示了一个"init"钩子函数,这似乎不是一个启动点
system/system.api.php
1737:function hook_init() {
function hook_init() {
drupal_add_css(drupal_get_path('module', 'book') . '/book.css');
}
Run Code Online (Sandbox Code Playgroud)
所以,这对我说模块系统之外的东西踢掉了这一切.这是发生在一个地方,还是多个地方.这些地方在哪里?
我目前不是一个沉重的Drupal用户.我所有这一切的最终目标是孤立地理解Drupal的模块系统,这样我就可以调查并理解Drupal如何使用它的模块构建大多数人认为是Drupal的应用程序.欢迎任何/所有解释,但我试图从架构的角度理解事物.我知道你不需要这些知识来使用Drupal,但是我的大脑已经坏了,在我知道基本的PHP代码在做什么之前我不会让我前进.
如果我已经拥有hook_mail,那么拥有hook_mail_alter有什么意义呢?
例如,我看到hook_mail_alter用于在我的邮件消息中添加页脚.但我可以hook_mail()用来添加它,而不是使用2个函数......我错过了什么?
也许在调用其他函数后添加页脚?
我已成功使用预处理页面挂钩,例如:
function mytheme_preprocess_page__node_front(&$variables) {
...
}
Run Code Online (Sandbox Code Playgroud)
和
function mytheme_preprocess_page__node_12(&$variables) {
...
}
Run Code Online (Sandbox Code Playgroud)
它与分别名为page - front.html.twig和page - 12.html.twig的自定义模板相关联.
我正在尝试为名为Video的内容类型实现相同的挂钩和模板配对.我的理解是,我的示例是针对特定页面的自定义模板,而我的目标是整个内容类型的自定义模板,但我得到了一个名为node的自定义模板 - video.html.twig可用作所有视频页面的模板.但是,当我尝试根据此模板名称编写一个钩子时:
function mytheme_preprocess_node__video(&$variables) {
...
}
Run Code Online (Sandbox Code Playgroud)
这不起作用.我认为我要么不能定义这样的钩子,要么我只是错误地命名它.我找到了一些与此相关的线程,例如这似乎意味着我需要为所有节点定义一个钩子,然后编写一个if语句来分别处理每个类型.所以.......
最后的问题:我可以为整个内容类型定义一个钩子,如果是这样,我做错了什么?
我正在通过hook_menu初始化一些项目(Drupal 6)
...
$items['webtv/block/%/playlist/edit/%'] = array(
...
'page arguments' => array('webtv_playlist_form', 2, 5),
...
);
$items['webtv/block/%/playlist/edit/%/filter/new'] = array(
...
'page arguments' => array('webtv_playlist_param_form', 2, 5),
...
);
$items['webtv/block/%/playlist/edit/%/filter/%'] = array(
...
'page arguments' => array('webtv_playlist_param_form', 2, 5, 7),
...
);
return $items;
Run Code Online (Sandbox Code Playgroud)
第一个条目是父条目,工作正常.以下两个是子条目.最后两个菜单条目仍然无效,并重定向到父页面视图.我通过从路径定义中删除第一个外卡"%/"标记进行了一些小修改来修复它.
手段:
$items['webtv/block/%/playlist/edit/%/filter/%']
Run Code Online (Sandbox Code Playgroud)
至
$items['webtv/block/playlist/edit/%/filter/%']
Run Code Online (Sandbox Code Playgroud)
和
$items['webtv/block/%/playlist/edit/%/filter/new']
Run Code Online (Sandbox Code Playgroud)
至
$items['webtv/block/playlist/edit/%/filter/new']
Run Code Online (Sandbox Code Playgroud)
通过添加外卡,请帮助我解决我的错误?超过两张外卡是无效的吗?
我有一个模块,声明了四种节点类型.我的问题是,hook_load,hook_view永远不会被调用.我使用drupal_set_message来查明是否正在调用某个钩子.我发现了hook_load,hook_view不是.只是为了给你清楚的图片,这是我的hook_load结构
这里有一个更新
function mymodule_node_info(){
return array(
'nodetype1' => array(
'name' => t('nodetype1'),
'module' => 'mymodule_nodetype1',
'description' => t('....'),
'has_title' => TRUE,
'title_label' => t('Title'),
'has_body' => TRUE,
'body_label' => t('Body'),
),
'nodetype2' => array(
......
'module' => 'mymodule_nodetype2',
......
),
'nodetype3' => array(
......
'module' => 'mymodule_nodetype3',
......
),
'nodetype4' => array(
......
'module' => 'mymodule_nodetype4',
.......
),
);
}
function mymodule_nodetype1_load($node){
$result = db_query('SELECT * from {nodetype1table} WHERE vid = %d'
$node->vid
);
drupal_set_message("hook_load is provoked.","status");
return db_fetch_object($result);
} …Run Code Online (Sandbox Code Playgroud) Drupal 6.x
我有这个模块管理四种不同的内容类型.就此而言,如何为同一模块中的每个内容定义权限?这甚至可能吗?我无法弄清楚如何为每个内容类型定义权限cuz hook_perm必须使用模块名称命名,并且它没有任何参数(如hook_access $ node)来返回内容类型的权限.这是我想做的 -
function mymodule_perm()
{
if(content1)
return array(
'create content1 node',
'edit content1 nodes',
'delete content1 nodes',
);
if(content2)
return array(
'create content2 node',
'edit content2 nodes',
'delete content2 nodes',
);
if(content3)
return array(
'create content3 node',
'edit content3 nodes',
'delete content3 nodes',
);
.......
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将受到高度赞赏.
我正在使用Drupal 8构建自定义模块.该模块的一个要求是它根据配置设置设置javascript文件,模块用户在模块配置中设置.
需要添加到页面的javascript取决于配置设置.因此,我无法使用本文中提到的库添加它:向Drupal模块添加资源.
我首先用块实现它.我使用Twig模板将PHP中的配置变量传递给twig文件,在twig文件中,我有一个标签可以根据配置变量添加javascript.请参阅使用树枝模板.
这种方法的问题是用户需要在页面上添加块,并且该块上没有面向UI的元素.我也觉得很乱.
有没有更简洁的方法来添加我的javascript使用钩子并传递变量?我环顾四周,发现了hook_install和hook_page_attachments.所以我可以添加Javascript,但不知道如何将任何php变量传递给它.
我是Drupal开发的新手.任何帮助都非常感谢.
TL; DR我需要找到一种方法来使用Drupal钩子添加Javascript并将一些PHP变量传递给它.
我问,因为它对于一个真名问题很重要,它让我想到如何避免这种冲突.