├── .circleci ├── config.yml ├── list_jobs.jpg └── list_workflows.jpg ├── .github ├── CONTRIBUTING.md └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── .platform.app.yaml ├── .platform ├── routes.yaml └── services.yaml ├── Dockerfile ├── Makefile ├── README.md ├── _images ├── logo.png ├── reference_entities │ ├── create_simple_metric_attribute.png │ ├── custom_property_simple_metric_attribute.png │ ├── display_grid_custom_property_simple_metric_attribute.png │ ├── edit_simple_metric_attribute.png │ ├── edit_simple_metric_attribute_property.png │ └── enrich_record_simple_metric_attribute.png └── xdebug │ └── phpstorm-xdebug.png ├── _themes └── akeneo │ ├── _github.html │ ├── _versions.html │ ├── layout.html │ ├── static │ ├── css │ │ ├── font-awesome.min.css │ │ └── variables-43bf553955.css │ ├── favicon.ico │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ ├── img │ │ ├── akene36.png │ │ ├── akeneo.svg │ │ └── icons │ │ │ ├── icon--check.png │ │ │ ├── icon--down.svg │ │ │ ├── icon--search.svg │ │ │ └── icons.svg │ └── js │ │ ├── akeneostyle.js │ │ ├── bootstrap.min.js │ │ ├── jquery.min.js │ │ └── versions.js │ └── theme.conf ├── akeneo_overview.png ├── cloud_edition ├── common │ └── images │ │ └── akeneo_illustration_ziggy.png ├── flexibility_mode │ ├── docs │ │ ├── composer_settings.rst │ │ ├── crontasks.rst │ │ ├── disk_usage.rst │ │ ├── environments_access.rst │ │ ├── job_consumers_and_workers.rst │ │ └── system_administration.rst │ ├── images │ │ └── flexibility_mode.png │ └── index.rst ├── index.rst └── serenity_mode │ └── index.rst ├── conf.py ├── contribute_to_pim ├── contribution_guide.rst ├── create_connector.rst ├── crowdin-logo.png ├── documentation.rst ├── feature_request.rst.inc ├── front.rst ├── index.rst ├── nelson.png ├── report.rst ├── report_bug.rst.inc ├── tech_enhancement.rst.inc ├── tests │ ├── establishing_decorator_pattern.rst │ ├── images │ │ ├── PermissionsContext.png │ │ ├── decorator.png │ │ ├── edit.png │ │ └── element.jpg │ ├── index.rst │ └── spin.rst └── translate.rst ├── cve_2022_46157.rst ├── docker-compose.override.yml.dist ├── docker-compose.yml ├── favicon.ico ├── import_and_export_data ├── akeneo_overview.svg ├── batch-item-step.png ├── batch-main-concepts.png ├── connectors.rst ├── formats.rst ├── formats │ ├── association_type.rst │ ├── attribute.rst │ ├── category.rst │ ├── examples │ │ ├── association_type.csv │ │ ├── attribute.csv │ │ ├── attribute_properties.csv │ │ ├── attribute_type.csv │ │ ├── category.csv │ │ ├── family.csv │ │ ├── family_variant.csv │ │ ├── group.csv │ │ ├── option.csv │ │ ├── product.csv │ │ ├── product_model.csv │ │ └── variant_group.csv │ ├── family.rst │ ├── family_variant.rst │ ├── group.rst │ ├── localized-labels.rst │ ├── option.rst │ ├── product.rst │ ├── product_model.rst │ └── scopable-labels.rst ├── guides │ ├── clean-csv-file-during-product-import.rst │ ├── create-connector.rst │ ├── create_connector_edit.png │ ├── index.rst │ └── product-import-from-xml-file.rst ├── index.rst ├── product-export.rst ├── product-import.rst └── simple-import.rst ├── index.rst ├── install_pim ├── customize_dataset │ ├── add_translation_packs.rst │ └── index.rst ├── docker │ └── installation_docker.rst ├── index.rst └── manual │ ├── common_install_initializing_ce_ee.rst.inc │ ├── common_install_setup_ce_ee.rst.inc │ ├── daemon_queue.rst │ ├── events_api.rst │ ├── index.rst │ ├── installation_ce.rst │ ├── installation_ee_archive.rst │ ├── papo │ ├── add_public_key.png │ ├── add_public_key_2.png │ ├── download_archive.png │ ├── download_button.png │ ├── manage_public_keys.png │ ├── permission_add.png │ └── permission_box.png │ ├── partners_portal_archive.rst.inc │ ├── scheduled_job.rst │ ├── security_recommendations.rst │ └── system_requirements │ ├── manual_system_installation_debian11.rst │ ├── system_configuration.rst.inc │ ├── system_install_ubuntu_2204.rst │ ├── system_requirements.rst │ └── system_requirements.rst.inc ├── logshell_flexv4.rst ├── logshell_flexv5.rst ├── logshell_saas.rst ├── maintain_pim ├── bug_qualification │ └── index.rst ├── common_issues │ └── index.rst ├── first_aid_kit │ ├── clear_browser_cache.rst.inc │ ├── deploy_assets.rst.inc │ └── index.rst ├── index.rst ├── purge │ ├── index.rst │ ├── purge_events_api_logs.rst │ ├── purge_job_execution.rst │ └── purge_version_entities.rst ├── scalability_guide │ ├── index.rst │ ├── more_than_100k_products_to_export.rst │ ├── more_than_10k_attributes.rst │ ├── more_than_10k_categories.rst │ ├── more_than_10k_families.rst │ ├── more_than_1GB_of_product_media_to_export.rst │ ├── more_than_500_attributes_usable_in_product_grid.rst │ └── representative_catalogs.rst └── unicorn-akeneo_128.png ├── manipulate_pim_data ├── catalog_structure │ ├── creating_a_reference_data.rst │ └── index.rst ├── connect │ └── configure_event_subscription_network.rst ├── define-acl.rst ├── index.rst ├── mass_edit.rst ├── mass_edition │ ├── operation-group-dropdown.png │ ├── register_a_new_bulk_action.rst │ └── register_a_new_mass_edit_action.rst ├── measurement │ └── configure_measurement_limits.rst ├── non-product │ ├── create.rst │ ├── index.rst │ ├── query.rst │ ├── remove.rst │ ├── save.rst │ ├── update.rst │ └── validate.rst ├── product │ ├── create.rst │ ├── index.rst │ ├── query.rst │ ├── remove.rst │ ├── save.rst │ ├── update.rst │ └── validate.rst ├── rule │ ├── add_custom_action_rule_engine.rst │ ├── general_information_on_rule_format.rst │ └── index.rst ├── store_assets_externally.rst └── teamwork_assistant │ ├── activate_loggable_step.rst │ ├── add_project_remover.rst │ ├── calculation_step.rst │ ├── customize_notification.rst │ └── index.rst ├── migrate_pim ├── apply_patch │ ├── apply_patch_ce.rst │ ├── apply_patch_ee_flexibility.rst │ ├── apply_patch_ee_on_premise.rst │ └── index.rst ├── changelog.rst ├── index.rst ├── migrate_to_saas.rst ├── upgrade │ ├── upgrade_from_32_to_40.rst │ ├── upgrade_from_40_to_50.rst │ ├── upgrade_from_50_to_60.rst │ └── upgrade_from_60_to_70.rst └── upgrade_major_version.rst ├── onboarder ├── common │ └── images │ │ └── logo-onboarder.png ├── index.rst ├── installation │ ├── define_environment_variables │ │ ├── dot_env_component.rst │ │ ├── index.rst │ │ └── system_environment_variables.rst │ └── index.rst ├── patch_and_minor │ ├── index.rst │ ├── update_ee_flexibility.rst │ └── update_ee_on_premise.rst ├── prerequisites │ └── index.rst ├── synchronization │ └── index.rst ├── troubleshooting │ ├── images │ │ └── check_pub_sub_access_command_response.png │ └── index.rst ├── uninstall │ └── index.rst └── upgrade_major │ └── index.rst ├── reference_entities ├── add_custom_property_to_your_custom_attribute_type.rst ├── configure_entity_limits.rst ├── create_new_attribute_type.rst ├── enrich_a_record_with_new_attribute_type.rst ├── index.rst └── refresh_records.rst ├── robots.txt ├── scripts └── update-doc-versions.php ├── src └── Acme │ └── Bundle │ ├── AppBundle │ └── AcmeAppBundle.php │ ├── CatalogBundle │ ├── AcmeCatalogBundle.php │ ├── DependencyInjection │ │ └── AcmeCatalogExtension.php │ ├── Entity │ │ ├── Category.php │ │ ├── CategoryTranslation.php │ │ ├── Color.php │ │ ├── ColorTranslation.php │ │ ├── MyProductValue.php │ │ └── TranslatableCategory.php │ ├── Form │ │ └── Type │ │ │ ├── CategoryType.php │ │ │ └── TranslatableCategoryType.php │ └── Resources │ │ └── config │ │ ├── attribute_types.yml │ │ ├── doctrine │ │ ├── Category.orm.yml │ │ ├── CategoryTranslation.orm.yml │ │ ├── Color.orm.yml │ │ ├── ColorTranslation.orm.yml │ │ ├── MyProductValue.orm.yml │ │ └── TranslatableCategory.orm.yml │ │ ├── entities.yml │ │ ├── form_types.yml │ │ └── validation │ │ ├── attribute.yml │ │ └── category.yml │ ├── CsvCleanerConnectorBundle │ ├── AcmeCsvCleanerConnectorBundle.php │ ├── ArrayConverter │ │ └── StandardToFlat │ │ │ └── Product.php │ ├── DependencyInjection │ │ └── AcmeCsvCleanerConnectorExtension.php │ └── Resources │ │ ├── config │ │ ├── array_converters.yml │ │ ├── job_constraints.yml │ │ ├── job_defaults.yml │ │ ├── job_parameters.yml │ │ ├── jobs.yml │ │ ├── readers.yml │ │ └── steps.yml │ │ ├── fixtures │ │ └── products.csv │ │ └── translations │ │ └── messages.en.yml │ ├── CustomMassActionBundle │ ├── AcmeCustomMassActionBundle.php │ ├── Connector │ │ └── Processor │ │ │ └── MassEdit │ │ │ └── Product │ │ │ └── CapitalizeValuesProcessor.php │ ├── DependencyInjection │ │ └── AcmeCustomMassActionExtension.php │ ├── Form │ │ └── Type │ │ │ └── MassEditAction │ │ │ └── CapitalizeValuesType.php │ ├── MassEditAction │ │ └── Operation │ │ │ └── CapitalizeValues.php │ └── Resources │ │ ├── config │ │ ├── form_types.yml │ │ ├── job_parameters.yml │ │ ├── jobs.yml │ │ ├── mass_actions.yml │ │ ├── processors.yml │ │ └── steps.yml │ │ ├── fixtures │ │ └── jobs.yml │ │ └── translations │ │ └── messages.en.yml │ ├── EnrichBundle │ ├── AcmeEnrichBundle.php │ ├── DependencyInjection │ │ └── AcmeEnrichExtension.php │ ├── Form │ │ └── Type │ │ │ └── ColorType.php │ └── Resources │ │ └── config │ │ ├── custom_entities.yml │ │ ├── datagrid.yml │ │ ├── form_types.yml │ │ ├── navigation.yml │ │ └── view_elements │ │ ├── attribute.yml │ │ └── category.yml │ ├── InstallerBundle │ ├── AcmeInstallerBundle.php │ ├── DependencyInjection │ │ └── AcmeInstallerExtension.php │ ├── Resources │ │ ├── config │ │ │ ├── fixtures.yml │ │ │ └── processors.yml │ │ └── fixtures │ │ │ └── mydataset │ │ │ ├── attribute_groups.yml │ │ │ ├── attributes.yml │ │ │ ├── categories.yml │ │ │ ├── channels.csv │ │ │ ├── colors.csv │ │ │ ├── currencies.yml │ │ │ ├── group_types.yml │ │ │ ├── locales.yml │ │ │ └── users.yml │ └── Ressources │ │ └── fixtures │ │ └── icecat_demo_dev │ │ └── jobs.yml │ ├── NotifyConnectorBundle │ ├── AcmeNotifyConnectorBundle.php │ ├── DependencyInjection │ │ └── AcmeNotifyConnectorExtension.php │ ├── JobParameters │ │ └── ProductCsvExportNotify.php │ ├── Resources │ │ ├── config │ │ │ ├── form_extensions │ │ │ │ ├── csv_product_export_notify_edit.yml │ │ │ │ └── csv_product_export_notify_show.yml │ │ │ ├── job_parameters.yml │ │ │ ├── jobs.yml │ │ │ ├── providers.yml │ │ │ └── steps.yml │ │ └── translations │ │ │ └── messages.en.yml │ └── Step │ │ └── NotifyStep.php │ └── XmlConnectorBundle │ ├── AcmeXmlConnectorBundle.php │ ├── Archiver │ └── XmlInvalidItemWriter.php │ ├── DependencyInjection │ └── AcmeXmlConnectorExtension.php │ ├── Job │ └── JobParameters │ │ └── SimpleXmlImport.php │ ├── Reader │ └── File │ │ ├── XmlFileIterator.php │ │ └── XmlProductReader.php │ ├── Resources │ ├── config │ │ ├── archiving.yml │ │ ├── form_extensions │ │ │ └── job_instance │ │ │ │ ├── xml_product_import_edit.yml │ │ │ │ └── xml_product_import_show.yml │ │ ├── job_parameters.yml │ │ ├── jobs.yml │ │ ├── readers.yml │ │ ├── steps.yml │ │ └── writers.yml │ ├── fixtures │ │ └── products.xml │ └── translations │ │ └── messages.en.yml │ └── Writer │ └── XmlWriter.php ├── technical_architecture ├── best_practices │ ├── core │ │ ├── conventions.rst │ │ └── standards.rst │ ├── index.rst │ ├── project.rst │ └── reusable_bundle.rst ├── component-or-bundle.png ├── component-or-bundle.rst.inc ├── event │ └── index.rst ├── events │ ├── index.rst │ ├── storage_events.rst │ └── workflow_events.rst ├── index.rst ├── localization │ ├── change_pim_locale.rst │ ├── how_to_use_the_localizers.rst │ ├── how_to_use_the_presenters.rst │ └── index.rst ├── notification │ └── add.rst ├── performances_guide │ ├── batch_page_size.rst │ ├── index.rst │ ├── php7_hhvm.rst │ ├── rules_execution_memory_usage.rst │ └── work_with_wysiwyg.rst ├── rest_api │ ├── configure-rest.png │ └── get-product.rst ├── standard_format │ ├── index.rst │ ├── other_entities.rst │ └── products.rst └── technical_information │ ├── application_technical_dependencies.rst │ ├── client_side_compatibilities.rst │ ├── flow_matrix.rst │ ├── index.rst │ ├── operation_processes.rst │ ├── php_ini.rst.inc │ ├── recommended_configuration.rst │ └── server_side_setup_for_hosting.rst ├── technical_overview ├── index.rst ├── product_information │ └── index.rst ├── teamwork_assistant │ ├── behat_permission_summary.rst │ ├── catalog_impact.rst │ ├── images │ │ └── widget-AM-target-zone.jpg │ ├── index.rst │ ├── project_completeness.rst │ ├── project_creation.rst │ ├── scalability_guide.rst │ └── widget_extension_points.rst └── workflow │ ├── img │ ├── partial-approve.png │ ├── partial-workflow.gliffy.json │ ├── simple-workflow.gliffy.json │ └── simple-workflow.png │ ├── index.rst │ ├── partial_workflow.rst │ └── simple_workflow.rst ├── troubleshooting └── index.rst └── use_sso_authentication ├── common └── images │ └── wikimedia-saml2-browser-sso-redirect-post.png └── index.rst /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | jobs: 3 | build: 4 | machine: 5 | image: ubuntu-2204:current 6 | steps: 7 | - checkout 8 | - run: make build 9 | 10 | check-external-link: 11 | machine: 12 | image: ubuntu-2204:current 13 | steps: 14 | - checkout 15 | - run: make lint 16 | 17 | deploy_staging: 18 | machine: 19 | image: ubuntu-2204:current 20 | steps: 21 | - checkout 22 | - add_ssh_keys 23 | - run: 24 | name: Deploy on staging server 25 | command: DEPLOY_HOSTNAME=$STAGING_HOSTNAME DEPLOY_PORT=$STAGING_PORT VERSION="master" make deploy 26 | 27 | deploy_production: 28 | machine: 29 | image: ubuntu-2204:current 30 | steps: 31 | - checkout 32 | - add_ssh_keys 33 | - run: 34 | name: Deploy on production server 35 | command: DEPLOY_HOSTNAME=$PROD_HOSTNAME DEPLOY_PORT=$PROD_PORT VERSION="master" make deploy 36 | 37 | workflows: 38 | version: 2 39 | pull_request: 40 | jobs: 41 | - build: 42 | filters: 43 | branches: 44 | ignore: 45 | - master 46 | 47 | deployment: 48 | jobs: 49 | - deploy_staging: 50 | filters: 51 | branches: 52 | only: master 53 | - approve_to_deploy_in_production: 54 | type: approval 55 | requires: 56 | - deploy_staging 57 | - deploy_production: 58 | requires: 59 | - approve_to_deploy_in_production 60 | 61 | nightly: 62 | triggers: 63 | - schedule: 64 | cron: "0 2 * * *" 65 | filters: 66 | branches: 67 | only: 68 | - "master" 69 | jobs: 70 | - check-external-link 71 | -------------------------------------------------------------------------------- /.circleci/list_jobs.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/.circleci/list_jobs.jpg -------------------------------------------------------------------------------- /.circleci/list_workflows.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/.circleci/list_workflows.jpg -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Please read and sign the following contributor agreement https://www.akeneo.com/contributor-license-agreement/ 2 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | **Description** 8 | 9 | 10 | 11 | **Definition Of Done** 12 | 13 | | Q | A 14 | | --------------------------------- | --- 15 | | Technical Review and 2 GTM | Todo 16 | | English Review and 1 GTM | Todo 17 | 18 | 19 | `Todo`: Pending / Work in progress 20 | `OK`: Done / Validated 21 | `-`: Not needed 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /pim-docs-build/ 2 | /pim-docs-lint/ 3 | /docker-compose.override.yml 4 | /ee_dev/ 5 | .vscode 6 | _build/ 7 | -------------------------------------------------------------------------------- /.platform.app.yaml: -------------------------------------------------------------------------------- 1 | # This file describes an application. You can have multiple applications 2 | # in the same project. 3 | 4 | # The name of this app. Must be unique within a project. 5 | name: akeneodocs 6 | 7 | # The toolstack used to build the application. 8 | type: "python:2.7" 9 | 10 | build: 11 | flavor: "none" 12 | 13 | variables: 14 | env: 15 | PIM_VERSION: $PLATFORM_BRANCH 16 | PIM_VERSIONS: $PLATFORM_BRANCH 17 | 18 | # The configuration of app when it is exposed to the web. 19 | web: 20 | # The public directory of the app, relative to its root. 21 | document_root: "/build/" 22 | index_files: 23 | - index.html 24 | whitelist: 25 | - \.html$ 26 | - \.txt$ 27 | 28 | # CSS and Javascript. 29 | - \.css$ 30 | - \.js$ 31 | - \.hbs$ 32 | 33 | # image/* types. 34 | - \.gif$ 35 | - \.png$ 36 | - \.ico$ 37 | - \.svgz?$ 38 | 39 | # fonts types. 40 | - \.ttf$ 41 | - \.eot$ 42 | - \.woff$ 43 | - \.otf$ 44 | 45 | # robots.txt. 46 | - /robots\.txt$ 47 | 48 | # The size of the persistent disk of the application (in MB). 49 | disk: 256 50 | 51 | # Build time dependencies. 52 | dependencies: 53 | python: 54 | virtualenv: 15.1.0 55 | 56 | # The hooks that will be performed when the package is deployed. 57 | hooks: 58 | build: | 59 | virtualenv .virtualenv 60 | . .virtualenv/bin/activate 61 | # Platform.sh currently sets PIP_USER=1. 62 | export PIP_USER= 63 | pip install sphinx~=1.8.5 64 | pip install git+https://github.com/fabpot/sphinx-php.git 65 | pip install git+https://github.com/mickaelandrieu/sphinxcontrib.youtube.git 66 | 67 | export PIM_VERSION=$PLATFORM_BRANCH 68 | export PIM_VERSIONS=$PLATFORM_BRANCH 69 | sphinx-build -b html . ./build 70 | -------------------------------------------------------------------------------- /.platform/routes.yaml: -------------------------------------------------------------------------------- 1 | "http://{default}/": 2 | type: upstream 3 | upstream: "akeneodocs:http" 4 | -------------------------------------------------------------------------------- /.platform/services.yaml: -------------------------------------------------------------------------------- 1 | # This file MUST exist 2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM akeneo/pim-php-dev:8.1 2 | WORKDIR /home/akeneo/pim-docs/ 3 | ENV DEBIAN_FRONTEND=noninteractive 4 | 5 | RUN echo 'APT::Install-Recommends "0" ; APT::Install-Suggests "0" ;' > /etc/apt/apt.conf.d/01-no-recommended && \ 6 | echo 'path-exclude=/usr/share/man/*' > /etc/dpkg/dpkg.cfg.d/path_exclusions && \ 7 | echo 'path-exclude=/usr/share/doc/*' >> /etc/dpkg/dpkg.cfg.d/path_exclusions && \ 8 | apt-get update && \ 9 | apt-get install -y \ 10 | wget \ 11 | lsb-release \ 12 | ca-certificates \ 13 | gnupg \ 14 | unzip \ 15 | python \ 16 | ssh \ 17 | rsync \ 18 | curl \ 19 | python3-pip && \ 20 | apt-get clean && apt-get --yes --quiet autoremove --purge && \ 21 | rm -rf /var/lib/apt/lists/* /var/log/* /tmp/* /usr/share/locale/* 22 | 23 | RUN pip3 install --upgrade setuptools wheel 24 | RUN pip3 install --upgrade sphinx 25 | 26 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | UID = $(shell id -u) 2 | GID = $(shell id -g) 3 | DOCKER_IMAGE = pim-docs 4 | DOCKER_RUN = docker run -it --rm -u $(UID):$(GID) -v /etc/passwd:/etc/passwd:ro -v $(PWD):/home/akeneo/pim-docs/data 5 | DOCKER_RSYNC = $(DOCKER_RUN) -v $${SSH_AUTH_SOCK}:/ssh-auth.sock:ro -e SSH_AUTH_SOCK=/ssh-auth.sock $(DOCKER_IMAGE) rsync -e "ssh -q -p $${DEPLOY_PORT} -o StrictHostKeyChecking=no" -qarz --delete 6 | 7 | .DEFAULT_GOAL := build 8 | .PHONY: build, deploy, docker-build, update-versions 9 | 10 | build: lint 11 | # Flags used here, not in `make html`: 12 | # -n Run in nit-picky mode. Currently, this generates warnings for all missing references. 13 | # -W Turn warnings into errors. This means that the build stops at the first warning and sphinx-build exits with exit status 1. 14 | # -T Displays the full stack trace if an unhandled exception occurs. 15 | # -b Linkcheck builder checks for broken links. 16 | $(DOCKER_RUN) $(DOCKER_IMAGE) sphinx-build -nWT -b html /home/akeneo/pim-docs/data /home/akeneo/pim-docs/data/pim-docs-build 17 | @echo "\nYou are now ready to check the documentation locally in the directory \"pim-docs-build/\" and to deploy it with \"DEPLOY_HOSTNAME=foo.com DEPLOY_PORT=1985 VERSION=bar make deploy\"." 18 | 19 | deploy: build update-versions 20 | $(DOCKER_RUN) -v $${SSH_AUTH_SOCK}:/ssh-auth.sock:ro -e SSH_AUTH_SOCK=/ssh-auth.sock $(DOCKER_IMAGE) rsync -e "ssh -q -p $${DEPLOY_PORT} -o StrictHostKeyChecking=no" -qarz --delete /home/akeneo/pim-docs/data/pim-docs-build/ akeneo@$${DEPLOY_HOSTNAME}:/var/www/${VERSION} 21 | 22 | lint: docker-build 23 | rm -rf pim-docs-build && mkdir pim-docs-build 24 | rm -rf pim-docs-lint && mkdir pim-docs-lint 25 | $(DOCKER_RUN) -v $(PWD):/home/akeneo/pim-docs/data $(DOCKER_IMAGE) sphinx-build -nWT -b linkcheck /home/akeneo/pim-docs/data /home/akeneo/pim-docs/data/pim-docs-lint 26 | 27 | docker-build: 28 | docker build . --tag $(DOCKER_IMAGE) 29 | 30 | update-versions: 31 | $(DOCKER_RSYNC) akeneo@$${DEPLOY_HOSTNAME}:/var/www/versions.json /home/akeneo/pim-docs/data 32 | $(DOCKER_RUN) -w /home/akeneo/pim-docs/data $(DOCKER_IMAGE) php scripts/update-doc-versions.php $(CIRCLE_BRANCH) versions.json 33 | $(DOCKER_RSYNC) /home/akeneo/pim-docs/data/versions.json akeneo@$${DEPLOY_HOSTNAME}:/var/www/ 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Akeneo PIM Documentation 2 | 3 | The Akeneo PIM documentation 4 | 5 | ## Build the documentation 6 | 7 | Install [Docker](https://docs.docker.com/engine/installation/). 8 | 9 | Then `make build`. 10 | 11 | The docs will be built into `./pim-docs-build`. 12 | 13 | ## Deploy the documentation 14 | 15 | ### With Circle CI (recommended) 16 | 17 | Once you merge a PR into the `master` branch, it is automatically deployed on the staging server. In order to deploy it in production, please follow these steps: 18 | 19 | - Check the staging environment if everything is ok to be deployed in production 20 | - Open [the list of merged PR in master branch](https://circleci.com/gh/akeneo/workflows/pim-docs/tree/master) in Circle CI. You have to be connected with your Github account. 21 | - Click on the first row which should be "On hold" 22 | 23 | ![List of merged PR in master](.circleci/list_workflows.jpg) 24 | 25 | - Click on the box "approve_to_deploy_in_production" and approve. It will launch the deployment in production. 26 | 27 | ![List of jobs in a workflow](.circleci/list_jobs.jpg) 28 | 29 | - It's deployed in production in 1 minute! 30 | 31 | ### Local deployment (not recommended) 32 | 33 | Your public SSH key should be deployed on the server (see Ansible configuration). It is strongly recommended to release with the CI process though. 34 | 35 | To deploy what you have built, use `HOSTNAME=foo.com PORT=1985 VERSION=bar make deploy`. 36 | 37 | `HOSTNAME` is the server to deploy the documentation on. 38 | `PORT` is the SSH port to connect to the server. 39 | `VERSION` is the subdirectory of `/var/www/` where the documentation will be deployed on the the server. It should be something like `3.2`, `4.0` or `master`. 40 | 41 | To know the production and staging environments of pim-docs, please read the [inventory](https://github.com/akeneo/ansible/blob/master/inventories/core.inventory). 42 | 43 | 44 | ## Contribution 45 | 46 | Don't hesitate to suggest cookbook ideas via https://github.com/akeneo/pim-docs/issues. 47 | 48 | ## Developer's notes 49 | 50 | - The folder `/_themes/sphinx_rtd_theme` is a clone from https://github.com/snide/sphinx_rtd_theme, and was 51 | updated on 2016-07. If you want to customize the Akeneo theme, please only update `/_theme/akeneo_rtd` theme. 52 | -------------------------------------------------------------------------------- /_images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/_images/logo.png -------------------------------------------------------------------------------- /_images/reference_entities/create_simple_metric_attribute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/_images/reference_entities/create_simple_metric_attribute.png -------------------------------------------------------------------------------- /_images/reference_entities/custom_property_simple_metric_attribute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/_images/reference_entities/custom_property_simple_metric_attribute.png -------------------------------------------------------------------------------- /_images/reference_entities/display_grid_custom_property_simple_metric_attribute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/_images/reference_entities/display_grid_custom_property_simple_metric_attribute.png -------------------------------------------------------------------------------- /_images/reference_entities/edit_simple_metric_attribute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/_images/reference_entities/edit_simple_metric_attribute.png -------------------------------------------------------------------------------- /_images/reference_entities/edit_simple_metric_attribute_property.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/_images/reference_entities/edit_simple_metric_attribute_property.png -------------------------------------------------------------------------------- /_images/reference_entities/enrich_record_simple_metric_attribute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/_images/reference_entities/enrich_record_simple_metric_attribute.png -------------------------------------------------------------------------------- /_images/xdebug/phpstorm-xdebug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/_images/xdebug/phpstorm-xdebug.png -------------------------------------------------------------------------------- /_themes/akeneo/_github.html: -------------------------------------------------------------------------------- 1 | {% if page_source_suffix %} 2 | {% set suffix = page_source_suffix %} 3 | {% else %} 4 | {% set suffix = source_suffix %} 5 | {% endif %} 6 | 7 | {% if meta is defined and meta is not none %} 8 | {% set check_meta = True %} 9 | {% else %} 10 | {% set check_meta = False %} 11 | {% endif %} 12 | 13 | {% if check_meta and 'github_url' in meta %} 14 | {% set display_github = True %} 15 | {% endif %} 16 | 17 | {% if check_meta and 'bitbucket_url' in meta %} 18 | {% set display_bitbucket = True %} 19 | {% endif %} 20 | 21 | {% if display_github %} 22 | {% if check_meta and 'github_url' in meta %} 23 | Join us on Github! 24 | {% else %} 25 | Join us on Github! 26 | {% endif %} 27 | {% endif %} 28 | -------------------------------------------------------------------------------- /_themes/akeneo/_versions.html: -------------------------------------------------------------------------------- 1 | 4 | 5 | 30 | -------------------------------------------------------------------------------- /_themes/akeneo/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/_themes/akeneo/static/favicon.ico -------------------------------------------------------------------------------- /_themes/akeneo/static/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/_themes/akeneo/static/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /_themes/akeneo/static/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/_themes/akeneo/static/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /_themes/akeneo/static/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/_themes/akeneo/static/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /_themes/akeneo/static/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/_themes/akeneo/static/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /_themes/akeneo/static/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/_themes/akeneo/static/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /_themes/akeneo/static/img/akene36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/_themes/akeneo/static/img/akene36.png -------------------------------------------------------------------------------- /_themes/akeneo/static/img/icons/icon--check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/_themes/akeneo/static/img/icons/icon--check.png -------------------------------------------------------------------------------- /_themes/akeneo/static/img/icons/icon--down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /_themes/akeneo/static/img/icons/icon--search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /_themes/akeneo/static/js/versions.js: -------------------------------------------------------------------------------- 1 | var getJSON = function(url, callback) { 2 | var xhr = new XMLHttpRequest(); 3 | xhr.open('GET', url, true); 4 | xhr.responseType = 'json'; 5 | xhr.onload = function() { 6 | var status = xhr.status; 7 | if (status === 200) { 8 | callback(null, xhr.response); 9 | } else { 10 | callback(status, xhr.response); 11 | } 12 | }; 13 | xhr.send(); 14 | }; 15 | 16 | function updateVersions() { 17 | getJSON('/versions.json', 18 | function (err, data) { 19 | if (err === null) { 20 | var versionsDom = document.getElementById('versions'); 21 | versionsDom.innerHTML = ''; 22 | data.forEach(function (version) { 23 | var node = document.createElement('li'); 24 | var link = document.createElement('a'); 25 | link.href = version.url; 26 | link.innerHTML = version.label; 27 | node.appendChild(link); 28 | versionsDom.appendChild(node); 29 | }); 30 | } 31 | }); 32 | } 33 | -------------------------------------------------------------------------------- /_themes/akeneo/theme.conf: -------------------------------------------------------------------------------- 1 | [theme] 2 | inherit = basic 3 | stylesheet = css/theme.css 4 | 5 | [options] 6 | -------------------------------------------------------------------------------- /akeneo_overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/akeneo_overview.png -------------------------------------------------------------------------------- /cloud_edition/common/images/akeneo_illustration_ziggy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/cloud_edition/common/images/akeneo_illustration_ziggy.png -------------------------------------------------------------------------------- /cloud_edition/flexibility_mode/images/flexibility_mode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/cloud_edition/flexibility_mode/images/flexibility_mode.png -------------------------------------------------------------------------------- /cloud_edition/index.rst: -------------------------------------------------------------------------------- 1 | Akeneo Cloud Edition 2 | ==================== 3 | 4 | .. toctree:: 5 | :maxdepth: 2 6 | 7 | flexibility_mode/index 8 | serenity_mode/index 9 | -------------------------------------------------------------------------------- /cloud_edition/serenity_mode/index.rst: -------------------------------------------------------------------------------- 1 | Serenity 2 | ============= 3 | 4 | **Serenity** mode is a Software as a service (SaaS) and allows users to benefit from all upgrades and patches as they are released, and **automatically**. 5 | 6 | .. note:: 7 | 8 | Please note that **no code customization** is possible on Serenity instances. The usage of the API is encouraged to connect with the PIM. 9 | 10 | Types of environments 11 | --------------------- 12 | 13 | .. note:: 14 | 15 | Learn how to request for a **new environment** on the `Help Center `_. 16 | 17 | **1. Production** 18 | 19 | - **my-project**.cloud.akeneo.com 20 | - **can be restored** to an anterior date 21 | 22 | **2. Sandbox** 23 | 24 | - **my-project-staging**.cloud.akeneo.com 25 | - **no data recovery** 26 | 27 | Updates and migrations 28 | ---------------------- 29 | 30 | Updates can include **patches** and **new features**. We try our best to make them as transparent as possible to end users and are usually applied during time slots of maintenance. 31 | 32 | .. _`A faster way to benefit from Akeneo!`: https://www.akeneo.com/blog/a-faster-way-to-benefit-from-akeneo/ 33 | -------------------------------------------------------------------------------- /contribute_to_pim/create_connector.rst: -------------------------------------------------------------------------------- 1 | How to contribute to a Connector? 2 | ================================= 3 | 4 | We're happy to connect the PIM to any third-party system! 5 | 6 | * Begin by checking on the `Akeneo App Store`_ that nobody published a connector for a 3rd party system 7 | * Create your connector :doc:`/import_and_export_data/guides/create-connector` 8 | * Reference it on the `Akeneo App Store`_ 9 | 10 | .. _Akeneo App Store: https://apps.akeneo.com/ 11 | -------------------------------------------------------------------------------- /contribute_to_pim/crowdin-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/contribute_to_pim/crowdin-logo.png -------------------------------------------------------------------------------- /contribute_to_pim/feature_request.rst.inc: -------------------------------------------------------------------------------- 1 | Submit a Feature Request 2 | ------------------------ 3 | 4 | * You can suggest any feature here by using our `Helpdesk `_ , section Akeneo PIM > I want to suggest an improvement or a new feature 5 | * After discussion, this feature could be included in our roadmap. 6 | -------------------------------------------------------------------------------- /contribute_to_pim/index.rst: -------------------------------------------------------------------------------- 1 | Contribute to Akeneo PIM 2 | ======================== 3 | 4 | We gladly welcome any kind of contribution on Akeneo PIM! 5 | 6 | .. toctree:: 7 | :maxdepth: 1 8 | 9 | report 10 | translate 11 | documentation 12 | create_connector 13 | contribution_guide 14 | front 15 | tests/index 16 | -------------------------------------------------------------------------------- /contribute_to_pim/nelson.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/contribute_to_pim/nelson.png -------------------------------------------------------------------------------- /contribute_to_pim/report.rst: -------------------------------------------------------------------------------- 1 | How to report an issue? 2 | ======================= 3 | 4 | .. include:: ./report_bug.rst.inc 5 | 6 | .. include:: ./feature_request.rst.inc 7 | 8 | .. include:: ./tech_enhancement.rst.inc 9 | -------------------------------------------------------------------------------- /contribute_to_pim/report_bug.rst.inc: -------------------------------------------------------------------------------- 1 | .. _report_bug: 2 | 3 | Report a Bug 4 | ------------ 5 | 6 | **Prerequisite** 7 | 8 | .. warning:: 9 | 10 | As a prerequisite, make sure you completed all the steps described in our :doc:`/maintain_pim/first_aid_kit/index`. 11 | 12 | **Community Edition** 13 | 14 | * Check if this issue is `already known `_ 15 | * Clone `the development repository `_ and checkout the branch of the version you want to test 16 | * Reproduce the bug 17 | * Gather as much information as possible by following our :doc:`/maintain_pim/bug_qualification/index` guide 18 | * Create a new `GitHub `_ issue which: 19 | 20 | * Clearly describes the issue in its title 21 | * Describes the steps to reproduce the bug 22 | * Provides the PIM system information available under System > System information 23 | * Provides as much information as possible on your environment (OS, PHP version, browser) 24 | 25 | **Enterprise Edition** 26 | 27 | * Gather as much information as possible by following our :doc:`/maintain_pim/bug_qualification/index` guide 28 | * Raise an issue by using your `Service Desk Account `_ 29 | * Attach the PIM system information file to your request (it is available under System > System information > TXT) 30 | * Submit your request on our Helpdesk 31 | -------------------------------------------------------------------------------- /contribute_to_pim/tech_enhancement.rst.inc: -------------------------------------------------------------------------------- 1 | Suggest a Technical Improvement 2 | ------------------------------- 3 | 4 | * Check if this improvement is already discussed: https://github.com/akeneo/pim-community-dev/labels/tech-improvement 5 | * Create a new Github issue that: 6 | 7 | * clearly describes the improvement 8 | * write some sample code 9 | -------------------------------------------------------------------------------- /contribute_to_pim/tests/images/PermissionsContext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/contribute_to_pim/tests/images/PermissionsContext.png -------------------------------------------------------------------------------- /contribute_to_pim/tests/images/decorator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/contribute_to_pim/tests/images/decorator.png -------------------------------------------------------------------------------- /contribute_to_pim/tests/images/edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/contribute_to_pim/tests/images/edit.png -------------------------------------------------------------------------------- /contribute_to_pim/tests/images/element.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/contribute_to_pim/tests/images/element.jpg -------------------------------------------------------------------------------- /contribute_to_pim/tests/index.rst: -------------------------------------------------------------------------------- 1 | How behavior tests are architectured in the PIM? 2 | ================================================ 3 | 4 | 5 | The PIM comes with a set of Behat scenarios: https://github.com/akeneo/pim-community-dev/tree/master/tests/legacy/features 6 | 7 | .. warning:: 8 | 9 | Please, note that reading `Behat documentation `_ is a prerequisite for 10 | the following documentation. 11 | 12 | .. toctree:: 13 | 14 | establishing_decorator_pattern 15 | spin 16 | -------------------------------------------------------------------------------- /cve_2022_46157.rst: -------------------------------------------------------------------------------- 1 | About CVE-2022-46157 2 | ============================================================== 3 | 4 | 5 | Security Update 6 | ----------------- 7 | 8 | A major vulnerability has been identified during our annual pentest. As it also applies to our pim-community project, we decided to register a CVE entry `(CVE-2022-46157) 9 | `_. Please find below the details of the remediation of the vulnerability according to your PIM subscription and/or version. 10 | 11 | Serenity (SaaS) user 12 | ********************** 13 | 14 | If you are an Akeneo SaaS user (i.e, Serenity), the vulnerability has already been patched. 15 | 16 | Flexibility (PaaS) user 17 | *********************** 18 | 19 | | If you are an Akeneo PaaS (i.e, Flexibility) user, we applied the patch to v5 and v6 as defined on our `support policy `_. 20 | | If you are an Akeneo PaaS user on lower versions, we **strongly advise** you to update your Flexibility versions as these versions will not be patched. 21 | 22 | On-premise user 23 | ********************** 24 | 25 | We **strongly advise** you to apply our patch available `here 26 | `_ to your Apache server configuration according your operating system. 27 | 28 | 29 | Additional information 30 | ********************** 31 | 32 | Feel free to contact your Akeneo Customer Success Manager if you have any question or need additional information on this subject. 33 | -------------------------------------------------------------------------------- /docker-compose.override.yml.dist: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | apache: 5 | ports: 6 | - '8080:80' 7 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | apache: 5 | image: httpd:2.4 6 | volumes: 7 | - ./pim-docs-build/:/usr/local/apache2/htdocs/ 8 | working_dir: /usr/local/apache2/htdocs/ 9 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/favicon.ico -------------------------------------------------------------------------------- /import_and_export_data/batch-item-step.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/import_and_export_data/batch-item-step.png -------------------------------------------------------------------------------- /import_and_export_data/batch-main-concepts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/import_and_export_data/batch-main-concepts.png -------------------------------------------------------------------------------- /import_and_export_data/connectors.rst: -------------------------------------------------------------------------------- 1 | Akeneo Connectors 2 | ================= 3 | 4 | CSV Connector 5 | ------------- 6 | 7 | Akeneo CSV Connector supports reading and writing CSV files. The connector uses an open source library called openspout (https://github.com/openspout/openspout) to read and create CSV files. 8 | 9 | XLSX Connector 10 | -------------- 11 | 12 | Akeneo XLSX Connector supports reading and writing XLSX files. The connector uses an open source library called openspout (https://github.com/openspout/openspout) to read and create XLSX files. 13 | 14 | The connector supports the following Excel versions: 15 | 16 | - Windows Excel 2016 17 | - Windows Excel 2013 18 | - Windows Excel 2010 19 | - Windows Excel 2007 20 | - Excel 16 (Office 2016 for OS X) 21 | - Excel 14 (Office 2011 for OS X) 22 | 23 | YAML Connector 24 | -------------- 25 | 26 | Akeneo YAML Connector supports reading and writing YAML files. The connector uses an open source component called symfony/yaml (https://github.com/symfony/yaml) to read and create YAML files. 27 | 28 | Customizing connectors 29 | ---------------------- 30 | 31 | It is possible to customize these connectors to import and export numerous PIM related objects: 32 | 33 | - Check how to import PIM objects using the Akeneo Connectors (cf :doc:`/import_and_export_data/simple-import`) 34 | - In order to understand how the Akeneo CSV Connector is working for products, please refer to chapters about product import (cf :doc:`/import_and_export_data/product-import`) and product export (cf :doc:`/import_and_export_data/product-export`) 35 | -------------------------------------------------------------------------------- /import_and_export_data/formats.rst: -------------------------------------------------------------------------------- 1 | Formats 2 | ======= 3 | 4 | Headers for localized and/or scopable entities follow the same generic rule: 5 | 6 | .. toctree:: 7 | :titlesonly: 8 | :maxdepth: 1 9 | 10 | formats/localized-labels 11 | formats/scopable-labels 12 | 13 | CSV formats used for import/export profiles in a default Akeneo PIM installation: 14 | 15 | .. toctree:: 16 | :titlesonly: 17 | :maxdepth: 1 18 | 19 | formats/association_type 20 | formats/attribute 21 | formats/category 22 | formats/family 23 | formats/family_variant 24 | formats/group 25 | formats/option 26 | formats/product 27 | formats/product_model 28 | 29 | .. note:: 30 | 31 | XLSX format is also available. Data remain the same. 32 | -------------------------------------------------------------------------------- /import_and_export_data/formats/association_type.rst: -------------------------------------------------------------------------------- 1 | Association types data structure 2 | ================================ 3 | 4 | The import/export file follows this data structure: 5 | 6 | - **code** (required): the association type code 7 | - **label-**: each label in a dedicated column (See :doc:`localized-labels`) 8 | - **is_two_way**: When true, the association is a two-way association 9 | - **is_quantified**: When true, the association is a quantified association 10 | 11 | .. note:: 12 | 13 | File example: 14 | 15 | .. literalinclude:: examples/association_type.csv 16 | 17 | Be aware that an association type will be visible in an product export file only if you have products or groups of products using this association type. 18 | -------------------------------------------------------------------------------- /import_and_export_data/formats/attribute.rst: -------------------------------------------------------------------------------- 1 | Attribute data structure 2 | ======================== 3 | 4 | Data structure 5 | -------------- 6 | The import/export file follows this data structure: 7 | 8 | .. csv-table:: 9 | :header: "Property name"; "Default value"; "Required for"; "Special validation rules" 10 | :file: examples/attribute_properties.csv 11 | :delim: ; 12 | 13 | .. note:: 14 | 15 | File example: 16 | 17 | .. literalinclude:: examples/attribute.csv 18 | 19 | 20 | Attribute types 21 | --------------- 22 | 23 | .. csv-table:: 24 | :header: "Attribute type"; "Description" 25 | :file: examples/attribute_type.csv 26 | :delim: ; 27 | -------------------------------------------------------------------------------- /import_and_export_data/formats/category.rst: -------------------------------------------------------------------------------- 1 | Category data structure 2 | ======================= 3 | 4 | The import/export file follows this data structure: 5 | 6 | - **code** (required): the category code 7 | - **parent**: code of the parent category. Blank if it is a root category. 8 | - **label-**: each label in a dedicated column (See :doc:`localized-labels`) 9 | 10 | .. note:: 11 | 12 | File example: 13 | 14 | .. literalinclude:: examples/category.csv 15 | -------------------------------------------------------------------------------- /import_and_export_data/formats/examples/association_type.csv: -------------------------------------------------------------------------------- 1 | code;is_two_way;is_quantified;label-en_US;label-fr_FR 2 | X_SELL;0;0;"Cross sell";"Vente croisée" 3 | UPSELL;0;0;Upsell;"Vente incitative" 4 | SUBSTITUTION;0;0;Substitution;Remplacement 5 | PACK;0;0;Pack;Pack 6 | -------------------------------------------------------------------------------- /import_and_export_data/formats/examples/attribute.csv: -------------------------------------------------------------------------------- 1 | type;code;label-en_US;label-fr_FR;group;unique;useable_as_grid_filter;allowed_extensions;metric_family;default_metric_unit;reference_data_name;localizable;scopable;decimals_allowed;negative_allowed 2 | pim_catalog_identifier;sku;SKU;SKU;marketing;1;1;;;;;0;0;; 3 | pim_catalog_text;name;Name;Nom;marketing;0;1;;;;;0;0;; 4 | pim_catalog_textarea;description;Description;Description;marketing;0;1;;;;;1;1;; 5 | pim_catalog_number;optical_zoom;Optical zoom;Zoom optique;technical;0;1;;;;;0;0;0;0 6 | pim_catalog_boolean;image_stabilizer;Image stabilizer;Stabilisateur d'image;technical;0;1;;;;;0;0;; 7 | pim_catalog_simpleselect;sensor_type;Sensor type;Type de capteur;technical;0;1;;;;;0;0;; 8 | pim_catalog_multiselect;multifunctional_functions;All-in-one functions;Fonctions tout-en-un;technical;0;1;;;;;0;0;; 9 | pim_catalog_date;release_date;Release date;Date de sortie;marketing;0;1;;;;;0;1;; 10 | pim_catalog_metric;weight;Weight;Poids;technical;0;1;;Weight;KILOGRAM;;0;0;1;0 11 | pim_catalog_price_collection;price;Price;Prix;marketing;0;1;;;;;0;0;1; 12 | pim_catalog_image;picture;Picture;Photographie;media;0;1;jpg,jpeg,gif;;;;0;0;; 13 | pim_catalog_file;pdf_description;PDF description;Description PDF;media;0;1;pdf;;;;0;0;; 14 | -------------------------------------------------------------------------------- /import_and_export_data/formats/examples/attribute_properties.csv: -------------------------------------------------------------------------------- 1 | code;;all types;"| Must be unique 2 | | Must only contain letters, numbers and underscores 3 | | Must be less than 255 characters long 4 | | Cannot be one of: id, associationTypes, categories, categoryId, completeness, enabled, family, groups, associations, products, scope, treeId, values, category, attributes, parent, label, entity_type 5 | | Cannot end with “_products” or “_groups”" 6 | type;;all types;Must be a valid type (see table below) 7 | label-;;; 8 | guidelines-;;;"| Can contain line breaks 9 | | Cannot be more than 500 characters" 10 | group;;all types;Must be a valid attribute group code 11 | unique;0;; 12 | useable_as_grid_filter;0;; 13 | allowed_extensions;;;"| Must be a subset of extensions set in the parameters `pim_catalog_image_allowed_extensions` (for images) 14 | | or `pim_catalog_file_allowed_extensions` (for files)" 15 | auto_option_sorting;;simple select,multi select; 16 | metric_family;;metric;Must be a valid metric family 17 | default_metric_unit;;metric;Must be a valid metric unit and must be part of the specified metric_family 18 | available_locales;;;Must be a list of valid and activated locales 19 | max_characters;;;"| Must be a positive integer 20 | | Cannot be more than 255 for texts, or 65535 for textareas" 21 | validation_rule;;;Must be one of: email, url, regexp 22 | validation_regexp;;;Must be a valid PERL regular expression 23 | wysiwyg_enabled;;; 24 | number_min;;;Must be lower than number_max 25 | number_max;;;Must be greater than number_min 26 | decimals_allowed;;number, metric, price collection; 27 | default_value;;all types; 28 | negative_allowed;;number, metric; 29 | date_min;;;Must be lower than date_max 30 | date_max;;;Must be greater than date_min 31 | max_file_size;;;Must be between 0.01 and 9999.99 (in MB) 32 | minimum_input_length;;; 33 | sort_order;0;;Must be a positive integer 34 | localizable;0;;Must be false if the attribute is unique 35 | reference_data_name;;reference data,multi reference data,asset,reference entity 36 | scopable;0;;Must be false if the attribute is unique 37 | -------------------------------------------------------------------------------- /import_and_export_data/formats/examples/attribute_type.csv: -------------------------------------------------------------------------------- 1 | pim_catalog_identifier;It is the unique product's identifier. The catalog can contain only one. 2 | pim_catalog_text;Text 3 | pim_catalog_textarea;Long text 4 | pim_catalog_boolean;Yes/No 5 | pim_catalog_number;Number (integer and float) 6 | pim_catalog_simpleselect;Simple choice list 7 | pim_catalog_multiselect;Multiple choice list 8 | pim_catalog_date;Date 9 | pim_catalog_metric;Metric. It consists of a value and a unit (a weight for example). 10 | pim_catalog_price_collection;Collection of prices. Each price contains a value and a currency. 11 | pim_catalog_image;Image 12 | pim_catalog_file;File 13 | pim_catalog_asset_collection;Collection of assets (Only available in EE) 14 | pim_catalog_table;A multi dimensional attribute (Only available in EE) 15 | akeneo_reference_entity;Link to a record (Only available in EE) 16 | akeneo_reference_entity_collection;Collection of records (Only available in EE) 17 | -------------------------------------------------------------------------------- /import_and_export_data/formats/examples/category.csv: -------------------------------------------------------------------------------- 1 | code;parent;label-de_DE;label-en_US;label-fr_FR 2 | master;;Hauptkatalog;"Master catalog";"Catalogue principal" 3 | tvs_projectors;master;"TVs und projectoren";"TVs and projectors";"Téléviseurs et projecteurs" 4 | pc_monitors;tvs_projectors;"PC Monitoren";"PC Monitors";"Moniteurs PC" 5 | led_tvs;tvs_projectors;"TVs LED";"LED TVs";"Télévisions LED" 6 | cameras;master;Cameras;Cameras;Caméras 7 | digital_cameras;cameras;"Digitale Kameras";"Digital cameras";"Caméras digitales" 8 | camcorders;cameras;"Digitale Videokameras";Camcorders;"Caméscopes numériques" 9 | webcams;cameras;Webcams;Webcams;Webcams 10 | -------------------------------------------------------------------------------- /import_and_export_data/formats/examples/family.csv: -------------------------------------------------------------------------------- 1 | code;label-en_US;label-fr_FR;attributes;attribute_as_label;requirements-ecommerce;requirements-mobile;requirements-print 2 | mugs;Mugs;Chopes/Mugs;sku,name,description,price,picture,container_material,main_color;name;sku,name,description,main_color,price,container_material;sku,name,description,main_color,price;sku,name,description,price 3 | camcorders;Camcorders;Caméscopes numériques;sku,name,description,weight,power_requirements,sensor_type,total_megapixels,optical_zoom,image_stabilizer,release_date,price,picture;name;sku,name,description,price,sensor_type,total_megapixels;sku,name,description,price,sensor_type,total_megapixels;sku,name,description,price,sensor_type,total_megapixels 4 | tshirts;;;sku,name,description,price,picture,main_color,secondary_color,clothing_size,tshirt_materials,tshirt_style;sku;sku,name,description,main_color,secondary_color,tshirt_materials,clothing_size;sku,name,description,main_color,secondary_color,price,clothing_size;sku,name,description,price 5 | -------------------------------------------------------------------------------- /import_and_export_data/formats/examples/family_variant.csv: -------------------------------------------------------------------------------- 1 | code;family;label-de_DE;label-en_US;label-fr_FR;variant-axes_1;variant-axes_2;variant-attributes_1;variant-attributes_2 2 | clothing_color_size;clothing;Kleidung nach Farbe und Größe;Clothing by color and size;Vêtements par couleur et taille;color;size;variation_name,variation_image,composition,color,material;sku,weight,size,ean 3 | shoes_size;shoes;Schuhe nach Größe;Shoes by size;Chaussures par taille;eu_shoes_size;;sku,weight,size,eu_shoes_size,ean; 4 | clothing_colorsize;clothing;Kleidung nach Farbe/Größe;Clothing by color/size;Vêtements par couleur/taille;color,size;;sku,variation_name,variation_image,composition,color,size,ean; 5 | clothing_size;clothing;Kleidung nach Größe;Clothing by size;Vêtements par taille;size;;sku,weight,size,ean; 6 | clothing_color;clothing;Kleidung nach Farbe;Clothing by color;Vêtements par couleur;color;;sku,variation_name,variation_image,composition,color,ean; 7 | accessories_size;accessories;Accessories by size;Accessories by size;Accessoires par taille;size;;sku,weight,size,ean; 8 | shoes_size_color;shoes;Schuhe nach Größe und Farbe;Shoes by size and color;Chaussures par taille et couleur;size;color;weight,variation_name,size,eu_shoes_size;sku,image,variation_image,composition,color,ean 9 | clothing_material_size;clothing;Clothing by material and size;Clothing by material and size;Vêtements par matière et taille;material;size;variation_name,variation_image,composition,color,material;sku,weight,size,ean 10 | tv;led_tvs;LED TV;LED TV;LED TV;display_diagonal;;sku,price,weight,display_diagonal,picture; 11 | -------------------------------------------------------------------------------- /import_and_export_data/formats/examples/group.csv: -------------------------------------------------------------------------------- 1 | code;type;label-en_US;label-fr_FR 2 | promotion;RELATED;promotion;promotion 3 | -------------------------------------------------------------------------------- /import_and_export_data/formats/examples/option.csv: -------------------------------------------------------------------------------- 1 | attribute;code;sort_order;label-en_US;label-fr_FR 2 | maximum_print_size;210_x_1219_mm;1;210 x 1219 mm;210 x 1219 mm 3 | maximum_print_size;215_x_355_mm;2;215 x 355 mm;215 x 355 mm 4 | sensor_type;ccd;1;CCD;CCD 5 | sensor_type;cmos;2;CMOS;CMOS 6 | camera_type;bridge;1;Bridge;Bridge 7 | camera_type;compact;2;Compact;Compact 8 | main_color;white;1;White;Blanc 9 | main_color;black;2;Black;Noir 10 | main_color;grey;3;Grey;Gris 11 | main_color;blue;4;Blue;Bleu 12 | main_color;purple;5;Purple;Violet 13 | main_color;orange;6;Orange;Orange 14 | -------------------------------------------------------------------------------- /import_and_export_data/formats/examples/product_model.csv: -------------------------------------------------------------------------------- 1 | code;family_variant;parent;categories;brand;care_instructions;collection;color;composition;description-de_DE-ecommerce;description-de_DE-mobile;description-de_DE-print;description-en_US-ecommerce;description-en_US-mobile;description-en_US-print;description-fr_FR-ecommerce;description-fr_FR-mobile;description-fr_FR-print;erp_name-de_DE;erp_name-en_US;erp_name-fr_FR;eu_shoes_size;image;keywords-de_DE;keywords-en_US;keywords-fr_FR;material;meta_description-de_DE;meta_description-en_US;meta_description-fr_FR;meta_title-de_DE;meta_title-en_US;meta_title-fr_FR;name;notice;power_requirements;price-EUR;price-USD;release_date-ecommerce;release_date-mobile;release_date-print;size;sole_composition;supplier;top_composition;variation_image;variation_name-de_DE;variation_name-en_US;variation_name-fr_FR;wash_temperature;weight;weight-unit 2 | amor;clothing_colorsize;;master_men_blazers,supplier_zaro;;;summer_2016;;;;;;Heritage jacket navy blue tweed suit with single breasted 2 button. 53% wool, 22% polyester, 18% acrylic, 5% nylon, 1% cotton, 1% viscose. Dry Cleaning uniquement.Le mannequin measuring 1m85 and wears UK size 40, size 50 FR;;;;;;;Amor;;;;;;;;;;;;;;Heritage jacket navy;;;999.00;;;;;;;zaro;;;;;;800;; 3 | brooksblue;shoes_size;;master_men_shoes;;;summer_2017;blue;;;;;Brooks blue;;;;;;;Brooks blue;;;;;;;;;;;;;;Brooks blue;;;;;;;;;;;;;;Brooks blue;;;; 4 | brookspink;shoes_size;;master_women_shoes;;;summer_2017;pink;;;;;Brooks pink;;;;;;;Brooks pink;;;;;;;;;;;;;;Brooks pink;;;;;;;;;;;;;;Brooks pink;;;; 5 | -------------------------------------------------------------------------------- /import_and_export_data/formats/examples/variant_group.csv: -------------------------------------------------------------------------------- 1 | code;axis;label-en_US;label-fr_FR;type 2 | akeneo_mug;main_color,secondary_color;Akeneo Mugs;Mugs Akeneo;VARIANT 3 | oro_mug;container_material,main_color,secondary_color;Oro Mugs;Mugs Oro;VARIANT 4 | akeneo_tshirt;clothing_size,main_color,secondary_color;Akeneo T-Shirts;T-Shirts Akeneo;VARIANT 5 | -------------------------------------------------------------------------------- /import_and_export_data/formats/family.rst: -------------------------------------------------------------------------------- 1 | Family data structure 2 | ===================== 3 | 4 | The import/export file follows this data structure: 5 | 6 | - **code** (required): the family code 7 | - **attributes**: the list of the family attribute codes separated with a comma 8 | - **label-**: each label in a dedicated column (See :doc:`localized-labels`) 9 | - **attribute_as_label**: the attribute whose value will be used as the product label on product datagrid 10 | - **requirements-**: each requirement in a dedicated column depending on the channel 11 | 12 | .. note:: 13 | 14 | File example: 15 | 16 | .. literalinclude:: examples/family.csv 17 | -------------------------------------------------------------------------------- /import_and_export_data/formats/family_variant.rst: -------------------------------------------------------------------------------- 1 | Family variant data structure 2 | ============================= 3 | 4 | The import/export file follows this data structure: 5 | 6 | - **code** (required): the family code 7 | - **family** : the family to which this family variant belongs 8 | - **label-**: each label in a dedicated column (See :doc:`localized-labels`) 9 | - **variant-axes_<1|2>**: the list of the axis variant attributes (5 max) 10 | - **variant-attributes_<1|2>**: the list of the variant attributes for the axis 11 | 12 | .. note:: 13 | 14 | File example: 15 | 16 | .. literalinclude:: examples/family_variant.csv 17 | -------------------------------------------------------------------------------- /import_and_export_data/formats/group.rst: -------------------------------------------------------------------------------- 1 | Group data structure 2 | ==================== 3 | 4 | The import/export file follows this data structure: 5 | 6 | - **code** (required): the group code 7 | - **type** (required): the group type 8 | - **label-**: each label in a dedicated column (See :doc:`localized-labels`) 9 | 10 | .. note:: 11 | 12 | File example: 13 | 14 | .. literalinclude:: examples/group.csv 15 | -------------------------------------------------------------------------------- /import_and_export_data/formats/localized-labels.rst: -------------------------------------------------------------------------------- 1 | Localized labels 2 | ================ 3 | 4 | All localized labels follow the same rule in the import/export: 5 | 6 | {code}-{locale} 7 | 8 | Thus, a `description` label available in fr_FR, en_US and de_DE will be exported in three columns: 9 | 10 | * description-fr_FR 11 | * description-en_US 12 | * description-de_DE 13 | -------------------------------------------------------------------------------- /import_and_export_data/formats/option.rst: -------------------------------------------------------------------------------- 1 | Options data structure 2 | ====================== 3 | 4 | Options are exported in a CSV file with the following structure: 5 | 6 | - **attribute** (required): the linked attribute code 7 | - **code** (required): the option code 8 | - **sort_order**: Option rank in the dropdown lists 9 | - **label-**: each label in a dedicated column (See :doc:`localized-labels`) 10 | 11 | .. note:: 12 | 13 | File example: 14 | 15 | .. literalinclude:: examples/option.csv 16 | -------------------------------------------------------------------------------- /import_and_export_data/formats/product.rst: -------------------------------------------------------------------------------- 1 | Product data structure 2 | ====================== 3 | 4 | Products are exported in a file with the following fields. 5 | 6 | Attributes fields can be one of these: 7 | 8 | - **sku** (required): Identifier attribute (SKU is the common code) 9 | - **clothing_size**: size option code for a simple select option 10 | - **description-en_US-mobile**: localizable and scopable attribute en_US for channel mobile 11 | - **description-fr_FR-mobile**: localizable and scopable attribute fr_FR for channel mobile 12 | - **name-fr_FR**: localizable attribute fr_FR 13 | - **name-en_US**: localizable attribute en_US 14 | - **price-EUR**: numeric price value for Euro 15 | - **price-USD**: numeric price value for US Dollar 16 | - **tshirt_style**: list of option codes for a multi select option list 17 | 18 | Associations fields: 19 | 20 | - **-groups**: groups list for the association type 21 | - **-product_models**: list of product models codes in this association type 22 | - **-products**: list of products identifiers in this association type 23 | 24 | Product properties fields: 25 | 26 | - **categories**: list of category codes 27 | - **enabled**: boolean 28 | - **family**: family code 29 | - **groups**: list of product group codes 30 | - **parent**: product model code 31 | 32 | 33 | .. note:: 34 | 35 | File example: 36 | 37 | .. literalinclude:: examples/product.csv 38 | 39 | -------------------------------------------------------------------------------- /import_and_export_data/formats/product_model.rst: -------------------------------------------------------------------------------- 1 | Product model data structure 2 | ============================ 3 | 4 | Product models are exported in a file with the following fields. 5 | 6 | Attributes fields can be one of these: 7 | 8 | - **code** (required): the product model code 9 | - **clothing_size**: size option code for a simple select option 10 | - **description--**: localizable and scopable attribute for channel mobile one row by local_code dans channel 11 | - **name-**: localizable attribute one row by local_code 12 | - **price-**: numeric price value for this currency (example: price-EUR) 13 | - **tshirt_style**: list of option codes for a multi select option list 14 | 15 | Product properties fields: 16 | 17 | - **categories**: list of category codes 18 | - **family_variant** (required): the family variant code 19 | - **parent**: product model code parent 20 | 21 | 22 | .. note:: 23 | 24 | File example: 25 | 26 | .. literalinclude:: examples/product_model.csv 27 | 28 | -------------------------------------------------------------------------------- /import_and_export_data/formats/scopable-labels.rst: -------------------------------------------------------------------------------- 1 | Scopable labels 2 | =============== 3 | 4 | In the case of product export, all localized and/or scopable labels follow the same rule in the import/export: 5 | 6 | {code}-{locale}-{scope} 7 | 8 | Thus, a `foo` label available in ecommerce and print channels and in fr_FR, en_US and de_DE locales 9 | will be exported in six columns: 10 | 11 | * foo-fr_FR-ecommerce 12 | * foo-en_US-ecommerce 13 | * foo-de_DE-ecommerce 14 | * foo-fr_FR-print 15 | * foo-en_US-print 16 | * foo-de_DE-print 17 | -------------------------------------------------------------------------------- /import_and_export_data/guides/create_connector_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/import_and_export_data/guides/create_connector_edit.png -------------------------------------------------------------------------------- /import_and_export_data/guides/index.rst: -------------------------------------------------------------------------------- 1 | How to Customize Import / Export 2 | ================================ 3 | 4 | This chapter describes how to create and customize connectors to handle imports and exports in your Akeneo PIM project. 5 | 6 | .. toctree:: 7 | 8 | create-connector 9 | product-import-from-xml-file 10 | clean-csv-file-during-product-import 11 | -------------------------------------------------------------------------------- /install_pim/customize_dataset/add_translation_packs.rst: -------------------------------------------------------------------------------- 1 | 2 | How to Add Translation Packs 3 | ============================ 4 | 5 | .. _Crowdin: https://crowdin.com/project/akeneo/ 6 | 7 | 8 | Akeneo PIM UI is translated through `Crowdin`_ (feel free to :doc:`/contribute_to_pim/translate`!). 9 | 10 | Once a week, new translation keys are pushed to Crowdin, and new validated translations are pulled from our Github repository. 11 | 12 | Akeneo PIM contains translation packs for all languages with more than 80% of translated keys. You can change this behavior by following this guide :doc:`/technical_architecture/localization/change_pim_locale`. 13 | 14 | Once a new minor or patch version has been tagged, the new translations are available. 15 | 16 | You can directly download translation packs from `Crowdin`_. 17 | 18 | The Akeneo PIM archive will contain *Community* and *Enterprise* directories. 19 | 20 | To add a pack you have to: 21 | 22 | * rename the directories by following the rule ``src/Pim/Bundle/EnrichBundle`` to ``PimEnrichBundle`` 23 | * move this directory to ``app/Resources/`` 24 | * run ``php bin/console oro:translation:dump fr de en --env=prod`` (if you use en, fr and de locales) 25 | * run ``php bin/console cache:clear --env=prod`` 26 | -------------------------------------------------------------------------------- /install_pim/index.rst: -------------------------------------------------------------------------------- 1 | Install Akeneo PIM 2 | ================== 3 | 4 | You can choose either to install Akeneo PIM :doc:`through Docker ` 5 | or to perform a classic, :doc:`manual installation ` on a server. 6 | 7 | 8 | .. toctree:: 9 | :maxdepth: 1 10 | :hidden: 11 | 12 | docker/installation_docker 13 | manual/index 14 | 15 | 16 | .. toctree:: 17 | :maxdepth: 1 18 | :hidden: 19 | 20 | customize_dataset/index 21 | customize_dataset/add_translation_packs 22 | -------------------------------------------------------------------------------- /install_pim/manual/common_install_initializing_ce_ee.rst.inc: -------------------------------------------------------------------------------- 1 | Initializing Akeneo 2 | ------------------- 3 | 4 | .. note:: 5 | 6 | Copy the .env into a local .env and make the configuration in the local .env. 7 | 8 | 9 | Configure the PIM via the ``.env`` file: 10 | 11 | .. code-block:: yaml 12 | :linenos: 13 | 14 | APP_ENV=prod 15 | APP_DATABASE_HOST=localhost 16 | APP_DATABASE_PORT=null 17 | APP_DATABASE_NAME=akeneo_pim 18 | APP_DATABASE_USER=akeneo_pim 19 | APP_DATABASE_PASSWORD=akeneo_pim 20 | APP_INDEX_HOSTS='localhost:9200' 21 | -------------------------------------------------------------------------------- /install_pim/manual/index.rst: -------------------------------------------------------------------------------- 1 | Install Akeneo PIM manually 2 | =========================== 3 | 4 | Here are the guidelines to set everything up according to your operating system: 5 | 6 | .. toctree:: 7 | :maxdepth: 1 8 | 9 | system_requirements/system_requirements 10 | system_requirements/manual_system_installation_debian11 11 | system_requirements/system_install_ubuntu_2204 12 | 13 | Once the requirements are fulfilled, you are ready to install Akeneo PIM. Otherwise, check the *Setup System Requirements* pages. 14 | 15 | .. toctree:: 16 | :maxdepth: 1 17 | 18 | installation_ce 19 | installation_ee_archive 20 | daemon_queue 21 | security_recommendations 22 | scheduled_job 23 | events_api 24 | -------------------------------------------------------------------------------- /install_pim/manual/installation_ce.rst: -------------------------------------------------------------------------------- 1 | Installing Akeneo PIM Community Edition (CE) 2 | ============================================ 3 | 4 | This document provides step by step instructions to install the PIM with the archive on an environment that fulfills the expected :doc:`system_requirements/system_requirements`. 5 | 6 | Getting Akeneo PIM 7 | ------------------ 8 | 9 | You can either use `composer` to create your project: 10 | 11 | .. code-block:: bash 12 | :linenos: 13 | 14 | $ composer create-project akeneo/pim-community-standard /srv/pim "7.0.*@stable" 15 | 16 | or download an archive containing Akeneo PIM and its PHP dependencies: https://download.akeneo.com/pim-community-standard-v6.0-latest-icecat.tar.gz 17 | 18 | 19 | .. include:: ./common_install_initializing_ce_ee.rst.inc 20 | 21 | 22 | Launching the PIM in dev mode 23 | ----------------------------- 24 | 25 | .. note:: 26 | 27 | All `make` commands must be run from the PIM root directory, either created by the archive or from the composer create project above. 28 | 29 | 30 | You can then launch the install with the following command: 31 | 32 | .. code-block:: bash 33 | 34 | $ NO_DOCKER=true make dev 35 | 36 | 37 | Once this command is finished, the PIM is accessible at http://localhost:8080/ 38 | 39 | 40 | Launching the PIM in prod mode 41 | ------------------------------ 42 | 43 | .. code-block:: bash 44 | 45 | $ NO_DOCKER=true make prod 46 | 47 | Once this command is finished, the PIM is accessible at http://localhost:8080/ 48 | 49 | 50 | .. include:: ./common_install_setup_ce_ee.rst.inc 51 | -------------------------------------------------------------------------------- /install_pim/manual/installation_ee_archive.rst: -------------------------------------------------------------------------------- 1 | Installing Akeneo PIM Enterprise Edition (EE) with the Archive 2 | ============================================================== 3 | 4 | This document provides step by step instructions to install the PIM with the archive on an environment that fulfills the expected :doc:`system_requirements/system_requirements`. 5 | 6 | By default `Composer `_ uses `packagist.org `_ to retrieve all open source packages and their updates. To download Akeneo PIM Enterprise Edition, you have to get access to our private enterprise edition repository by sending your SSH public key to our system. 7 | 8 | Creating the PIM project 9 | ------------------------ 10 | 11 | You need to get a PIM Enterprise Standard archive from the Partners Portal. See `_ 12 | 13 | .. code-block:: bash 14 | 15 | $ tar -xvzf pim-enterprise-standard-v7.0.tar.gz 16 | $ cd pim-enterprise-standard/pim-enterprise-standard 17 | $ composer install 18 | 19 | .. include:: ./common_install_initializing_ce_ee.rst.inc 20 | 21 | 22 | Launching the PIM in dev mode 23 | ----------------------------- 24 | 25 | .. note:: 26 | 27 | All `make` commands must be run from the PIM root directory, either created by the archive or from the composer create project above. 28 | 29 | 30 | To run the PIM EE in dev mode without docker, you will need to change some configuration files: 31 | 32 | .. code-block:: bash 33 | 34 | $ cp vendor/akeneo/pim-enterprise-dev/config/packages/prod_onprem/oneup_flysystem.yml config/packages/dev/ 35 | $ cp vendor/akeneo/pim-enterprise-dev/config/packages/prod_onprem/messenger.yml config/packages/dev/ 36 | 37 | 38 | You can then launch the install with the following command: 39 | 40 | .. code-block:: bash 41 | 42 | $ NO_DOCKER=true make dev 43 | 44 | 45 | Once this command is finished, the PIM is accessible at http://localhost:8080/ 46 | 47 | Launching the PIM in prod mode 48 | ------------------------------ 49 | 50 | .. code-block:: bash 51 | 52 | $ NO_DOCKER=true make prod 53 | 54 | Once this command is finished, the PIM is accessible at http://localhost:8080/ 55 | 56 | 57 | .. include:: ./common_install_setup_ce_ee.rst.inc 58 | 59 | -------------------------------------------------------------------------------- /install_pim/manual/papo/add_public_key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/install_pim/manual/papo/add_public_key.png -------------------------------------------------------------------------------- /install_pim/manual/papo/add_public_key_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/install_pim/manual/papo/add_public_key_2.png -------------------------------------------------------------------------------- /install_pim/manual/papo/download_archive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/install_pim/manual/papo/download_archive.png -------------------------------------------------------------------------------- /install_pim/manual/papo/download_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/install_pim/manual/papo/download_button.png -------------------------------------------------------------------------------- /install_pim/manual/papo/manage_public_keys.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/install_pim/manual/papo/manage_public_keys.png -------------------------------------------------------------------------------- /install_pim/manual/papo/permission_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/install_pim/manual/papo/permission_add.png -------------------------------------------------------------------------------- /install_pim/manual/papo/permission_box.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/install_pim/manual/papo/permission_box.png -------------------------------------------------------------------------------- /install_pim/manual/partners_portal_archive.rst.inc: -------------------------------------------------------------------------------- 1 | Get PIM Enterprise Edition (EE) archive 2 | *************************************** 3 | 4 | Get the `PIM Enterprise Edition (EE) archive from the Portal `_. 5 | -------------------------------------------------------------------------------- /install_pim/manual/scheduled_job.rst: -------------------------------------------------------------------------------- 1 | Setting up the job scheduling 2 | =============================== 3 | 4 | Purpose of the cron 5 | -------------------- 6 | 7 | Since version 7.0, the user can schedule a job directly on the PIM. It can also define the user used to executed the job. 8 | In order to have this job launched at the right moment you should launch periodically a command that will check if there is a scheduled job to launch. 9 | 10 | To run a command periodically, you can use a cron_: 11 | 12 | .. _cron: https://help.ubuntu.com/community/CronHowto 13 | 14 | First, you need to install it (example in debian/ubuntu based distributions): 15 | 16 | .. code-block:: bash 17 | :linenos: 18 | 19 | apt-get install cron 20 | 21 | Then, you can edit your crontab: 22 | 23 | .. code-block:: bash 24 | :linenos: 25 | 26 | crontab -e 27 | 28 | You can now add a new line at the end of the opened file: 29 | 30 | .. code-block:: bash 31 | :linenos: 32 | 33 | */10 * * * * /home/akeneo/pim/bin/console pim:job-automation:push-scheduled-jobs-to-queue 34 | 35 | With this cron configuration the application will pushed into the job queue every ten minutes the job that need to be launched according to the user configuration 36 | 37 | .. warning:: 38 | 39 | One daemon or several daemon processes have to be started to execute the jobs. 40 | Please follow the documentation :doc:`/install_pim/manual/daemon_queue` if it's not the case. 41 | -------------------------------------------------------------------------------- /install_pim/manual/security_recommendations.rst: -------------------------------------------------------------------------------- 1 | Security best practices 2 | ========================= 3 | 4 | Avoid information leakage 5 | ############################# 6 | 7 | Rather than directly attacking a server, attackers will first run discovery tasks to steal publicly accessible data off the server. 8 | 9 | There are many types of sensitive information that you should protect from attackers, including system data, configuration, secrets, 10 | intellectual property and an individual's personal (private) information. 11 | 12 | You should never enable these in production environments as it will lead to major security vulnerabilities in your project. 13 | - `adminer `_ 14 | - `Php Symfony Profiler `_ 15 | 16 | On test/dev/staging/pre-prod environments, if needed only, make sure to ask support team to add with authorized IPs 17 | using Apache. 18 | 19 | .. code-block:: apacheconf 20 | :linenos: 21 | 22 | 23 | Require all denied 24 | 25 | 26 | 27 | Require all denied 28 | 29 | -------------------------------------------------------------------------------- /install_pim/manual/system_requirements/system_requirements.rst: -------------------------------------------------------------------------------- 1 | System Requirements 2 | =================== 3 | 4 | Here is the list of system requirements that should be fulfilled to be able to install Akeneo PIM. 5 | 6 | .. include:: /install_pim/manual/system_requirements/system_requirements.rst.inc 7 | -------------------------------------------------------------------------------- /logshell_flexv4.rst: -------------------------------------------------------------------------------- 1 | About Log4Shell Vulnerability for Flexibility users below v5.0 2 | ============================================================== 3 | 4 | Security Update 5 | *************** 6 | 7 | As you are an Akeneo Enterprise Edition PaaS (ie, Flexibility) user in a version prior to v5.0, we took extra precaution to better protect your version. We applied a mitigation on Friday, December the 17th, around 9:30am GMT. 8 | 9 | Your version is now protected against this vulnerability. 10 | 11 | No action is required on your side. 12 | 13 | Feel free to contact your Akeneo Customer Success Manager if you have any question or need additional information on this subject. 14 | 15 | Additional information 16 | ********************** 17 | 18 | You may have heard about a global critical vulnerability disclosed Friday, December the 10th, 2021, which has the potential to affect a lot of online services and companies. This vulnerability comes from a Java logging library. 19 | Just after the publication of this vulnerability (CVE-2021-44228, or Log4shell), we closely examined any related impacts to Akeneo, assessed our exposure, and came to the following statement: 20 | 21 | 1. As PHP applications, our main software is not impacted 22 | 2. We use Elasticsearch (from Elastic) as a technical component. We applied a specific configuration to be protected against the aforementioned configuration. 23 | 24 | 25 | If you are an on-premise user 26 | ***************************** 27 | 28 | Please follow the Elasticsearch vendor advisory available here: 29 | https://discuss.elastic.co/t/apache-log4j2-remote-code-execution-rce-vulnerability-cve-2021-44228-esa-2021-31/291476 30 | 31 | and apply the recommended mitigation (setting the "log4j2.formatMsgNoLookups" JVM option to "true"). 32 | -------------------------------------------------------------------------------- /logshell_flexv5.rst: -------------------------------------------------------------------------------- 1 | About Log4Shell Vulnerability for Flexibility v5 Users 2 | ====================================================== 3 | 4 | Security Update 5 | *************** 6 | 7 | As you are an Akeneo Enterprise Edition PaaS (ie, Flexibility) v5 user, we have good news for you. Akeneo Enterprise Edition PaaS (ie, Flexibility) v5 users are NOT impacted by the Apache Log4j Java critical security vulnerability that was disclosed on Friday, December the 10th 2021. No action is needed from you and your Akeneo instance remains secure. 8 | 9 | Additional information 10 | ********************** 11 | 12 | You may have heard about a global critical vulnerability disclosed on Friday, December the 10th 2021, which has the potential to affect a lot of online services and companies. This vulnerability comes from a Java logging library. 13 | Just after the publication of this vulnerability (CVE-2021-44228, or Log4shell), we closely examined any related impacts to Akeneo, assessed our exposure, and came to the following statement: 14 | 15 | 1. As PHP applications, our main software is not impacted; 16 | 2. We use Elasticsearch (from Elastic) as a technical component and the version used on Serenity, Growth Edition and Flexibility v5 is not impacted by this vulnerability 17 | 18 | 19 | If you are an on-premise user 20 | ***************************** 21 | 22 | If you followed the technical requirements for PIM v5.0, you are not impacted by the vulnerability, as the required Elasticsearch version for PIM v5 is not vulnerable. 23 | -------------------------------------------------------------------------------- /logshell_saas.rst: -------------------------------------------------------------------------------- 1 | About Log4Shell Vulnerability for SaaS Users 2 | ============================================ 3 | 4 | Security Update 5 | *************** 6 | 7 | As you are an Akeneo SaaS user, we have good news for you. Serenity/GrowthEdition/SharedCatalogs are NOT impacted by the Apache Log4j Java critical security vulnerability that was disclosed on Friday, December the 10th 2021, thanks to our ability to continuously upgrade and maintain our services. No action is needed from you and your Akeneo instance remains secure. 8 | 9 | Additional information 10 | ********************** 11 | You may have heard about a global critical vulnerability disclosed Friday, December the 10th 2021, which has the potential to affect a lot of online services and companies. This vulnerability comes from a Java logging library. 12 | Just after the publication of this vulnerability (CVE-2021-44228, or Log4shell), we closely examined any related impacts to Akeneo, assessed our exposure, and came to the following statement: 13 | 14 | 1. As PHP applications, our main software is not impacted; 15 | 2. We use Elasticsearch (from Elastic) as a technical component 16 | 17 | We have concluded that there is no security vulnerability for you, as a SaaS customer. 18 | -------------------------------------------------------------------------------- /maintain_pim/first_aid_kit/clear_browser_cache.rst.inc: -------------------------------------------------------------------------------- 1 | * If you use Chrome, see: `Chrome documentation: Clear cache and cookies `_. 2 | * If you use Firefox, see: `Firefox documentation: How to clear the Firefox cache `_. 3 | * If you use another browser, be aware this one isn't officially supported. 4 | -------------------------------------------------------------------------------- /maintain_pim/first_aid_kit/deploy_assets.rst.inc: -------------------------------------------------------------------------------- 1 | .. code-block:: bash 2 | 3 | cd /path/to/your/pim/ 4 | rm -rf ./public/bundles/* ./public/css/* ./public/js/* 5 | php bin/console pim:install:assets 6 | php bin/console assets:install --symlink web 7 | yarn run webpack 8 | -------------------------------------------------------------------------------- /maintain_pim/index.rst: -------------------------------------------------------------------------------- 1 | Maintain Akeneo PIM projects 2 | ============================ 3 | 4 | You can use this guide to help you resolve common technical issues you may be experiencing with the PIM. 5 | 6 | .. toctree:: 7 | :maxdepth: 1 8 | 9 | first_aid_kit/index 10 | bug_qualification/index 11 | common_issues/index 12 | scalability_guide/index 13 | purge/index -------------------------------------------------------------------------------- /maintain_pim/purge/index.rst: -------------------------------------------------------------------------------- 1 | How to purge history 2 | ==================== 3 | 4 | This chapter describes the existing commands to purge unused information in the PIM. 5 | 6 | .. toctree:: 7 | :maxdepth: 2 8 | 9 | purge_job_execution 10 | purge_version_entities 11 | purge_events_api_logs 12 | -------------------------------------------------------------------------------- /maintain_pim/purge/purge_events_api_logs.rst: -------------------------------------------------------------------------------- 1 | How to purge events API logs 2 | ============================ 3 | 4 | This chapter gives details on how to purge events API logs in order keep the elastic search index volume under control. 5 | 6 | The batch job command 7 | --------------------- 8 | 9 | Akeneo PIM provides a simple command to purge events API logs: 10 | 11 | .. code-block:: bash 12 | :linenos: 13 | 14 | bin/console akeneo:connectivity-connection:purge-events-api-logs 15 | 16 | .. note:: 17 | 18 | This purge command removes the info and notice level events API logs to keep only the 100 last and removes the warning 19 | and error logs older than 72h. 20 | 21 | Scheduling the jobs 22 | ------------------- 23 | 24 | To run a command periodically, you can use a cron_: 25 | 26 | .. _cron: https://help.ubuntu.com/community/CronHowto 27 | 28 | First, you need to install it (example in debian/ubuntu based distributions): 29 | 30 | .. code-block:: bash 31 | :linenos: 32 | 33 | apt-get install cron 34 | 35 | Then, you can edit your crontab: 36 | 37 | .. code-block:: bash 38 | :linenos: 39 | 40 | crontab -e 41 | 42 | You can now add a new line at the end of the opened file: 43 | 44 | .. code-block:: bash 45 | :linenos: 46 | 47 | 0 * * * * /home/akeneo/pim/bin/console akeneo:connectivity-connection:purge-events-api-logs --env=prod 48 | 49 | With this cron configuration a purge of events API logs, will be launched each hour. 50 | -------------------------------------------------------------------------------- /maintain_pim/purge/purge_job_execution.rst: -------------------------------------------------------------------------------- 1 | How to purge jobs executions 2 | ============================ 3 | 4 | This chapter gives details on how to purge jobs executions in order to decrease the database volume. 5 | 6 | The batch job command 7 | --------------------- 8 | 9 | Akeneo PIM provides a simple command to purge jobs executions: 10 | 11 | .. code-block:: bash 12 | :linenos: 13 | 14 | bin/console akeneo:batch:purge-job-execution [-d|--days DAYS] 15 | 16 | .. tip:: 17 | Don't forget to add --env=prod to avoid memory leaks in dev environment (the default environment for commands) 18 | 19 | You can also provide a custom configuration for the job: 20 | 21 | .. code-block:: bash 22 | :linenos: 23 | 24 | bin/console akeneo:batch:purge-job-execution --days=30 --env=prod 25 | 26 | For example, with the option --days=30, the command will remove all jobs executions and their archives when they were created over 30 days ago. 27 | 28 | .. note:: 29 | 30 | This purge command removes the job executions from the database and files from var/file_storage/archive directory. 31 | 32 | Scheduling the jobs 33 | ------------------- 34 | 35 | To run a command periodically, you can use a cron_: 36 | 37 | .. _cron: https://help.ubuntu.com/community/CronHowto 38 | 39 | First, you need to install it (example in debian/ubuntu based distributions): 40 | 41 | .. code-block:: bash 42 | :linenos: 43 | 44 | apt-get install cron 45 | 46 | Then, you can edit your crontab: 47 | 48 | .. code-block:: bash 49 | :linenos: 50 | 51 | crontab -e 52 | 53 | You can now add a new line at the end of the opened file: 54 | 55 | .. code-block:: bash 56 | :linenos: 57 | 58 | 0 0 * * * /home/akeneo/pim/bin/console akeneo:batch:purge-job-execution --env=prod 59 | 60 | With this cron configuration a purge of jobs executions older than 90 days, will be launched once a day. 61 | -------------------------------------------------------------------------------- /maintain_pim/scalability_guide/index.rst: -------------------------------------------------------------------------------- 1 | Scalability Guide 2 | ================= 3 | 4 | A product catalog is unique to one's need. It is configured with a custom number of products, attributes, families, locales, channels, etc. Those different combinations may affect the application performances. 5 | 6 | This chapter explains how we audit the application's scalability, it lists the known issues and possible improvements as well as the bottlenecks already encountered by our partners with the PIM. It also shows best practices you should implement to ensure the success of your project. 7 | 8 | We improve the scalability in each new minor version. 9 | If you encounter any new limitation, please do not hesitate to contact us through `the helpdesk `_. 10 | We'll give you details about the roadmap for specific improvements and help you to find a suitable solution for your project. 11 | 12 | .. warning:: 13 | 14 | This is an early version of this chapter, we'll continue to complete it with more use cases. 15 | We also provide a :doc:`/technical_architecture/performances_guide/index`. 16 | 17 | .. toctree:: 18 | :maxdepth: 1 19 | 20 | representative_catalogs 21 | more_than_10k_attributes 22 | more_than_10k_families 23 | more_than_10k_categories 24 | more_than_500_attributes_usable_in_product_grid 25 | more_than_100k_products_to_export 26 | more_than_1GB_of_product_media_to_export 27 | -------------------------------------------------------------------------------- /maintain_pim/scalability_guide/more_than_100k_products_to_export.rst: -------------------------------------------------------------------------------- 1 | More than 100k products to export? 2 | ---------------------------------- 3 | 4 | In the past, we encountered use cases where partners would export 270k products and experienced issues with the memory usage. 5 | 6 | Most of PIM's massive operations, such as imports and exports, process the products iteratively via a size configured subsets of products in order to minimize the memory usage. 7 | 8 | As each product may have different properties, the export operation would keep the transformed array in memory in order to add missing columns from one line to another. 9 | 10 | In version 1.5.0, we changed the internal behavior of the CsvProductWriter to use a file buffer to temporarily write each previously transformed array in order to aggregate the final result. We decoupled the CsvProductWriter and the buffer component so that it can be used in other contexts. 11 | 12 | As a conclusion, the main product export's limitation is now the hard drive space and no longer the available memory. 13 | 14 | Please notice that the number of values per product will have an impact on the execution time and memory usage. 15 | -------------------------------------------------------------------------------- /maintain_pim/scalability_guide/more_than_10k_attributes.rst: -------------------------------------------------------------------------------- 1 | More than 10k attributes? 2 | ------------------------- 3 | 4 | The number of attributes may impact performances of Akeneo PIM in several ways. 5 | We've tested performances with a set of 10k simple attributes in total (not 10k attributes per product). Note: These attributes were not scopable nor localizable. 6 | 7 | .. warning:: 8 | 9 | We've already improved different screens and processes but we are still experiencing different issues with 10k attributes and a low amount of families and categories. 10 | 11 | The impacted screens are the following: 12 | - **[Fixed v1.6.0]** (PIM-5401) the attributes popin in variant group page (Community Edition) 13 | - **[Fixed v1.6.0]** (PIM-5283) use the same edit form system than product for the variant group edit (Community Edition) 14 | - **[Fixed v1.7.0]** (PIM-5212) the attributes popin in family edit page (Community Edition) 15 | - **[TODO]** (PIM-6118) the configure step of the family / mass edit / requirements (Community Edition) 16 | - **[TODO]** (PIM-6094) the attributes popin in attribute group edit page (Community Edition) 17 | 18 | **If you plan to use the PIM with more than 10k attributes, please contact us.** 19 | 20 | You may be interested in :doc:`/maintain_pim/scalability_guide/more_than_500_attributes_usable_in_product_grid` 21 | -------------------------------------------------------------------------------- /maintain_pim/scalability_guide/more_than_10k_categories.rst: -------------------------------------------------------------------------------- 1 | More than 10k categories? 2 | ------------------------- 3 | 4 | The number of categories will impact performances of the PIM in several ways. 5 | We've tested performances with a set of 10k categories in total. 6 | 7 | .. warning:: 8 | 9 | We've already improved different screens and processes but we are still experiencing different issues with 10k categories and a low amount of families and attributes. 10 | 11 | The impacted screens are the following and we're releasing performances fixes as 1.4 patches: 12 | - **[TODO]** (PIM-5239) change and save permissions on the root category of a large tree (Enterprise Edition) 13 | 14 | **If you plan to use the PIM with more than 10k categories, please contact us.** 15 | -------------------------------------------------------------------------------- /maintain_pim/scalability_guide/more_than_10k_families.rst: -------------------------------------------------------------------------------- 1 | More than 10k families? 2 | ----------------------- 3 | 4 | The number of families will impact performances of the PIM in several ways. 5 | We've tested performances with a set of 10k families in total. 6 | 7 | .. warning:: 8 | 9 | We've already improved different screens and processes but we are still experiencing different issues with 10k families and a low amount of attributes and categories. 10 | 11 | The impacted screens are the following: 12 | - **[TODO]** (PIM-5234) creation of a channel due to the creation of families requirements (Community Edition) 13 | 14 | **If you plan to use the PIM with more than 10k families, please contact us.** 15 | -------------------------------------------------------------------------------- /maintain_pim/scalability_guide/more_than_500_attributes_usable_in_product_grid.rst: -------------------------------------------------------------------------------- 1 | More than 500 attributes usable in the product grids? 2 | ----------------------------------------------------- 3 | 4 | The number of attributes usable in the product grids will impact performances of the PIM in several ways. 5 | 6 | We've tested performances with a set of 10k attributes, including 500 attributes usable in the grids (meaning 10k attributes in total not 10k attributes per product). 7 | 8 | Prior to 1.4.12, all attributes could be displayed in the grid columns and only *attributes usable as grid filter* could be used to filter data in the grids. We observed a significant performance problem during the loading of the product grids for catalogs with a large number of attributes. We decided to change this behavior and to define a limitation of 500 attributes usable in the grid. 9 | 10 | From 1.4.12 and upper versions, the attribute option *attributes usable as grid filter* became *usable in grid*. 11 | This option states whether or not the attribute can be displayed as a column or used as a filter in product grids. 12 | 13 | We'll try to improve the datagrid system to increase this limitation in an upcoming minor version. 14 | 15 | .. warning:: 16 | 17 | **If you plan to use the PIM with more than 500 attributes usable in the grids, please contact us.** 18 | -------------------------------------------------------------------------------- /maintain_pim/unicorn-akeneo_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/maintain_pim/unicorn-akeneo_128.png -------------------------------------------------------------------------------- /manipulate_pim_data/catalog_structure/creating_a_reference_data.rst: -------------------------------------------------------------------------------- 1 | How to Create a Reference Data 2 | ============================== 3 | 4 | .. note:: 5 | If you want to use Reference data to model your catalog you likely need our new feature: `Reference entities`_! 6 | 7 | .. _Reference entities: https://github.com/akeneo-labs/CustomEntityBundle/blob/master/docs/index.md 8 | -------------------------------------------------------------------------------- /manipulate_pim_data/catalog_structure/index.rst: -------------------------------------------------------------------------------- 1 | How to Customize the Catalog Structure 2 | ====================================== 3 | 4 | This chapter describes how to customize the catalog structure to add your own models or update the existing ones. 5 | 6 | .. toctree:: 7 | 8 | creating_a_reference_data 9 | -------------------------------------------------------------------------------- /manipulate_pim_data/connect/configure_event_subscription_network.rst: -------------------------------------------------------------------------------- 1 | How to Configure the Event Subscription network restrictions 2 | ============================================================ 3 | 4 | In the Event Subscription, some restrictions exist on the entered URL to guarantee that the PIM is not used to access 5 | unsolicited resources. 6 | 7 | The following domains are always blacklisted: 8 | 9 | - `localhost` 10 | - `elasticsearch` 11 | - `memcached` 12 | - `object-storage` 13 | - `mysql` 14 | 15 | Additionally, we also block the ranges of IPs defined in the RFC1918. 16 | 17 | However, **you may need to add an exception to those IP address ranges**, this chapter explains how. 18 | 19 | Add IPs to the whitelist 20 | ------------------------ 21 | If you want to allow specific IPs, you can set the environment variable `ALLOWED_NETWORK_WHITELIST` with 22 | a list of IPs separated by commas, with or without netmask. 23 | 24 | .. code-block:: yaml 25 | :linenos: 26 | 27 | ALLOWED_NETWORK_WHITELIST=10.0.2.0/24,10.0.3.1 28 | 29 | .. warning:: 30 | 31 | The domain blacklist will always supersede the IP whitelist. 32 | -------------------------------------------------------------------------------- /manipulate_pim_data/index.rst: -------------------------------------------------------------------------------- 1 | Manipulate the Akeneo PIM data 2 | ============================== 3 | 4 | .. toctree:: 5 | :maxdepth: 2 6 | 7 | mass_edit 8 | product/index 9 | non-product/index 10 | rule/index 11 | define-acl 12 | catalog_structure/index 13 | teamwork_assistant/index 14 | store_assets_externally 15 | measurement/configure_measurement_limits 16 | connect/configure_event_subscription_network 17 | -------------------------------------------------------------------------------- /manipulate_pim_data/mass_edit.rst: -------------------------------------------------------------------------------- 1 | How to Customize Mass Edit Operations 2 | ===================================== 3 | 4 | This chapter gives details on how to customize existing mass edit operations and how to add new ones. 5 | 6 | .. toctree:: 7 | 8 | mass_edition/register_a_new_bulk_action 9 | mass_edition/register_a_new_mass_edit_action 10 | 11 | If you need a presentation of Mass Edit feature, take a look at the *Product focus* video! 12 | 13 | .. raw:: html 14 | 15 |
16 | 17 |
18 | -------------------------------------------------------------------------------- /manipulate_pim_data/mass_edition/operation-group-dropdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/manipulate_pim_data/mass_edition/operation-group-dropdown.png -------------------------------------------------------------------------------- /manipulate_pim_data/measurement/configure_measurement_limits.rst: -------------------------------------------------------------------------------- 1 | How to Configure Measurement Limits 2 | =================================== 3 | 4 | In the Measurement Families, some limits about the number of families and units have been defined to guarantee that the PIM is functional and runs smoothly. 5 | However, as your catalog is unique, **you may need to raise those values**, this chapter explains how. 6 | 7 | .. warning:: 8 | If you hit those limits, this could reflect that **your modelization is not adapted**. If it's the case, we can't guarantee that the PIM will be functional and runs smoothly, be sure to test the performances with your new limits. 9 | 10 | All those limits are defined as parameters that you can override like any other `Symfony config parameter `_. 11 | 12 | Raise the limit of Measurement Families 13 | --------------------------------------- 14 | By default, you can't create more than **300 Measurement Families**. 15 | If you want to create more, you have to edit the ``akeneo_measurement.validation.measurement_family.families_max`` parameter, for example: 16 | 17 | .. code-block:: yaml 18 | :linenos: 19 | 20 | parameters: 21 | akeneo_measurement.validation.measurement_family.families_max: 500 22 | 23 | Raise the limit of Units per Measurement Family 24 | ----------------------------------------------- 25 | By default, you can't create more than **50 Units per Measurement Family**. 26 | If you want to create more, you have to edit the ``akeneo_measurement.validation.measurement_family.units_max`` parameter, for example: 27 | 28 | .. code-block:: yaml 29 | :linenos: 30 | 31 | parameters: 32 | akeneo_measurement.validation.measurement_family.units_max: 100 33 | 34 | Raise the limit of Operations per Unit 35 | -------------------------------------- 36 | By default, you can't create more than **5 Operations per Unit**. 37 | If you want to create more, you have to edit the ``akeneo_measurement.validation.measurement_family.operations_max`` parameter, for example: 38 | 39 | .. code-block:: yaml 40 | :linenos: 41 | 42 | parameters: 43 | akeneo_measurement.validation.measurement_family.operations_max: 10 44 | -------------------------------------------------------------------------------- /manipulate_pim_data/non-product/index.rst: -------------------------------------------------------------------------------- 1 | How to Manipulate Non-Product Objects 2 | ===================================== 3 | 4 | This chapter gives details on how to programmatically manipulate other catalog objects. 5 | 6 | .. toctree:: 7 | 8 | query 9 | create 10 | update 11 | validate 12 | save 13 | remove 14 | -------------------------------------------------------------------------------- /manipulate_pim_data/non-product/remove.rst: -------------------------------------------------------------------------------- 1 | How to Remove Non-Product Objects 2 | ================================= 3 | 4 | To remove one or many objects, we provide a service which implements methods 'remove' and 'removeAll' through the implementation of ``Akeneo\Tool\Component\StorageUtils\Remover\RemoverInterface`` and ``Akeneo\Tool\Component\StorageUtils\Remover\BulkRemoverInterface``. 5 | 6 | Use the Remover to Remove a Single Object 7 | ----------------------------------------- 8 | 9 | You can remove one or many objects of a kind with a special service, the remover checks that the used object is supported (for instance, you can't use the attribute remover to remove a family). 10 | 11 | We define these different services to simplify future changes, and to allow you to override only one of them to add specific business logic (for instance, override only attribute remover but not the family remover). 12 | 13 | Some services already use specific classes but most of these services use the class ``Akeneo\Tool\Bundle\StorageUtilsBundle\Doctrine\Common\Remover\BaseRemover``. 14 | 15 | .. code-block:: php 16 | 17 | $attributeRemover = $this->getContainer()->get('pim_catalog.remover.attribute'); 18 | $attributeRemover->remove($attribute); 19 | 20 | $familyRemover = $this->getContainer()->get('pim_catalog.remover.family'); 21 | $familyRemover->remove($family); 22 | 23 | $categoryRemover = $this->getContainer()->get('pim_catalog.remover.category'); 24 | $categoryRemover->remove($category); 25 | 26 | Use the Remover to Remove many Objects 27 | -------------------------------------- 28 | 29 | .. code-block:: php 30 | 31 | $attributeRemover = $this->getContainer()->get('pim_catalog.remover.attribute'); 32 | $attributeRemover->removeAll([$attributeOne, $attributeTwo]); 33 | 34 | $familyRemover = $this->getContainer()->get('pim_catalog.remover.family'); 35 | $familyRemover->removeAll([$familyOne, $familyTwo]); 36 | 37 | $categoryRemover = $this->getContainer()->get('pim_catalog.remover.category'); 38 | $categoryRemover->removeAll([$categoryOne, $categoryTwo]); 39 | -------------------------------------------------------------------------------- /manipulate_pim_data/non-product/save.rst: -------------------------------------------------------------------------------- 1 | How to Save Non-Product Objects 2 | =============================== 3 | 4 | To save one or several objects, we provide a service which implements methods 'save' and 'saveAll' through the implementation of ``Akeneo\Tool\Component\StorageUtils\Saver\SaverInterface`` and ``Akeneo\Tool\Component\StorageUtils\Saver\BulkSaverInterface``. 5 | 6 | Use the Saver to Save a Single Object 7 | ------------------------------------- 8 | 9 | You can save one or several objects of a kind with a dedicated service, the saver checks that the used object is supported (for instance, you can't use the attribute saver to save a family). 10 | 11 | We define these different services to simplify the future changes, and to allow you to override only one of them to add custom business logic (for instance, override only attribute saver but not the family saver). 12 | 13 | Some services already use specific classes but most of these services use the class ``Akeneo\Tool\Bundle\StorageUtilsBundle\Doctrine\Common\Saver\BaseSaver``. 14 | 15 | .. code-block:: php 16 | 17 | $attributeSaver = $this->getContainer()->get('pim_catalog.saver.attribute'); 18 | $attributeSaver->save($attribute); 19 | 20 | $familySaver = $this->getContainer()->get('pim_catalog.saver.family'); 21 | $familySaver->save($family); 22 | 23 | $categorySaver = $this->getContainer()->get('pim_catalog.saver.category'); 24 | $categorySaver->save($category); 25 | 26 | Use the Saver to Save many Objects 27 | ---------------------------------- 28 | 29 | .. code-block:: php 30 | 31 | $attributeSaver = $this->getContainer()->get('pim_catalog.saver.attribute'); 32 | $attributeSaver->saveAll([$attributeOne, $attributeTwo]); 33 | 34 | $familySaver = $this->getContainer()->get('pim_catalog.saver.family'); 35 | $familySaver->saveAll([$familyOne, $familyTwo]); 36 | 37 | $categorySaver = $this->getContainer()->get('pim_catalog.saver.category'); 38 | $categorySaver->saveAll([$categoryOne, $categoryTwo]); 39 | 40 | Use the Saver with Options 41 | -------------------------- 42 | 43 | You can use an array of the following boolean options as the second parameter when you save objects. 44 | 45 | If the 'flush' option is passed with 'true', the object will be saved to the database (the default 'flush' value is 'true'). 46 | 47 | .. code-block:: php 48 | 49 | $saver->save($product, ['flush' => true]); 50 | 51 | .. note:: 52 | 53 | Some business savers may accept different options, for instance, the channel saver accepts a 'schedule' option to indicate that the completeness must be re-calculated later. 54 | -------------------------------------------------------------------------------- /manipulate_pim_data/non-product/validate.rst: -------------------------------------------------------------------------------- 1 | How to Validate Non-Product Objects 2 | =================================== 3 | 4 | To validate an object, we use a classic Symfony Validator with Constraints defined in yaml files. 5 | 6 | Use the Validator 7 | ----------------- 8 | 9 | The validator is a service, you can fetch it from the container. 10 | 11 | .. code-block:: php 12 | 13 | $validator = $this->getContainer()->get('validator'); 14 | 15 | When you validate an attribute, a family or another object, all business validations are applied. 16 | 17 | .. code-block:: php 18 | 19 | $violations = $validator->validate($family); 20 | $violations = $validator->validate($attribute); 21 | // ... 22 | 23 | It returns here a list of violation errors, a ``Symfony\Component\Validator\ConstraintViolationList``. 24 | 25 | .. warning:: 26 | 27 | The validation of a product is a bit different, you should use its own validator, the service alias is ``pim_catalog.validator.product``. 28 | -------------------------------------------------------------------------------- /manipulate_pim_data/product/create.rst: -------------------------------------------------------------------------------- 1 | How to Create Products 2 | ====================== 3 | 4 | Instantiate a New ProductBuilder 5 | -------------------------------- 6 | 7 | The product builder is available as a service, you can fetch it from the container. 8 | 9 | .. code-block:: php 10 | 11 | $productBuilder = $this->getContainer()->get('pim_catalog.builder.product'); 12 | 13 | Use the ProductBuilder to Create a new Product 14 | ---------------------------------------------- 15 | 16 | .. code-block:: php 17 | 18 | // create a product with a sku (default identifier attribute) and a family code 19 | $product = $productBuilder->createProduct($identifier, $familyCode); 20 | 21 | // create a product with a sku (default identifier attribute) and no family 22 | $product = $productBuilder->createProduct($identifier); 23 | 24 | // create a product without identifier or family 25 | $product = $productBuilder->createProduct(); 26 | -------------------------------------------------------------------------------- /manipulate_pim_data/product/index.rst: -------------------------------------------------------------------------------- 1 | How to Manipulate Products 2 | ========================== 3 | 4 | This chapter gives details on how to use the internal API to manipulate products, the product is the main object of the PIM and it comes with specific services for the following situations. 5 | 6 | .. toctree:: 7 | 8 | query 9 | create 10 | update 11 | validate 12 | save 13 | remove 14 | -------------------------------------------------------------------------------- /manipulate_pim_data/product/remove.rst: -------------------------------------------------------------------------------- 1 | How to Remove Products 2 | ====================== 3 | 4 | Instantiate the Remover 5 | ----------------------- 6 | 7 | The product remover is a service, you can fetch it from the container. 8 | 9 | .. code-block:: php 10 | 11 | $remover = $this->getContainer()->get('pim_catalog.remover.product'); 12 | 13 | Remove the Products 14 | ------------------- 15 | 16 | It implements ``Akeneo\Tool\Component\StorageUtils\Remover\RemoverInterface`` and ``Akeneo\Tool\Component\StorageUtils\Remover\BulkRemoverInterface`` so you can remove one or several products. 17 | 18 | .. code-block:: php 19 | 20 | $remover->remove($product); // To remove one product 21 | $remover->removeAll($products); // To remove a collection of products 22 | -------------------------------------------------------------------------------- /manipulate_pim_data/product/validate.rst: -------------------------------------------------------------------------------- 1 | How to Validate Products 2 | ======================== 3 | 4 | Instantiate the validator 5 | ------------------------- 6 | 7 | The validator is a service, you can fetch it from the container 8 | 9 | .. code-block:: php 10 | 11 | $validator = $this->getContainer()->get('pim_catalog.validator.product'); 12 | 13 | The validator that we use for products is quite special, for other objects we use the Symfony classic `validator`. 14 | 15 | The service `pim_catalog.validator.product` receives Constraints from yaml files (standard Symfony) and also from attributes configuration, to do so we use our own `DelegatingClassMetadataFactory`. 16 | 17 | Validate the product 18 | -------------------- 19 | 20 | Now you can validate your product, all business validations are applied here. 21 | 22 | .. code-block:: php 23 | 24 | $violations = $validator->validate($product); 25 | 26 | In return we get a list of violation errors, a 'Symfony\Component\Validator\ConstraintViolationList'. 27 | -------------------------------------------------------------------------------- /manipulate_pim_data/rule/index.rst: -------------------------------------------------------------------------------- 1 | How to add a custom action rule 2 | =============================== 3 | 4 | This chapter describes rules format and how to to add a custom action in the rule engine. 5 | 6 | **These cookbook entries are about a feature only provided in the Enterprise Edition.** 7 | 8 | .. toctree:: 9 | 10 | general_information_on_rule_format 11 | add_custom_action_rule_engine 12 | -------------------------------------------------------------------------------- /manipulate_pim_data/teamwork_assistant/index.rst: -------------------------------------------------------------------------------- 1 | How To Customize Teamwork Assistant (Enterprise Edition) 2 | ======================================================== 3 | 4 | .. toctree:: 5 | 6 | Customize notifications 7 | Add a calculation step 8 | How to log calculation step 9 | Remove projects impacted by a custom catalog update 10 | -------------------------------------------------------------------------------- /migrate_pim/apply_patch/apply_patch_ce.rst: -------------------------------------------------------------------------------- 1 | How to apply a patch - Community Edition 2 | ============================================= 3 | 4 | Run the composer update command: 5 | 6 | .. code-block:: bash 7 | 8 | composer --prefer-dist update 9 | 10 | Be aware that your composer.json won't be updated and some dependencies might be missing or coming from an outdated version. 11 | 12 | You have to make sure you have the latest version composer.json. In this case you should backup your current composer.json and download the newest one beforehand. 13 | 14 | Double check in the output of this command that the latest version has been fetched, you can also check it by using the following command: 15 | 16 | .. code-block:: bash 17 | 18 | composer licenses 19 | 20 | Then clean the cache, re-install assets and warmup the cache: 21 | 22 | 23 | .. note:: 24 | 25 | Before launching the following commands, remember to stop the daemons to avoid generating outdated cache. 26 | 27 | 28 | .. code-block:: bash 29 | 30 | service php8.1-fpm restart 31 | rm -rf var/cache/* ./public/bundles/* ./public/css/* ./public/js/* 32 | rm yarn.lock 33 | bin/console pim:installer:assets 34 | bin/console cache:warmup 35 | yarn install 36 | yarn run less 37 | yarn run webpack 38 | 39 | Please **clear your browser's cache** before testing. 40 | 41 | .. note:: 42 | 43 | We set any other dependencies to their exact patch versions to avoid compatibility issues. 44 | 45 | 46 | Troubleshooting 47 | ----------------------- 48 | 49 | 50 | **Cache issues** 51 | 52 | If you get a 500 error after upgrading and clear cache isn't working, try clearing the apc cache with a PHP script or restart the Apache/Web server. 53 | 54 | 55 | **Composer issues** 56 | 57 | You have to make sure you have the latest version of composer.json. If this isn't the case, you should backup your current composer.json and download the newest one before updating. 58 | 59 | You need to get an archive containing Akeneo PIM and its PHP dependencies: https://download.akeneo.com/pim-community-standard-v6.0-latest-icecat.tar.gz 60 | 61 | You can then copy the composer.json file to your pim installation. 62 | -------------------------------------------------------------------------------- /migrate_pim/apply_patch/index.rst: -------------------------------------------------------------------------------- 1 | How to apply a patch? 2 | ===================== 3 | 4 | We frequently release patches for all supported versions. 5 | 6 | Each patch contains bug fixes and sometimes improvements or security fixes, **that is why it is very important to always have the latest patch installed on your PIM.** 7 | 8 | Guides 9 | ------- 10 | 11 | * :doc:`/migrate_pim/apply_patch/apply_patch_ce` 12 | 13 | * :doc:`/migrate_pim/apply_patch/apply_patch_ee_flexibility` 14 | 15 | * :doc:`/migrate_pim/apply_patch/apply_patch_ee_on_premise` 16 | 17 | .. toctree:: 18 | :maxdepth: 2 19 | :hidden: 20 | 21 | apply_patch_ce 22 | apply_patch_ee_flexibility 23 | apply_patch_ee_on_premise -------------------------------------------------------------------------------- /migrate_pim/changelog.rst: -------------------------------------------------------------------------------- 1 | Where is the Changelog? 2 | ======================== 3 | 4 | When our maintenance team works on issues, they take extreme care to avoid any backward compatibility break, but it might happen. If it is the case, the BC break is mentioned in the changelog of the version. 5 | 6 | .. note:: 7 | 8 | Akeneo provides 2 changelogs: one for CE edition available the Community repo and one for EE edition which is only available in the latest Enterprise Edition archive. 9 | 10 | Akeneo PIM CE changelog is available on our GitHub repository: 11 | 12 | * Go to our `Community Repository `_. 13 | * Select your branch in the drop down menu, for instance select 7.0 branch. 14 | * Then scroll down the page, and select the desired Changelog in the list, for instance `Changelog 7.0 version `_. 15 | 16 | Akeneo PIM EE changelog is available in your last archive: 17 | 18 | * Get the latest `PIM Enterprise Edition (EE) archive from the Portal `_. 19 | * In your archive, select the desired Changelog in the list, for instance "CHANGELOG-7.0.md" 20 | * If you don't know how to get your archive, please contact us 21 | -------------------------------------------------------------------------------- /migrate_pim/index.rst: -------------------------------------------------------------------------------- 1 | Upgrade Akeneo PIM projects 2 | =========================== 3 | 4 | This chapter describes how to apply a patch on your current version or how to upgrade from a major version to a more recent one. 5 | 6 | As a prerequisite, we assume that you are using a project installed from a Community Edition or an Enterprise Edition (:doc:`/install_pim/index`). 7 | 8 | .. toctree:: 9 | :maxdepth: 2 10 | :hidden: 11 | 12 | apply_patch/index 13 | changelog 14 | upgrade_major_version 15 | migrate_to_saas 16 | -------------------------------------------------------------------------------- /onboarder/common/images/logo-onboarder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/onboarder/common/images/logo-onboarder.png -------------------------------------------------------------------------------- /onboarder/index.rst: -------------------------------------------------------------------------------- 1 | Akeneo Onboarder 2 | ================ 3 | 4 | | 5 | 6 | .. image:: ./common/images/logo-onboarder.png 7 | :width: 291px 8 | 9 | | 10 | 11 | .. toctree:: 12 | :maxdepth: 2 13 | 14 | prerequisites/index 15 | installation/index 16 | synchronization/index 17 | patch_and_minor/index 18 | upgrade_major/index 19 | troubleshooting/index 20 | uninstall/index 21 | 22 | .. toctree:: 23 | :hidden: 24 | :titlesonly: 25 | :includehidden: 26 | 27 | installation/define_environment_variables/index 28 | -------------------------------------------------------------------------------- /onboarder/installation/define_environment_variables/dot_env_component.rst: -------------------------------------------------------------------------------- 1 | Using the DotEnv file 2 | ===================== 3 | 4 | The `Dotenv Symfony component `_ is a dependency already available 5 | into the PIM as it's a standard Symfony framework component. It is also used by default in the PIM starting Akeneo PIM 6 | ``4.0``. 7 | 8 | Edit the ``.env`` file at your project root directory and add the environment variables values provided on your 9 | Onboarder project page on the Partner Portal. 10 | -------------------------------------------------------------------------------- /onboarder/installation/define_environment_variables/index.rst: -------------------------------------------------------------------------------- 1 | Environment variables 2 | ===================== 3 | 4 | .. toctree:: 5 | 6 | dot_env_component 7 | system_environment_variables 8 | -------------------------------------------------------------------------------- /onboarder/installation/define_environment_variables/system_environment_variables.rst: -------------------------------------------------------------------------------- 1 | Using environment variables 2 | =========================== 3 | 4 | Here are some examples to manage environment variables, the way to define environment variables may vary depending on your server installation and your deployment/update strategy. 5 | 6 | **CLI** 7 | 8 | Define the environment variables for CLI. Ensure these variables are always set using the export command : 9 | 10 | .. code-block:: bash 11 | 12 | export ONBOARDER_TOPIC_NAME_FOR_PUBLICATION_TO_MIDDLEWARE=a_topic_name 13 | 14 | **WEB** 15 | 16 | Define the environment variables in your vhost using the SetEnv directive : 17 | 18 | .. code-block:: apache 19 | 20 | 21 | SetEnv ONBOARDER_TOPIC_NAME_FOR_PUBLICATION_TO_MIDDLEWARE a_topic_name 22 | 23 | -------------------------------------------------------------------------------- /onboarder/patch_and_minor/index.rst: -------------------------------------------------------------------------------- 1 | How to update a minor version or to apply a patch 2 | ================================================= 3 | 4 | We frequently release patches for all supported versions. Each patch contains bug fixes and sometimes improvements or 5 | security fixes, **that is why it is very important to always have the latest Onboarder patch installed on your PIM.** 6 | 7 | New minor versions bring new features. 8 | 9 | Prerequisite 10 | ------------ 11 | 12 | We assume that you are using a project installed from a PIM Enterprise Standard edition (:doc:`/onboarder/installation/index`). 13 | It is especially important that you added the Onboarder Composer upgrade script to your PIM ``composer.json``, as explained in :doc:`/onboarder/installation/index`. 14 | 15 | Guides 16 | ------- 17 | 18 | * :doc:`/onboarder/patch_and_minor/update_ee_flexibility` 19 | 20 | * :doc:`/onboarder/patch_and_minor/update_ee_on_premise` 21 | 22 | .. toctree:: 23 | :maxdepth: 2 24 | :hidden: 25 | 26 | update_ee_flexibility 27 | update_ee_on_premise 28 | -------------------------------------------------------------------------------- /onboarder/troubleshooting/images/check_pub_sub_access_command_response.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/onboarder/troubleshooting/images/check_pub_sub_access_command_response.png -------------------------------------------------------------------------------- /onboarder/troubleshooting/index.rst: -------------------------------------------------------------------------------- 1 | Troubleshooting 2 | =============== 3 | 4 | Running the job queue daemon command line leads to errors 5 | --------------------------------------------------------- 6 | 7 | .. code-block:: bash 8 | 9 | batch.ERROR: Encountered an error executing the step: No project ID was provided, and we were unable to detect a default project ID. 10 | 11 | If you encounter this kind of error in ``var/logs/*.log``, it's because the job queue daemon command line isn't aware of the mandatory environment variables needed to run the onboarder properly. 12 | 13 | If you launch this daemon :doc:`using supervisor configuration ` as recommended by the PIM installation manual you have to configure :doc:`the mandatory environment variables ` that the akeneo/pim-onboarder bundle requires in the ``/etc/supervisor.conf`` file. 14 | 15 | .. code-block:: bash 16 | 17 | [supervisord] 18 | environment=ONBOARDER_GOOGLE_APPLICATION_CREDENTIALS="/srv/pim/onboarderServiceAccount.json",ONBOARDER_TOPIC_NAME_FOR_PUBLICATION_TO_MIDDLEWARE="middleware-topic-name",... 19 | 20 | You can check if Google Pub/Sub access is successfully configured by using the following command in your pim 21 | 22 | .. code-block:: bash 23 | 24 | php bin/console akeneo:onboarder:check-pubsub-access --env=prod 25 | 26 | .. image:: ./images/check_pub_sub_access_command_response.png 27 | :width: 900px 28 | :height: 550px 29 | :scale: 100 % 30 | :alt: Result of the check pubsub access command 31 | :align: center 32 | 33 | Proposals from Onboarder don't show up in the PIM 34 | --------------------------------------------------- 35 | 36 | If you don't receive proposals in the PIM, double check that you properly set up and configured your workers, see :doc:`synchronization ` page. 37 | 38 | Please also check that in your .env file you have an `ONBOARDER_GOOGLE_APPLICATION_CREDENTIALS` entry. More details in the :doc:`installation ` page at "Set the configuration values" section. -------------------------------------------------------------------------------- /onboarder/uninstall/index.rst: -------------------------------------------------------------------------------- 1 | How to uninstall the Onboarder bundle 2 | ===================================== 3 | 4 | Clean related data 5 | ------------------ 6 | 7 | There are several related data created by Onboarder: 8 | 9 | - Supplier & supplier reference attributes 10 | - The Onboarder channel 11 | - Product values 12 | 13 | You need to run this command to clean them: 14 | 15 | .. code-block:: bash 16 | 17 | bin/console akeneo:onboarder:deactivate 18 | bin/console akeneo:onboarder:clean-bundle-data 19 | 20 | .. warning:: 21 | 22 | Onboarder ACL is stored in a yml file and not in the database. So the `Akeneo Onboarder` permission will still be displayed after running this command. 23 | -------------------------------------------------------------------------------- /onboarder/upgrade_major/index.rst: -------------------------------------------------------------------------------- 1 | How to upgrade to a major version 2 | ================================= 3 | 4 | New major versions bring compatibility with new Akeneo PIM releases. So the only case you'll have to perform a major 5 | update of the Onboarder bundle is when you are migrating the PIM itself to a new version. 6 | 7 | The instructions you will follow to update your PIM are mostly enough to migrate the bundle, you will only need to do a 8 | couple more things specific to the Onboarder bundle. 9 | 10 | 11 | Right before updating you composer dependencies 12 | ----------------------------------------------- 13 | 14 | When updating the PIM ``composer.json`` to increase the PIM version, you also need to change the 15 | ``akeneo/pim-onboarder`` version. Please refer to :doc:`/onboarder/installation/index` to know which version of the 16 | bundle to use. 17 | 18 | Then, make sure the Onboarder composer script is present in the ``composer.json`` file, as explained in :doc:`/onboarder/installation/index`. 19 | 20 | Right after updating you composer dependencies 21 | ---------------------------------------------- 22 | 23 | Thanks to the Onboarder composer script, all the migration scripts of the Onboarder bundle should have been copied 24 | in the ``upgrades/schema`` directory, alongside those of the PIM. Before executing the migrations (both those of the PIM 25 | and those of the Onboarder bundle), please make sure to follow the additional instructions of the ``UPGRADE.md`` file 26 | contained in the bundle (``vendor/akeneo/pim-onboarder/UPGRADE.md``). It will provide you accurate instructions on how 27 | to run the migration scripts. 28 | 29 | You can then follow the rest of the PIM upgrade instructions. 30 | -------------------------------------------------------------------------------- /reference_entities/configure_entity_limits.rst: -------------------------------------------------------------------------------- 1 | Configure Entity Limits 2 | ======================= 3 | 4 | For the Reference Entities feature (*introduced in 3.0*), some limits about the number of entities have been defined to guarantee that the PIM is functional and runs smoothly. 5 | However, as your catalog is unique, **you may need to raise those values**, this chapter explains how. 6 | 7 | .. warning:: 8 | If you hit those limits, this could reflect that **your modelization is not adapted**. If it's the case, we can't guarantee that the PIM will be functional and runs smoothly, be sure to test the performances with your new limits. 9 | 10 | All those limits are defined as parameters that you can override like any other `Symfony config parameter `_. 11 | 12 | Raise the limit of Reference Entities 13 | ------------------------------------- 14 | By default, you can't create more than **200 Reference Entities**. 15 | If you want to create more, you have to edit the ``reference_entity_limit`` parameter, for example: 16 | 17 | .. code-block:: yaml 18 | :linenos: 19 | 20 | # app/config/parameters.yml 21 | parameters: 22 | reference_entity_limit: 250 23 | 24 | Raise the limit of Attributes per Reference Entity 25 | -------------------------------------------------- 26 | By default, you can't create more than **100 Attributes per Reference Entity**. 27 | If you want to create more, you have to edit the ``reference_entity_maximum_attribute`` parameter, for example: 28 | 29 | .. code-block:: yaml 30 | :linenos: 31 | 32 | # app/config/parameters.yml 33 | parameters: 34 | reference_entity_maximum_attribute: 130 35 | 36 | Raise the limit of Options for "Simple Option" and "Multiple Option" Attributes 37 | ------------------------------------------------------------------------------- 38 | You can't create more than **100** options for each **"Simple Option" and "Multiple Option"**. 39 | If you need more than 100 options, we advise you to create a dedicated reference entity. 40 | 41 | 42 | Raise the limit of Records per Reference Entity 43 | ----------------------------------------------- 44 | By default, you can't create more than **1 000 000** (*one million*) **Records per Reference Entity**. 45 | If you want to create more, you have to edit the ``reference_entity_record_limit_per_reference_entity`` parameter, for example: 46 | 47 | .. code-block:: yaml 48 | :linenos: 49 | 50 | # app/config/parameters.yml 51 | parameters: 52 | reference_entity_record_limit_per_reference_entity: 2000000 53 | -------------------------------------------------------------------------------- /reference_entities/index.rst: -------------------------------------------------------------------------------- 1 | Reference Entities 2 | ================== 3 | 4 | .. note:: 5 | 6 | Reference Entities feature is only available for the **Enterprise Edition**. 7 | 8 | .. note:: 9 | 10 | In this current documentation, we provide a way to add a custom attribute type and enrich it. 11 | However, this extensibility point is pretty new and **we couldn't ensure the backward compatibility** in the next minor releases. 12 | 13 | This part of the documentation is about the Reference Entities feature. 14 | Reference entities are objects related to products with their own attributes and lifecycle (ie. brands, ranges, manufacturers, colors, materials, care instructions...). 15 | 16 | .. toctree:: 17 | :maxdepth: 2 18 | :titlesonly: 19 | :hidden: 20 | 21 | configure_entity_limits 22 | create_new_attribute_type 23 | enrich_a_record_with_new_attribute_type 24 | add_custom_property_to_your_custom_attribute_type 25 | refresh_records 26 | -------------------------------------------------------------------------------- /reference_entities/refresh_records.rst: -------------------------------------------------------------------------------- 1 | Refresh records completeness 2 | ============================ 3 | 4 | .. note:: 5 | 6 | Reference Entities feature is only available for the **Enterprise Edition**. 7 | 8 | Usecases 9 | -------- 10 | 11 | Let's say we have some records having a value for each of those attributes: 12 | 13 | - 1 attribute of type Single Option 14 | - 1 attribute of type Multiple Option 15 | - 1 attribute of type Reference entity single link 16 | - 1 attribute of type Reference entity multiple links 17 | 18 | Whenever an option is removed from the Option (or Option collection) attribute, the records having the deleted option have to be refreshed in order to correctly compute the completeness. 19 | 20 | The same operation needs to happen if a record referenced by another record (through a Reference entity single link or Reference entity multiple links attribute) is deleted. 21 | All the records referencing the deleted record needs to be refreshed. 22 | 23 | .. note:: 24 | 25 | The record's data coming out of the API will always be accurate, yet filtering on the records' completeness may be de-synchronised. 26 | 27 | Command line 28 | ------------ 29 | 30 | To achieve this result, you can use the command: 31 | 32 | .. code-block:: bash 33 | 34 | $ php bin/console --env=prod akeneo:reference-entity:refresh-records 35 | 36 | 37 | This command will go over all the records of the database and refresh all the record's values. 38 | 39 | It is advised to program a crontab to run at least every day when the users are not using the PIM. 40 | 41 | Depending on your reference entities' size (number of records and number of attributes option, option collection, record link and record multiple link) you can run this command multiple times a day. 42 | 43 | .. note:: 44 | 45 | There are chances this command will be deprecated in 3.1 as we may be able to find a solution to refresh the records directly after an option or record deletion. 46 | -------------------------------------------------------------------------------- /robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: / -------------------------------------------------------------------------------- /scripts/update-doc-versions.php: -------------------------------------------------------------------------------- 1 | $newVersionLabel, 20 | 'url' => "/$branch/index.html" 21 | ]; 22 | 23 | writeReorderedVersions($versions, $versionFile); 24 | 25 | function containsVersionLabel(array $versions, string $versionLabel): bool 26 | { 27 | foreach ($versions as $version) { 28 | if ($versionLabel === $version['label']) { 29 | return true; 30 | } 31 | } 32 | 33 | return false; 34 | } 35 | 36 | function versionLabelFromBranchName(string $branchName): string 37 | { 38 | return $branchName == "master" ? $branchName : "v${branchName}"; 39 | } 40 | 41 | function writeReorderedVersions(array $versions, string $versionFile): void 42 | { 43 | $versions = orderVersions($versions); 44 | file_put_contents("$versionFile", json_encode($versions, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); 45 | } 46 | 47 | function orderVersions(array $versions): array 48 | { 49 | usort($versions, static function (array $versionA, array $versionB) { 50 | if ($versionA['label'] === "master") return -1; 51 | if ($versionB['label'] === "master") return 1; 52 | 53 | return $versionB <=> $versionA; 54 | }); 55 | 56 | return $versions; 57 | } 58 | -------------------------------------------------------------------------------- /src/Acme/Bundle/AppBundle/AcmeAppBundle.php: -------------------------------------------------------------------------------- 1 | load('entities.yml'); 16 | $loader->load('attribute_types.yml'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CatalogBundle/Entity/Category.php: -------------------------------------------------------------------------------- 1 | description; 14 | } 15 | 16 | public function setDescription($description) 17 | { 18 | $this->description = $description; 19 | 20 | return $this; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CatalogBundle/Entity/CategoryTranslation.php: -------------------------------------------------------------------------------- 1 | description; 14 | } 15 | 16 | public function setDescription($description) 17 | { 18 | $this->description = $description; 19 | 20 | return $this; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CatalogBundle/Entity/Color.php: -------------------------------------------------------------------------------- 1 | color; 25 | } 26 | 27 | /** 28 | * Sets the color 29 | * 30 | * @param Color $color 31 | * 32 | * @return MyProductValue 33 | */ 34 | public function setColor(Color $color) 35 | { 36 | $this->color = $color; 37 | 38 | return $this; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CatalogBundle/Entity/TranslatableCategory.php: -------------------------------------------------------------------------------- 1 | getTranslation()) ? $this->getTranslation()->getDescription() : null; 12 | 13 | return ($translated !== '' && $translated !== null) ? $translated : '['.$this->getCode().']'; 14 | } 15 | 16 | public function setDescription($description) 17 | { 18 | $this->getTranslation()->setDescription($description); 19 | 20 | return $this; 21 | } 22 | 23 | public function getTranslationFQCN() 24 | { 25 | return CategoryTranslation::class; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CatalogBundle/Form/Type/CategoryType.php: -------------------------------------------------------------------------------- 1 | add('description', TextType::class, 23 | [ 24 | 'required' => true 25 | ] 26 | ); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CatalogBundle/Form/Type/TranslatableCategoryType.php: -------------------------------------------------------------------------------- 1 | add( 24 | 'description', 25 | TranslatableFieldType::class, 26 | [ 27 | 'field' => 'description', 28 | 'translation_class' => $this->translationDataClass, 29 | 'entity_class' => $this->dataClass, 30 | 'property_path' => 'translations', 31 | 'widget' => TextareaType::class, 32 | ] 33 | ); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CatalogBundle/Resources/config/attribute_types.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | pim_datagrid.product.attribute_type.acme_color: 3 | column: 4 | type: flexible_option 5 | selector: flexible_option 6 | filter: 7 | type: flexible_choice 8 | parent_type: ajax_choice 9 | options: 10 | field_options: 11 | multiple: true 12 | sorter: flexible_field 13 | 14 | services: 15 | acme_catalog.attributetype.color: 16 | class: '%pim_custom_entity.attribute_type.custom_option_simple_select.class%' 17 | arguments: 18 | - color 19 | - pim_ajax_entity 20 | - '@pim_catalog.validator.constraint_guesser.chained_attribute' 21 | - acme_catalog_color 22 | - Acme\Bundle\CatalogBundle\Entity\Color 23 | tags: 24 | - { name: pim_catalog.attribute_type, alias: acme_catalog_color, entity: '%pim_catalog.entity.product.class%' } 25 | 26 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CatalogBundle/Resources/config/doctrine/Category.orm.yml: -------------------------------------------------------------------------------- 1 | Acme\Bundle\CatalogBundle\Entity\Category: 2 | type: entity 3 | table: pim_catalog_category 4 | changeTrackingPolicy: DEFERRED_EXPLICIT 5 | repositoryClass: Akeneo\Tool\Bundle\ClassificationBundle\Doctrine\ORM\Repository\CategoryRepository 6 | uniqueConstraints: 7 | pim_category_code_uc: 8 | columns: 9 | - code 10 | gedmo: 11 | tree: 12 | type: nested 13 | fields: 14 | description: 15 | type: string 16 | length: 255 17 | nullable: true 18 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CatalogBundle/Resources/config/doctrine/CategoryTranslation.orm.yml: -------------------------------------------------------------------------------- 1 | Acme\Bundle\CatalogBundle\Entity\CategoryTranslation: 2 | type: entity 3 | table: pim_catalog_category_translation 4 | changeTrackingPolicy: DEFERRED_EXPLICIT 5 | uniqueConstraints: 6 | locale_foreign_key_idx: 7 | columns: 8 | - locale 9 | - foreign_key 10 | fields: 11 | description: 12 | type: text 13 | nullable: true 14 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CatalogBundle/Resources/config/doctrine/Color.orm.yml: -------------------------------------------------------------------------------- 1 | Acme\Bundle\CatalogBundle\Entity\Color: 2 | type: entity 3 | table: acme_catalog_color 4 | repositoryClass: Pim\Bundle\CustomEntityBundle\Entity\Repository\TranslatableCustomOptionRepository 5 | fields: 6 | id: 7 | type: integer 8 | id: true 9 | generator: 10 | strategy: AUTO 11 | code: 12 | type: string 13 | length: 100 14 | unique: true 15 | created: 16 | type: datetime 17 | gedmo: 18 | timestampable: 19 | on: create 20 | updated: 21 | type: datetime 22 | gedmo: 23 | timestampable: 24 | on: update 25 | oneToMany: 26 | translations: 27 | targetEntity: Acme\Bundle\CatalogBundle\Entity\ColorTranslation 28 | mappedBy: foreignKey 29 | cascade: 30 | - persist 31 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CatalogBundle/Resources/config/doctrine/ColorTranslation.orm.yml: -------------------------------------------------------------------------------- 1 | Acme\Bundle\CatalogBundle\Entity\ColorTranslation: 2 | type: entity 3 | table: acme_catalog_color_translation 4 | uniqueConstraints: 5 | locale_foreign_key_idx: 6 | columns: 7 | - locale 8 | - foreign_key 9 | fields: 10 | id: 11 | type: integer 12 | id: true 13 | generator: 14 | strategy: AUTO 15 | label: 16 | type: string 17 | length: 100 18 | nullable: true 19 | locale: 20 | type: string 21 | length: 20 22 | manyToOne: 23 | foreignKey: 24 | targetEntity: Acme\Bundle\CatalogBundle\Entity\Color 25 | inversedBy: translations 26 | joinColumns: 27 | foreign_key: 28 | referencedColumnName: id 29 | onDelete: CASCADE 30 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CatalogBundle/Resources/config/doctrine/TranslatableCategory.orm.yml: -------------------------------------------------------------------------------- 1 | Acme\Bundle\CatalogBundle\Entity\Category: 2 | type: entity 3 | table: pim_catalog_category 4 | changeTrackingPolicy: DEFERRED_EXPLICIT 5 | repositoryClass: Akeneo\Tool\Bundle\ClassificationBundle\Doctrine\ORM\Repository\CategoryRepository 6 | uniqueConstraints: 7 | pim_category_code_uc: 8 | columns: 9 | - code 10 | gedmo: 11 | tree: 12 | type: nested 13 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CatalogBundle/Resources/config/entities.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | pim_catalog.entity.product_value.class: Acme\Bundle\CatalogBundle\Entity\MyProductValue 3 | pim_catalog.entity.category.class: Acme\Bundle\CatalogBundle\Entity\Category 4 | pim_catalog.entity.category_translation.class: Acme\Bundle\CatalogBundle\Entity\CategoryTranslation 5 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CatalogBundle/Resources/config/form_types.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | pim_enrich.view_element.category.tab.property.template: 'AcmeCatalogBundle:CategoryTree:Tab/property.html.twig' 3 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CatalogBundle/Resources/config/validation/category.yml: -------------------------------------------------------------------------------- 1 | Acme\Bundle\CatalogBundle\Entity\Category: 2 | properties: 3 | description: 4 | - NotBlank: ~ 5 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CsvCleanerConnectorBundle/AcmeCsvCleanerConnectorBundle.php: -------------------------------------------------------------------------------- 1 | productConverter = $productConverter; 18 | } 19 | 20 | public function convert(array $item, array $options = []) 21 | { 22 | // cleans the sku 23 | $item['sku'] = str_replace('uselesspart-', '', $item['sku']); 24 | 25 | $convertedItem = $this->productConverter->convert($item, $options); 26 | 27 | 28 | 29 | return $convertedItem; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CsvCleanerConnectorBundle/DependencyInjection/AcmeCsvCleanerConnectorExtension.php: -------------------------------------------------------------------------------- 1 | load('array_converters.yml'); 16 | $loader->load('jobs.yml'); 17 | $loader->load('job_constraints.yml'); 18 | $loader->load('job_defaults.yml'); 19 | $loader->load('job_parameters.yml'); 20 | $loader->load('readers.yml'); 21 | $loader->load('steps.yml'); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CsvCleanerConnectorBundle/Resources/config/array_converters.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | acme_csvcleanerconnector.array_converter.flat.product.class: 'Acme\Bundle\CsvCleanerConnectorBundle\ArrayConverter\StandardToFlat\Product' 3 | 4 | services: 5 | acme_csvcleanerconnector.array_converter.flat.product: 6 | class: '%acme_csvcleanerconnector.array_converter.flat.product.class%' 7 | arguments: 8 | - '@pim_connector.array_converter.flat_to_standard.product_delocalized' 9 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CsvCleanerConnectorBundle/Resources/config/job_constraints.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_csvcleanerconnector.job.job_parameters.constraint_collection_provider.product_csv_import: 3 | class: '%pim_connector.job.job_parameters.constraint_collection_provider.product_csv_import.class%' 4 | arguments: 5 | - '@pim_connector.job.job_parameters.constraint_collection_provider.simple_csv_import' 6 | - 7 | - 'csv_product_import_cleaner' 8 | tags: 9 | - { name: akeneo_batch.job.job_parameters.constraint_collection_provider } 10 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CsvCleanerConnectorBundle/Resources/config/job_defaults.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_csvcleanerconnector.job.job_parameters.default_values_provider.product_csv_import: 3 | class: '%pim_connector.job.job_parameters.default_values_provider.product_csv_import.class%' 4 | arguments: 5 | - '@pim_connector.job.job_parameters.default_values_provider.simple_csv_import' 6 | - 7 | - 'csv_product_import_cleaner' 8 | tags: 9 | - { name: akeneo_batch.job.job_parameters.default_values_provider } 10 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CsvCleanerConnectorBundle/Resources/config/job_parameters.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_csvcleanerconnector.job_parameters.form_configuration_provider.product_csv_import_cleaner: 3 | class: '%pim_import_export.job_parameters.form_configuration_provider.product_csv_import.class%' 4 | arguments: 5 | - '@pim_import_export.job_parameters.form_configuration_provider.simple_csv_import' 6 | - 7 | - 'csv_product_import_cleaner' 8 | - '%pim_catalog.localization.decimal_separators%' 9 | - '%pim_catalog.localization.date_formats%' 10 | tags: 11 | - { name: pim_import_export.job_parameters.form_configuration_provider } 12 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CsvCleanerConnectorBundle/Resources/config/jobs.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | acme_csvcleanerconnector.job_name.csv_product_import_cleaner: 'csv_product_import_cleaner' 3 | 4 | services: 5 | acme_csvcleanerconnector.job.csv_product_import_cleaner: 6 | class: '%pim_connector.job.simple_job.class%' 7 | arguments: 8 | - '%acme_csvcleanerconnector.job_name.csv_product_import_cleaner%' 9 | - '@event_dispatcher' 10 | - '@akeneo_batch.job_repository' 11 | - 12 | - '@pim_connector.step.charset_validator' 13 | - '@acme_csvcleanerconnector.step.csv_product.import' 14 | tags: 15 | - { name: akeneo_batch.job, connector: '%pim_connector.connector_name.csv%', type: '%pim_connector.job.import_type%' } 16 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CsvCleanerConnectorBundle/Resources/config/readers.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_csvcleanerconnector.reader.file.csv_product: 3 | class: '%pim_connector.reader.file.csv_product.class%' 4 | arguments: 5 | - '@pim_connector.reader.file.csv_iterator_factory' 6 | - '@acme_csvcleanerconnector.array_converter.flat.product' 7 | - '@pim_connector.reader.file.media_path_transformer' 8 | - [] 9 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CsvCleanerConnectorBundle/Resources/config/steps.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_csvcleanerconnector.step.csv_product.import: 3 | class: '%pim_connector.step.item_step.class%' 4 | arguments: 5 | - 'import' 6 | - '@event_dispatcher' 7 | - '@akeneo_batch.job_repository' 8 | - '@acme_csvcleanerconnector.reader.file.csv_product' 9 | - '@pim_connector.processor.denormalization.product' 10 | - '@pim_connector.writer.database.product' 11 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CsvCleanerConnectorBundle/Resources/fixtures/products.csv: -------------------------------------------------------------------------------- 1 | sku;name 2 | uselesspart-sku-1;my full name 1 3 | uselesspart-sku-2;my full name 2 4 | uselesspart-sku-3;my full name 3 5 | 6 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CsvCleanerConnectorBundle/Resources/translations/messages.en.yml: -------------------------------------------------------------------------------- 1 | batch_jobs: 2 | csv_product_import_cleaner: 3 | label: Product Import Cleaned Csv 4 | import.label: Product import cleaned 5 | validation.label: File encoding validation 6 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CustomMassActionBundle/AcmeCustomMassActionBundle.php: -------------------------------------------------------------------------------- 1 | load('form_types.yml'); 16 | $loader->load('job_parameters.yml'); 17 | $loader->load('jobs.yml'); 18 | $loader->load('mass_actions.yml'); 19 | $loader->load('processors.yml'); 20 | $loader->load('steps.yml'); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CustomMassActionBundle/Form/Type/MassEditAction/CapitalizeValuesType.php: -------------------------------------------------------------------------------- 1 | setDefaults( 19 | [ 20 | 'data_class' => 'Acme\\Bundle\\CustomMassActionBundle\\MassEditAction\\Operation\\CapitalizeValues' 21 | ] 22 | ); 23 | } 24 | 25 | public function getName() 26 | { 27 | return 'acme_custom_mass_action_operation_capitalize_values'; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CustomMassActionBundle/MassEditAction/Operation/CapitalizeValues.php: -------------------------------------------------------------------------------- 1 | 'name', 40 | 'options' => ['locale' => null, 'scope' => null] 41 | ]; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CustomMassActionBundle/Resources/config/form_types.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_custom_mass_action.form.type.capitalize_values: 3 | class: Acme\Bundle\CustomMassActionBundle\Form\Type\MassEditAction\CapitalizeValuesType 4 | tags: 5 | - { name: form.type, alias: acme_custom_mass_action_operation_capitalize_values } 6 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CustomMassActionBundle/Resources/config/job_parameters.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_custom_mass_action.connector.job.job_parameters.default_values_provider.product_mass_edit: 3 | class: '%pim_enrich.connector.job.job_parameters.default_values_provider.product_mass_edit.class%' 4 | arguments: 5 | - ['mass_edit_capitalize_values'] 6 | tags: 7 | - { name: akeneo_batch.job.job_parameters.default_values_provider } 8 | 9 | acme_custom_mass_action.connector.job.job_parameters.constraint_collection_provider.product_mass_edit: 10 | class: '%pim_enrich.connector.job.job_parameters.constraint_collection_provider.product_mass_edit.class%' 11 | arguments: 12 | - ['mass_edit_capitalize_values'] 13 | tags: 14 | - { name: akeneo_batch.job.job_parameters.constraint_collection_provider } 15 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CustomMassActionBundle/Resources/config/jobs.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_custom_mass_action.job.capitalize_values: 3 | class: '%pim_connector.job.simple_job.class%' 4 | arguments: 5 | - 'mass_edit_capitalize_values' 6 | - '@event_dispatcher' 7 | - '@akeneo_batch.job_repository' 8 | - 9 | - '@acme_custom_mass_action.step.capitalize_values.mass_edit' 10 | tags: 11 | - { name: akeneo_batch.job, connector: '%pim_enrich.connector_name.mass_edit%', type: '%pim_enrich.job.mass_edit_type%' } 12 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CustomMassActionBundle/Resources/config/mass_actions.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_custom_mass_action.mass_edit_action.capitalize_values: 3 | public: false 4 | class: Acme\Bundle\CustomMassActionBundle\MassEditAction\Operation\CapitalizeValues 5 | arguments: 6 | - 'mass_edit_capitalize_values' 7 | tags: 8 | - 9 | name: pim_enrich.mass_edit_action 10 | alias: capitalize-values 11 | acl: pim_enrich_product_edit_attributes 12 | datagrid: product-grid 13 | operation_group: mass-edit 14 | form_type: acme_custom_mass_action_operation_capitalize_values 15 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CustomMassActionBundle/Resources/config/processors.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_custom_mass_action.mass_edit.capitalize_values.processor: 3 | class: Acme\Bundle\CustomMassActionBundle\Connector\Processor\MassEdit\Product\CapitalizeValuesProcessor 4 | arguments: 5 | - '@pim_catalog.updater.product_property_setter' 6 | - '@pim_catalog.validator.product' 7 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CustomMassActionBundle/Resources/config/steps.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_custom_mass_action.step.capitalize_values.mass_edit: 3 | class: '%pim_connector.step.item_step.class%' 4 | arguments: 5 | - 'mass_edit_capitalize_values' 6 | - '@event_dispatcher' 7 | - '@akeneo_batch.job_repository' 8 | - '@pim_connector.reader.database.product' 9 | - '@acme_custom_mass_action.mass_edit.capitalize_values.processor' 10 | - '@pim_connector.writer.database.product' 11 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CustomMassActionBundle/Resources/fixtures/jobs.yml: -------------------------------------------------------------------------------- 1 | jobs: 2 | mass_edit_capitalize_values: 3 | connector: Akeneo Mass Edit Connector 4 | alias: mass_edit_capitalize_values 5 | label: Mass capitalize products value 6 | type: mass_edit 7 | -------------------------------------------------------------------------------- /src/Acme/Bundle/CustomMassActionBundle/Resources/translations/messages.en.yml: -------------------------------------------------------------------------------- 1 | pim_enrich.mass_edit_action: 2 | capitalize-values: 3 | label: Capitalize values 4 | description: The selected product(s) will have capitalized values 5 | launched_flash: The bulk action "capitalize values" has been launched. You will be notified when it is done. 6 | success_flash: Product(s) values have been updated 7 | 8 | batch_jobs: 9 | mass_edit_capitalize_values: 10 | capitalize_values: 11 | label: Capitalize values 12 | -------------------------------------------------------------------------------- /src/Acme/Bundle/EnrichBundle/AcmeEnrichBundle.php: -------------------------------------------------------------------------------- 1 | load('form_types.yml'); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/Acme/Bundle/EnrichBundle/Form/Type/ColorType.php: -------------------------------------------------------------------------------- 1 | add('code') 21 | ->add( 22 | 'label', 23 | TranslatableFieldType::class, 24 | array( 25 | 'field' => 'label', 26 | 'translation_class' => 'Acme\Bundle\CatalogBundle\Entity\ColorTranslation', 27 | 'entity_class' => $options['data_class'], 28 | 'property_path' => 'translations' 29 | ) 30 | ); 31 | } 32 | 33 | /** 34 | * {@inheritdoc} 35 | */ 36 | public function getName() 37 | { 38 | return 'acme_enrich_color'; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/Acme/Bundle/EnrichBundle/Resources/config/custom_entities.yml: -------------------------------------------------------------------------------- 1 | custom_entities: 2 | color: 3 | entity_class: Acme\Bundle\CatalogBundle\Entity\Color 4 | actions: 5 | edit: 6 | form_type: acme_enrich_color 7 | create: 8 | form_type: acme_enrich_color 9 | -------------------------------------------------------------------------------- /src/Acme/Bundle/EnrichBundle/Resources/config/datagrid.yml: -------------------------------------------------------------------------------- 1 | datagrid: 2 | color: 3 | extends: custom_entity 4 | options: 5 | entityHint: color 6 | columns: 7 | code: 8 | label: Code 9 | label: 10 | label: Label 11 | created: 12 | label: Created 13 | frontend_type: date 14 | updated: 15 | label: Updated 16 | frontend_type: date 17 | filters: 18 | columns: 19 | code: 20 | type: string 21 | label: Code 22 | data_name: o.code 23 | label: 24 | type: string 25 | label: Label 26 | data_name: translation.label 27 | created: 28 | type: date 29 | label: Created 30 | data_name: o.created 31 | filter_by_having: true 32 | updated: 33 | type: date 34 | label: Updated 35 | data_name: o.updated 36 | filter_by_having: true 37 | sorters: 38 | columns: 39 | code: 40 | data_name: o.code 41 | label: 42 | data_name: translation.label 43 | created: 44 | data_name: o.created 45 | updated: 46 | data_name: o.updated 47 | default: 48 | code: '%oro_datagrid.extension.orm_sorter.class%::DIRECTION_ASC' 49 | -------------------------------------------------------------------------------- /src/Acme/Bundle/EnrichBundle/Resources/config/form_types.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | pim_enrich.view_element.category.tab.property.template: 'AcmeEnrichBundle:CategoryTree:Tab/property.html.twig' 3 | 4 | services: 5 | acme_enrich.form.type.color: 6 | class: Acme\Bundle\EnrichBundle\Form\Type\ColorType 7 | tags: 8 | - { name: form.type, alias: acme_enrich_color } 9 | -------------------------------------------------------------------------------- /src/Acme/Bundle/EnrichBundle/Resources/config/navigation.yml: -------------------------------------------------------------------------------- 1 | oro_menu_config: 2 | items: 3 | acme_enrich_color: 4 | label: 'Colors' 5 | route: 'pim_customentity_index' 6 | routeParameters: { customEntityName: color } 7 | 8 | tree: 9 | application_menu: 10 | children: 11 | pim_enrich_tab: 12 | children: 13 | acme_enrich_color: ~ 14 | -------------------------------------------------------------------------------- /src/Acme/Bundle/EnrichBundle/Resources/config/view_elements/attribute.yml: -------------------------------------------------------------------------------- 1 | services: 2 | pim_enrich.view_element.attribute.tab.parameter: 3 | class: Acme\Bundle\EnrichBundle\View\Tab\MyCustomTab 4 | arguments: 5 | - 'pim_enrich.attribute.tab.parameter' 6 | - '%pim_enrich.view_element.attribute.tab.parameter.template%' 7 | tags: 8 | - { name: pim_enrich.view_element, type: pim_enrich_attribute_form.form_tab, position: 90 } 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/Acme/Bundle/EnrichBundle/Resources/config/view_elements/category.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | pim_enrich.view_element.category.tab.property.template: 'AcmeEnrichBundle:Category:Tab/my_property.html.twig' 3 | 4 | services: 5 | pim_enrich.view_element.category.tab.history: 6 | parent: pim_enrich.view_element.base 7 | arguments: 8 | - 'pim_enrich.category.tab.history' 9 | - '%pim_enrich.view_element.category.tab.history.template%' 10 | calls: 11 | - [ addVisibilityChecker, ['@acme_enrich.view_element.visibility_checker.my_custom_visibility_checker', {my_custom_option: 'my_custom_option_value'}] ] 12 | tags: 13 | - { name: pim_enrich.view_element, type: pim_category.form_tab, position: 110 } 14 | 15 | pim_enrich.view_element.category.tab.my_custom_tab: 16 | parent: pim_enrich.view_element.base 17 | arguments: 18 | - 'pim_enrich.category.tab.my_custom_tab_title' 19 | - 'AcmeEnrichBundle:Category:Tab/my_custom_tab.html.twig' 20 | calls: 21 | - [ addVisibilityChecker, ['@pim_enrich.view_element.visibility_checker.edit_form'] ] 22 | tags: 23 | - { name: pim_enrich.view_element, type: pim_category.form_tab, position: 120 } 24 | 25 | -------------------------------------------------------------------------------- /src/Acme/Bundle/InstallerBundle/AcmeInstallerBundle.php: -------------------------------------------------------------------------------- 1 | load('processors.yml'); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/Acme/Bundle/InstallerBundle/Resources/config/fixtures.yml: -------------------------------------------------------------------------------- 1 | colors: 2 | order: 70 3 | csv: 4 | processor: acme_installer.processor.color 5 | yml: 6 | processor: acme_installer.processor.color 7 | -------------------------------------------------------------------------------- /src/Acme/Bundle/InstallerBundle/Resources/config/processors.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_installer.processor.color: 3 | parent: pim_base_connector.processor.transformer 4 | arguments: 5 | - Acme\Bundle\CatalogBundle\Entity\Color 6 | -------------------------------------------------------------------------------- /src/Acme/Bundle/InstallerBundle/Resources/fixtures/mydataset/attribute_groups.yml: -------------------------------------------------------------------------------- 1 | attribute_groups: 2 | other: 3 | sort_order: 100 4 | labels: 5 | en_US: Other 6 | fr_FR: Autre 7 | -------------------------------------------------------------------------------- /src/Acme/Bundle/InstallerBundle/Resources/fixtures/mydataset/attributes.yml: -------------------------------------------------------------------------------- 1 | attributes: 2 | sku: 3 | labels: 4 | en_US: SKU 5 | type: pim_catalog_identifier 6 | group: other 7 | required: true 8 | unique: true 9 | useableAsGridFilter: true 10 | sortOrder: 1 11 | -------------------------------------------------------------------------------- /src/Acme/Bundle/InstallerBundle/Resources/fixtures/mydataset/categories.yml: -------------------------------------------------------------------------------- 1 | categories: 2 | default: 3 | labels: 4 | en_US: Master catalog 5 | -------------------------------------------------------------------------------- /src/Acme/Bundle/InstallerBundle/Resources/fixtures/mydataset/channels.csv: -------------------------------------------------------------------------------- 1 | code;label;currencies;locales;tree 2 | default;Default;en_US;USD;default 3 | -------------------------------------------------------------------------------- /src/Acme/Bundle/InstallerBundle/Resources/fixtures/mydataset/colors.csv: -------------------------------------------------------------------------------- 1 | code;label-en_US 2 | RED;red 3 | BLUE;blue 4 | ORANGE;orange 5 | GREEN;green -------------------------------------------------------------------------------- /src/Acme/Bundle/InstallerBundle/Resources/fixtures/mydataset/currencies.yml: -------------------------------------------------------------------------------- 1 | currencies: 2 | - USD 3 | removed_currencies: 4 | - ADP 5 | - AFA 6 | - ALK 7 | - AOK 8 | - AON 9 | - AOR 10 | - ARM 11 | - ARP 12 | - ARL 13 | - ATS 14 | - AZM 15 | - BAD 16 | - BAN 17 | - BEC 18 | - BEF 19 | - BEL 20 | - BGL 21 | - BGM 22 | - BGO 23 | - BOL 24 | - BOP 25 | - BRB 26 | - BRC 27 | - BRE 28 | - BRR 29 | - BRN 30 | - BRZ 31 | - BYB 32 | - CHE 33 | - CHW 34 | - CSD 35 | - CSK 36 | - DEM 37 | - EEK 38 | - ESA 39 | - ESB 40 | - ESP 41 | - FIM 42 | - FRF 43 | - GHC 44 | - GRD 45 | - GYD 46 | - IEP 47 | - ISJ 48 | - ILR 49 | - ITL 50 | - KRH 51 | - KRO 52 | - LUF 53 | - LVR 54 | - MGF 55 | - MKN 56 | - MTL 57 | - MXP 58 | - MZE 59 | - MZM 60 | - NIC 61 | - NLG 62 | - PES 63 | - PLZ 64 | - PTE 65 | - ROL 66 | - SDD 67 | - SDP 68 | - SIT 69 | - SKK 70 | - SUR 71 | - TMM 72 | - TPE 73 | - TRL 74 | - UGS 75 | - UYP 76 | - VEB 77 | - VNN 78 | - XAU 79 | - XBA 80 | - XBB 81 | - XBC 82 | - XBD 83 | - XEU 84 | - XFO 85 | - XFU 86 | - XPD 87 | - XDR 88 | - XSU 89 | - XTS 90 | - XXX 91 | - YUD 92 | - YUM 93 | - YUN 94 | - YUR 95 | - ZMK 96 | - ZRN 97 | - ZRZ 98 | - ZWD 99 | - ZWL 100 | - ZWR 101 | -------------------------------------------------------------------------------- /src/Acme/Bundle/InstallerBundle/Resources/fixtures/mydataset/group_types.yml: -------------------------------------------------------------------------------- 1 | group_types: 2 | VARIANT: 3 | variant: 1 4 | -------------------------------------------------------------------------------- /src/Acme/Bundle/InstallerBundle/Resources/fixtures/mydataset/locales.yml: -------------------------------------------------------------------------------- 1 | locales: 2 | en_US: 3 | fallback: ~ 4 | currency: USD 5 | -------------------------------------------------------------------------------- /src/Acme/Bundle/InstallerBundle/Resources/fixtures/mydataset/users.yml: -------------------------------------------------------------------------------- 1 | users: 2 | admin: 3 | username: admin 4 | password: admin 5 | email: admin@example.com 6 | firstname: Peter 7 | lastname: Doe 8 | owner: Main 9 | catalog_locale: en_US 10 | catalog_scope: ecommerce 11 | default_tree: master 12 | role: ROLE_ADMINISTRATOR 13 | enable: true 14 | julia: 15 | username: julia 16 | password: julia 17 | email: julia@example.com 18 | firstname: Julia 19 | lastname: Zaro 20 | owner: Main 21 | catalog_locale: de_DE 22 | catalog_scope: ecommerce 23 | default_tree: master 24 | role: ROLE_MANAGER 25 | enable: true 26 | mary: 27 | username: mary 28 | password: mary 29 | email: mary@example.com 30 | firstname: Mary 31 | lastname: Doe 32 | owner: Main 33 | catalog_locale: en_US 34 | catalog_scope: ecommerce 35 | default_tree: master 36 | role: ROLE_USER 37 | enable: true 38 | sandra: 39 | username: sandra 40 | password: sandra 41 | email: sandra@example.com 42 | firstname: Sandra 43 | lastname: Doe 44 | owner: Main 45 | catalog_locale: en_US 46 | catalog_scope: ecommerce 47 | default_tree: master 48 | role: ROLE_USER 49 | enable: true 50 | peter: 51 | username: peter 52 | password: peter 53 | email: peter@example.com 54 | firstname: Peter 55 | lastname: Doe 56 | owner: Main 57 | catalog_locale: en_US 58 | catalog_scope: ecommerce 59 | default_tree: master 60 | role: ROLE_ADMINISTRATOR 61 | enable: true 62 | -------------------------------------------------------------------------------- /src/Acme/Bundle/InstallerBundle/Ressources/fixtures/icecat_demo_dev/jobs.yml: -------------------------------------------------------------------------------- 1 | jobs: 2 | capitalize_values: 3 | connector: Akeneo Mass Edit Connector 4 | alias: capitalize_values 5 | label: Mass edit capitalize values 6 | type: mass_edit 7 | -------------------------------------------------------------------------------- /src/Acme/Bundle/NotifyConnectorBundle/AcmeNotifyConnectorBundle.php: -------------------------------------------------------------------------------- 1 | load('jobs.yml'); 16 | $loader->load('job_parameters.yml'); 17 | $loader->load('job_profile.yml'); 18 | $loader->load('steps.yml'); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Acme/Bundle/NotifyConnectorBundle/JobParameters/ProductCsvExportNotify.php: -------------------------------------------------------------------------------- 1 | baseDefaultValuesProvider = $baseDefaultValuesProvider; 35 | $this->baseConstraintCollectionProvider = $baseConstraintCollectionProvider; 36 | $this->supportedJobNames = $supportedJobNames; 37 | } 38 | 39 | /** 40 | * {@inheritdoc} 41 | */ 42 | public function getDefaultValues() 43 | { 44 | return array_merge( 45 | $this->baseDefaultValuesProvider->getDefaultValues(), 46 | ['urlToNotify' => 'http://'] 47 | ); 48 | } 49 | 50 | /** 51 | * {@inheritdoc} 52 | */ 53 | public function getConstraintCollection() 54 | { 55 | $baseConstraints = $this->baseConstraintCollectionProvider->getConstraintCollection(); 56 | $constraintFields = array_merge( 57 | $baseConstraints->fields, 58 | ['urlToNotify' => new Url()] 59 | ); 60 | 61 | return new Collection(['fields' => $constraintFields]); 62 | } 63 | 64 | /** 65 | * {@inheritdoc} 66 | */ 67 | public function supports(JobInterface $job) 68 | { 69 | return in_array($job->getName(), $this->supportedJobNames); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/Acme/Bundle/NotifyConnectorBundle/Resources/config/job_parameters.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_notifyconnector.job.job_parameters.csv_product_export_notify: 3 | class: 'Acme\Bundle\NotifyConnectorBundle\JobParameters\ProductCsvExportNotify' 4 | arguments: 5 | - '@pim_connector.job.job_parameters.default_values_provider.product_csv_export' 6 | - '@pim_connector.job.job_parameters.constraint_collection_provider.product_csv_export' 7 | - ['%acme_notifyconnector.job_name.csv_product_export_notify%'] 8 | tags: 9 | - { name: akeneo_batch.job.job_parameters.constraint_collection_provider } 10 | - { name: akeneo_batch.job.job_parameters.default_values_provider } 11 | -------------------------------------------------------------------------------- /src/Acme/Bundle/NotifyConnectorBundle/Resources/config/jobs.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_notifyconnector.csv_product_export_notify: 3 | class: 'Akeneo\Tool\Component\Batch\Job\Job' 4 | arguments: 5 | - 'csv_product_export_notify' # Job name 6 | - '@event_dispatcher' 7 | - '@akeneo_batch.job_repository' 8 | - 9 | - '@pim_connector.step.csv_product.export' 10 | - '@acme_notifyconnector.step.notify' # You new custom step 11 | - true # Does the job is stoppable ? 12 | tags: 13 | - { name: akeneo_batch.job, connector: 'Acme CSV Notify Connector', type: 'export' } 14 | -------------------------------------------------------------------------------- /src/Acme/Bundle/NotifyConnectorBundle/Resources/config/providers.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_notifyconnector.provider.form.job_instance: 3 | class: 'Akeneo\Platform\Bundle\ImportExportBundle\Provider\Form\JobInstanceFormProvider' 4 | arguments: 5 | - 6 | csv_product_export_notify: pim-job-instance-csv-product-export-notify 7 | tags: 8 | - { name: pim_enrich.provider.form } 9 | -------------------------------------------------------------------------------- /src/Acme/Bundle/NotifyConnectorBundle/Resources/config/steps.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_notifyconnector.step.notify: 3 | class: 'Acme\Bundle\NotifyConnectorBundle\Step\NotifyStep' 4 | arguments: 5 | - 'notify' # The step name 6 | - '@event_dispatcher' 7 | - '@akeneo_batch.job_repository' 8 | -------------------------------------------------------------------------------- /src/Acme/Bundle/NotifyConnectorBundle/Resources/translations/messages.en.yml: -------------------------------------------------------------------------------- 1 | acme_notify_connector: 2 | jobs: 3 | notify_product_import: 4 | title: Product Import With Notification 5 | export: 6 | title: Product Export Step 7 | notify: 8 | title: Notification Step 9 | url: 10 | label: Notify url to call 11 | help: The url to call at the end of the export 12 | 13 | job_execution.summary.notified: Notification sent 14 | 15 | batch_jobs: 16 | csv_product_export_notify: 17 | label: Product Import Notify Csv 18 | export.label: Product import notify 19 | validation.label: File encoding validation 20 | notify.label: Notify step 21 | -------------------------------------------------------------------------------- /src/Acme/Bundle/NotifyConnectorBundle/Step/NotifyStep.php: -------------------------------------------------------------------------------- 1 | getJobParameters(); 14 | 15 | $directory = dirname($jobParameters->get('storage')['file_path']); 16 | $fields = sprintf('directory=%s', urlencode($directory)); 17 | $url = $jobParameters->get('urlToNotify'); 18 | 19 | $ch = curl_init(); 20 | curl_setopt($ch, CURLOPT_URL, $url); 21 | curl_setopt($ch, CURLOPT_POST, true); 22 | curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); 23 | 24 | if (false !== curl_exec($ch)) { 25 | $stepExecution->addSummaryInfo('notified', 'yes'); 26 | } else { 27 | $stepExecution->addSummaryInfo('notified', 'no'); 28 | $stepExecution->addError('Failed to call target URL: '.curl_error($ch)); 29 | } 30 | 31 | curl_close($ch); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/Acme/Bundle/XmlConnectorBundle/AcmeXmlConnectorBundle.php: -------------------------------------------------------------------------------- 1 | get('storage')['file_path']; 26 | 27 | $fileIterator = $this->fileIteratorFactory->create($filePath); 28 | $fileIterator->rewind(); 29 | 30 | return $fileIterator; 31 | } 32 | 33 | /** 34 | * {@inheritdoc} 35 | */ 36 | protected function setupWriter(JobExecution $jobExecution) 37 | { 38 | $fileKey = strtr($this->getRelativeArchivePath($jobExecution), ['%filename%' => 'invalid_items.xml']); 39 | $this->filesystem->put($fileKey, ''); 40 | 41 | $writeParams = $this->defaultValuesProvider->getDefaultValues(); 42 | $writeParams['storage'] = [ 43 | 'type' => 'local', 44 | 'file_path' => $this->filesystem->getAdapter()->getPathPrefix() . $fileKey, 45 | ]; 46 | 47 | $writeJobParameters = new JobParameters($writeParams); 48 | $writeJobExecution = new JobExecution(); 49 | $writeJobExecution->setJobParameters($writeJobParameters); 50 | 51 | $stepExecution = new StepExecution('processor', $writeJobExecution); 52 | $this->writer->setStepExecution($stepExecution); 53 | $this->writer->initialize(); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/Acme/Bundle/XmlConnectorBundle/DependencyInjection/AcmeXmlConnectorExtension.php: -------------------------------------------------------------------------------- 1 | load('archiving.yml'); 16 | $loader->load('jobs.yml'); 17 | $loader->load('job_parameters.yml'); 18 | $loader->load('steps.yml'); 19 | $loader->load('readers.yml'); 20 | $loader->load('writers.yml'); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Acme/Bundle/XmlConnectorBundle/Resources/config/archiving.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | acme_xml_connector.archiver.invalid_item_xml_writer.class: Acme\Bundle\XmlConnectorBundle\Archiver\XmlInvalidItemWriter 3 | 4 | services: 5 | acme_xml_connector.archiver.invalid_item_xml_writer: 6 | class: '%acme_xml_connector.archiver.invalid_item_xml_writer.class%' 7 | arguments: 8 | - '@pim_connector.event_listener.invalid_items_collector' 9 | - '@acme_xml_connector.writer.file.invalid_items_xml' 10 | - '@acme_xml_connector.reader.file.xml_iterator_factory' 11 | - '@oneup_flysystem.archivist_filesystem' 12 | - '@acme_xml_connector.job.job_parameters.simple_xml_product_import' 13 | - 'xml' 14 | tags: 15 | - { name: pim_connector.archiver } 16 | -------------------------------------------------------------------------------- /src/Acme/Bundle/XmlConnectorBundle/Resources/config/job_parameters.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | acme_xml_connector.job.job_parameters.simple_xml_import.class: Acme\Bundle\XmlConnectorBundle\Job\JobParameters\SimpleXmlImport 3 | 4 | services: 5 | acme_xml_connector.job.job_parameters.simple_xml_product_import: 6 | class: '%acme_xml_connector.job.job_parameters.simple_xml_import.class%' 7 | arguments: 8 | - '%pim_catalog.localization.decimal_separators%' 9 | - '%pim_catalog.localization.date_formats%' 10 | tags: 11 | - { name: akeneo_batch.job.job_parameters.constraint_collection_provider } 12 | - { name: akeneo_batch.job.job_parameters.default_values_provider } 13 | 14 | acme_xml_connector.job.job_parameters.provider.simple_xml_product_import: 15 | class: 'Akeneo\Platform\Bundle\ImportExportBundle\Provider\Form\JobInstanceFormProvider' 16 | arguments: 17 | - 18 | xml_product_import: pim-job-instance-xml-product-import 19 | tags: 20 | - { name: pim_enrich.provider.form } 21 | -------------------------------------------------------------------------------- /src/Acme/Bundle/XmlConnectorBundle/Resources/config/jobs.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_xml_connector.job.xml_product_import: 3 | class: '%pim_connector.job.simple_job.class%' 4 | arguments: 5 | - 'xml_product_import' 6 | - '@event_dispatcher' 7 | - '@akeneo_batch.job_repository' 8 | - 9 | - '@acme_xml_connector.step.xml_product_import.import' 10 | tags: 11 | - { name: akeneo_batch.job, connector: 'Akeneo XML Connector', type: '%pim_connector.job.import_type%' } 12 | -------------------------------------------------------------------------------- /src/Acme/Bundle/XmlConnectorBundle/Resources/config/readers.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | acme_xml_connector.reader.file.xml_product.class: Acme\Bundle\XmlConnectorBundle\Reader\File\XmlProductReader 3 | acme_xml_connector.reader.file.file_iterator.class: Acme\Bundle\XmlConnectorBundle\Reader\File\XmlFileIterator 4 | 5 | services: 6 | acme_xml_connector.reader.file.xml_iterator_factory: 7 | class: '%pim_connector.reader.file.file_iterator_factory.class%' 8 | arguments: 9 | - '%acme_xml_connector.reader.file.file_iterator.class%' 10 | - 'xml' 11 | 12 | acme_xml_connector.reader.file.xml_product: 13 | class: '%acme_xml_connector.reader.file.xml_product.class%' 14 | arguments: 15 | - '@pim_connector.array_converter.flat_to_standard.product' 16 | -------------------------------------------------------------------------------- /src/Acme/Bundle/XmlConnectorBundle/Resources/config/steps.yml: -------------------------------------------------------------------------------- 1 | services: 2 | acme_xml_connector.step.xml_product_import.import: 3 | class: '%pim_connector.step.item_step.class%' 4 | arguments: 5 | - 'import' 6 | - '@event_dispatcher' 7 | - '@akeneo_batch.job_repository' 8 | - '@acme_xml_connector.reader.file.xml_product' 9 | - '@pim_connector.processor.denormalization.product' 10 | - '@pim_connector.writer.database.product' 11 | - 10 12 | -------------------------------------------------------------------------------- /src/Acme/Bundle/XmlConnectorBundle/Resources/config/writers.yml: -------------------------------------------------------------------------------- 1 | parameters: 2 | acme_xml_connector.writer.file.xml.class: Acme\Bundle\XmlConnectorBundle\Writer\XmlWriter 3 | 4 | services: 5 | acme_xml_connector.writer.file.invalid_items_xml: 6 | class: '%acme_xml_connector.writer.file.xml.class%' 7 | -------------------------------------------------------------------------------- /src/Acme/Bundle/XmlConnectorBundle/Resources/fixtures/products.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/Acme/Bundle/XmlConnectorBundle/Writer/XmlWriter.php: -------------------------------------------------------------------------------- 1 | xml) { 31 | $jobParameters = $this->stepExecution->getJobParameters(); 32 | $filePath = $jobParameters->get('storage')['file_path']; 33 | 34 | $this->xml = new \XMLWriter(); 35 | $this->xml->openURI($filePath); 36 | $this->xml->startDocument('1.0', 'UTF-8'); 37 | $this->xml->setIndent(4); 38 | $this->xml->startElement('products'); 39 | } 40 | } 41 | 42 | /** 43 | * {@inheritdoc} 44 | */ 45 | public function getWrittenFiles() 46 | { 47 | return $this->writtenFiles; 48 | } 49 | 50 | /** 51 | * {@inheritdoc} 52 | */ 53 | public function write(array $items) 54 | { 55 | $exportDirectory = dirname($this->getPath()); 56 | if (!is_dir($exportDirectory)) { 57 | $this->localFs->mkdir($exportDirectory); 58 | } 59 | 60 | foreach ($items as $item) { 61 | $this->xml->startElement('product'); 62 | foreach ($item as $property => $value) { 63 | $this->xml->writeAttribute($property, $value); 64 | } 65 | $this->xml->endElement(); 66 | } 67 | } 68 | 69 | /** 70 | * {@inheritdoc} 71 | */ 72 | public function flush() 73 | { 74 | $this->xml->endElement(); 75 | $this->xml->endDocument(); 76 | $this->xml->flush(); 77 | $jobParameters = $this->stepExecution->getJobParameters(); 78 | 79 | $this->writtenFiles = [$this->stepExecution->getJobParameters()->get('storage')['file_path']]; 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /technical_architecture/best_practices/index.rst: -------------------------------------------------------------------------------- 1 | Best Practices 2 | ============== 3 | 4 | .. toctree:: 5 | :maxdepth: 1 6 | :titlesonly: 7 | 8 | project 9 | reusable_bundle 10 | ./core/conventions 11 | ./core/standards 12 | -------------------------------------------------------------------------------- /technical_architecture/best_practices/project.rst: -------------------------------------------------------------------------------- 1 | Create a project 2 | ================ 3 | 4 | .. warning:: 5 | 6 | Here is a very early version of this section, we'll keep enriching it in the upcoming weeks. 7 | 8 | Setup the project 9 | ----------------- 10 | 11 | The Akeneo PIM standard project comes with a default configuration to help you during the development. 12 | 13 | Please install it by following the :doc:`/install_pim/index` process. 14 | 15 | This distribution contains an empty src folder, your custom code will reside here. 16 | 17 | What about versioning? 18 | ---------------------- 19 | 20 | You should use a version control system (VCS) for your project, for instance, our team uses Git with Github. 21 | 22 | The `.gitignore` file located in the root folder of your project defines what is NOT to be versioned. 23 | 24 | If you use another VCS, you should follow the guideline provided by this file to know what to version or not. 25 | 26 | Here are some explanations of the most important points: 27 | 28 | * Do **NOT** modify the code in the vendors 29 | 30 | The next time you update them with composer, your modifications would be lost. 31 | 32 | * Do **NOT** version vendors 33 | * Do **NOT** fork your vendors 34 | 35 | You would not benefit from dependencies patches otherwise. 36 | 37 | What about your dependencies? 38 | ----------------------------- 39 | 40 | In your composer.json, you should try to rely as much as possible on stable dependencies (tags) when installing extra dependencies. 41 | 42 | Once installed don't hesitate to version your composer.lock. This practice ensures that all of your coworkers (or servers) will use the exact same version of all dependencies. 43 | -------------------------------------------------------------------------------- /technical_architecture/component-or-bundle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/technical_architecture/component-or-bundle.png -------------------------------------------------------------------------------- /technical_architecture/component-or-bundle.rst.inc: -------------------------------------------------------------------------------- 1 | Akeneo or Pim, Bundle or Component? 2 | ----------------------------------- 3 | 4 | Since version 1.3, Akeneo PIM introduced components, that contain business logic or technical logic not coupled with Symfony Framework, although Bundles contain the glue to assemble components together. 5 | 6 | We use different namespaces, Akeneo for the technical parts not coupled with the PIM, Pim for the Community Edition parts and Enterprise suffix for the Enterprise Edition parts. 7 | 8 | We organise the code as above in any new development and try to update legacy code as much as we can in each minor version to make the stack more and more understandable. 9 | 10 | .. image:: /technical_architecture/component-or-bundle.png 11 | :width: 400pt 12 | -------------------------------------------------------------------------------- /technical_architecture/events/index.rst: -------------------------------------------------------------------------------- 1 | Events 2 | ====== 3 | 4 | .. note:: 5 | 6 | For a description of event usage, please refer to the :doc:`cookbook ` 7 | 8 | .. toctree:: 9 | :maxdepth: 2 10 | 11 | storage_events 12 | workflow_events 13 | -------------------------------------------------------------------------------- /technical_architecture/index.rst: -------------------------------------------------------------------------------- 1 | Technical architecture 2 | ====================== 3 | 4 | Akeneo PIM is an OOP application, based on the framework Symfony 4.4, it also widely uses Doctrine ORM. 5 | If you are not familiar with one of these, the best move is to start by reading the `Symfony documentation`_ and `Doctrine documentation`_ 6 | 7 | .. _Symfony documentation: https://symfony.com/doc/5.4/index.html 8 | .. _Doctrine documentation: https://www.doctrine-project.org/projects/doctrine-orm/en/2.14/index.html 9 | 10 | .. toctree:: 11 | :maxdepth: 2 12 | 13 | best_practices/index 14 | event/index 15 | events/index 16 | localization/index 17 | notification/add 18 | performances_guide/index 19 | rest_api/get-product 20 | standard_format/index 21 | technical_information/index 22 | -------------------------------------------------------------------------------- /technical_architecture/localization/change_pim_locale.rst: -------------------------------------------------------------------------------- 1 | How to change the PIM locale 2 | ============================ 3 | 4 | In this cookbook, you will learn how to manage Akeneo PIM locales. 5 | 6 | How to allow more locales 7 | ------------------------- 8 | 9 | The global Akeneo PIM locale and user interface locales are configurable. By default, the Akeneo PIM is configured to 10 | allow only locales translated to more than 80%. 11 | 12 | If you want to allow more locales, you can change the limit by overriding the parameter: 13 | 14 | .. code-block:: yaml 15 | 16 | parameters: 17 | pim_localization.provider.ui_locale.min_percentage: 0.7 18 | 19 | In this example, you allow locales translated to more than 70%. 20 | 21 | You can set this parameter directly in your ``app/config/parameters.yml`` file or in one of your custom bundle resource file (for instance ``Acme/Bundle/AppBundle/Resources/config/one_of_your_config_file.yml``). 22 | 23 | The last thing you need to do to take this change into account is to clear the symfony cache. 24 | 25 | .. code-block:: php 26 | 27 | bin/console cache:clear --env=prod 28 | 29 | How to improve translations 30 | --------------------------- 31 | 32 | If your locale is not allowed or if you need to add missing translations, you can fill the related ``messages.yml`` or, 33 | better, contribute and :doc:`/contribute_to_pim/translate`. 34 | -------------------------------------------------------------------------------- /technical_architecture/localization/how_to_use_the_presenters.rst: -------------------------------------------------------------------------------- 1 | How to use Presenters 2 | ===================== 3 | 4 | The Presenters are used to display the data for the end user according to their locale. 5 | For example, a metric value will be displayed `"0.15 Meter"` in English and `"0,15 Mètre"` in French. 6 | In this page you will learn how to create your own Presenters or modify predefined formats of default Presenters. 7 | 8 | How to register a new Presenter 9 | ------------------------------- 10 | 11 | Several presenters are already defined for prices, metrics, numbers, etc. 12 | You can implement your own Presenter to display your custom values. 13 | 14 | To create your new Presenter, first create a class implementing `Akeneo\\Component\\Localization\\Presenter\\PresenterInterface`. 15 | Next, declare it as a service: 16 | 17 | .. code-block:: yaml 18 | 19 | pim_catalog.localization.presenter.my_own_presenter: 20 | class: '%my_own_presenter_class%' 21 | tags: 22 | - { name: pim_catalog.localization.presenter, type: 'product_value' } 23 | 24 | You have to tag your service with one of the following types: 25 | 26 | - `product_value`: used to present the `ProductValue` (e.g. prices, metrics, numbers, etc), 27 | - `attribute_option`: used to present the attribute options (e.g. the option `max_number` of the number attributes). 28 | 29 | Actually, the Presenter interface displays data according to the user locale, but you can create a Presenter using custom options. 30 | 31 | 32 | How to modify the predefined formats of default Presenters 33 | ---------------------------------------------------------- 34 | 35 | .. _IntlDateFormatter: https://www.php.net/manual/en/class.intldateformatter.php 36 | .. _NumberFormatter: https://www.php.net/manual/en/class.numberformatter.php 37 | 38 | You can define your own formats to present dates, datetimes and prices depending on the user's locale. 39 | The formats of date, datetimes and currencies are predefined for a set of languages. 40 | When the requested format is not predefined, the fallback is defined by `IntlDateFormatter`_ and `NumberFormatter`_. 41 | 42 | To add or modify the default formats, you have to add or modify the `pim_catalog.localization.factory` tags (`date.formats`, `datetime.formats` and `currency.formats`). 43 | 44 | For example: 45 | 46 | .. code-block:: yaml 47 | 48 | pim_catalog.localization.factory.currency.formats: 49 | en_US: '¤#,##0.00' 50 | fr_FR: '#,##0.00 ¤' 51 | -------------------------------------------------------------------------------- /technical_architecture/localization/index.rst: -------------------------------------------------------------------------------- 1 | How to Localize your data 2 | ========================= 3 | 4 | Since the 1.5 version, Akeneo PIM can be used simultaneously by people of different languages in the same installation. 5 | This implies that it is necessary to manage language-related specificities. 6 | For example, the English decimal separator is a dot (.), the French one is a comma (,). 7 | The Akeneo PIM needs to be able to normalize and present this data. 8 | 9 | You will find in this chapter the cookbooks to add custom languages, normalizers and presenters. 10 | 11 | .. toctree:: 12 | 13 | change_pim_locale 14 | how_to_use_the_localizers 15 | how_to_use_the_presenters 16 | -------------------------------------------------------------------------------- /technical_architecture/performances_guide/batch_page_size.rst: -------------------------------------------------------------------------------- 1 | Job product batch size 2 | ====================== 3 | 4 | A product catalog is unique to one's need. It is configured with a custom number of attributes, families, locales, channels, etc. Those different combinations may affect the batch jobs (CSV imports/exports, mass edits, indexation, etc) performances. 5 | 6 | Indeed the size of the products will define how much RAM they will take to be processed. During a product batch jobs, we regularly flush the processed products into the database to avoid too much memory consumption. 7 | 8 | But, if we flush them too often, the transaction time can slow the process: for each iteration, we clear the doctrine cache (to free some memory), index the products (so more communications between PHP and elastic search) and update the Mysql database. On the other hand, if we flush too sporadically, the RAM consumption can increase to a point where the PHP's garbage collector is called too many times and slows down the batch jobs. 9 | 10 | That's why there is no universal answer to the `pim_job_product_batch_size` parameter and if you encounter performance issues on your batch jobs, you may need to tweak it. 11 | 12 | To do so, try to increase it if your batch job seems unexpectedly slow and your product have a reasonable size. Or try to reduce it if the batch processes are too slow and your product have a lot of product values. 13 | 14 | -------------------------------------------------------------------------------- /technical_architecture/performances_guide/index.rst: -------------------------------------------------------------------------------- 1 | Performances Guide 2 | ================== 3 | 4 | Your product catalog is unique, with different amount of attributes, families, locales, channels, products, etc. All those different combinations may cause different performance issues. 5 | 6 | The following chapter explains the different performances bottlenecks you can encounter by using *Akeneo PIM* and lists known issues. It also explains best practices you should implement to ensure the success of your project. 7 | 8 | Thank you to contact us when your use case is not covered, we could handle it in next minor version or provide an alternative solution for your project. 9 | 10 | .. warning:: 11 | 12 | This is an early version of this chapter, we'll continue to complete it with more use cases. 13 | We also provide a :doc:`/maintain_pim/scalability_guide/index`. 14 | 15 | .. toctree:: 16 | :maxdepth: 2 17 | 18 | rules_execution_memory_usage 19 | work_with_wysiwyg 20 | php7_hhvm 21 | batch_page_size 22 | -------------------------------------------------------------------------------- /technical_architecture/performances_guide/php7_hhvm.rst: -------------------------------------------------------------------------------- 1 | PHP7 and HHVM Compatibility? 2 | ============================ 3 | 4 | PHP7 5 | ---- 6 | 7 | We continued our effort regarding Akeneo PIM PHP7 support. 8 | 9 | We're happy to announce that PHP7 is now supported and production ready for both CLI and Web. 10 | 11 | This modification introduces a new constraint, the minimum version of PHP for Akeneo PIM 2.x is now PHP 7.1. 12 | 13 | HHVM 14 | ---- 15 | 16 | Will not be supported. 17 | -------------------------------------------------------------------------------- /technical_architecture/performances_guide/work_with_wysiwyg.rst: -------------------------------------------------------------------------------- 1 | More than 100 WYSIWYG editors in a page 2 | --------------------------------------- 3 | 4 | WYSIWYG are javascript components and are executed on the client side. Hardware performances of the client can affect the speed of pages with WYSIWYG. 5 | 6 | That's why it's not recommended to have more than one hundred WYSIWYG in the same page. In the product edit form, only attributes in the 7 | current attribute group and the current scope are rendered. It means that you should not have more than one hundred WYSIWYG in the same 8 | attribute group and scope. When configuring mass edit common attributes, all scopes are rendered at 9 | the same time. It means you should not add more than one hundred WYSIWYG all scopes included at once. 10 | 11 | For example, a product with 2 attribute groups, 100 scopable WYSIWYG in each group and 5 scopes, has 1000 WYSIWYG. You can render them 12 | in the PEF because you will render WYSIWYG 100 by 100. But in mass edit, you should not add more than 20 WYSIWYG because 13 | they have 5 scopes and 100 WYSIWYG will be rendered. 14 | -------------------------------------------------------------------------------- /technical_architecture/rest_api/configure-rest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/technical_architecture/rest_api/configure-rest.png -------------------------------------------------------------------------------- /technical_architecture/rest_api/get-product.rst: -------------------------------------------------------------------------------- 1 | How to Use the Web REST API 2 | =========================== 3 | 4 | Akeneo PIM v1.7 comes with a brand new web API and a `dedicated website `_ 5 | -------------------------------------------------------------------------------- /technical_architecture/technical_information/client_side_compatibilities.rst: -------------------------------------------------------------------------------- 1 | Client side configuration and compatibilities 2 | ============================================= 3 | 4 | Hardware 5 | -------- 6 | 7 | For a comfortable user experience, the end user workstation should have: 8 | 9 | +--------+-------------+ 10 | | Memory | 2GB minimum | 11 | +--------+-------------+ 12 | 13 | Network 14 | ------- 15 | 16 | Connecting to PIM through a VPN network could greatly impact the user experience by reducing the speed of the connection. 17 | 18 | Browsers 19 | -------- 20 | 21 | +------------------------+-------------------------+ 22 | | Supported Browsers | Chrome 30+, Firefox 47+ | 23 | +------------------------+-------------------------+ 24 | 25 | 26 | Screen resolution 27 | ----------------- 28 | 29 | +------------------------+-------------+ 30 | | Minimal Resolution | 1280x800px | 31 | +------------------------+-------------+ 32 | | Recommended Resolution | 1440x900px | 33 | +------------------------+-------------+ 34 | -------------------------------------------------------------------------------- /technical_architecture/technical_information/index.rst: -------------------------------------------------------------------------------- 1 | Application Technical Information 2 | ================================= 3 | 4 | The following chapter is designed for both clients and partners and provides all technical information required to: 5 | 6 | * Buy/rent and provision required server(s) to run Akeneo PIM application 7 | * Check that end users workstation is compatible with Akeneo PIM application 8 | * Have an overview of technical skills required to modify/override some of the Akeneo PIM behaviours when needed 9 | 10 | We also want to provide the reader with a recommended architecture that would follow Akeneo's best practices. 11 | 12 | .. toctree:: 13 | :maxdepth: 2 14 | 15 | application_technical_dependencies 16 | server_side_setup_for_hosting 17 | recommended_configuration 18 | client_side_compatibilities 19 | operation_processes 20 | flow_matrix 21 | -------------------------------------------------------------------------------- /technical_architecture/technical_information/php_ini.rst.inc: -------------------------------------------------------------------------------- 1 | * Setup *CLI php.ini* file ``/etc/php/8.1/cli/php.ini`` 2 | 3 | .. code-block:: yaml 4 | 5 | $ sudo vim /etc/php/8.1/cli/php.ini 6 | memory_limit = 1024M 7 | date.timezone = UTC 8 | 9 | .. note:: 10 | 11 | Use the time zone matching your location, for example *America/Los_Angeles* or *Europe/Berlin*. See https://www.php.net/timezones for the list of all available timezones. 12 | 13 | * Setup *FPM php.ini* file ``/etc/php/8.1/fpm/php.ini`` 14 | 15 | .. note:: 16 | 17 | If you have several PHP versions on your server, these files can be located in ``/etc/php/x.x/fpm/php.ini`` and ``/etc/php/x.x/cli/php.ini``. 18 | 19 | .. code-block:: yaml 20 | 21 | $ sudo vim /etc/php/8.1/fpm/php.ini 22 | memory_limit = 512M 23 | date.timezone = UTC 24 | 25 | To avoid spending too much time on permission problems between the CLI user and the FPM user, a good practice is to use the same user for both of them. 26 | 27 | .. warning:: 28 | 29 | This configuration is aimed to easily set up a development machine. 30 | **It is absolutely not suited for a production environment.** 31 | 32 | * Get your identifiers 33 | 34 | .. code-block:: bash 35 | 36 | $ id 37 | uid=1000(my_user), gid=1000(my_group), ... 38 | 39 | In this example, the user is *my_user* and the group is *my_group*. 40 | 41 | * Stop FPM 42 | 43 | .. code-block:: bash 44 | 45 | $ sudo service php8.1-fpm stop 46 | 47 | * Open the file ``/etc/php/8.1/fpm/pool.d/www.conf`` with your favorite text editor: 48 | 49 | .. code-block:: bash 50 | 51 | $ sudo vi /etc/php/8.1/fpm/pool.d/www.conf 52 | # replace these environment variables: 53 | user = my_user 54 | group = my_group 55 | listen = /run/php/php8.1-fpm.sock 56 | listen.owner = www-data 57 | listen.group = www-data 58 | 59 | .. note:: 60 | 61 | On the default installation, FPM user and group are ``www-data``. 62 | ``listen.owner`` and ``listen.group`` must be set on the same user than your Apache server. 63 | ``/run/php/php8.1-fpm.sock`` is the default socket path. If you changed it in ``/etc/php/8.1/fpm/pool.d/www.conf``, change it in the Apache virtual host too. 64 | 65 | * Restart FPM 66 | 67 | .. code-block:: bash 68 | 69 | $ sudo service php8.1-fpm restart 70 | -------------------------------------------------------------------------------- /technical_architecture/technical_information/server_side_setup_for_hosting.rst: -------------------------------------------------------------------------------- 1 | Server side set up for hosting 2 | ============================== 3 | 4 | Hardware 5 | -------- 6 | 7 | The required configuration depends on your volume and your usage. As we are based on Elasticsearch and MySQL, please check their dedicated documentation to define your server size. 8 | 9 | .. warning:: 10 | 11 | Should you use VCPu, keep in mind that VCPus do not provide same level of performance as real CPUs. Amazon servers, for instance, offer only 10 to 25% of performances of a real CPU. 12 | 13 | Software 14 | -------- 15 | 16 | .. include:: /install_pim/manual/system_requirements/system_requirements.rst 17 | -------------------------------------------------------------------------------- /technical_overview/index.rst: -------------------------------------------------------------------------------- 1 | Technical overview 2 | ================== 3 | 4 | .. toctree:: 5 | :maxdepth: 2 6 | :hidden: 7 | 8 | product_information/index 9 | teamwork_assistant/index 10 | workflow/index 11 | -------------------------------------------------------------------------------- /technical_overview/teamwork_assistant/catalog_impact.rst: -------------------------------------------------------------------------------- 1 | What Are The Impacts Of Catalog Updates On Projects? 2 | ==================================================== 3 | 4 | Several catalog updates can impact project integrity. In this case we need to remove the impacted projects. 5 | 6 | Channel Updates 7 | _______________ 8 | 9 | :Remove a channel: A project has to be removed if its channel is removed. 10 | :Remove a locale from a channel: A project has to be removed if its locale is now deactivated or if its locale is no 11 | longer part of its channel locales. This case happens when a locale is removed from a channel and both of them 12 | belong to a project. 13 | :Remove a currency from a channel: A project is removed if it uses a currency as product filter that is removed from its 14 | channel. This case happens when a currency is removed from a channel that belongs to a project. 15 | 16 | Attribute Updates 17 | _________________ 18 | 19 | :Remove an attribute: A project must be removed if an attribute used as product filter is removed. 20 | 21 | Category Updates 22 | ________________ 23 | 24 | :Remove a category: A project must be removed if a category used as product filter is removed. 25 | -------------------------------------------------------------------------------- /technical_overview/teamwork_assistant/images/widget-AM-target-zone.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/technical_overview/teamwork_assistant/images/widget-AM-target-zone.jpg -------------------------------------------------------------------------------- /technical_overview/teamwork_assistant/index.rst: -------------------------------------------------------------------------------- 1 | Teamwork Assistant (Enterprise Edition) 2 | ======================================= 3 | 4 | .. toctree:: 5 | 6 | Project creation 7 | Project completeness 8 | Project Completeness widget 9 | Catalog update impact 10 | Scalability guide 11 | Users permission summary for Behat tests 12 | -------------------------------------------------------------------------------- /technical_overview/teamwork_assistant/scalability_guide.rst: -------------------------------------------------------------------------------- 1 | Teamwork Assistant Scalability Guide 2 | ____________________________________ 3 | 4 | For the moment, the pre-processing data are computed once you save a project, when you save a product concerned by a 5 | project from the Product Edit Form and the sequential edit. Moreover, a command 6 | ``php bin/console pimee:project:recalculate`` is provided to help you to recalculate data according to your needs. 7 | 8 | This scalability guide will focus on how to use the Teamwork Assistant functionally (how much projects in the same time, 9 | etc.) and technically (how to use the recalculate command) in a healthy way. 10 | 11 | .. note:: 12 | 13 | To know more about the project completeness visit the :doc:`project completeness ` reference. 14 | 15 | Computing Project Completeness 16 | ------------------------------ 17 | 18 | Before beginning to work with the Teamwork Assistant, you must be aware that this feature has to compute a lot of 19 | data. The more products and attribute groups you have in a project, the more time project completeness computing will take. 20 | We did some benchmarks with our :doc:`medium catalog ` 21 | on MySQL to give you an idea of the time it can take. A medium 22 | catalog is about 3,66 millions of product values. 23 | 24 | 25 | In this benchmark the catalog contained 5 users with read/edit permissions on all 15 attribute groups and 5 users 26 | with read/edit permissions on 7 attribute groups. 27 | 28 | +------------------------------------+-----------------------+ 29 | | Project size (products) | time spent to compute | 30 | +====================================+=======================+ 31 | | 50k products (3,6m product values) | 3h 36m 30s | 32 | | 50k products already calculated | 45m 30s | 33 | | 5k products | 19 min 10 sec | 34 | | 5k products already calculated | 4 min 18 sec | 35 | +------------------------------------+-----------------------+ 36 | 37 | Here are the server’s features used for the bench: 38 | **CPU:** Intel E3-1220 V2 @ 3.1GHZ (4 cores) 39 | **RAM:** 16 GB 40 | **Disk:** SATA 3 - 7200 RPM disks 41 | -------------------------------------------------------------------------------- /technical_overview/workflow/img/partial-approve.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/technical_overview/workflow/img/partial-approve.png -------------------------------------------------------------------------------- /technical_overview/workflow/img/simple-workflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/technical_overview/workflow/img/simple-workflow.png -------------------------------------------------------------------------------- /technical_overview/workflow/index.rst: -------------------------------------------------------------------------------- 1 | Collaborative workflow 2 | ====================== 3 | 4 | This chapter describes the collaborative workflow involving Mary and Julia. 5 | 6 | **These cookbooks are about a feature only provided in the Enterprise Edition.** 7 | 8 | .. toctree:: 9 | :maxdepth: 2 10 | 11 | simple_workflow 12 | partial_workflow 13 | 14 | If you need a presentation of Collaborative Workflow feature, take a look at the *Product focus* video! 15 | 16 | .. raw:: html 17 | 18 |
19 | 20 |
21 | -------------------------------------------------------------------------------- /technical_overview/workflow/partial_workflow.rst: -------------------------------------------------------------------------------- 1 | Partial workflow 2 | ================ 3 | 4 | In this scenario, Julia approves or rejects a draft partially. 5 | 6 | .. image:: img/partial-approve.png 7 | -------------------------------------------------------------------------------- /technical_overview/workflow/simple_workflow.rst: -------------------------------------------------------------------------------- 1 | Simple workflow 2 | =============== 3 | 4 | This schema represents the simplest scenario when Julia approves or rejects a whole draft. 5 | 6 | .. image:: img/simple-workflow.png 7 | -------------------------------------------------------------------------------- /troubleshooting/index.rst: -------------------------------------------------------------------------------- 1 | Troubleshooting guide 2 | ===================== 3 | 4 | Auto_increment reaches max value for pim_catalog_completeness table 5 | ------------------------------------------------------------------- 6 | 7 | .. note:: 8 | 9 | Impacted versions: PIM <= 5.0 10 | 11 | After some time, the completeness table auto_increment identifier could reach the defined maximum. 12 | We made a fix to to allow for a lot more identifier in PIM-9750 ticket but for older database schema, 13 | you must apply this fix with the following MySql ALTER command: 14 | 15 | .. code-block:: sql 16 | 17 | ALTER TABLE pim_catalog_completeness MODIFY id bigint NOT NULL AUTO_INCREMENT; 18 | 19 | 20 | Asset family identifiers stored with a different case in attributes properties (EE only) 21 | ---------------------------------------------------------------------------------------- 22 | 23 | .. note:: 24 | 25 | Impacted versions: PIM EE <= 5.0 26 | 27 | We fixed the attributes import to sanitize the asset family identifiers in PIM-9753, 28 | and you may need to fix data already stored in database with the following clean command: 29 | 30 | .. code-block:: bash 31 | 32 | bin/console --env=prod pim:asset-manager:clean-asset-family-in-asset-collection-attributes 33 | 34 | 35 | Asset & Asset family codes being case-sensitive (EE only) 36 | ---------------------------------------------------------------------------------------- 37 | 38 | .. note:: 39 | 40 | Impacted versions: PIM EE <= 5.0 41 | 42 | The Asset index mapping has been updated to be case-insensitive on the Asset & Asset family codes. 43 | You may need to reset your index and re-index all Assets: 44 | 45 | .. code-block:: bash 46 | 47 | bin/console akeneo:elasticsearch:reset-indexes --index=akeneo_assetmanager_asset 48 | bin/console akeneo:asset-manager:index-assets --all 49 | -------------------------------------------------------------------------------- /use_sso_authentication/common/images/wikimedia-saml2-browser-sso-redirect-post.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akeneo/pim-docs/af4e9847d540d6a7c76dc3ad8af6fcb25607e6f6/use_sso_authentication/common/images/wikimedia-saml2-browser-sso-redirect-post.png --------------------------------------------------------------------------------