标签: drupal-hooks

Drupal:*.api.php中的hook_函数是否曾被调用过?

在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被调用.

这些功能是什么?它们是否曾被系统调用过?如果是的话,何时?如果没有,为什么他们在那里?

php drupal drupal-hooks drupal-modules

7
推荐指数
1
解决办法
1293
查看次数

在购物车中的同一个订单项上组合同类产品

我遇到了与此处概述的相同问题,但下面的解决方案不起作用.我确实启用了"商品选项".

我也用这个钩子来改变价格,

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一样,但它不起作用.

drupal drupal-7 drupal-hooks drupal-commerce

7
推荐指数
1
解决办法
360
查看次数

为页面创建模板

假设我有以下实现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 drupal-7 drupal-hooks

5
推荐指数
1
解决办法
2384
查看次数

什么将 Drupal Hook 与特定模块联系起来?

什么将 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 系统中是否有将特定钩子与特定模块联系起来的东西?或者是其他东西?

php drupal drupal-hooks drupal-modules

5
推荐指数
1
解决办法
1220
查看次数

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代码在做什么之前我不会让我前进.

php drupal drupal-hooks drupal-modules

4
推荐指数
1
解决办法
2683
查看次数

如果我已经拥有hook_mail,那么拥有hook_mail_alter有什么意义呢?

如果我已经拥有hook_mail,那么拥有hook_mail_alter有什么意义呢?

例如,我看到hook_mail_alter用于在我的邮件消息中添加页脚.但我可以hook_mail()用来添加它,而不是使用2个函数......我错过了什么?

也许调用其他函数添加页脚?

drupal drupal-6 drupal-hooks

4
推荐指数
1
解决办法
2532
查看次数

在Drupal 8中使用特定节点类型的预处理挂钩

我已成功使用预处理页面挂钩,例如:

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语句来分别处理每个类型.所以.......

最后的问题:我可以为整个内容类型定义一个钩子,如果是这样,我做错了什么?

drupal-templates drupal-hooks drupal-8

3
推荐指数
2
解决办法
9695
查看次数

hook_menu() - 一个意外的行为(更长的路径问题)

我正在通过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)

通过添加外卡,请帮助我解决我的错误?超过两张外卡是无效的吗?

drupal drupal-6 drupal-hooks drupal-modules

3
推荐指数
1
解决办法
369
查看次数

hook_load/hook_view未调用

我有一个模块,声明了四种节点类型.我的问题是,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 drupal-hooks drupal-modules

3
推荐指数
1
解决办法
2844
查看次数

Hook perm适用于多种内容类型

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 drupal-hooks drupal-permissions drupal-content-types

1
推荐指数
1
解决办法
1035
查看次数

Drupal 8添加javascript并使用自定义模块在钩子中传递数据

我正在使用Drupal 8构建自定义模块.该模块的一个要求是它根据配置设置设置javascript文件,模块用户在模块配置中设置.

需要添加到页面的javascript取决于配置设置.因此,我无法使用本文中提到的库添加它:向Drupal模块添加资源.

我首先用块实现它.我使用Twig模板将PHP中的配置变量传递给twig文件,在twig文件中,我有一个标签可以根据配置变量添加javascript.请参阅使用树枝模板.

这种方法的问题是用户需要在页面上添加块,并且该块上没有面向UI的元素.我也觉得很乱.

有没有更简洁的方法来添加我的javascript使用钩子并传递变量?我环顾四周,发现了hook_installhook_page_attachments.所以我可以添加Javascript,但不知道如何将任何php变量传递给它.

我是Drupal开发的新手.任何帮助都非常感谢.

TL; DR我需要找到一种方法来使用Drupal钩子添加Javascript并将一些PHP变量传递给它.

hook drupal drupal-hooks drupal-8 drupal-modules

1
推荐指数
1
解决办法
2525
查看次数

0
推荐指数
1
解决办法
91
查看次数