2014-10-02 142 views
0

这将是我创建的第一个自定义模块,并且有一些灰色头发用于将js函数渲染到drupal块模块中。Drupal块查看执行Javascript功能

因此,在php模式下,通过将以下代码粘贴到drupal中创建新块,该脚本工作得很好,并且呈现出来很好。

<!-- Include my.js --> 
 
    <script src="https://1.2.3.4/static/my.js"></script> 
 

 
    <!-- Decide where you want to put my --> 
 
    <div id="my_container" style="position: relative; width: 60em; height: 30em;"> 
 
     <div id="my"></div> 
 
    </div> 
 

 
    <!-- Call my.init() at some point after the page is done loading --> 
 
    <script> 
 
    window.onload = function() { 
 
     // Initialize my: 
 
     my.init({url: 'https://1.2.3.4/'}); 
 
    } 
 
    </script>

什么是现在这个加载到一个模块组件的最佳实践,是hook_init或hook_block_view或两者有史以来它,请给举例和说明。

很多预先感谢。

回答

0

我猜这是在Drupal 7

如果您需要快速上手...如何组织你的模块

例。我们称你的模块为“mymodule”。

[内MyModule的文件夹]

mymodule.info mymodule.module --js/ --inc/

把所有的JavaScript具体涉及您的模块中的“JS”文件夹 把所有的PHP文件,具体涉及到你的模块中的“INC”文件夹(短为包括)

1)使用hook_block_view()

//Within mymodule_block_view() 

//Put your content for the block 
$block['content']= '<div id="my_container" style="position: relative; width: 60em; height: 30em;"> 
       <div id="my"></div> 
      </div>'; 

//Later on 
return $block; 

完整的例子见https://api.drupal.org/api/drupal/modules%21block%21block.api.php/function/hook_block_view/7

我就拆了这一点到一个单独的文件,或者使用module_file_include()(见https://api.drupal.org/api/drupal/includes!module.inc/function/module_load_include/7),或在功能包,并调用该函数从内部mymodule_block_view()

2)在您的方框图

使用 drupal_add_js()
$module_path = drupal_get_path('module', 'mymodule'); //Get path of your module 
drupal_add_js($module_path.'/js/[your JS file]', 'file'); 

解释和举例这里添加JS:https://api.drupal.org/api/drupal/includes%21common.inc/function/drupal_add_js/7

请注意,刚才明明白白增加<script>$block['content']可以工作,但通过使用drupal_add_js(),您可以利用Drupal的缓存(以及各种缓存模块)来帮助加速您的网站。如果你只是使用<script>,你没有任何优势。

3)一般提示:学习jQuery,比纯JavaScript

drupal_add_js("jQuery(document).ready(my.init({url: 'https://1.2.3.4/'}));", 'inline'); 

部分例子更容易(你hook_block_view内):

$module_path = drupal_get_path('module', 'mymodule'); //Get path of your module 
drupal_add_js($module_path.'/js/[your JS file]', 'file'); 
$block['content']= '<div id="my_container" style="position: relative; width: 60em; height: 30em;"> 
        <div id="my"></div> 
       </div>'; 

drupal_add_js("jQuery(document).ready(my.init({url: 'https://1.2.3.4/'}));", 'inline'); 

正如我上面提到的,我将分离出的模块代码分成更小(更易管理)的文件。

举例来说。

inc/mymodule_menu.inc.php //hook_menu 
inc/mymodule_blocks.inc.php //hook_block_view 
inc/mymodule_firstblock.inc.php //Code for a block wrapped in a function, which hook_block_view calls 

希望这有助于

+0

忘了说了,如果它是一个外部JavaScript文件,它是好的,给drupal_add_js()的URL,使用“外部”选项。 – ConnectedSystems 2014-10-02 12:58:25

+0

谢谢你,这很有帮助。该模块现在功能正常,我用你的代码和它的工作很好,我完全没有使用你的“drupal_add-js”,我用它来调用我的js文件,就像这样“\t \t drupal_add_js(drupal_get_path('module','我')。'/js/myinit.js','文件'); “现在任何人都可以使用该模块,如果他们希望。 – BeNoZo 2014-10-06 21:53:07

0

我同意大多数还是给出了答案,但我想指出一个潜在的错误。

一旦启用块缓存,问题是在hook_block_view中使用drupal_add_js。

更具体地说,一旦块被缓存,你的js将不会被这个方法添加。

为了解决这个问题,您可以在您在hook_block_view中构建的可渲染数组中使用'#attached'。

退房https://api.drupal.org/comment/28929#comment-28929