3

symfony2 アプリケーションでは、エンティティ Message はドキュメントに対して一対多の関係を持っています。Documents はユーザーのアップロードを表します。フォームを作成しました。MessageForm と DocumentForm の 2 つの Form を実現しました。DocumentForm は、MessageForm のコレクション FormField 内に存在します。ファイルのアップロードと処理は機能します。

しかし、エンティティのメッセージを編集したい場合、フォームには既存のドキュメントと同じ数の空の FileInput が含まれます。望ましい動作は次のとおりです。

  • 新しいファイルをアップロードする FileInputs
  • 既存のファイルへのファイル名 (リンク)
  • 既存のファイルを削除する可能性

これはフォーム内で処理する必要があります。フォームの送信時に変更を行う必要があります。

これはどのように実現できますか?

4

2 に答える 2

9

解決策は、カスタム フォーム タイプの拡張機能を作成することです。http://symfony.com/doc/2.1/cookbook/form/create_form_type_extension.htmlで説明されているとおり。

ファイルタイプ拡張子

    <?php

    use Symfony\Component\Form\AbstractTypeExtension;
    use Symfony\Component\Form\FormView;
    use Symfony\Component\Form\FormInterface;
    use Symfony\Component\Form\Util\PropertyPath;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;

    /**
     * Class FileTypeExtension
     *
     * @see http://symfony.com/doc/2.1/cookbook/form/create_form_type_extension.html
     */
    class FileTypeExtension extends AbstractTypeExtension
    {
        /**
        * Returns the name of the type being extended.
        *
        * @return string The name of the type being extended
        */
        public function getExtendedType()
        {
            return 'file';
        }

        /**
         * Add the image_path option
         *
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setOptional(array('file_path', 'file_name'));
        }

        /**
         * Pass the image url to the view
         *
         * @param FormView $view
         * @param FormInterface $form
         * @param array $options
         */
        public function buildView(FormView $view, FormInterface $form, array $options)
        {
            if (array_key_exists('file_path', $options)) {
                $parentData = $form->getParent()->getData();

                if (null !== $parentData) {
                    $propertyPath = new PropertyPath($options['file_path']);
                    $fileUrl = $propertyPath->getValue($parentData);
                } else {
                    $fileUrl = null;
                }

                $view->set('file_url', $fileUrl);
            }

            if (array_key_exists('file_name', $options)) {
                $parentData = $form->getParent()->getData();

                if (null !== $parentData) {
                    $propertyPath = new PropertyPath($options['file_name']);
                    $fileName = $propertyPath->getValue($parentData);
                } else {
                    $fileName = null;
                }

                $view->set('file_name', $fileName);
            }
        }
    }

カスタマイズされた file_widget

    {% block file_widget %}
        {% spaceless %}

            {% if file_url is not null %}
                <div><a href="{{ file_url }}">{{ file_name }}</a></div>
                <div style="display:none">{{ block('form_widget') }}</div>
            {% else %}
                {{ block('form_widget') }}
            {% endif %}

        {% endspaceless %}
    {% endblock %}

services.yml

    parameters:
        foobar.file_type_extension.class: Foobar\Form\Extension\FileTypeExtension

    services:
        foobar.file_type_extension:
            class: %replacethis.file_type_extension.class%
            tags:
              - { name: form.type_extension, alias: file }

フォームタイプ内

    $builder->add('file','file', array(
                "label" => "Datei",
                "required" => true,
                "attr" => array(),
                "file_path" => "webPath",
                "file_name" => "name"
            ));

それでおしまい ;)

于 2013-03-22T16:46:24.573 に答える
0

上記の回答に加えて-リンク(URLがある場合)またはフィールド(ない場合)としてレンダリングできるファイル入力を作成できます-あなたは見てみるかもしれません

http://symfony.com/doc/2.0/cookbook/form/form_collections.html

いくつかの jQuery と組み合わせると、UI にフィールドを追加できます。

于 2013-03-22T17:18:35.510 に答える