2014-06-17 28 views
0

有困難就節省了我的database.In我的行動保存在symfony的1.4動作的照片或文件

if($r->isMethod('post')) { 
     $this->form->bind($r->getParameter('applicants'), $r->getFiles('applicants'));   
     //$this->form->bind($r->getParameter('applicants')); 
     $this->familyForm->bind($r->getParameter('applicant_family_info')); 
     if($this->form->isValid() && $this->familyForm->isValid()) { 
      $values = $this->form->getValues(); 
      $familyValues = $this->familyForm->getValues(); 
      $applicantId = Doctrine_Core::getTable('Applicants')->createOrUpdateObject($values, $familyValues, $this->getUser()->getUsername()); 
      $this->getUser()->setFlash('good', 'New applicant record created successfully!'); 
      $this->redirect('loans/new_applicant_loan?applicant_id='.$applicantId); 

這將節省輸入數據減去照片column..However,如果我的文件或相片IM添加$ this-> form-> save(); ,這將保存包括照片字段的數據,但照片是重複的,關於如何解決這個問題的任何想法?

enter image description here

與這 - $>形式 - >保存();

enter image description here

,則返回null我刪除$這個 - >形式 - >保存();順便說一句,我有,申請人該兩個表,並applicant_family_info

這ApplicantsTable.class。 PHP

public function createOrUpdateObject($values, $infoValues, $currentLoggedInUser, $obj = null) { 
    $isUpdate = true; 
    if(empty($obj)) { 
     $obj = new Applicants(); 
     $isUpdate = false; 
    } 

    $db = $this->getConnection(); 
    $db->beginTransaction(); 
    foreach($values as $k=>$v) { 
     $obj->$k = $v; 
    } 
    if(!$isUpdate) { 
     $obj->created_by = $currentLoggedInUser; 
     $obj->date_created = date('Y-m-d H:i:s'); 
    } else { 
     $obj->updated_by = $currentLoggedInUser; 
     $obj->date_updated = date('Y-m-d H:i:s'); 
    } 

    $obj->save(); 
    if(!$isUpdate) { 
     $applicantId = $db->lastInsertId(); 
    } else { 
     $applicantId = $obj->id; 
    } 

    if(!$isUpdate) { 
     $info = new ApplicantFamilyInfo(); 
    } else { 
     $info = $obj->ApplicantFamilyInfo; 
    } 
    foreach($infoValues as $k=>$v) { 
     $info->$k = $v; 
    } 

    $info->applicant_id = $applicantId; 
    $info->save(); 

    $db->commit(); 

    return $applicantId; 
} 

回答

0

當您使用form->save(),然後調用createOrUpdateObject()要保存你的對象到數據庫兩次,這就是爲什麼你在你的申請表中的重複條目。

'魔術'爲什麼在第一種情況下你得到的文件名和第二個不是在Symfony處理上傳文件的方式。在第二種情況下,您從表單中讀取值,包括photo字段,但該字段實際上沒有設置值(有一個與該字段關聯的文件,但不是它的「值」)。當您第一次執行表單的save方法Symfony處理文件上傳(將文件從臨時位置移動到上傳文件,更改名稱等),並作爲迴應,設置photo字段的值,爲您提供文件的完整物理路徑。

你真的需要createOrUpdateObject功能嗎?除了保存表單之外,還有其他的工作嗎?如果您需要修改任何其他值,你可以隨時使用學說的生命週期功能:preSavepreInsertpostDelete

+0

是的,我需要createOrUpdateObject函數。我想自動填充created_by和updated_by列。 – rai

+0

您可以將'Timestampable'行爲添加到您的表格中,Doctrine會爲您填充它們。 –

+0

謝謝Michal Trojanowski.I會嘗試你的建議。 – rai

0

一些google搜索後,並嘗試,我終於找到了成功保存在我的problem.The文件路徑的解決方案MySQL和不重複這time.Here是我在行動編輯代碼:

if($r->isMethod('post')) { 
     $this->form->bind($r->getParameter('applicants'), $r->getFiles('applicants')); 
     $photo = $this->form->getValue('photo'); 
     $photo->save();  
     $this->familyForm->bind($r->getParameter('applicant_family_info')); 
     if($this->form->isValid() && $this->familyForm->isValid()) { 
      $values = $this->form->getValues(); 
      //$this->form->save(); 
      //$values = $this->form->getValues('photo'); 
      //$photo->save(); 
      //$filename = 'photo'.sha1($photo->getOriginalName()); 
      //$extension = $photo->getExtension($photo->getOriginalExtension()); 
      //$photo->save(sfConfig::get('sf_upload_dir'));// . $filename . $extension); 
      //$photo->save(sfConfig::get('sf_upload_dir') . '/'.$photo . date('Ym'));// . '/' . $filename . $extension); 

      //$photo->save(sfConfig::get('sf_upload_dir').'/photos/'.$photo); 
      $familyValues = $this->familyForm->getValues(); 
      $applicantId = Doctrine_Core::getTable('Applicants')->createOrUpdateObject($values, $familyValues, $this->getUser()->getUsername()); 
      $this->getUser()->setFlash('good', 'New applicant record created successfully!'); 
      $this->redirect('loans/new_applicant_loan?applicant_id='.$applicantId); 
     } 
    } 
} 

,這裏是mysql的 enter image description here

,並在這裏,在我的模板來我的新的問題..

<?php echo $applicant->photo ?> 

將呈現文件名,而不是圖像(C:\ WAMP \ WWW \ ian_loans \網絡\上傳/照片\ 85c4153ed074657c58db526e5f8349183cb08469.jpg) 我試圖

<td width="129" rowspan="5"><img src="/uploads/photos/<?php echo($applicant->photo)?>" width="129" height="129" /></td> 

和照片從未露面。 ..我在這裏錯過了什麼?

+0

首先,在驗證表單之前保存照片並不是一個好主意。如果表單無效,則最終將保存在服務器上的文件。這也是一個安全問題,因爲您可以讓任何類型的文件上傳到您的服務器。其他問題是您保存文件的物理路徑,您應該只保存文件名(或URL),因爲這是您在顯示圖像時需要的。你應該在'createOrUpdate'函數中改變這個值。 –