2017-03-27 22 views
1

我几天前开始学习Sylius。我需要Symfony 3项目中的电子商务模块。所以我要用Sylius来扩展我的项目,我将使用Core/Components堆栈。Sylius产品定制模型:字段未在表格中显示

  1. 我开始安装Sylius ProductBundle的(参见http://docs.sylius.org/en/latest/bundles/SyliusProductBundle/installation.html

看似简单,但在第一,因为作曲家安装的不支持了一个稳定的版本(0.19),没有工作。 ..无论如何,我终于安装了sylius/sylius [email protected]包,所以我composer.json看起来像这样:

"minimum-stability" : "dev", 
"prefer-stable" : true, 
"require" : { 
    "php" : "^7.0", 
    "sylius/sylius" : "^[email protected]", 
    "friendsofsymfony/user-bundle" : "[email protected]", 
    "symfony/assetic-bundle" : "^2.8", 
    "gedmo/doctrine-extensions" : "^2.4" 
}, 

=>第一个问题:这是正确的方式???

  1. 然后,我在我的项目中创建了一个SyliusBundle,以将整个Sylius配置与我的其余项目分离。

在SyliusBundle /应用/ config.yml:

imports: 
    - { resource: "@SyliusProductBundle/Resources/config/app/config.yml" } 

# Doctrine 
stof_doctrine_extensions: 
    default_locale: "%locale%" 
    orm: 
     default: 
      tree: true 
      sluggable: true 
      timestampable: true 
      loggable: false 
      sortable: true 

# Product 
sylius_product: 
    driver: doctrine/orm 
    resources: 
     product: 
      classes: 
       model: OfferBundle\Entity\Offer 
       repository: OfferBundle\Entity\OfferRepository 
       form: OfferBundle\Form\OfferType 

我跟着Sylius方针定制从Sylius产品型号(很简单)

在OfferBundle /实体

/继承我的报价模型Offer.php:

<?php 
namespace OfferBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Sylius\Component\Core\Model\Product as BaseProduct; 


/** 
* @ORM\Table(name="offer") 
* @ORM\Entity(repositoryClass="OfferRepository") 
*/ 
class Offer extends BaseProduct 
{ 

=>问题2:听起来不错?

  • 然后我定制的形式延伸我的优惠形式与Sylius产品形式(参见http://docs.sylius.org/en/latest/customization/form.html
  • 在OfferBundle /形式/ OfferType.php:

    <?php 
    
    namespace OfferBundle\Form; 
    
    use Symfony\Component\OptionsResolver\OptionsResolver; 
    use OfferBundle\Entity\Offer; 
    use Symfony\Component\Form\AbstractType; 
    
    
    class OfferType extends AbstractType 
    { 
        /** 
        * {@inheritdoc} 
        */ 
        public function configureOptions(OptionsResolver $resolver) 
        { 
         $resolver->setDefaults(['data_class' => Offer::class]); 
        } 
    
    
        /** 
        * {@inheritdoc} 
        */ 
        public function getBlockPrefix() 
        { 
         return 'offer'; 
        } 
    
    
        /** 
        * {@inheritdoc} 
        */ 
        public function getParent() 
        { 
         return \Sylius\Bundle\ProductBundle\Form\Type\ProductType::class; 
        } 
    } 
    

    在OfferBundle /表/扩展/ OfferTypeExtension.php:

    <?php 
    
    namespace OfferBundle\Form\Extension; 
    
    use Symfony\Component\Form\FormBuilderInterface; 
    use Symfony\Component\OptionsResolver\OptionsResolver; 
    use AppBundle\Form\Type\WysiwygType; 
    use Symfony\Component\Form\Extension\Core\Type\DateType; 
    use OfferBundle\Form\Type\TagsType; 
    use Symfony\Bridge\Doctrine\Form\Type\EntityType; 
    use Doctrine\ORM\EntityRepository; 
    use Symfony\Component\Form\Extension\Core\Type\CollectionType; 
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 
    use OfferBundle\Entity\Offer; 
    use MediaBundle\Form\MediaFileType; 
    use MediaBundle\Form\MediaVideoType; 
    use CompanyBundle\Entity\Company; 
    use Tetranz\Select2EntityBundle\Form\Type\Select2EntityType; 
    use Admin\CompanyBundle\Controller\CompanyController; 
    use Symfony\Component\Form\AbstractTypeExtension; 
    use OfferBundle\Form\ContactType; 
    use OfferBundle\Form\PriceType; 
    use OfferBundle\Form\OfferType; 
    
    
    final class OfferTypeExtension extends AbstractTypeExtension 
    { 
        /** 
        * {@inheritdoc} 
        */ 
        public function buildForm(FormBuilderInterface $builder, array $options) 
        { 
         $builder 
          ->add('advantage', WysiwygType::class) 
          ->add('ecommerce') 
          ->add('enabled') 
          ->add('bestseller') 
          ->add('company', Select2EntityType::class, [ 
           'multiple' => false, 
           'remote_route' => 'admin_company_company_autocomplete', 
           'class' => Company::class, 
           'primary_key' => 'id', 
           'text_property' => 'name', 
           'minimum_input_length' => 0, 
           'page_limit' => CompanyController::NB_PER_PAGE, 
           'allow_clear' => false, 
           'delay' => 250, 
           'cache' => false, 
           'cache_timeout' => 60000, 
           'language' => 'fr', 
           'placeholder' => 'form.choose', 
           'required' => true, 
          ]) 
          ->add('state', ChoiceType::class, [ 
           'choices' => Offer::getStates(), 
           'placeholder' => 'form.choose', 
          ]) 
    ... 
    

    和表单前紧张由服务加载。 在OfferBundle /资源/配置/ services.yml:

    offer.form.extension.type.offer: 
         class: OfferBundle\Form\Extension\OfferTypeExtension 
         tags: 
          - { name: form.type_extension, extended_type: OfferBundle\Form\OfferType } 
    

    问题3:它的工作原理,但看到Sylius \包\ CoreBundle \表格\延期\ ProductTypeExtension包含如$图像,$ variantSelectionMethod其它附加字段。 ..但它不会以我的形式出现。所以我想在某个地方的service.yml没有加载?

    希望有人能帮助我!

    回答

    0

    我认为这个问题是因为你已经重写了表单而不是扩展它。所以你只能看到你的表单域,而不是产品表单域(因为这个表单不再被使用)。 如果您希望对产品表单进行一些更改,则只需对表单进行扩展即可修改现有产品表单。

    http://docs.sylius.org/en/latest/customization/form.html

    希望这有助于! :)

    0

    您可能还需要重写窗体的模板以显示这些添加的字段。

    +0

    Tkank你的答案。 实际上,没有必要,因为Symfony中的表单呈现显示所有未显示的字段,所以它不是关于表单模板。 – Echo