我试图通过AJAX调用将Angular.js生成的表单发送到Symfony控制器操作以便保存。在接收到一些JSON数据(包括条目ID)后,在ng-repeat中生成表单。代码如下所示。
<div ng-repeat="job in sc.careers">
<div>
<h2>{[{job.title}]}</h2>
<span ng-if="job.super">{[{job.super}]}</span>
<div>
<h4>Role</h4>
<span ng-bind-html="job.role"></span>
</div>
<div class="col-md-4">
<h4>Required Skills</h4>
<span ng-bind-html="job.skills"></span>
</div>
<div class="col-md-4">
<h4>Media</h4>
Some other content \ media
</div>
</div>
<hr/>
<div class="join-us">
<button ng-click="sc.joinUs[$index] = true" ng-hide="sc.joinUs[$index]">Apply for this position</button>
<div ng-show="sc.joinUs[$index]">
<h4>Join Us</h4>
<span>Some random text</span>
<form>
<input type="hidden" name="job_id" value="{[{job.id}]}" />
<label for="email">E-Mail</label>
<input type="email" id="email" name="email" />
<label for="motivation">Cover Letter & CV link</label>
<textarea id="motivation" name="motivation"></textarea>
<label for="resume">Upload your resume</label>
<input type="file" name="resume">
<button type="submit">Send your application</button>
</form>
</div>
</div>
</div>
*大多数类名已经过编辑,以使代码尽可能与问题相关
我还没有放置ng-click - &gt;提交指令。另外,我的Angular配置为使用&#34; {[{&#34;和&#34;}]}&#34;分隔符,以免干扰TWIG。
我在互联网上搜索了可能的答案,但它们都与Symfony生成的表格(包括验证令牌)有关。其他答案(例如this one)并没有完全描述事物的角度方面,或者没有描述发送整个表格。
最后,我不确定如何处理这个问题。如果它过于复杂,我甚至会决定不使用AJAX并直接提交给Symfony。 (实际上,我想要使用AJAX的唯一原因是让网站感觉更多&#34; snappy&#34;)。
在撰写本文时,我使用最新的稳定版本的PHP,Symfony和Angular.JS是值得的。
所以我设法通过使用Agular JS模块将数据发送回控制器,该模块允许在文件输入上使用ng-model并使用FormData,如下所示:
var formObject = new FormData;
formObject.append('email', self.careers[index].application.email);
formObject.append('motivation', self.careers[index].application.motivation);
formObject.append('resume', self.careers[index].application.file);
formObject.append('jobID', self.careers[index].id);
$http.post('/app_dev.php/jobs/apply', formObject, {
transformRequest: angular.identity,
headers: { 'Content-Type': undefined } // Allows angular to choose the proper Content-Type
})
现在唯一的问题是Symfony无法识别我的表单数据是否有效。控制器动作看起来像这样(暂时)。
public function applyAction(Request $request) {
$jobApplication = new JobApplications(); // This is the entity I use to store everything.
$form = $this->createFormBuilder($jobApplication)
->add('jobId')
->add('email')
->add('coverLetter')
->add('file')
->getForm();
$form->handleRequest($request);
$response = array (
'isValid' => $form->isValid(), // false
'isSubmitted' => $form->isSubmitted(), // false < that's why the form is invalid
'isErrors' => $form->getErrorsAsString() // empty array
);
if ($form->isValid()) { // is not valid so the following section is not complete
$em = $this->getDoctrine()->getManager();
$jobApplication->upload();
$em->persist($jobApplication);
$em->flush();
//return $this->redirect($this->generateUrl('idea_presentation_careers'));
}
return new JsonResponse($response);
}