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

Posted

技术标签:

【中文标题】EasyAdmin 3.X - 如何查看相关实体 `toString` 而不是列表中的关联数?【英文标题】:EasyAdmin 3.X - How to see related entities `toString` instead of the number of association in the list? 【发布时间】:2020-12-22 23:08:49 【问题描述】:

我有一个实体 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 列相同:

【问题讨论】:

【参考方案1】:

你可以像这样制作一个模板:

// 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'),

【讨论】:

这个应该是正确的答案,imo【参考方案2】:

您可以像这样使用formatValue 方法格式化值:

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

【讨论】:

我会试试这个formatValue func,谢谢。为了您的解决方案,也许您可​​以使用implode (php.net/manual/en/function.implode.php) 返回相同的结果? 非常好的解决方案,但请注意,如果您需要对多个实体进行此操作,则当前形式的此方法不允许代码重用。【参考方案3】:

我在详细信息页面上遇到了同样的问题。因此,我没有使用模板,而是根据pagename 更改字段类型

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

【讨论】:

【参考方案4】:

在 crud 控制器中使用 ArrayField::new('categories'), 而不是 AssociationField::new('categories'),

现在创建/编辑产品时,显示有所不同,但足够好

【讨论】:

以上是关于EasyAdmin 3.X - 如何查看相关实体 `toString` 而不是列表中的关联数?的主要内容,如果未能解决你的问题,请参考以下文章

EasyAdmin 3:如何基于 dql 为 CRUD 索引显示实体

用户如何在 EasyAdmin 中查看自己的产品,而管理员可以查看所有产品?

easyadmin 实体字段的动态自定义选择

EasyAdmin 3:嵌套表单

Symfony 5 easyadmin 3 与 ManyToOne 关系的实体 - 不保存在“多”端

如何在 EasyAdmin 3 中添加自定义操作?