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 变量的最低限度框架。从这里开始,您应该详细说明并根据您的用例调整此代码。
我正在使用 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 变量的最低限度框架。从这里开始,您应该详细说明并根据您的用例调整此代码。