Silex:重定向onchange选择按钮(使用URL Generator)

时间:2017-05-03 18:33:46

标签: php forms symfony select silex

我正在使用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问题上,当我在选择框中选择OP时,如何将其重定向到OP页面?我认为应该用onchange=''完成一些事情。但我不知道如何继续。

更新

当我更改选择按钮时,我想重定向到新网址:

假设我在多选页面上:

  

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

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

现在,当我将select设置为Open Question(OP)时,我需要重定向到此URL:

  

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

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

更新2

我现在在我的twig模板中得到了以下代码。但是,当我更改选择框时,它仍然无法执行:

{% 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 %}

网址完美无缺。我已经测试了,所以这部分确实有效。我的错误在哪里?

1 个答案:

答案 0 :(得分:0)

要将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变量。从这里开始,您应该详细说明并根据您的用例调整此代码。