我需要根据分类法创建一个新的促销规则:例如,对于具有特定分类的所有产品(不是整个订单),可享受10%的折扣。
我阅读了文档,阅读了sylius附带的两条规则的代码(项目数和订单总数)。我开始创建一个新的规则检查器(目前它只返回true),所以现在我有第三个推广规则(“分类法”)。然后我创建了它的配置表单类型。在这里,我需要创建一个选择列出所有配置的分类,以便能够选择触发促销的分类。在这里,我被困住了。我在TaxonomyConfigurationType.php中尝试过的(我注入了实体管理器):
class TaxonomyConfigurationType extends AbstractType
{
protected $em;
public function __construct($em)
{
$this->em = $em;
}
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('theme', 'choice',
array(
'mapped' => false,
'multiple' => false,
'empty_value' => 'Choose a taxon',
'choices' => $this->buildThemeChoices()
)
);
}
public function getName()
{
return 'ecad_promotion_rule_taxonomy_configuration';
}
protected function buildThemeChoices() {
$choices = array();
/// how can I access the taxonomy repo ?
$r = $this->em->getRepository('BoutiqueBundle:Theme');
$entities = $r->findAll();
foreach ($entities as $e) {
$choices[$e->getId()] = $e->getName();
}
return $choices;
}
}
我重写了Taxon类(BoutiqueBundle:Theme)以翻译我的分类,所以我收到了这个错误:
Class "Ecad\BoutiqueBundle\Entity\Theme" sub class of "Sylius\Bundle\TaxonomiesBundle\Model\Taxon" is not a valid entity or mapped super class.
任何导致实现这一目标?最后,我需要在$ configuration中存储一个分类单元ID,以便能够检查产品是否符合条件。
另一件事:是否可以仅指定一种产品作为促销主题?
由于
答案 0 :(得分:0)
确定我的错误......
对于那些感兴趣的人,我现在有一个基于分类法的新推广规则(我想使用一个名为“Thematique”的特定词汇):
class TaxonomyConfigurationType extends AbstractType
{
protected $container;
public function __construct($container)
{
$this->container = $container;
}
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('taxons', 'choice', array(
'label' => 'Thème',
'choices' => $this->getThemeChoices(),
'multiple' => true,
'required' => true
));
}
public function getName()
{
return 'promotion_rule_taxonomy_configuration';
}
protected function getThemeChoices() {
$taxonomyRepository = $this->container->get('sylius.repository.taxonomy');
$taxonomy = $taxonomyRepository->findOneByName('Thematique');
$taxons = $taxonomy->getTaxonsAsList($taxonomy);
$choices = array();
foreach($taxons as $t) {
$choices[$t->getId()] = $t->getName();
}
return $choices;
}
}
我可以选择一个或多个正确序列化的分类单元,并在编辑促销规则时检索。我不得不将@service_container作为参数传递给这项服务。
如果在SO上授权,我将更新此帖子以用于后续步骤(规则检查,产品价格调整而不是整个订单......)。
答案 1 :(得分:0)
同时,Sylius实现了一些更通用的称为过滤器:
很快,在您附近的浏览器中:)