在我的symfony(v3.4)项目中,我需要将一些javascript变量从视图传递到包含表单的控制器:我使用Jquery和Ajax将变量发送到正确的路径,但是由于某些原因,我无法访问它来自我的控制器。
这是我的树枝视图中的脚本部分:
$(".month").click(function() {
var click = $(this);
var month = click.val();
var year = $("#years").val();
var url = "{{ path('av_platform_saisie') }}";
$.ajax(url,
{
type: 'POST',
data: { 'month': month,
'year': year
},
success: function (data) {
alert('OK');
},
error : function(jqXHR, textStatus, errorThrown){}
});
});
还有我的控制器:
public function saisieAction(Request $request)
{
$user = $this->getUser();
$thisyear = date("Y");
$em = $this->getDoctrine()->getManager();
// Create the form
$form = $this->get('form.factory')->createBuilder(FormType::class)
->add('ndf', CollectionType::class, array(
'entry_type' => NoteDeFraisType::class,
'label' => false,
'allow_add' => true,
'allow_delete' => true,
))
->getForm();
// if the form has been submited
if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
if($request->isXMLHttpRequest()){
$month = $request->get('month');
$year = $request->get('year');
$sub_date = $month .'/' .$year;
}
$notesDeFrais = $form['ndf']->getData();
foreach ($notesDeFrais as $ndf) {
$ndf->setUser($user);
$ndf->setMonth($sub_date);
$em->persist($ndf);
}
$em->flush();
}
return $this->render('AvPlatformBundle:Platform:saisie.html.twig',
array(
'year' => $thisyear, 'form' => $form->createView()
));
}
奇怪的是:我试图从一个新的Twig视图发送我的js变量,该视图不是由我的控制器渲染的,并且在完全相同的代码下也能正常工作,所以也许这是正常现象吗?
编辑:
我进行了一些调试,实际上if($request->isXMLHttpRequest())
中的代码未执行
答案 0 :(得分:3)
您没有使用正确的语法来获取参数,这应该是这样:
if($request->isXMLHttpRequest()) {
$month=$request->request->get('month');
$year=$request->request->get('year');
$sub_date=$month .'/' .$year;
}
如果您想获得GET
参数,就是这样:
$request->query->get('get_param');
答案 1 :(得分:0)
您必须正确获取请求的内容。
根据您的Symfony版本,其他答案可能不起作用,您可能必须使用:
$ request-> getContent();
有权访问包含您的数据的关联数组。
(编辑以添加我的评论):如果它不起作用,那么,我脑中唯一的另一件事就是您的IDE自动导入将在控制器中导入错误的“ Request”类?确保使用->使用Symfony \ Component \ HttpFoundation \ Request;
答案 2 :(得分:0)
将您的网址放在传递给ajax的数组中,如下所示:
<html>
<head>
<script
crossorigin
src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.1/react.js"
></script>
<script
crossorigin
src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.1/react-dom.js"
></script>
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.min.js"></script>
</head>
<body>
<div id="app"></div>
<script type="text/babel">
class Foo extends React.Component {
state = {
loading: false
};
componentDidMount() {
console.log("mounted");
}
leave() {
this.setState({
loading: true
});
setTimeout(() => {
this.setupReset();
window.location.href = "https://github.com";
}, 2000);
}
setupReset() {
let interval = setInterval(() => {
if (
!!window.performance &&
window.performance.navigation.type === 2
) {
clearInterval(interval);
console.log('reseting');
this.setState({ loading: false });
}
},500);
}
render() {
return this.state.loading ? (
<div>loading...</div>
) : (
<button onClick={this.leave.bind(this)}>leave</button>
);
}
}
ReactDOM.render(<Foo />, document.getElementById("app"));
</script>
</body>
</html>
答案 3 :(得分:-1)
您是否检查了表单的源代码,action
属性的值是什么?我认为您不能像您那样为该AJAX请求添加js url
。理想情况下,安装FosJsRoutingBundle,然后修改为:
url: Routing.generate('av_platform_saisie')