kiobo / akeneo-enrich-bundle
Requires
- akeneo-labs/custom-entity-bundle: ~1.10.0
- akeneo/pim-community-dev: ~1.7.5
This package is auto-updated.
Last update: 2024-09-21 17:09:09 UTC
README
本项目是什么?
本项目是对Akeneo的CustomEntityBundle的增强:https://github.com/akeneo-labs/CustomEntityBundle。
本项目做什么?
此扩展包帮助开发者更快、更轻松地为您在Akeneo中的PIM和相关视图创建自定义引用数据。
为什么本项目有用?
通常需要自定义PIM引用数据以满足每个项目的业务需求和特定性。
需要帮助?
如果您需要关于此扩展包的帮助,请联系Kiboko开发团队:hello@kiboko.fr 或 +33 (0)471 027 223。我们于巴黎时间上午9点至12:30和下午2点至5点开放。
如何:创建自定义引用数据
Kiboko实体助手特质
我们为构成大多数自定义实体引用数据的大部分常见属性构建了3个助手特质。
这三个都是可翻译的,并使用优化的UX在同时使用大量地区。
自定义实体
首先,您需要创建自定义实体类,以下示例中我们将它称为Pictogram
。
<?php namespace MyProject\Bundle\PictogramBundle\Entity; use Doctrine\Common\Collections\ArrayCollection; use Kiboko\Bundle\EnrichBundle\Model\DescribedInterface; use Kiboko\Bundle\EnrichBundle\Model\DescribedTrait; use Kiboko\Bundle\EnrichBundle\Model\LabeledInterface; use Kiboko\Bundle\EnrichBundle\Model\PicturedInterface; use Kiboko\Bundle\EnrichBundle\Model\PicturedTrait; use Kiboko\Bundle\EnrichBundle\Model\LabeledTrait; use Kiboko\Bundle\EnrichBundle\Model\TranslatableCustomEntityTrait; use Akeneo\Component\Localization\Model\TranslatableInterface; use Pim\Component\ReferenceData\Model\ReferenceDataInterface; class Pictogram implements TranslatableInterface, ReferenceDataInterface, DescribedInterface, LabeledInterface, PicturedInterface { use TranslatableCustomEntityTrait; use DescribedTrait; use LabeledTrait; use PicturedTrait; /** * Pictogram constructor. */ public function __construct() { $this->translations = new ArrayCollection(); } /** * Returns the custom entity name used in the configuration * Used to map row actions on datagrid * * @return string */ public function getCustomEntityName() { return 'pictogram'; } /** * Get translation full qualified class name * * @return string */ public function getTranslationFQCN() { return PictogramTranslation::class; } /** * @return string */ public static function getLabelProperty() { return 'label'; } /** * @return string */ public static function getFallbackLabelProperty() { return 'labelFallback'; } }
如您所注意到的,该类实现了五个接口
ReferenceDataInterface
和TranslatableInterface
来自Akeneo扩展包。如果您需要更多关于它们的信息,请参阅它们的文档:https://docs.akeneo.com/1.7/index.html。DescribedInterface
、LabeledInterface
和PicturedInterface
由本扩展包提供作为助手
接口的默认实现是通过特质完成的
TranslatableCustomEntityTrait
,用于TranslatableInterface
和ReferenceDataInterface
的具体实现DescribedTrait
用于DescribedInterface
的实现LabeledTrait
用于LabeledInterface
的实现PicturedTrait
用于PicturedInterface
的实现
请参阅CustomEntityBundle文档了解示例中声明的其他方法的说明。
自定义实体翻译
如果您想要管理翻译,您需要创建自定义实体翻译类,以下示例中我们将它称为PictogramTranslation
。
<?php namespace MyProject\Bundle\PictogramBundle\Entity; use Akeneo\Component\Localization\Model\AbstractTranslation; use Kiboko\Bundle\EnrichBundle\Model\DescribedTranslationTrait; use Kiboko\Bundle\EnrichBundle\Model\LabeledTranslationTrait; use Kiboko\Bundle\EnrichBundle\Model\PicturedTranslationTrait; class PictogramTranslation extends AbstractTranslation implements LabeledTranslationInterface, DescribedTranslationInterface, PicturedTranslationInterface { use DescribedTranslationTrait; use LabeledTranslationTrait; use PicturedTranslationTrait; }
该类扩展了CustomEntityBundle文档中所述的AbstractTranslation
。
它还必须实现翻译接口并使用相应的翻译助手特质
LabeledTranslationTrait
用于LabeledTranslationInterface
的实现DescribedTranslationTrait
用于DescribedTranslationInterface
的实现PicturedTranslationTrait
用于PicturedTranslationInterface
的实现
Doctrine配置
在doctrine文件夹中,在Resources/config/doctrine/Pictogram.orm.yml
中创建自定义实体映射
MyProject\Bundle\PictogramBundle\Entity\Pictogram: type: entity table: my_pictogram repositoryClass: Pim\Bundle\CustomEntityBundle\Entity\Repository\TranslatableCustomEntityRepository changeTrackingPolicy: DEFERRED_EXPLICIT fields: id: type: integer id: true generator: strategy: AUTO code: type: string length: 100 unique: true labelFallback: type: string length: 100 nullable: true descriptionFallback: type: text nullable: true created: type: datetime gedmo: timestampable: on: create updated: type: datetime gedmo: timestampable: on: update oneToMany: translations: targetEntity: MyProject\Bundle\PictogramBundle\Entity\PictogramTranslation mappedBy: foreignKey cascade: - persist - detach oneToOne: pictureFallback: targetEntity: Akeneo\Component\FileStorage\Model\FileInfo joinColumn: name: picture_id referencedColumnName: id onDelete: CASCADE cascade: - persist
对于pictureFallback
字段,需要一个到FileInfo
模型的oneToOne关系。
为了管理翻译,需要一个oneToMany关系。
如果您想管理翻译,您还需要在 Resources/config/doctrine/PictogramTranslation.orm.yml
中为翻译实体创建映射。
MyProject\Bundle\PictogramBundle\Entity\PictogramTranslation: type: entity table: my_pictogram_translation changeTrackingPolicy: DEFERRED_EXPLICIT uniqueConstraints: locale_foreign_key_idx: columns: - locale - foreign_key fields: id: type: integer id: true generator: strategy: AUTO label: type: string length: 100 nullable: true description: type: text nullable: true locale: type: string length: 20 manyToOne: foreignKey: targetEntity: MyProject\Bundle\PictogramBundle\Entity\Pictogram inversedBy: pictograms joinColumns: foreign_key: referencedColumnName: id onDelete: CASCADE oneToOne: picture: targetEntity: Akeneo\Component\FileStorage\Model\FileInfo joinColumn: name: picture_id referencedColumnName: id onDelete: CASCADE cascade: [ persist ]
再次强调,对于 picture
字段,需要一个与 FileInfo
模型的一对一关系。
别忘了创建迁移文件或更新您的模式
app/console doctrine:migration:diff
(推荐使用)app/console doctrine:schema:update --force
(危险的,仅适用于高级用户)
数据网格配置
您的自定义实体现在已声明,您需要实现数据网格配置和表单映射。
在您的包中创建一个名为 datagrid 的文件夹,在其中创建 yaml 文件:Resources/config/datagrid/pictogram.yml
以下部分配置了要使用的自定义引用数据实体。
datagrid: pictogram: extends: pictogram-entity-grid options: entityHint: pictogram locale_parameter: localeCode source: type: pim_datasource_default entity: MyProject\Bundle\PictogramBundle\Entity\Pictogram repository_method: createDatagridQueryBuilder columns: code: label: Code labelFallback: label: Label localizedLabel: label: Localized Label data_name: translation.label pictureFallback: label: Picture type: twig template: 'KibokoEnrichBundle:Datagrid:pictureColumn.html.twig' data_name: pictureFallback frontend_type: html created: label: Created type: product_value_datetime frontend_type: datetime updated: label: Updated type: product_value_datetime frontend_type: datetime properties: id: ~ edit_link: type: url route: pim_customentity_edit params: - id - customEntityName delete_link: type: url route: pim_customentity_delete params: - id - customEntityName actions: edit: type: navigate label: Edit the pictogram icon: edit link: edit_link rowAction: true delete: type: delete label: Delete the pictogram icon: trash link: delete_link filters: columns: code: type: string label: Code data_name: rd.code labelFallback: type: string label: Label data_name: rd.labelFallback created: type: date label: Created data_name: rd.created filter_by_having: true updated: type: date label: Updated data_name: rd.udapted filter_by_having: true sorters: columns: code: data_name: rd.code labelFallback: data_name: rd.labelFallback created: data_name: rd.created updated: data_name: rd.udapted default: code: '%oro_datagrid.extension.orm_sorter.class%::DIRECTION_ASC'
为创建和编辑创建表单类型
在您的包中创建一个名为 Form 的文件夹,并创建一个子文件夹 Type。
在此文件夹内创建一个扩展 CustomEntityType 的自定义实体类型类。
在我们的例子中,我们将其命名为 PictogramType。
<?php namespace MyProject\Bundle\PictogramBundle\Form\Type; use Kiboko\Bundle\EnrichBundle\Form\EventListener\PicturedFormListener; use Pim\Bundle\CustomEntityBundle\Form\Type\CustomEntityType; use Pim\Bundle\EnrichBundle\Form\Subscriber\DisableFieldSubscriber; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class PictogramType extends CustomEntityType { private $formListener; public function __construct(PicturedFormListener $formListener) { $this->formListener = $formListener; } public function buildForm(FormBuilderInterface $builder, array $options) { parent::buildForm($builder, $options); $builder ->add( 'labelFallback', 'text', [ 'label' => 'my_pictogram.form.field.labelFallback.label' ] ) ->add( 'label', 'pim_translatable_field', [ 'label' => 'my_pictogram.form.field.label.label', 'field' => 'label', 'translation_class' => $options['translation_class'], 'entity_class' => $options['data_class'], 'property_path' => 'translations', ] ) ->add( 'descriptionFallback', 'textarea', [ 'label' => 'my_pictogram.form.field.descriptionFallback.label' ] ) ->add( 'description', 'pim_translatable_field', [ 'label' => 'my_pictogram.form.field.description.label', 'field' => 'description', 'translation_class' => $options['translation_class'], 'entity_class' => $options['data_class'], 'property_path' => 'translations', 'widget' => 'textarea' ] ) ->add( 'pictureFallback', 'kiboko_enrich_media', [ 'label' => 'my_pictogram.form.field.pictureFallback.label', ] ) ->add( 'picture', 'kiboko_translatable_field', [ 'label' => 'my_pictogram.form.field.picture.label', 'field' => 'picture', 'translation_class' => $options['translation_class'], 'entity_class' => $options['data_class'], 'property_path' => 'translations', 'widget' => 'kiboko_enrich_media' ] ) ->addEventSubscriber(new DisableFieldSubscriber('code')) ->addEventSubscriber($this->formListener); } /** * {@inheritdoc} */ public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setRequired(['translation_class']); } public function getName() { return 'my_pictogram'; } }
对于您要使用的每个 kiboko 模型,您需要将正确的映射添加到您的表单构建器中。
在我们的例子中,我们映射了标签、描述和图片模型及其相应的翻译字段。
此类还需要实现
getName()
:返回表单自定义实体类型名称setDefaultOption(OptionsResolverInterface $resolver)
:需要管理模型翻译
现在让我们看看如何配置 doctrine 以使用我们的自定义实体。
表单类型配置文件
在您的包的 config 文件夹中创建一个名为 'form_types.yml' 的 yaml 文件。
Resources/config/form_types.yml
这是您需要将表单类型映射到自定义数据引用实体的地方。
parameters: my_pictogram.form.type.pictogram.class: MyProject\Bundle\PictogramBundle\Form\Type\PictogramType services: my_pictogram.form.type.pictogram: class: '%my_pictogram.form.type.pictogram.class%' arguments: ['@kiboko_enrich.form.event_subscriber'] tags: - { name: form.type, alias: my_pictogram }
自定义实体配置文件
在您的包的 config 文件夹中创建一个名为 'custom_entities.yml' 的 yaml 文件。
Resources/config/custom_entities.yml
这是您需要定义用于您的数据网格中每个操作的服务的位置。
custom_entities: pictogram: entity_class: MyProject\Bundle\PictogramBundle\Entity\Pictogram actions: index: service: pim_custom_entity.action.index create: form_type: my_pictogram form_options: translation_class: MyProject\Bundle\PictogramBundle\Entity\PictogramTranslation service: pim_custom_entity.action.create template: MyPictogramBundle:Pictogram:form.html.twig edit: form_type: my_pictogram form_options: translation_class: MyProject\Bundle\PictogramBundle\Entity\PictogramTranslation service: pim_custom_entity.action.edit template: MyPictogramBundle:Pictogram:form.html.twig
表单视图
现在您可以创建自定义实体表单视图了。
在您的包的 views 文件夹中创建一个名为 form.html.twig
的 twig 文件,如自定义实体配置文件中指定。
Resources/views/Pictogram/form.html.twig
{% extends 'PimCustomEntityBundle:CustomEntity:form.html.twig' %} {% form_theme form.labelFallback 'KibokoEnrichBundle:CustomReferenceData:form/label.html.twig' %} {% form_theme form.descriptionFallback 'KibokoEnrichBundle:CustomReferenceData:form/description.html.twig' %} {% form_theme form.pictureFallback 'KibokoEnrichBundle:CustomReferenceData:form/picture.html.twig' %} {% form_theme form.label 'KibokoEnrichBundle:CustomReferenceData:form/pim_translatable_field_row.html.twig' %} {% form_theme form.description 'KibokoEnrichBundle:CustomReferenceData:form/pim_translatable_field_row.html.twig' %} {% form_theme form.picture with [ 'KibokoEnrichBundle:CustomReferenceData:form/pim_translatable_field_row.html.twig', 'KibokoEnrichBundle:CustomReferenceData:form/picture.html.twig' ] %} {% block custom_entity_form_tabs %} <div class="AknTabContainer"> {{ elements.form_navbar(['properties']) }} <div class="AknTabContainer-content tab-content"> {{ elements.form_errors(form) }} <div class="tab-pane active" id="properties"> {% block custom_entity_form_properties %} <div class="tabsections"> <div class="tabsection"> <div class="tabsection-title">{{ 'pane.accordion.general_properties' | trans }}</div> <div class="tabsection-content"> <div class="AknFormContainer AknFormContainer--withPadding"> {{ form_row(form.code) }} {{ form_row(form.labelFallback) }} {{ form_row(form.label, {'attr': {'class': 'labelBlock'}}) }} {{ form_row(form.descriptionFallback) }} {{ form_row(form.description, {'attr': {'class': 'descriptionBlock'}}) }} {{ form_row(form.pictureFallback) }} {{ form_row(form.picture, {'attr': {'class': 'pictureBlock', 'displayFolder': false}}) }} </div> </div> </div> </div> {% endblock %} </div> </div> </div> <style> .labelBlock, .descriptionBlock, .pictureBlock.AknFieldContainer { display: none; width: 500px; margin-left: 400px; background-color: white; border: 1px solid rgb(238, 238, 238); padding: 10px; } .labelBlock:after, .descriptionBlock:after, .pictureBlock.AknFieldContainer:after { clear: both; } </style> <script type="text/javascript"> require(['jquery'], function($) { var labelFolder = $('#labelFallbackFolder'); var descriptionFolder = $('#descriptionFallbackFolder'); var pictureFolder = $('#pictureFallbackFolder'); labelFolder.click(function() { if(labelFolder.hasClass('icon-folder-close')) { labelFolder.removeClass('icon-folder-close').addClass('icon-folder-open'); }else { labelFolder.removeClass('icon-folder-open').addClass('icon-folder-close'); } $('.labelBlock').toggle(); }); descriptionFolder.click(function() { if(descriptionFolder.hasClass('icon-folder-close')) { descriptionFolder.removeClass('icon-folder-close').addClass('icon-folder-open'); }else { descriptionFolder.removeClass('icon-folder-open').addClass('icon-folder-close'); } $('.descriptionBlock').toggle(); }); pictureFolder.click(function() { if(pictureFolder.hasClass('icon-folder-close')) { pictureFolder.removeClass('icon-folder-close').addClass('icon-folder-open'); }else { pictureFolder.removeClass('icon-folder-open').addClass('icon-folder-close'); } $('.pictureBlock.AknFieldContainer').toggle(); }); }); </script> {% endblock %}
Kiboko,我们是谁?
Kiboko 是一家电子商务和商业解决方案的咨询和开发公司,由三位经验丰富的电子商务开发者联合创立,他们致力于各种规模的电子商务网站。根据您的业务需求,Kiboko 使用 Magento 和 OroCommerce 开发和维护电子商务网店。Kiboko 还将 Akeneo(PIM)、OroCRM(CRM)和 Marello(ERP)集成到现有的环境或新环境中,以满足您的业务需求。Kiboko 是首批将 OroCommerce 作为真正的 B2B 电子商务解决方案的信任公司之一,也是首批发布使用它运行的网店的公司之一。
贡献
请随意在 Github 上创建 新问题