西利乌斯资源和学说过滤器



我是Sylius的新手,并试图为我的业务扩展它。我目前在管理部分面临一个我不知道如何解决的问题。

我有一个与Sylius产品实体一对一相关的购物篮实体:

/**
* @ORMEntity
* @ORMTable(name="app_basket")
*/
class Basket implements ResourceInterface, BasketInterface
{
/**
* @ORMOneToOne(targetEntity="AppEntityProductProduct", inversedBy="basket", cascade={"persist", "remove"})
* @ORMJoinColumn(nullable=false)
*/
private $product;
}

我创建这种关系是为了能够更轻松地处理Sylius的订单管理。我不想在我的业务中混合使用购物车和产品对象,因此我创建了一个原则过滤器来从产品中排除购物篮项目:

<?php
namespace AppDoctrineFilter;
use AppEntityProductProduct;
use DoctrineORMMappingClassMetadata;
use DoctrineORMQueryFilterSQLFilter;
class ProductFilter extends SQLFilter
{
/**
* @inheritDoc
*/
public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
{
if($targetEntity->getName() !== Product::class) {
return '';
}
return "$targetTableAlias.id not in (select product_id from app_basket)";
}
}

在管理产品页面上,一切都很棒,我没有篮子。但是,如果我转到购物篮管理索引页面,则会出现以下错误:

呈现

模板期间引发异常 ("ID id(4( 的类型为'应用\实体\产品\产品'的实体不是 发现"(。

这是因为我使用的网格。我想显示购物篮中包含的产品名称:

sylius_grid:
grids:
app_admin_basket:
driver:
name: doctrine/orm
options:
class: AppEntityBasketBasket
fields:
id:
type: string
label: sylius.ui.id
product.name:
type: string
label: sylius.ui.name

为了检索 basket.product.name,生成的查询直接查询到产品表而不是购物篮表:

SELECT t0.code AS code_1, t0.created_at AS created_at_2, t0.updated_at AS updated_at_3, t0.enabled AS enabled_4, t0.id AS id_5, t0.variant_selection_method AS variant_selection_method_6, t0.average_rating AS average_rating_7, t0.main_taxon_id AS main_taxon_id_8, t9.id AS id_10, t9.product_id AS product_id_11 
--problem here
FROM sylius_product t0 
LEFT JOIN app_basket t9 ON t9.product_id = t0.id 
WHERE t0.id = 4 
--Doctrine SQL FIlter
AND ((t0.id not in (select product_id from app_basket)));

如果在树枝模板中得到这个,我也有相同的行为:

{{ basket.product.name }}

使用 fetch="EAGER"注释我没有错误,但目标实体仍然没有反映我想要的。

有没有办法强制Sylius Resource首先通过篮子实体,而不是直接传递到嵌入实体?

试试这个

sylius_grid:
grids:
app_admin_basket:
driver:
name: doctrine/orm
options:
class: AppEntityBasketBasket
fields:
id:
type: string
label: sylius.ui.id
product.name:
type: twig
label: sylius.ui.name
path: .
options:
template: thetemplate.html.twig

path: .属性允许您访问整个实体而不是特定属性。然后,您应该能够使用 twig 模板中的data.product.name访问它。

你也可以试试这个,虽然我还没有测试过:

sylius_grid:
grids:
app_admin_basket:
driver:
name: doctrine/orm
options:
class: AppEntityBasketBasket
fields:
id:
type: string
label: sylius.ui.id
product.name:
type: string
label: sylius.ui.name
path: product.name

您的过滤器将始终阻止获取购物篮的产品。 您可以尝试至少为此请求禁用它:https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/filters.html#disabling-enabling-filters-and-setting-parameters

相关内容

  • 没有找到相关文章

最新更新