如何使用Angular.JS生成的表单通过AJAX将文件(和其他字段)上传到Symfony2?

时间:2015-03-11 09:16:00

标签: ajax angularjs symfony

我试图通过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);
}

0 个答案:

没有答案