我写了一个ModelAdmin来管理我网站的Imageslider。 由ModelAdmin管理的一个Dataobject是“SliderSettings”。在那里你可以设置滑块行为。
在那里设置的变量应保存到js文件中并包含在模板中。 我知道如果使用控制器,可以使用变量创建内联js。但这不适用于Dataobjects并创建内联js,有没有办法用我的Dataobject来创建一个文件而不是内联js?
这是我的代码http://sspaste.com/paste/show/525d094569329
先谢谢你
答案 0 :(得分:2)
public function init()
{
parent::init();
$sliderSettings = DataObject::get_by_id('SliderSettings ', $this->ID);
if ( $sliderSettings )
{
$sliderSettings = Convert::raw2json( $sliderSettings->toMap() );
Requirements::customScript(<<<JS
var sliderSettings = $sliderSettings;
JS
);
}
}
这将序列化当前的SliderSettings
DataObject,并通过自定义脚本标记通过全局范围内的sliderSettings
对象使其可供Javascript访问。
使用javascriptTemplate
的选项可能有效,但如果没有看到JS文件,则很难调试。
修改强>
考虑到很难控制要求的顺序,如@Zauberfisch提到的那样。解决方案可以是在控制器中使用自定义功能,如下所示:
public function SliderSettings()
{
$sliderSettings = DataObject::get_by_id('SliderSettings ', $this->ID);
if ( $sliderSettings )
{
return Convert::raw2json( $sliderSettings->toMap() );
}
else{
return '{}';
}
}
这样可以在模板中提供$SliderSettings
变量,您可以在任何地方使用该变量。例如,要将JSON包含在HEAD中(可能不是最好的......),或者只是在其他任何脚本之前<script>var sliderSetting = $SliderSettings;</script>
答案 1 :(得分:2)
我强烈建议反对撰写文件,而我建议使用Requirements::customScript()
是的,如果你把它放在没有被调用的地方(在DataObject中)那将是无用的
所以我们把它放在有意义的地方,例如Page_Controller-&gt; init(),
当然我们需要获取SliderSettings对象,这可以通过SliderSettings :: get() - &gt; First()完成,这为你提供了数据库中的第一个SliderSettings对象,如果你想得到一个特定的,你也可以通过ID获取它:SliderSettings :: get() - &gt; byID(42)
class Page_Controller extends ContentController {
public function init() {
parent::init();
$sliderSettings = SliderSettings::get()->First();
if ($sliderSettings) {
$sliderSettings = Convert::array2json(array(
'SliderEffect' => $sliderSettings->SliderEffect,
'SliderCaptions' => $sliderSettings->SliderCaptions,
'SliderRandom' => $sliderSettings->SliderRandom,
'SliderTicker' => $sliderSettings->SliderTicker,
'SliderPager' => $sliderSettings->SliderPager,
'SliderControls' => $sliderSettings->SliderControls,
'SliderStart' => $sliderSettings->SliderStart,
'SliderAdaptive' => $sliderSettings->SliderAdaptive,
'SliderSpeed' => $sliderSettings->SliderSpeed,
'SliderPause' => $sliderSettings->SliderPause,
));
Requirements::customScript("var sliderSettings = $sliderSettings;");
// Requirements::customScript will put it at the bottom of the HTML, if you need it above the other JS files, you can put it into the header with the following workaround/hack: (if you use this, remove the Requirements::customScript line)
// Requirements::insertHeadTags("<script type='text/javascript'>var sliderSettings = $sliderSettings;</script>");
}
}
}
就是这样,现在你应该在javascript中有一个名为sliderSettings
的变量
此变量是一个对象,因此您可以像这样访问它:sliderSettings.SliderEffect
或sliderSettings['SliderEffect']
注意:变量将在您的JS文件之后,因此它不能直接在代码中使用,但您可以在$(document).ready(function() {})
内访问它。