【问题标题】:CTools Include sometimes doesn't workCTools 包含有时不起作用
【发布时间】:2017-05-13 20:38:01
【问题描述】:

因此,使用 drupal 包含函数进行下拉是可行的,但在某些页面上,脚本不包含在内,并且在任何地方都不会抛出错误。这发生在 hook_block_view 中。在实际页面上,Drupal.behaviors.CToolsDropdown 在它不起作用的页面上丢失。但没有说明原因。

ctools_include('dropdown.theme');
...
$block['content'] = array(
      '#markup' => theme_ctools_dropdown($vars),
);

【问题讨论】:

    标签: php drupal drupal-7 drupal-ctools


    【解决方案1】:

    ctools_include() 加载了dropdown.theme.inc 文件,我们知道因为否则调用theme_ctools_dropdown() 会由于调用未定义函数而导致致命错误。

    theme_ctools_dropdown() 本身无条件添加所需的dropdown.jsdropdown.css 文件。

    所以我相信您的代码永远不会在这些页面上被调用(即不会显示该块)。为了证明这一点,请在您的 hook_block_view() 中的某处输入 drupal_set_message('Hello world');,看看会发生什么。

    如果您看到该消息,请在您的代码中搜索 hook_js_alter(),也许某处的某个逻辑会删除这些页面上的 dropdown.js

    更新: 清除缓存后,块内调用的drupal_add_js() 将不包含在内。所以你需要使用#attached 属性来包含 JS 和 CSS 文件:

    ctools_include('dropdown.theme');
    // ...
    $block['content'] = array(
      '#markup' => theme_ctools_dropdown($vars),
      '#attached' => array(
        'css' => array(
          drupal_get_path('module', 'ctools') . '/css/dropdown.css',
        ),
        'js' => array(
          drupal_get_path('module', 'ctools') . '/js/dropdown.js',
        ),
      ),
    );
    

    【讨论】:

    • 刚试过这个。有趣的是,它出现在某些页面上,但在其他页面上仍然没有出现,下拉菜单始终显示,但由于没有 js,因此停留在打开状态。也没有 hook_js_alter
    • 所以更奇怪的行为,它在刷新所有缓存后第一次工作,然后每次都没有加载消息,并且下拉列表被破坏。
    • 嘿,我完全忘记了块缓存和 css/js 包含。修改后的答案应该可以解决您的问题。
    • 是的,这绝对是block_info中设置的缓存!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2012-06-20
    相关资源
    最近更新 更多