在submitForm()中,我希望重定向到控制器并传递表单值。表单值都是数组,顺便说一句。
这是submitForm。
public function submitForm(array &$form, FormStateInterface $form_state) {
// get values
$demo_values = $form_state->getValue('demo');
$data_set_value = $form_state->getValue('data_set');
$engineering_degrees1 = $form_state->getValue('engineering_degrees1');
$engineering_degrees2 = $form_state->getValue('engineering_degrees2');
$engineering_degrees3 = $form_state->getValue('engineering_degrees3');
$engineering_degrees4 = $form_state->getValue('engineering_degrees4');
$physical_science_degrees = $form_state->getValue('physical_science_degrees');
# set form data in url redirect
$params = ['demos' => $demo_values,
'data_set' => $data_set_value,
'engineering_degrees1' => $engineering_degrees1,
'engineering_degrees2' => $engineering_degrees2,
'engineering_degrees3' => $engineering_degrees3,
'engineering_degrees4' => $engineering_degrees4,
'physical_science_degrees' => $physical_science_degrees];
$form_state->setRedirect('stats_degrees.render_chart',$params);
}
}
这是我的路由YML文件。
stats_degrees.render_form:
path: '/statistics/stats-degrees'
defaults:
_title: 'Engineering and Physical Science Degrees Earned by Members of Underrepresented Groups'
_form: '\Drupal\stats_degrees\Form\StatsDegreesForm'
requirements:
_permission: 'access content'
stats_degrees.render_chart:
path: '/statistics/stats-degrees-chart/{demos}/{data_set}/{engineering_degrees1}/{engineering_degrees2}/{engineering_degrees3}/{engineering_degrees4}/{physical_science_degrees}'
defaults:
_controller: '\Drupal\stats_degrees\Controller\StatsDegreesController::stats_degrees_chart'
requirements:
_permission: 'access content'
这是我的Controller方法调用。
public function stats_degrees_chart($demos,$data_set,$engineering_degrees1,$engineering_degrees2,$engineering_degrees3,$engineering_degrees4,$physical_science_degrees) {
目前,在我提交表单后,它会抛出一个500错误。是否有更好的方法将参数传递给控制器?
发布于 2021-07-27 06:50:49
将参数传递给控制器的最佳实践是基于意见的,并取决于用例,因此我尝试介绍所有可能的方法。
通常,向控制器、查询字符串、POST数据和会话传递参数的方法有三种。可以序列化查询字符串的数组,但更容易的是POST或SESSION。
参见控制器中的如何获得$_员额和美元_获取参数。
如果使用会话值,则在控制器的末尾取消设置它们,因为不再需要的会话值不利于缓存。见如何销毁或取消会话?。
特别是对于表格,还有更多。如果表单的目的是将值存储在数据库中(永久地存储在实体中或临时存储在一个tempstore中),那么首先这样做,然后通过路由参数引用数据库项。
如果您不想存储数据,那么将数据直接发布到控制器是有意义的,因为您不能将post数据附加到提交重定向。
您不一定需要一个控制器,您可以重新生成窗体下面的图表或替换它。请参阅如何在提交表单后在同一页上显示结果?
发布于 2021-07-27 07:03:24
你可以使用私人的诱惑商店。参见例如http://karimboudjema.com/en/drupal/20190315/saving-temporary-values-form-private-tempstore-drupal-8
https://drupal.stackexchange.com/questions/304314
复制相似问题