3

我正在使用 SilverStripe 3.0 CMS,我需要在 CMS 中包含 Google Map。

我正在按照这个步骤,除了有点旧,官方文档在当前版本的 SilverStripe 中使用相同的方法(至少它似乎是当前版本的文档)。

问题出在这部分代码中:

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

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

this.observeMethod is not a function

当在 SilverStripe CMS 中打开页面编辑器时,有人可以给我一个提示,以便调用 javascript 函数吗?

4

3 回答 3

6

您提到的 'Behaviour.register' 调用已被明确弃用,并且在核心代码中不再可用,因此文档需要在此处进行更新。

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

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

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

在此脚本中,删除Behaviour.register...块,并将initialize函数移到 document.ready之外(或简单地删除 document.ready 部分),因此initialize全局可用(您可以考虑重命名它)。

然后,在里面添加以下内容getCMSFields

$fields->addFieldToTab('Root.Content', new LiteralField('js', '<script>initialize();</script>'));

这将确保initialize每次在 cms 中呈现页面的“编辑视图”时调用该函数。

hth

于 2012-08-17T10:49:29.160 回答
3

正如本所说,

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

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

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

整个“在需要时包含它”这件事显示了 CMS 等领域的一些弱点,其中 Ajax 用于加载应用程序的大块,这可能需要包含更多的 CSS 和 JavaScript。在这个阶段,唯一的解决方法是确保您可能需要的所有内容都包含在第一个页面加载中。

一种想法是提及应该包含在 Ajax 响应的标头中的 CSS 和 JavaScript,以便客户端可以在完成 Ajax 请求时加载这些脚本和样式表。这可以非常干净地编码,但为了获得最佳结果,我们希望通过我们自己的更改来扩展prototype.js 到他们的Ajax 系统,以便每个脚本都对此提供一致的支持。

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

于 2014-08-28T01:19:37.137 回答
0
LeftAndMain::require_javascript('mysite/javascript/initGoogleMaps.js') 

would work much better

于 2013-01-09T00:14:55.163 回答