2014-02-27 4 views
3

저는 AngularJS를 사용하여 포함될 수있는 여러 가지 질문을 관리하는 일종의 검색 도구 헌트 프로젝트를 운영하고 있습니다. 이 질문은 다른 유형입니다. 따라서 일부는 파일 입력을 포함 할 수도 있고 그렇지 않을 수도 있습니다. 이 프로젝트에서 Symfony와 SonataMediaBundle을 사용하여 파일과 이미지를 관리합니다.SonataMediaBundle - 사용자 정의 파일 입력 사용 방법

내 HTML 모델 (대부분 내 양식)이 사용자의 동작에 따라 변경 될 수 있으므로 Symfony의 내장 도구를 사용하여 양식을 생성 할 수 없습니다. 따라서 모든 제 양식은 맞춤 제작되었습니다. 이 때문에 일부 파일을 업로드 할 때 SonataMediaBundle에 문제가 발생합니다. 사용자가 파일을 선택하면 양식이 전송되면이 파일이 POST를 통해 컨트롤러의 메소드로 전송됩니다. 따라서,이받은 파일을 SonataMediaBundle에 보내서 관리 할 수 ​​있도록하고 싶지만, 문서에서 그와 같은 일을하는 방법을 찾지 못했습니다.

이론적으로는 정말 간단합니다. 내 컨트롤러에서 파일 입력을 받으면 SonataMedia가 업로드를 관리하도록하고 싶습니다 (적절한 위치로 복사하는 등 ...). 어떻게해야하는지에 대한 단서가 없습니다.

+0

아마도 https://gist.github.com/romaricdrigon/6291435에서 살펴보아야합니다. 이렇게하면 AngularJS와 함께 양식을 작성하는 Symfony 방식을 사용할 수 있습니다. 원하는 방식으로 양식을 작성하여 백엔드에서 SPA로 되돌릴 수 있습니다. –

답변

1

번들은 Symfony와 SonataMedia 사이의 이러한 격차를 정확히 없애기 위해 존재합니다. SonataMedia는 원시 PHP 용으로 제작되었으며 SonataMediaBundle은 Symfony 인터페이스를 SonataMedia에 첨부합니다. Bundle의 기능 중 상당 부분을 다시 작성하고 있습니다. 어떻게 올바르게 수행되었는지 보여주는 좋은 예를 보려면 번들 코드를 참조하십시오.)

죄송합니다. 다음 제안 사항을 철저히 고려해 본다면 유감스럽게도 질문의 제한된 정보를 바탕으로 확신 할 수 없습니다. Symfony 양식은 유연성이 뛰어나며 CSRF 토큰과 같은 직접 구현하지 말아야하는 많은 중요한 기능을 제공합니다. 대부분의 문제점에는 양식 시스템에 대한 좋은 해결책이 있습니다. 양식이 변형되어 있고 (UI 상호 작용을 기반으로 여러 별자리가 있음) 여러 양식 유형으로 처리 할 수없는 경우에도 옵션을 사용할 수 있습니다. 현재 전송중인 양식 유형을 나타내는 GET 매개 변수를 설정할 수 있으면 FormBuilder에 전달할 수 있습니다. 사용하는 모든 필드가 포함 된 전체 응용 프로그램에 대해 하나의 큰 양식을 작성할 수도 있습니다. 이는 약간의 낭비이지만 게시 + 소나타를 연결하는 것보다 여전히 좋습니다. 첫 번째 버전에는 몇 가지 추가 바이트와 빈 필드가 가장 해 롭습니다. 시도 할 수있는 최소한의 상처는 심각한 보안 유출을 초래하는 것입니다.

+0

내가 이것을 언급하지 않는다면 나는 당신이 언급 한 것을 할 수있다. 최대 20 개의 질문을 가질 수 있으며 각 질문마다 다른 유형이있을 수 있습니다 (나는 10 가지 유형의 질문이 있습니다). 따라서, 나는 내 모든 다른 가능성을 관리 할 수 ​​있도록이 페이지를 20000 가지 형태로 전달해야 할 것입니다. 이것은 좋은 선택처럼 보이지 않습니다 ... – CoachNono

