Silex:重定向 onchange select 按钮(使用 URL 生成器)

Silex: redirect onchange select button (using URL Generator)

我正在使用 Silex 框架。我正在创建一个系统,用户可以在其中回答我的问题。我已经设置了以下路线:

$routes->match('/assignment/register/{type}/{count}', function (Request $request, $type, $count) use ($app) {

现在,可以有两种类型的问题:选择题或开放式。路由的类型是 MC 或 OP。因此,将生成如下表单:

if($type == 'MC'){

        $builder->add('type', ChoiceType::class, array(
            'label' => 'Type',
            'required' => 'required',
            'attr' => array('class' => 'select-field', 'autocomplete' => 'off', 'onchange' => 'this.form.submit()'),
            'label_attr' => array('class' => 'label'),
            'choices' => array('Multiple Choice' => 'MC', 'Open' => 'OP'),
            'expanded' => false,
            'multiple' => false,
        ));

    }
    if($type == 'OP'){

        $builder->add('type', ChoiceType::class, array(
            'label' => 'Type',
            'required' => 'required',
            'attr' => array('class' => 'select-field', 'autocomplete' => 'off', 'onchange' => 'this.form.submit()'),
            'label_attr' => array('class' => 'label'),
            'choices' => array('Multiple Choice' => 'MC', 'Open' => 'OP'),
            'expanded' => false,
            'multiple' => false,
            'data' => 'OP',
        ));

    }

但是,当我选择其他类型的问题时,我希望被重定向。所以假设我在 MC 问题上,当我在 select 框中输入 select OP 时,如何将我重定向到 OP 页面?我认为应该用 onchange='' 做点什么。但是我不知道如何继续。

更新

当我更改 select 按钮时,我希望被重定向到新的 URL:

假设我在多项选择页面上:

Www.MyWebsite.nl/Escape/public/assignment/create/MC/3

MC代表多项选择,3告诉脚本我可以给出3个答案。

现在,当我将 select 设置为开放式问题 (OP) 时,我需要重定向到此 URL:

Www.MyWebsite.nl/Escape/public/assignment/create/OP/1

这必须使用 Silex/Symfony 中的 URL 生成器来完成,因为我不能只给出完整的 URL

更新 2

现在我的 Twig 模板中有以下代码。但是,当我更改 select 框时它仍然没有执行:

{% block scripts %}
    {% if urlTo is defined %}
          <script>
          var urlTo = {{ urlTo }}; 
          document.getElementById('form_type').onchange(function()
          {
            alert(urlTo);
            window.location.href(urlTo);
          });
        </script>
    {% endif %}
{% endblock %}

URL给出的很完美。我已经测试过了,所以那部分确实有效。我的错误在哪里?

要将 URL 从控制器传递到您的脚本,您只需附加一个模板变量,如下所示:

<?php
// somwhere in your route definition file
$app->match(
    '/assignment/register/{type}/{count}', 
    function (Request $request, $type, $count) use ($app) {
      // do your magic here
      $urlTo = $app['url_generator']->generate('path-name', [$path=>$options]);

      // here you pass the $urlTo variable to your template
      // by passing a 2n argument to the render method
      // https://silex.sensiolabs.org/doc/2.0/providers/twig.html#usage
      return $app['twig']->render('your-template-name-here.twig', ["urlTo" => $urlTo]);
    }
);

然后在你定义 JS 的模板中(假设你使用的是 Twig,你没有指定你使用的是哪个模板):

<?php
// this is your template file
<script>
  var urlTo = {{ urlTo }}; // here comes the injection from the PHP value to JS
  document.getElementById('the-id-of-the-select-element').onchange = function(e) {
    // probably you want to check the selected value here and then...
    window.location.replace(urlTo);
  };
</script>

这是展示如何将 urlTo PHP 变量传递到您的模板并将其转换为 JS 变量的最低限度框架。从这里开始,您应该详细说明并根据您的用例调整此代码。