Sylius:创建一个基于分类的推广

时间:2014-06-12 11:15:18

标签: php symfony sylius

我需要根据分类法创建一个新的促销规则:例如,对于具有特定分类的所有产品(不是整个订单),可享受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,以便能够检查产品是否符合条件。

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

由于

2 个答案:

答案 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实现了一些更通用的称为过滤器:

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