2014-02-27 50 views
3

我有一種尋寶工程,我使用AngularJS來管理它可能包含的不同問題。這些問題是不同類型的。因此,有些可能包含文件輸入,有些可能不包含。在這個項目中,我也使用Symfony和SonataMediaBundle來管理我的文件和我的圖像。SonataMediaBundle - 如何使用自定義文件輸入

由於我的html模型(主要是我的表單)可以根據用戶的操作進行更改,所以我不能使用Symfony的內置工具來生成表單。因此,我所有的表格都是定製的。這給了我一個SonataMediaBundle的問題,當我想要上傳一些文件時。如果用戶選擇一個文件,當文件發送時,這個文件將通過POST發送到控制器中的一個方法。因此,我想將收到的文件發送給SonataMediaBundle以便它可以管理它,但是我沒有在文檔中的任何地方找到如何做這樣的事情。

理論上,它非常簡單。在我的控制器中,當我收到一個文件輸入時,我想讓SonataMedia管理上傳(這是複製到適當的位置等),我不知道該怎麼做。

+0

也許你應該看看:https://gist.github.com/romaricdrigon/6291435。這使您可以使用Symfony的方式與AngularJS結合構建表單。您可以以任何方式構建表單並將其從後端返回到SPA。 –

回答

1

The Bundle在那裏可以完全消除Symfony和SonataMedia之間的差距。 SonataMedia是爲原始PHP製作的,而SonataMediaBundle將Symfony接口附加到SonataMedia;你正在重寫Bundle的大部分功能。爲了得到一個很好的例子,看看它是如何做的正確的,看看Bundle的代碼;)

對不起,如果下一個建議是你考慮徹底的東西,我不能確定根據有限的信息在問題。 Symfony表單非常靈活,並提供了很多關鍵功能,您不應該嘗試重新實現自己(例如CSRF令牌)。大多數問題都可以通過表單系統很好的解決。如果一個表單是變形的(有許多基於UI交互的字段星座)並且不能被多種表單類型處理,你仍然有選擇。如果您可以設置一個GET參數來指示當前正在發送哪種類型的表單,那麼您可以將其傳遞給FormBuilder。你甚至可以選擇爲整個應用程序構建一個單一的大型表單,它包含你曾經使用的每個領域 - 這有點浪費,但比試圖將發佈+奏鳴曲連接在一起更好。最傷害的第一個版本確實是一些額外的字節和空字段。你嘗試做的最少的事情是引入嚴重的安全漏洞。

+0

我可以做你提到的,如果不是這樣的話。我最多可以有20個問題,每個問題可以是不同的類型(我有10個不同類型的問題)。因此,我必須通過我的頁面,200個不同的形式,以便我可以管理所有不同的可能性,這似乎不是一個好的選擇... – CoachNono

+0

如果你說你有10種類型,我知道它有10個變化爲領域。如果每個問題都可以有任何類型的表單,那麼我會看到兩個步驟。 1)創建一個FormType類,它可以構建如此多的字段,以便它可以包含10種類型中的任何一種(例如如果有類型1和文本的文字和廣播,類型2有3個複選框,則可以用文字,廣播和3個複選框構建表格)。 2)獲取formbuilder,併爲每個問題$ builder-> add()這個FormType的一個實例(它的構造函數參數可以照顧個人的'選擇'列表以及哪些字段確實需要添加。 –

+0

如果你仍然感覺不到像這樣可以輕鬆解決問題,那麼請編輯問題,以便我們在10個問題類型中看到至少2-3個問題,並在20個問題中看到2-3個問題,最好以某種組合的形式出現,這樣我們可以弄清楚爲什麼會出現這種問題比它應該更大的挑戰 –

7

使用symfony2並沒有利用它的好處,你正在做一個很大的錯誤,你應該適當地構建你的應用程序,但是至於你的問題,關於symfony沒有什麼限制,但你自己如何使用它。你可以得到Sonata媒體管理器服務,您必須手動設置媒體管理器所需的所有設置器,並且您必須手動處理文件大小,文件MIME類型等驗證。下面是演示如何將文件存儲在索納塔媒體捆綁

/* 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 
} 

但再次會有很多返工你必須做它的symfony已經爲您提供了方便的

+1

男人,你救了我的工作!!! :)謝謝你! – Aldee