сохранение фотографии или файла в symfony 1.4 действие

#php #symfony-1.4

#php #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() amp;amp; $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);
  

Это сохранит введенные данные за вычетом столбца фото..Однако, если я добавлю $this->form->save(); , это сохранит данные, включая поле photo, но фотография дублируется, есть идеи о том, как это решить?

введите описание изображения здесь

с помощью $this->form->save();

введите описание изображения здесь

возвращает значение null, если я удаляю $this->form->save();Кстати, у меня есть две таблицы для этого из, applicants и 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;
}
  

Ответ №1:

Когда вы используете form->save() , а затем вызываете createOrUpdateObject() , вы сохраняете свой объект в базе данных дважды, вот почему у вас есть дублирующаяся запись в таблице кандидатов.

«Волшебство», почему в первом случае вы получаете имя файла, а во втором нет, заключается в том, как Symfony обрабатывает загруженные файлы. Во втором случае вы считываете значения из формы, включая photo поле, но это поле на самом деле не имеет установленного значения (с этим полем связан файл, но это не его «значение»). При первом выполнении метода формы save Symfony обрабатывает загрузку файла (перемещает файл из временного расположения в загруженные файлы, изменяет имена и т. Д.) И в ответ задает значение вашего photo поля, предоставляя вам полный физический путь к файлу.

Вам действительно нужна createOrUpdateObject функция? Делает ли это что-нибудь еще, кроме простого сохранения форм? Если вам нужно изменить какие-либо дополнительные значения, вы всегда можете использовать функции жизненного цикла Doctrine: preSave , preInsert , postDelete , и т.д.

Комментарии:

1. Да, мне нужна функция createOrUpdateObject. Я хотел бы автоматически заполнить столбцы created_by и updated_by.

2. Вы можете добавить Timestampable поведение в свою таблицу, и Doctrine заполнит их для вас.

3. Спасибо Михал Трояновски. Я попробую ваше предложение.

Ответ №2:

После некоторого поиска в Google и попыток я, наконец, нашел решение своей проблемы.Путь к файлу успешно сохранен в mysql и на этот раз не дублируется.Вот мой отредактированный код в действии:

 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() amp;amp; $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
введите описание изображения здесь

и здесь, в моих шаблонах, возникает моя новая проблема..

 <?php echo $applicant->photo ?>
  

Вместо изображения отобразится имя файла (C:wampwwwian_loanswebuploads/photos85c4153ed074657c58db526e5f8349183cb08469.jpg )
и я попытался

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

и фотография никогда не появляется…Чего мне здесь не хватает?

Комментарии:

1. Во-первых, не стоит сохранять фотографию перед проверкой формы. Если форма недействительна, вы получите файл, сохраненный на вашем сервере. Это также проблема безопасности, поскольку вы позволяете людям загружать любые файлы на ваш сервер. Другая проблема заключается в том, что вы сохраняете физический путь к файлу, и вы должны сохранить только имя файла (или URL), поскольку это то, что вам нужно при отображении изображения. Вы должны изменить это значение в createOrUpdate функции.