使用dataobject的变量创建一个js文件 - Sivlerstripe 3.1

时间:2013-10-15 09:35:07

标签: javascript silverstripe

我写了一个ModelAdmin来管理我网站的Imageslider。 由ModelAdmin管理的一个Dataobject是“SliderSettings”。在那里你可以设置滑块行为。

在那里设置的变量应保存到js文件中并包含在模板中。 我知道如果使用控制器,可以使用变量创建内联js。但这不适用于Dataobjects并创建内联js,有没有办法用我的Dataobject来创建一个文件而不是内联js?

这是我的代码http://sspaste.com/paste/show/525d094569329

先谢谢你

2 个答案:

答案 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.SliderEffectsliderSettings['SliderEffect']
注意:变量将在您的JS文件之后,因此它不能直接在代码中使用,但您可以在$(document).ready(function() {})内访问它。