Skip to content

Add demoentityimporter module (custom importer for the 9.2 import engine) - #256

Draft
jolelievre wants to merge 4 commits into
PrestaShop:masterfrom
jolelievre:demoentityimporter-module
Draft

Add demoentityimporter module (custom importer for the 9.2 import engine)#256
jolelievre wants to merge 4 commits into
PrestaShop:masterfrom
jolelievre:demoentityimporter-module

Conversation

@jolelievre

Copy link
Copy Markdown
Contributor

Description

New example module showing how a module plugs its own entity importer into the core import engine introduced by the #41907 refactoring:

  • the importer implements PrestaShop\PrestaShop\Core\Import\Engine\EntityImporterInterface
  • the service is registered with autoconfigure: true — the core tags it automatically (core.import.entity_importer) and collects it into the EntityImporterRegistry, no manual tag needed
  • the registry feeds the import page entity dropdown, the mapping screen field list and batch execution

Verification after installing the module:

php bin/console debug:container --tag=core.import.entity_importer

Related

Shows how a module registers its own entity importer into the PrestaShop
9.2 core import engine: an autoconfigured service implementing
EntityImporterInterface is enough, the core tags and collects it into
the EntityImporterRegistry (entity dropdown, mapping screen and batch
execution pick it up automatically).

Companion example for PrestaShop/PrestaShop#42247 (#41907 import
engine).
@jolelievre
jolelievre force-pushed the demoentityimporter-module branch from 25486fb to f7bd7d2 Compare August 6, 2026 13:22
The module was an empty registration shell; it now demonstrates the full
integration story with the core import engine:

- DemoNote Doctrine entity in src/Entity (auto-mapped by the core for
  active modules), backing table created at module install
- DemoNoteImporter extends the new AbstractEntityImporter base (cursor-
  resumable batch loop, phase-id guard, default unit count) and follows
  the updated engine contract (getLabel(), string phase ids, plain array
  records, skip rows consumed at normalization)
- validation phase (note required, max 255 chars) and database phase
  persisting one DemoNote per row (create, or update by mapped id)
- sample CSV and README walkthrough
@jolelievre
jolelievre force-pushed the demoentityimporter-module branch from f7bd7d2 to bf63cdd Compare August 7, 2026 07:03
Match the core import engine convention: no final classes, protected
members instead of private, so other modules can extend or decorate
importers.
The core import engine moved on since this module was written. It still
compiles and is still discovered (debug:container --tag=core.import.entity_importer
lists DemoNoteImporter next to ProductImporter), because it returns
iterateBatch() rather than building a PhaseBatchResult itself - but two things
were stale:

- the "note" field was flagged required through EntityField's 4th argument.
  That flag is deprecated in 9.3: it never enforced anything server-side, and
  requiredness is now validated PER ROW, because a value is only mandatory when
  the row CREATES an entity and one file can create and update. An example
  module should not showcase a deprecated API, so the flag is gone and a comment
  explains where the check actually lives (the validation phase already does it).
- the version floor said 9.2, while the engine ships in 9.3.

Also documents the one API tightening a module author can actually trip over:
PhaseBatchResult now requires all four arguments, and a batch that consumed
nothing must hand back the cursor it was given. Returning a fresh result without
it rewinds the reader to the start of the file while the phase offset stays put,
re-importing rows under the wrong indexes. This module never hits that, since it
returns iterateBatch(), but importers implementing EntityImporterInterface
directly - which the docblock presents as a supported option - would.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant