0

我编写了一个 ModelAdmin 来管理我网站的 Imageslider。ModelAdmin 管理的一个数据对象是“SliderSettings”。在那里您可以设置滑块行为。

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

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

先感谢您

4

2 回答 2

2

我强烈建议不要编写文件,而是建议使用Requirements::customScript()

是的,如果你把它放在它不会被调用的地方(在 DataObject 中)那将是无用的 所以让我们把它放在有意义的地方,例如 Page_Controller->init(),
当然我们需要获取 SliderSettings 对象,这可以通过 SliderSettings::get()->First() 来完成,这给了你数据库中的第一个 SliderSettings 对象,如果你想得到一个特定的,你也可以通过 ID 得到它:SliderSettings::get ()->按ID(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>");
        }
    }
}

就是这样,现在你应该sliderSettings在javascript中有一个名为availiable的变量。这个变量是一个对象,
所以你可以像这样sliderSettings.SliderEffect访问sliderSettings['SliderEffect']
$(document).ready(function() {})

于 2013-10-15T12:47:47.977 回答
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
        );
    }
}

这将序列化当前的DataObject 并通过自定义脚本标记通过全局范围内SliderSettings的对象使其可供 Javascript 访问。sliderSettings

您的选项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>

于 2013-10-15T10:31:00.390 回答