2

これまでのところ、これが投稿からフォームにデータを渡す方法であることがわかっています。

$form->setData( $this->getRequest()->getPost() );

これは使えるかもと思った

$form
    ->setData( $this->getRequest()->getPost() )
    ->setData( $this->getRequest()->getFiles() );

それはしません。フレームワークのソースを調べたところ、そうすべきではないことが確認されました。そこで、ファイルデータを投稿データにマージすることを考えていました。確かにこれは望ましい解決策ではないでしょうか? getPost() と getFiles() が簡単にマージ可能な配列を返すのではなく、Parameter オブジェクトを返します。

これは Zend Framework 2 固有のものであることに注意してください。

4

4 に答える 4

3

getFileInfo今知っているか、Zendを使用しているという事実に注意を払ってみましたか。通常、ファイルごと$_FILEに、アップロードされるファイルの情報に基づく配列があります。ファイル名、拡張子など。ZendsgetFileInfoは同様の方法でその情報を出力します。しばらく遊んだことはありませんが、調べる価値はあります

概念の例(私が知っている複数のファイルのアップロードについてはもっと詳しく説明しますが、2つ以上のファイルを追加したい場合に備えて、1つの優れた概念をそのままにしておくとよいでしょう)

$uploads = new Zend_File_Transfer_Adapter_Http();
$files  = $uploads->getFileInfo();

foreach($files as $file => $fileInfo) {
    if ($uploads->isUploaded($file)) {
        if ($uploads->isValid($file)) {
            if ($uploads->receive($file)) {
                $info = $uploads->getFileInfo($file);
                $tmp  = $info[$file]['tmp_name'];
                $data = file_get_contents($tmp);
                // here $tmp is the location of the uploaded file on the server
                // var_dump($info); to see all the fields you can use
            }
         }
     }
}
于 2012-07-27T15:58:31.197 に答える
3

Zend のファイル転送アダプターを使用しようとした後、コントローラーで回避策を講じました。フォーム クラスの setData() は、アイテムを置き換えるのではなく、データにマージする必要があると思います。(私見では)

protected function getPostedData()
{
    if ( is_null($this->postedData) )
    {
        $this->postedData = array_merge(
            (array) $this->getRequest()->getPost(),
            (array) $this->getRequest()->getFiles()
        );
    }
    return $this->postedData;
}
于 2012-08-02T09:05:11.513 に答える
1

私はarray_mergeを使用しています:

    $form    = $this->getForm('my_form');
    $request = $this->getRequest();

    if($request->isPost())
    {

        $file    = $this->params()->fromFiles('name_of_file');
        $form->setData(array_merge(
            $request->getPost()->toArray(),
            array('arquivo' => $file['name'])
        ));

        if ($form->isValid()) {
        // now i can validate the form field
于 2012-11-21T13:48:56.293 に答える
0

この記事で説明されているように変数変数を使用して変数を作成し、各フォーム エントリの値としてエコーします。

例:

// create array of GET/POST variables then convert each variable to a local variable
$fields = array_keys($_REQUEST);
foreach ($fields as $field) {
   $$field = $_REQUEST[$field];
}
于 2012-07-27T15:44:26.613 に答える