有没有办法在 October CMS 中使用 GET 参数重定向?

Is there a way to Redirect with GET Parameters in October CMS?

我有一个具有 Ajax 处理程序的组件。在此处理程序结束时,我想将用户重定向到带有 GET 参数的页面。

示例:

在 Ajax 处理程序中,一些代码将 return 来自 REST API 的 ID。同一个处理程序也知道要重定向到的页面(可以在后端设置中设置)。 我试图在 October CMS Documentation 中找到一些东西。我发现的唯一东西是重定向 Class,它可以重定向到给定的页面,但我找不到设置 GET 查询参数的方法

<form id="sample-form" data-request-validate data-request="onOrder">
    <input type="hidden" name="sample" value="{{ sample.id }}" />
    <button type="submit">Get Sample</button>
</form>

AJAX 处理程序

public function onOrder() {
    $sample = Sample::findOrFail(input('sample'));
    // API Call returns ID $id
    return Redirect::to(Settings::get('redirectUrl')->with('id',$id);
}

我希望使用 GET 查询

将用户重定向到给定的 Url

有人知道如何进行这项工作吗?

我使用组件页面顶部的Input;服务。现在我认为最好使用尽可能少的 AJAX 。对于整页重定向,我推荐一个简单的 HTML 表单,但使用 TWIG 打开它。

所以我的故障排除技巧。使用 {{ form_open({request: __SELF__~"::onOrder", id: "sample-form"}) }} 创建您的表单;不要忘记结尾 {{ form_close() }}。这将生成一个非 ajax 表单,但对解决问题很有用。注意 __SELF__~"::onOrder",这是用于指定特定组件的处理程序。如果您有许多具有相同 onOrder 处理程序和一般良好做法的组件,这一点很重要。

现在你会注意到在 Component.php onOrder 处理程序中我有 //dd(Input::get('sample')) 当你取消注释这一行和 运行 你应该看到 $id 你想通过。如果正确,则将 die 和 dump 命令移到函数的下方。

检查是否检索到 $sample。你可以只使用 Sample::where('id', $id);我相信如果找不到,这将 return 为空,但如果找到,您可以使用 $sample->first(),因为 return 是一个集合。

构建重定向很容易 return Redirect::to(Settings::get('redirectUrl').'?id='.$id);。在这里,我在 url 的末尾连接了 '?id='.$id。包含 ->with() 只是意味着您正在闪烁一条消息,例如 `->with('success', 'Thank you for your order');您可以通过会话检索此消息。

如果您觉得必须使用 Ajax 并完整回答您的问题,我确实包含了 {{ form_ajax(__SELF__~"::onOrder", {id: "sample-form"}) }}。我确实测试了这个,虽然不是确切的场景,但一切都对我有用。

    <?php namespace Author\Plugin\Components;

    use Input;
    use Author\Plugin\Models\Sample;


    class Something extends \Cms\Classes\ComponentBase
    {
        public function componentDetails()
        {
            return [
                'name' => 'Somthing',
                'description' => 'Something'
            ];
        }
        public function onOrder() {
            //dd(Input::get('sample'));
            $id = Input::get('sample');
            $sample = Sample::where('id', $id);
            //dd($sample);
            // API Call returns ID $id
            if ($sample != null) {
            return Redirect::to(Settings::get('redirectUrl').'?id='.$id);
            }
        }
    }
    {{ form_ajax(__SELF__~"::onOrder", {id: "sample-form"}) }}
        <input type="hidden" name="sample" value="{{ sample.id }}" />
        <button type="submit">Get Sample</button>
    {{ form_close() }}

    {{ form_open({request: __SELF__~"::onOrder", id: "sample-form"}) }}
        <input type="hidden" name="sample" value="{{ sample.id }}" />
        <button type="submit">Get Sample</button>
    {{ form_close() }}