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 上创建 新问题



