【问题标题】:Silex: redirect onchange select button (using URL Generator)Silex:重定向 onchange 选择按钮(使用 URL 生成器)
【发布时间】:2017-10-01 17:34:45
【问题描述】:

我正在使用 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='' 做点什么。但我不知道如何继续。

更新

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

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

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

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

现在,当我将选择设置为开放式问题 (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 %}

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

【问题讨论】:

  • 我不确定我是否关注...当您说重定向时,您的意思是整页重新加载?或者你想要一个 AJAX 调用来动态地改变问题?你能详细说明你的用例吗?
  • 我已经更新了我的问题,希望对您有所帮助
  • 要进行重定向,您必须在 Javascript 中进行,因为这将是在浏览器上运行的客户端代码。但是你有重定向到哪里的问题。你基本上有2个选择。在您的控制器中生成 URL 并将其传递给您的模板,或者如果您使用的是 twig,您有 path/url functions。检查this answer,这可能对您的JS代码有所帮助。
  • 那么您能否回答我如何将生成的 URL 从控制器传递到 Onchange 的脚本(我不知道如何编写)?

标签: php forms symfony select silex


【解决方案1】:

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

【讨论】:

  • onclick 是否适用于选择框? (它不是单选按钮)
  • 附言。是的,我正在使用树枝
  • 我又更新了我的问题,我好像又做错了什么
  • 是的,onclic 事件处理程序也应该在选择框上工作(顺便说一句,几乎在任何 HTML 元素上)。如果您使用的是选择框,则应改用change event(我已更新代码)
  • 我又试了一次,但由于某种原因,仍然没有任何反应,甚至没有重新加载页面......另外:函数(e)中的e是做什么的?
猜你喜欢
  • 2015-06-26
  • 1970-01-01
  • 2022-01-13
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
相关资源
最近更新 更多