3

Sonata 管理フォームで、現在のオブジェクトに関連するすべての画像を表示したいと思います。それらを編集する必要はありません。テンプレート内のすべての画像を呼び出すことができるように、エンティティ フィールド タイプとそのプロパティ オプションを使用して画像 URL をラベルとして選択することで、これを機能させることができました。

->add('image', 'entity', array(
    'class' => 'Hop\HopBundle\Entity\Image',
    'property' => 'image_url',
    'query_builder' => function($er) use ($object) {
        return $er->createQueryBuilder('i')
        ->where('i.object = :object')
        ->setParameter('object', $object)
        ;
    },
    'expanded' => true,
))

.

{% for child in form %}
    <img src="{{ child.vars.label }}" alt="{{ child.vars.label }}" />
{% endfor %}

これは、エンティティ タイプがテンプレートにラベルと 1 つの値しか与えないように見えるためです。

しかし、画像の幅、説明、日付なども取得したいと思います...つまり、Twigテンプレートで関連する各画像オブジェクト全体を取得するにはどうすればよいですか?

ありがとう。

4

3 に答える 3

6

だから私はそれをたくさんグーグルで検索しましたが、これが私にとってうまくいったものです(Symfony 2.2)
@fluがコメントで提案したように更新されました

{% for key, child in form %}
<div>
    {% set entity = form.vars.choices[key].data %}
    {{ form_widget(child) }}
    {{ form_label(child) }}
</div>
{% endfor %}

そして子entityオブジェクトです。Symfony 2.3 の時点でform.vars.data、私が正しく理解していれば、https ://github.com/symfony/symfony/pull/5023 だけになります。

于 2013-05-03T12:53:33.910 に答える
4

この問題の解決策を得るために、私は丸一日を費やしました。

まず、ChoiceType を拡張する新しい FormType を作成しました。

class NomineesType extends AbstractType
{
protected $em;

public function __construct(EntityManager $em) {
    $this->em = $em;
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $submissionRepository = $this->em->getRepository('BundleName:Submission');
    $choices = $submissionRepository->findBy(array(
        'nominee' => true
    ));
    $resolver->setDefaults(array(
        'choices' => $choices
    ));
}

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

public function getParent()
{
    return 'choice';
}
}

サービスを登録する必要があったよりも:

services:
form.type.nominees:
    class: Bundle\Form\Type\NomineesType
    arguments:
        entityManager: "@doctrine.orm.entity_manager"
    tags:
        - { name: form.type, alias: nominees }

その後、フォームに新しいタイプを追加しました。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $game = $this->game;
    $builder->add('submission', 'nominees', array(
        'expanded' => true,
        'multiple' => false
    ));
    $builder->add('email');
}

twig-template ですべてのプロパティを取得できるようになりました。

{% block nominees_widget %}
{% spaceless %}
    {% if expanded %}
        <ul {{ block('widget_container_attributes') }}>
        {% for child in form %}
            <li>
                {{ child.get('form').get('label').firstname }}
                {{ child.get('form').get('label').lastname }}
                {{ form_widget(child) }}
                {{ form_label(child) }}
            </li>
        {% endfor %}
        </ul>
    {% else %}
        {# just let the choice widget render the select tag #}
        {{ block('choice_widget') }}
    {% endif %}
{% endspaceless %}
{% endblock %}

選択リストは整数値のみを返すため、選択の ID をエンティティに変換する新しいデータ トランスフォーマーを作成しました。

class IntToEntityTransformer implements DataTransformerInterface
{
/**
 * @var ObjectManager
 */
private $om;

/**
 * @param ObjectManager $om
 */
public function __construct(ObjectManager $om)
{
    $this->om = $om;
}

/**
 * Transforms an object (issue) to a string (number).
 *
 * @param  Issue|null $issue
 * @return string
 */
public function transform($issue)
{
    if (null === $issue) {
        return "";
    }

    return $issue->getNumber();
}

/**
 * Transforms a string (number) to an object (issue).
 *
 * @param  string $number
 * @return Issue|null
 * @throws TransformationFailedException if object (issue) is not found.
 */
public function reverseTransform($number)
{
    if (!$number) {
        return null;
    }

    $issue = $this->om
        ->getRepository('BundleName:Submission')
        ->findOneBy(array('id' => $number))
    ;

    if (null === $issue) {
        throw new TransformationFailedException(sprintf(
            'An Submission with number "%s" does not exist!',
            $number
        ));
    }

    return $issue;
}
}

このデータ トランスフォーマーは、ビルド フォーム メソッドで初期化されます。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $transformer = new IntToEntityTransformer($this->em);
    $builder->add($builder->create('submission', 'nominees', array(
        'expanded' => true,
        'multiple' => false
    ))->addModelTransformer($transformer));
    $builder->add('email');
}
于 2012-09-08T13:41:59.247 に答える
0

私は Symfony 2.3 でこの問題と戦ってきました。2.1 での動作がわかりません。

私の場合、各選択肢のラベルの横に、エンティティの「説明」フィールドを追加する必要があるエンティティの選択肢 (拡張および複数) がありました。

私は次のように解決しました:

1-親がEntityTypeで、名前が「xxxxxxx_form_reparacionnormalizada」のカスタムタイプを作成しました

class ReparacionNormalizadaType extends AbstractType
{
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'class'        => 'xxxxxxxxx\Entity\TipoReparacion',
        ));
    }

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

    public function getParent()
    {
        return 'entity';
    }
}

2-通常どおりフォームタイプをサービスとして登録します

3- 次のようにカスタム テンプレートを作成しました。

{% block xxxxxxx_form_reparacionnormalizada_widget %}
<ul {{ block('widget_container_attributes_choice_widget') }}>

    {% for id, child in form.children %}

    <li>
        {{ form_label(child, child.vars.label|default(null), { 'in_list_checkbox' : true, 'widget' : form_widget(child) } ) }}

        <span>{{ choices[id].data.descripcion }}</span>

    </li>
    {% endfor %}
</ul>
{% endblock %}

4-あなたのソナタ管理者では、代わりにカスタムタイプを使用します'entity'

それが役に立てば幸い

よろしく

ハビエル

于 2013-07-24T15:11:48.133 に答える