如何在Silverstripe CMS中使用javascript?

时间:2012-08-16 19:31:44

标签: javascript silverstripe

我使用的是SilverStripe 3.0 CMS,我需要在CMS中加入Google地图。

我跟随this steps,除了它有点旧,official documentation在当前版本的SilverStripe中使用相同的方法(至少它似乎是当前版本文档)。

问题出在代码的这一部分:

Behaviour.register({ 
    "#Form_EditForm" : { 
        initialize : function() { 
            this.observeMethod("PageLoaded", this.adminPageHandler); 
            this.adminPageHandler(); 
        }, 
        adminPageHandler : function() { 
            initialize(); 
        } 
    } 
}); 

首先,没有定义行为。我需要手动包含框架内的behaviour.js文件。但现在,我得到一个类型错误:

this.observeMethod is not a function

在SilverStripe CMS中打开页面编辑器时,有人可以给我一些关于如何调用javascript函数的提示吗?

3 个答案:

答案 0 :(得分:6)

你提到的'Behaviour.register'调用肯定已弃用,核心代码中不再提供,因此文档需要更新。

不幸的是,我找不到有记录的方法来替换这种行为,但是现在根据您提到的第一手论坛帖子中的方法,以下内容应该对您有用:

找到此处添加的'initGoogleMaps.js'脚本:

function getCMSFields() { 
Requirements::javascript('mysite/javascript/initGoogleMaps.js');  
...

在此脚本中,删除Behaviour.register...块,然后将initialize函数移到文档.ready(或者只是删除document.ready部分),这样{{ 1}}是全局可用的(您可以考虑重命名)。

然后,在initialize

中添加以下内容
getCMSFields

这将确保每次在cms中呈现页面的“编辑视图”时调用$fields->addFieldToTab('Root.Content', new LiteralField('js', '<script>initialize();</script>')); 函数。

HTH

答案 1 :(得分:3)

正如ben所说,

LeftAndMain::require_javascript('mysite/javascript/initGoogleMaps.js') 

比“在需要时包含它”更可靠。为什么? 由于Silverstripe使用Ajax,因此最好在第一次加载时加载任何javascript或css,以便在ajax驱动的环境中转到CMS内的不同模型管理区域时它们已准备就绪。在开始时不加载会导致不一致,并且当您不加载该管理区域时,将不会加载您的js,css文件。

来自文档:http://doc.silverstripe.org/framework/en/reference/requirementshttp://api.silverstripe.org/3.0/class-LeftAndMain.html

  

整体“在你需要它时包括它”的东西显示出一些弱点   诸如CMS之类的区域,其中Ajax用于加载大块的   应用程序,可能需要更多的CSS和JavaScript   包括在内。 在此阶段,唯一的解决方法是确保这一点   您可能需要的所有内容都包含在首页加载中。

     

一个想法是提及应包含的CSS和JavaScript   在Ajax响应的标头中,以便客户端可以加载   完成Ajax请求后的那些脚本和样式表。   这可以很干净地编码,但为了获得最佳结果,我们想要   使用我们自己对Ajax系统的更改来扩展prototype.js,以便   每个脚本都对此持续支持。

顺便说一句,这行的理想位置是自定义模块中的_config.php或mysite,具体取决于您的需求。

答案 2 :(得分:0)

LeftAndMain::require_javascript('mysite/javascript/initGoogleMaps.js') 

会更好用