Skip to content

Releases: iranimij/openimport

OpenImport 1.5.4

Choose a tag to compare

@github-actions github-actions released this 23 Oct 08:37
8b43a9e

OpenImport 1.5.4 — import and export for Magento 2 and Mage-OS. Free, MIT, built on Magento's own import engine.

Install: composer require iranimij/openimport && bin/magento module:enable Iranimij_Base Iranimij_OpenImport && bin/magento setup:upgrade

Documentation: https://iranimij.github.io/openimport/

Fixes from the fifth hands-on review (Notion "18 · Browser review 5").

Fixed

  • Exports: a run that is cancelled, or fails while Magento's export reads the records (a writer error, an expression
    that divides by zero), now ends as cancelled or failed and delivers nothing. Magento's product export catches every
    exception in its page loop and returns the rows so far, so such runs used to end as SUCCESS with a partial file.
  • Export destination "E-mail" on Magento 2.4.8 and 2.4.9: the file is attached again. The run failed with "Call to
    undefined method Symfony\Component\Mime\Part\TextPart::getMimePart()" since Magento moved to Symfony mail.
    The e-mail also said "exported 0 row(s)": destinations now get the run's counts.
  • The profiles grid no longer sends stored secrets (encrypted passwords, keys, tokens) to the browser.
  • "Replace existing records" for products keeps each product's URL key when the file has no url_key column;
    Magento gave all existing products an empty key, so two or more collided ("Url key: '' was already generated").
    Magento's duplicate URL key message is explained in plain words.
  • Upload: a file larger than the web server or PHP accepts says so ("The file is larger than the web server
    accepts. Zip it …") instead of "A technical problem with the server … Try again"; the form shows PHP's upload limit
    under the drop zone, and an old error banner no longer stays after the next upload. Docs: Sources › Big files.
  • Cancel: once a live run writes to Magento the run page says so and no longer offers Cancel; a cancel that came too
    late is named in the run's message; stopping a running live run asks first.

Changed

  • Download run files now also covers file contents shown in the admin: the first rows in step 3, the mapping
    preview, an export's first rows on the run page and the source cells in error reports. Files an admin uploads are
    shown to that admin anyway.
  • The Behaviour field explains the chosen behaviour (what Replace deletes and keeps, what Only add / Only update
    skip).

OpenImport 1.5.3

Choose a tag to compare

@github-actions github-actions released this 22 Oct 18:35
ed0aa0f

OpenImport 1.5.3 — import and export for Magento 2 and Mage-OS. Free, MIT, built on Magento's own import engine.

Install: composer require iranimij/openimport && bin/magento module:enable Iranimij_Base Iranimij_OpenImport && bin/magento setup:upgrade

Documentation: https://iranimij.github.io/openimport/

Fixed

  • Magento's "Value for 'name' attribute contains incorrect value" and "Wrong URL/path used for attribute …" are
    explained in plain words for the column. 1.5.2 did this only when Magento sent its short error code; the product
    import sends the formatted message instead.

OpenImport 1.5.2

Choose a tag to compare

@github-actions github-actions released this 22 Oct 18:05
94e7820

OpenImport 1.5.2 — import and export for Magento 2 and Mage-OS. Free, MIT, built on Magento's own import engine.

Install: composer require iranimij/openimport && bin/magento module:enable Iranimij_Base Iranimij_OpenImport && bin/magento setup:upgrade

Documentation: https://iranimij.github.io/openimport/

Fixes from the fourth hands-on review (Notion "17 · Browser review 4").

Fixed

  • Profiles and Runs grids: the keyword search finds profiles (and runs) by name. It listed every record: the
    search filter never reached Magento's grid data provider.
  • Product pictures: base_image, small_image, thumbnail_image, swatch_image, additional_images, their
    labels and hide_from_product_page are in the field list of step 4, and Auto-match finds them (also from Bild,
    Foto, Picture). Magento 2.4.9's own sample file, which the list was built from, has no picture columns.
  • Dry run: when rows with errors are left out, the headline says so ("Magento accepts the other rows; 3 row(s) have
    errors and will be left out") instead of "Magento accepts the rows". Run summaries count rows with errors, not
    error messages.
  • Exported files import back unchanged: the apostrophe the formula guard puts in front of =, +, -, @ is
    taken off on import (phone numbers such as +49 69 … kept getting an apostrophe).
  • CSV files with CR line breaks (old Excel for Mac, some ERPs) are read line by line; they were one header row.
  • A CSV row with filled cells beyond the last column is a row error (and a warning in the first rows of step 3):
    the extra cells used to disappear silently, although they mean shifted values.
  • A CSV line longer than 8 MB stops the file with a plain message instead of exhausting PHP's memory.
  • An empty file says "The file is empty" in step 3 and in the run, not "The profile has no mapping yet".
  • Quantities with decimals are refused for products sold in whole pieces (Qty Uses Decimals off), for changes
    (+1.5) and plain quantities.
  • Orders import: unknown country codes in billing and shipping addresses are reported.
  • Picture cells with file://, ftp://, drives, network paths or ../ are refused with a row error instead of
    Magento's "Wrong URL/path used for attribute image"; Magento's "Value for 'name' attribute contains incorrect
    value" names the column in plain words.
  • "Products missing from the file" changes nothing when the file has no rows (a broken feed).
  • Import profiles from JSON: a broken file says it is not valid JSON.
  • REST source: without a saved connection the field says where to add one, Test connection asks for one, and the
    path shows a REST example.
  • "Run again" on an export says it exports again instead of "changes the shop"; the cron status says "just now".

Changed

  • Profiles imported from a JSON file never switch automatic runs on: new profiles start off, updated ones keep
    their state.
  • New permission Download run files (the imported file and the export of a run, which can hold customer data).
    Roles that could view runs get it on upgrade.
  • Step 3 lists the sheets of an Excel or OpenDocument file with several sheets.

OpenImport 1.5.1

Choose a tag to compare

@github-actions github-actions released this 22 Oct 13:16
947b759

OpenImport 1.5.1 — import and export for Magento 2 and Mage-OS. Free, MIT, built on Magento's own import engine.

Install: composer require iranimij/openimport && bin/magento module:enable Iranimij_Base Iranimij_OpenImport && bin/magento setup:upgrade

Documentation: https://iranimij.github.io/openimport/

Fixes from the third hands-on browser review of 1.5.0 (Notion "16 · Browser review 3").

Fixed

  • Reviews: a new review without store_codes, and all, is saved for every store view. It used to be saved for
    store 0 only, which Magento shows nowhere: the review and its stars stayed invisible in the shop and in the
    admin form. The export writes all for a review shown in every store view and leaves store_codes empty for
    one shown in none, so importing all for such a review repairs it.
  • Reviews: a rating that is switched off or not shown in the review's store views (Stores › Rating › Rating
    Visibility) is still imported, with a note on the row that its stars will not appear.
  • Orders: an order without shipping columns gets the billing address as its shipping address, as documented.
    Without it Magento's admin order view failed with "An error has happened during application run".
  • Profile form: the "Order numbers" option (keep the file's numbers or generate new ones) was missing for order
    imports. A select without a default value no longer disappears from the form, and every field of a step has its
    own position (fields sharing one could swap places).
  • Dry run: a record spread over several lines (an order with its items) counts once, and records the importer
    refuses (an invalid e-mail, an unknown product) are listed under the errors only, no longer also as "New".
  • Profiles grid: the "Source / destination" filter also finds exports by destination ("Export to: E-mail"…).
  • Run page: a queued run no longer shows a bare "0" after the waiting notice.
  • Run messages for OpenImport's own importers say "The rows are valid" / "The rows have errors" instead of
    naming Magento's import, which did not check them.
  • SFTP: a failed connection names the server once and says why in plain words ("the server name is unknown")
    instead of PHP's network messages.

Changed

  • Profile form: after the first file is read, its columns are matched automatically when nothing is mapped yet.
  • Auto-match knows Beliebtheit, Häufigkeit, uses and searches (popularity) and Ergebnisse / results
    for search terms.

OpenImport 1.5.0

Choose a tag to compare

@github-actions github-actions released this 21 Oct 19:01
bd8344c

OpenImport 1.5.0 — import and export for Magento 2 and Mage-OS. Free, MIT, built on Magento's own import engine.

Install: composer require iranimij/openimport && bin/magento module:enable Iranimij_Base Iranimij_OpenImport && bin/magento setup:upgrade

Documentation: https://iranimij.github.io/openimport/

Sales and marketing entities: orders, shipments, URL rewrites, price rules and coupons, reviews, newsletter,
search terms and synonyms, category positions — import and export through Magento's own models and services
(plan 1.3–1.6, release 1.5).

Added

  • Shipments and tracking numbers (openimport_shipment): a file ships orders by order number through Magento's
    own shipment service (all open items or one SKU with a quantity, carrier, tracking number, customer e-mail,
    comment); rows of one order make one shipment; orders already carrying the tracking number are skipped and
    reported. See Shipments.
  • Order import (openimport_order, import direction): historic orders land as they are, one row per item in the
    layout of the order export (state and status, date, totals, addresses, items with parents and product options,
    payment method recorded). Options: keep the file's order numbers or generate new ones, create invoices, shipments
    (with tracking numbers) and credit memos from the item quantities through Magento's own services, reduce stock.
    Orders are only added; existing numbers are skipped and reported; one transaction per order; the dry run checks
    totals and every column. See Order import.
  • Import profiles carry import options (ImportRequest::$options) for the own importers.
  • URL rewrites (openimport_url_rewrite, import and export): custom rewrites and redirects (301, 302, plain) by
    request path and store view, or the URL of a product (SKU), category (path) or CMS page (identifier); Add/Update,
    Delete; Magento's generated URLs are never changed or deleted and a request path that is one is reported as a
    conflict naming the owner. The export writes every rewrite with SKUs, category paths and page identifiers
    instead of ids. See URL rewrites.
  • Cart price rules with coupons (openimport_cart_rule) and catalog price rules (openimport_catalog_rule),
    import and export, matched by name (or rule_id): discount, websites and customer groups by code, dates,
    priority, coupon code or a list of codes, usage limits, free shipping, store labels; conditions from simple
    columns (subtotal, SKUs, categories, the items the discount applies to) or Magento's condition tree as JSON
    with short type names; every type checked. Add/Update, Delete. See
    Price rules.
  • Product reviews with ratings (openimport_review), newsletter subscribers (openimport_newsletter, no e-mail
    sent), search terms (openimport_search_term), search synonyms (openimport_search_synonym, groups merged as
    the admin does) and product positions in categories (openimport_category_position): import (Add/Update,
    Delete) and export, each a round trip. See
    Reviews, newsletter, search, positions.

OpenImport 1.4.0

Choose a tag to compare

@github-actions github-actions released this 21 Oct 09:18
24ac1e0

OpenImport 1.4.0 — import and export for Magento 2 and Mage-OS. Free, MIT, built on Magento's own import engine.

Install: composer require iranimij/openimport && bin/magento module:enable Iranimij_Base Iranimij_OpenImport && bin/magento setup:upgrade

Documentation: https://iranimij.github.io/openimport/

Connectors: every file source and destination of the paid import modules (plan 1.3–1.6, release 1.4).

Added

  • Saved connections (System › Data Transfer › OpenImport Connections): SFTP and FTP logins with Test connection, shared
    by profiles as source or export destination; secrets encrypted and never shown again; a connection in use cannot be
    deleted; profile files name the connection instead of carrying a login. New ACL resource Manage connections. See
    Saved connections.
  • Amazon S3 and S3-compatible storage (Cloudflare R2, Wasabi, MinIO, Garage, ...) as import source and export
    destination, through a saved S3 connection: own Signature Version 4 client (no SDK), folders as key prefixes, all
    matching files, move after success; every request through the URL guard. Tested against AWS's published signature
    examples and an S3-compatible server in CI.
  • Google Drive and Google Sheets with a login, as import source and export destination: a service account (JSON key,
    signed JWT) or a Google account (Sign in with Google: your own OAuth client, state and PKCE, refresh token stored
    encrypted). Folders by link, id or path, Sheets read as Excel files, exports replace a file of the same name or
    become a Google Sheet, moves into processed, deletes go to the bin.
  • Dropbox and OneDrive / SharePoint as import source and export destination, through Sign in with Dropbox /
    Sign in with Microsoft with the shop's own app (state, PKCE, refresh token stored encrypted). SharePoint document
    libraries by site address; uploads in 10 MB parts on OneDrive.
  • REST APIs as import source and export destination: saved REST connection (header token, Basic, OAuth 2 client
    credentials), paging by page numbers, offsets, cursors, next addresses or the Link header, records path, a page
    limit that stops instead of importing a partial list, retries after 429/503 with Retry-After; exports send the
    file or JSON batches.
  • Archives: a .zip, .gz, .tar or .tar.gz file from any source is unpacked and the file inside is read
    (File inside the archive: a name or pattern, else the first CSV, Excel, ODS, JSON or XML file); exports can be
    packed as ZIP, gzip or tar.gz (Compress). Zip-slip-safe (fixed file name), size counted while unpacking (1 GB),
    nested and password-protected archives refused. See Archives.
  • OpenDocument spreadsheets (.ods, LibreOffice Calc) as import format (typed values, repeated cells and rows,
    sheet by name or position, streamed) and export format (own writer, bold header row). Detected by the file's
    mimetype entry when the name says nothing.
  • XSLT: XSLT before reading (XML) turns a supplier's XML into records before the reader sees it, XSLT after
    writing (XML)
    reshapes an XML export before delivery. libxslt runs with no file, network or PHP access
    (document(), xsl:include, xsl:import refused), no DOCTYPE, a 64 MB file limit; stylesheets are checked at
    save. See File formats.

Fixed

  • openimport:secrets:reencrypt now also encrypts the secrets of export destinations again, and goes on when one
    profile cannot be saved.
  • Uninstalling removes the openimport_image table too.

OpenImport 1.3.0

Choose a tag to compare

@github-actions github-actions released this 16 Oct 14:40
2fb03f2

OpenImport 1.3.0 — import and export for Magento 2 and Mage-OS. Free, MIT, built on Magento's own import engine.

Install: composer require iranimij/openimport && bin/magento module:enable Iranimij_Base Iranimij_OpenImport && bin/magento setup:upgrade

Documentation: https://iranimij.github.io/openimport/

Catalog helpers: every product helper of the paid import modules (plan 1.3–1.6, release 1.3).

Added

  • Product pictures from web addresses: OpenImport downloads them itself (SSRF check on every redirect, JPG/PNG/GIF
    checked by their first bytes, size and time limits), keeps them in var/import/images/openimport and asks the
    server with ETag/Last-Modified before downloading again. Profile option Pictures that cannot be read: report the
    row or import it without the picture. Settings under Pictures from web addresses; housekeeping removes pictures
    no run used for 30 days. See Product pictures.
  • Configurable products from simple rows: map a column to Parent SKU (configurable products), choose the variation
    attributes; OpenImport builds the parent (name from the variants or a mapped column, values from the first
    variant), hides the variants, gives new variants unique URL keys and lists every variant in the file even with
    Skip unchanged rows. A parent's own row (product type configurable, as WooCommerce exports) is used. See
    Configurable products.
  • Products missing from the file: a product profile can treat its file as the complete list and disable, set out of
    stock or delete the products of a scope (all, a website, an attribute value such as a supplier) that the file does
    not name, after the import, in the dry run, under the safety limit with a typed confirmation (DISABLE, OUT OF
    STOCK
    , DELETE); a run with row errors changes nothing. See
    Products missing from the file.
  • Quantities as changes: Quantities in the file → are changes (+5, -3) for products, Stock & prices and stock per
    source (MSI); current quantities are read per batch, repeated SKUs add up, the dry run shows the result. See
    Quantities as changes.
  • URL keys from a pattern ({name}-{sku}) for rows without a URL key, with duplicate keys reported with the other
    SKU, and Redirect old URLs (301) for changed URL keys. See
    URL keys and redirects.
  • Conditional transforms: every transform can have Only when (an expression such as {Brand} = 'Acme' or
    value > 20); other rows keep their value.
  • Several files per run: Which file → All matching files, one run each (by name) for folder, SFTP and FTP
    sources, each file with its own run, report and move; When a file fails: go on or stop.
  • Presets: Or start from a preset creates a product profile for Shopify (current and classic columns),
    WooCommerce and Magento 1 product files. New transform fill_down (Fill from the row above). See
    Presets.
  • Row steps (RowStepInterface, AbstractRowStep): a seam between mapping and Magento's import with observe,
    columns, observeIdentifiers, apply and finish hooks, and PostImportStepInterface for changes after the
    import; pictures, configurable products and missing products are built on it.

Changed

  • Step fields such as configurable:parent_sku are never sent to Magento, also when their step is off.
  • The dry-run preview compares what Magento receives (after pictures, variants and quantity changes), not the raw
    mapped values.
  • Live imports lock Magento's entity, so products and Stock & prices runs no longer run at the same time.
  • Product pictures given as file names are read from var/import/images (as in Magento's own import), not from
    pub/media/import.

OpenImport 1.2.0

Choose a tag to compare

@github-actions github-actions released this 15 Oct 14:17
0882485

OpenImport 1.2.0 — import and export for Magento 2 and Mage-OS. Free, MIT, built on Magento's own import engine.

Install: composer require iranimij/openimport && bin/magento module:enable Iranimij_Base Iranimij_OpenImport && bin/magento setup:upgrade

Documentation: https://iranimij.github.io/openimport/

The admin, reworked from the second hands-on review (design items D1–D15, product items P1–P10).

Added

  • Profile page: step navigation, a one-line summary in each step header, a ? per step that opens the docs,
    Recent runs (the last five), Download as JSON.
  • Profiles grid: a status line (runs of the last 24 hours, waiting runs, cron health), mass actions (switch schedules
    on or off, delete), Import profiles from JSON, a click on a row opens the profile.
  • Runs: Cancel also stops a running run while it still reads the file; Run again / Dry run again on the
    run page and in the runs grid; the runs grid has What and Direction columns and filters, shows Exported for
    exports and no import counts there; a click on a row opens the run.
  • Schedules every 15 or 30 minutes and every day at a chosen time; the form shows the next three run times.
  • An export's run page shows the first ten rows of the file it wrote.
  • Setting E-mail sender for run e-mails and exports by e-mail.

Changed

  • Run page: a status chip next to a one-line headline; What would change has one row per record with the changed
    fields inline (field: before → after), more behind a toggle; tables scroll sideways only.
  • One primary action per page (Download the export is secondary while Run for real is offered).
  • Mapping: the field-code box only shows for Other field …; + Value map link; column Empty is an error;
    transforms without settings are added when chosen; chips stay on one line with their buttons on hover or focus.
  • Yes/No settings are switches; port, errors allowed and safety limit are narrow fields with units; the upload is a
    drop zone that shows the current file with Replace the file.
  • Order exports: statuses from a list, dates with a date picker, the order filters in step 5.
  • Grid dates do not wrap.

Fixed

  • Auto-match right after an upload could use an older answer without the file's columns and match nothing.

OpenImport 1.1.2

Choose a tag to compare

@github-actions github-actions released this 15 Oct 12:59
23e5296

OpenImport 1.1.2 — import and export for Magento 2 and Mage-OS. Free, MIT, built on Magento's own import engine.

Install: composer require iranimij/openimport && bin/magento module:enable Iranimij_Base Iranimij_OpenImport && bin/magento setup:upgrade

Documentation: https://iranimij.github.io/openimport/

Fixes from the second hands-on review (QA items Q1–Q21 of the review page).

Fixed

  • Profiles grid: Dry run and Duplicate work again (they opened a 404 page); the What, Source / destination
    and Started by filters list their choices; the keyword search finds profiles by name, runs by profile name.
  • Deleting categories counts the subcategories that go along, in the dry run and in the safety limit.
  • Export profiles no longer show import settings: no Detect choices, sheet, record path or first rows in step 3,
    no behaviour, error rules, skip unchanged or safety limit in step 5; row filters say Export only the records
    that match
    .
  • Fields show only where they matter: delimiter and encoding for CSV, sheet for Excel, record path for JSON/XML,
    the cron field with Custom, the schedule switch with a schedule, the sheet gid for
    Google Sheets links, the password unless SFTP logs in with a key, the file handling for folder/SFTP/FTP sources.
  • Behaviour lists only what the chosen entity can do; Replace for categories, attributes and CMS is refused on
    save instead of at run time.
  • Private keys go in a multi-line field (hidden while not focused); keys that lost their line breaks are repaired
    before the login.
  • A failed save opens the step with the problem and shows the message at the field; a wrong cron expression names
    every wrong part at once.
  • The form asks before leaving with unsaved changes.
  • Run for real with a typed confirmation stays disabled until the word is typed; lower case is accepted.
  • Run now says which file is imported (or where the export goes) and how the last dry run went; dialog buttons say
    what they do (Run now, Delete profile).
  • Required source and destination fields are marked; the server folder is kept apart from the SFTP/FTP folder when
    switching the source type; help texts per source type.
  • Long error messages wrap on the run page; a failed connection test shows as an error.
  • Order date filters use the store time zone, like the schedules; a date alone as until means the whole day.
  • The safety limit field shows the configured default.
  • Five texts were missing in German; CI now checks that every phrase has an English and a German line.

Changed

  • A schedule needs a source that changes by itself: uploads cannot be scheduled, and scheduled exports need a
    destination other than Download. The sample profiles read from and write to server folders.
  • CSV exports can leave out the header row and write ISO-8859-1/-15.

OpenImport 1.1.1

Choose a tag to compare

@github-actions github-actions released this 15 Oct 09:44
d797c3c

OpenImport 1.1.1 — import and export for Magento 2 and Mage-OS. Free, MIT, built on Magento's own import engine.

Install: composer require iranimij/openimport && bin/magento module:enable Iranimij_Base Iranimij_OpenImport && bin/magento setup:upgrade

Documentation: https://iranimij.github.io/openimport/

Fixes and small improvements from a hands-on review of 1.1.0 in the admin.

Added

  • Auto-match adds Decimal comma → dot to number fields whose first rows use decimal commas, and understands
    store:<code>:<field> column names.
  • Add required fields proposes fixed values (default attribute set and website, simple, default customer group,
    default source) and says what it added.
  • The note under What explains the chosen entity; entities are listed in a sensible order.
  • Records skipped by the behaviour (for example SKUs that are not in the shop) are named in the run message.

Fixed

  • New products without type or attribute set get a plain message with the column instead of core's "Product Type is
    invalid or not supported", once per row.
  • Dry-run totals leave out records Magento refuses, and count the parent categories a category import creates; new
    categories are no longer also counted as updated.
  • The profiles grid shows where an export goes (Source / destination); the runs grid and the run page show how and
    by whom a run started.
  • Mapping step: the "choose what to import" note no longer stays visible, the editor lines up with the other steps,
    transforms show their names, wide first-rows tables show a scrollbar; the detected file format is no longer shown
    as a warning; store-view rows in the preview no longer repeat attribute set and product type.