+0

10 가지 유형이 있다고 말하면 10 가지 변형이 있다고 이해합니다. 필드 용. 모든 질문에 모든 유형의 양식이 있으면 2 단계가 표시됩니다. 1) 10 가지 유형 중 하나를 포함 할 수있는 많은 필드를 만드는 하나의 FormType 클래스를 만듭니다 (예 :type1과 text에 대한 텍스트와 라디오가 있고 type2에 대한 3 개의 체크 박스가있는 경우 텍스트, 라디오 및 3 개의 체크 박스가있는 양식을 작성합니다. 2) formbuilder를 얻고, 각 질문에 대해이 FormType의 $ builder-> add() 인스턴스를 생성합니다 (생성자 매개 변수는 개별 '선택 사항'목록을 처리 할 수 ​​있고 실제로 추가해야하는 필드가 있습니다.) –

+0

여전히 느끼지 않으면 이렇게하면 쉽게 문제를 해결할 수 있습니다. 그런 다음 문제를 편집하여 10 가지 질문 유형 중 2 ~ 3 개와 20 가지 질문 중 2-3 가지를 선호하는 조합으로 표시하십시오. 그것보다 훨씬 더 큰 도전. –

7

symfony2를 사용하면 큰 실수를 저지르고 있습니다. 응용 프로그램을 올바르게 작성해야합니다. 그러나 질문에 관심이있는 한 심포니는 아무 것도 사용하지 않지만 심포니는 여러분이 사용하는 방법에 의존합니다. 소나타 미디어 관리자 서비스를 컨테이너에서 수동으로 설정해야합니다. 미디어 관리자에 필요한 모든 설정 도구를 수동으로 설정해야합니다. 파일 크기, 파일 유형 등과 같은 유효성 검사를 수동으로 수행해야합니다. 다음은 파일을 저장할 수있는 방법을 보여주는 데모입니다. 소나타 미디어 번들

/* Before class use these*/ 
use Symfony\Component\HttpFoundation\File\File; 
use Symfony\Component\HttpFoundation\File\UploadedFile; 
use Application\Sonata\MediaBundle\Entity\Media; 

public function uploadAction() 
{ 

$file = $this->get('request')->files->get('filefieldname'); 

    if (!$file instanceof UploadedFile || !$file->isValid()) { 
     return new Response(json_encode(array(
      'event' => 'uploader:error', 
      'data' => array(
       'message' => 'Missing file.', 
      ), 
     ))); 
    } 

/* validate max min size for the file */ 
/* validate mime type for the file */ 
/* Get sonata media manager service from container */ 
$mediaManager = $this->container->get('sonata.media.manager.media'); 
/* create new instance of sonata media class in my case entity is located at 
* Application\Sonata\MediaBundle\Entity\Media 
*/ 
$media = new Media(); 
$media->setBinaryContent($file); 
$media->setContext('default'); 
$ImagemimeTypes = array('image/jpeg', 'image/png'); 
$FilemimeTypes = array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 
    'application/msword', 'application/pdf', 'application/x-pdf'); 
if (in_array($file->getMimeType(), $FilemimeTypes)) { 
    $media->setProviderName('sonata.media.provider.file'); 
} 
if (in_array($file->getMimeType(), $ImagemimeTypes)) { 
    $media->setProviderName('sonata.media.provider.image'); 
} 
/*If you have other providers in your app like vimeo /dailymotion etc 
then do set here i have shown you the demo for adding image/file in sonata media */ 
/*other setters if you want to set like enabled/disable etc*/ 
$mediaManager->save($media); 
// end function 
} 

하지만 다시 한 번 당신이 이미

당신에게 편의성을 제공하는 심포니해야하는 재 작업을 많이있을 것입니다
+1

남자, 당신은 내 직업을 구했어 !!! !!! 감사합니다 !!! – Aldee

관련 문제