SilverStripe 3.3 - 添加 CMS 字段作为 JavaScript 变量
SilverStripe 3.3 - Add CMS Fields as JavaScript variables
我正在为 SilverStripe 项目尝试一些不同的方法:我需要找到一种方法来获取 CMS 中的字段并将它们放入 JavaScript 变量中,以便在 JavaScript 文件中使用。
首先,我在 Page.php
中有一个 Header CMS 字段:
private static $db = array(
'Header' => 'HTMLText'
);
public function getCMSFields() {
$fields = parent::getCMSFields();
$fields->addFieldToTab('Root.Main', new HTMLEditorField('Header', 'Header'));
return $fields;
}
我想在 JavaScript 文件中引用该字段作为变量:
{
id: 'Text-Intro',
type: 'text',
rect: ['251px', '250px','641px','71px','auto', 'auto'],
text: [Header variable needs to go here],
align: "left",
font: ['Arial, Helvetica, sans-serif', 25, "rgba(0,0,0,1.00)", "500", "none", "normal"]
},
我尝试使用 Requirements::javascriptTemplate() 函数,但在 detail-page_edge.js
文件中无法识别该变量:
public function init() {
parent::init();
Requirements::javascriptTemplate('/themes/simple/javascript/detail-page_edge.js', array(
'Header' => $this->Header
));
}
一定是少了什么,或者这只是过时了?我以前从未在 SilverStripe 中尝试过这个。不过,考虑到这个项目的设置方式,我别无选择。
您可以使用 SilverStripe 模板语法进行简单的变量替换。所以你的 JS 文件应该是:
// ... plain JS code
text: '$Header',
// ... more JS code
请注意,您不能使用更复杂的模板语法,例如 <% loop … %>
或 <% if … %>
,因为 javascriptTemplate
只会进行变量替换。
如果您需要完整的模板功能,您可以将 .ss
模板文件渲染为字符串并使用 Requirements::customScript
输出。不过,我认为您永远不应该这样做……甚至通过 javascriptTemplate
处理 JS 文件似乎也不可行。我宁愿在你的常规标记中使用 HTML 数据属性(例如 .ss
模板)并以某种方式编写 JavaScript ,它会获取所需的属性并建立在标记。
另外:确保文件路径正确。而不是写绝对路径:
'/themes/simple/javascript/detail-page_edge.js'
我建议您使用以下内容:
$this->ThemeDir() . '/javascript/detail-page_edge.js'
我正在为 SilverStripe 项目尝试一些不同的方法:我需要找到一种方法来获取 CMS 中的字段并将它们放入 JavaScript 变量中,以便在 JavaScript 文件中使用。
首先,我在 Page.php
中有一个 Header CMS 字段:
private static $db = array(
'Header' => 'HTMLText'
);
public function getCMSFields() {
$fields = parent::getCMSFields();
$fields->addFieldToTab('Root.Main', new HTMLEditorField('Header', 'Header'));
return $fields;
}
我想在 JavaScript 文件中引用该字段作为变量:
{
id: 'Text-Intro',
type: 'text',
rect: ['251px', '250px','641px','71px','auto', 'auto'],
text: [Header variable needs to go here],
align: "left",
font: ['Arial, Helvetica, sans-serif', 25, "rgba(0,0,0,1.00)", "500", "none", "normal"]
},
我尝试使用 Requirements::javascriptTemplate() 函数,但在 detail-page_edge.js
文件中无法识别该变量:
public function init() {
parent::init();
Requirements::javascriptTemplate('/themes/simple/javascript/detail-page_edge.js', array(
'Header' => $this->Header
));
}
一定是少了什么,或者这只是过时了?我以前从未在 SilverStripe 中尝试过这个。不过,考虑到这个项目的设置方式,我别无选择。
您可以使用 SilverStripe 模板语法进行简单的变量替换。所以你的 JS 文件应该是:
// ... plain JS code
text: '$Header',
// ... more JS code
请注意,您不能使用更复杂的模板语法,例如 <% loop … %>
或 <% if … %>
,因为 javascriptTemplate
只会进行变量替换。
如果您需要完整的模板功能,您可以将 .ss
模板文件渲染为字符串并使用 Requirements::customScript
输出。不过,我认为您永远不应该这样做……甚至通过 javascriptTemplate
处理 JS 文件似乎也不可行。我宁愿在你的常规标记中使用 HTML 数据属性(例如 .ss
模板)并以某种方式编写 JavaScript ,它会获取所需的属性并建立在标记。
另外:确保文件路径正确。而不是写绝对路径:
'/themes/simple/javascript/detail-page_edge.js'
我建议您使用以下内容:
$this->ThemeDir() . '/javascript/detail-page_edge.js'