2013-10-23 18 views
6

Wie füge ich ein Bild in Symfony2 aus dem Formular zu einer Datenbank hinzu. Ich möchte ein Logo als Bildfeld erstellen und Projektbild in einer Datenbank aus dem Formular speichern. Wie mache ich das?Hinzufügen von Bild in Symfony 2 von Symfony Form?

Hier ist meine Form:

<?php 

namespace Projects\ProjectsBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class ProjectsType extends AbstractType 
{ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('name') 
     ->add('description') 
     ->add('priority','choice', array(
'choices' => array('high' => 'high', 'low' => 'low', 'medium' => 'medium'))) 
     ->add('logo') 
     ->add('startedAt','datetime',array('label' => false,'data'=>new \DateTime(),'attr'=>array('style'=>'display:none;'))) 
     ->add('completedOn','datetime',array('label' => false,'data'=>new \DateTime(),'attr'=>array('style'=>'display:none;'))) 
     ->add('createdDatetime','datetime',array('label' => false,'data'=>new \DateTime(),'attr'=>array('style'=>'display:none;'))) 
     ->add('updatedDatetime','datetime',array('label' => false,'data'=>new \DateTime(),'attr'=>array('style'=>'display:none;'))) 
    ; 
} 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Projects\ProjectsBundle\Entity\Projects' 
    )); 
    } 

    public function getName() 
    { 
    return 'projects_projectsbundle_projectstype'; 
    } 
} 

und hier ist mein Controller:

public function createAction(Request $request) 
{ 
    $user = $this->get('security.context')->getToken()->getUser(); 
    $userId = $user->getId(); 
    $entity = new Projects(); 
    $form = $this->createForm(new ProjectsType(), $entity); 
    $form->bind($request); 
    $entity->setCreatedBy($userId); 
    $entity->setUpdatedBy($userId); 
    $entity->setCompletedBy($userId); 

    if ($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($entity); 
     $em->flush(); 
    $_SESSION['projectid'] =$entity->getId(); 
    if($request->isXmlHttpRequest()) { 
     $response = new Response(); 
     $output = array('success' => true, 'description' => $entity->getdescription(), 'id' => $entity->getId(), 'name' => $entity->getname(), 'priority' => $entity->getpriority(), 'logo' => $entity->getlogo(), 'startedat' => $entity->getstartedat(),'completedon' => $entity->getcompletedon(),'completedby' => $entity->getCompletedBy(), 'createdby' => $entity->getcreatedby(), 'updatedby' => $entity->getupdatedby(), 'createddatetime' => $entity->getcreateddatetime(), 'updateddatetime' => $entity->getupdateddatetime()); 
     $response->headers->set('Content-Type', 'application/json'); 
     $response->setContent(json_encode($output)); 
     return $response; 
    } 

     return $this->redirect($this->generateUrl('projects_show', array('id' => $entity->getId()))); 
    } 

    return $this->render('ProjectsProjectsBundle:Projects:new.html.twig', array(
     'entity' => $entity, 
     'form' => $form->createView(), 
    )); 
} 

Antwort

2

Der Prozess eine Datei zu und im Symfony Docs - File Uploads with Doctrine Abschnitt beschrieben wird.

sofern Sie die Dokumentation verwendet werden, Dateiinhalte in der Datenbank für das Speichern, die Sie verwenden sollten:

$entity->setFile(file_get_contents(<filename>)); 
0

dieses Add

->add('logo', 'file',array('required'=>false,'data_class' => null)) 

und in Ihrem Controller

  if ($form->isValid()) { 
      $file = $form['logo']->getData(); 
      if(!empty($file)) 
      { 
       $dir = $this->get('kernel')->getRootDir() . 'path/to/dir/'; 
       $extension = $file->guessExtension(); 
       $now = new \DateTime('now'); 
       $filename = $now->format('YmdHis').rand(1, 99999).".".$extension; 
       if($file->move($dir, $filename)) 
         $entity->setImage($filename); 
      } 
buildform

Ich habe nur die relevanten Teile eingefügt