symfony EasyAdmin 3.X -如何查看相关实体'toString'而不是列表中的关联数?

pb3s4cty  于 2023-01-13  发布在  其他
关注(0)|答案(6)|浏览(125)

我有一个实体Product,它与实体Category具有多对多关系

/**
 * @ORM\ManyToMany(targetEntity="App\Domain\Category", inversedBy="stalls")
 */
private $categories;

//...

/**
 * @return Collection|Category[]
 */
public function getCategories(): Collection
{
    return $this->categories;
}

ProductCrudController类中,我有以下configureFields方法:

public function configureFields(string $pageName): iterable
{
    return [
        Field::new('name'),
        Field::new('description'),
        AssociationField::new('categories'),
    ];
}

当创建/编辑一个Product时,关系中的一切都按预期工作,但在产品列表中,我看到的是产品的类别数,而不是显示相关的类别。
在下面的图片中,第一个产品有1个类别,列表中的第二个产品有2个不同的类别。我希望类别的名称显示在这里。

作为旁注:Category类具有返回类别名称的__toString方法。
编辑:
我要查找的行为与下图中的Tags列相同:

8gsdolmq

8gsdolmq1#

你可以这样做一个模板:

// somewhere here templates/admin/field/category.html.twig
{% for category in field.value %}
  {%- set url = ea_url()
    .setController('Path\\To\\Your\\CategoryCrudController')
    .setAction('detail')
    .setEntityId(category.id)
  -%}
  <a href="{{ url }}">
    {{ category.name }}{% if not loop.last %}, {% endif %}
  </a>
{% else %}  
  <span class="badge badge-secondary">None</span>
{% endfor %}

然后将其添加到字段中

// in ProductCrudController
AssociationField::new('categories')->setTemplatePath('admin/field/category.html.twig'),
ie3xauqp

ie3xauqp2#

您可以使用formatValue方法格式化该值,如下所示:

->formatValue(function ($value, $entity) {
                $str = $entity->getCategories()[0];
                for ($i = 1; $i < $entity->getCategories()->count(); $i++) {
                    $str = $str . ", " . $entity->getCategories()[$i];
                }
                return $str;
              })
abithluo

abithluo3#

我的详细信息页面也有同样的问题,所以我没有使用模板,而是根据pagename更改字段类型

if (Crud::PAGE_DETAIL === $pageName) {
   $field = ArrayField::new('field')->setLabel('label');
} else {
   $field = AssociationField::new('field')->setLabel('label');
}
myzjeezk

myzjeezk4#

我会这样做:

->formatValue(function ($value, $entity) {
    return implode(",",$entity->getCategories()->toArray());
})
v9tzhpje

v9tzhpje5#

the most upvoted answer的基础上构建,您可以像这样使Twig代码段通用:

{% for member in field.value %}
    {%- if field.customOption('crudControllerFqcn') is not empty -%}
        {%- set url = ea_url()
            .setController(field.customOption('crudControllerFqcn'))
            .setAction('detail')
            .setEntityId(member.id)
        -%}
        <a href="{{ url }}">
            {{ member }}
        </a>
    {%- else -%}
        {{ member }}
    {%- endif -%}

    {%- if not loop.last %}, {% endif -%}
{% else %}
    <span class="badge badge-secondary">None</span>
{% endfor %}

这样你就可以在CRUD控制器中设置链接目的地,并在任何地方使用模板。当没有设置CRUD控制器时,你仍然会枚举单个条目,但不作为链接。
在我的TeamCrudController中,我这样做:

public function configureFields(string $pageName): \Generator
{
    yield TextField::new('name')
        ->setDisabled()
    ;

    $members = AssociationField::new('members')
        ->hideOnForm()

    ;

    if (Crud::PAGE_DETAIL === $pageName) { // I want to see the number on INDEX, but the list on DETAIL
        $members
            ->setCrudController(EmployeeCrudController::class)
            ->setTemplatePath('admin/field/expanded_association_field.html.twig')
        ;
    }

    yield $members;
}

或者,如果您希望成为默认行为,请通过将以下内容放置在templates/bundles/EasyAdminBundle/crud/field/association.html.twig中来覆盖EasyAdminBundle模板:

{# @var ea \EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext #}
{# @var field \EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto #}
{# @var entity \EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto #}
{% if 'toMany' == field.customOptions.get('associationType') %}
    {% if ea.crud.currentPage == 'detail' %}
        {% for member in field.value %}
            {%- if field.customOption('crudControllerFqcn') is not empty -%}
                {%- set url = ea_url()
                    .setController(field.customOption('crudControllerFqcn'))
                    .setAction('detail')
                    .setEntityId(member.id)
                -%}
                <a href="{{ url }}">
                    {{- member -}}
                </a>
            {%- else -%}
                {{ member }}
            {%- endif -%}

            {%- if not loop.last %}, {% endif -%}
        {% else %}
            <span class="badge badge-secondary">None</span>
        {% endfor %}

    {% else %}
        <span class="badge badge-secondary">{{ field.formattedValue }}</span>
    {% endif %}
{% else %}
    {% if field.customOptions.get('relatedUrl') is not null %}
        <a href="{{ field.customOptions.get('relatedUrl') }}">{{ field.formattedValue }}</a>
    {% else %}
        {{ field.formattedValue }}
    {% endif %}
{% endif %}
cnh2zyt3

cnh2zyt36#

在积垢控制器中使用ArrayField::new('categories'),代替AssociationField::new('categories'),
现在创建/编辑产品时,显示不同,但足够好

相关问题