0

我需要根据分类创建一个新的促销规则:例如,所有具有特定分类的产品(不是整个订单)可享受 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;
}
}

我重写了分类单元类(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,以便能够检查产品是否符合条件。

另一件事:是否可以只指定一种产品作为促销主题?

谢谢

4

2 回答 2

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 上授权,我将更新此帖子以进行后续步骤(规则检查、调整产品价格而不是整个订单......)。

于 2014-06-13T08:42:29.670 回答
0

同时,Sylius 实现了一些更通用的过滤器:

很快,在您附近的浏览器中:)

于 2016-08-25T16:22:42.827 回答