如何在 SilverStripe 中使用模板中的参数调用函数


How to call a function with arguments from template in SilverStripe

假设我有以下函数:

function fruit ($request) {
    ...
    $response = array('apple' => '1dollars', 'mango' => '2dollars');
    return json_encode($response);
}

我想在我的模板中访问类似$response.apple的东西。

我已经尝试了以下方法,但这不起作用,因为我的页面上没有显示任何内容:

<% control response %>
    <h1>$response.apple<h2>;
<% end_control %>

如果我尝试从我的模板访问函数fruitfruit给我一个错误。 fruit(request)也给了我一个错误。

但是,如果我去水果,它返回我的数据绝对没问题:

["apple":"1dollar","mango":"2dollar"]

您需要以不同的方式做两件事:

    如果
  1. 希望数据数组在模板中可访问,则必须将数据数组包装在 ArrayData 或 ArrayList 对象中。
  2. 必须返回原始数组(在这种情况下,将自动呈现模板 ControllerName_actionName.ss)或显式返回呈现的模板。

所以更像是:

function fruit ($request) {
    ...
    return $this->customise(array(
        'response' => new ArrayData(array(
            'apple' => '1dollars', 
            'mango' => '2dollars'
        ));
    ))->renderWith(array('YourTemplate'));
}

请注意,"响应"的命名在那里是完全任意的。另一种可能的方法是使"响应"成为控制器上的一种方法(显然我会将其命名为不同的东西,为了清楚起见,我只是保留您的名称):

public function response() {
    return new ArrayData(array(
            'apple' => '1dollars', 
            'mango' => '2dollars'
        ));
}

在这种情况下,您可以在操作中返回以下内容:

return $this->renderWith(array('MyTemplate'));