etechflow / module-variant-links

etechflow/module-variant-links

Dynamic 'View Other Options/Finishes/Sizes' PDP buttons driven by per-product link attributes; replaces hardcoded in-description buttons and strips the old ones at render time.

magento2-module Compatibility: 2.4.7-2.4.8 Code Quality: Fail Tests: N/A Security: Pass proprietary

ETechFlow_VariantLinks

Dynamic "View Other Options / Finishes / Sizes" product-detail-page (PDP) buttons for
Magento 2 (Hyvä), driven by per-product link attributes — replacing hardcoded
in-description buttons and stripping the old ones at render time.

What it does

Many catalogues link product variants ("see this lock in another finish/size") with
anchors hand-baked into the product description HTML. That's unmaintainable: the links
rot, the markup is inconsistent, and the domain is hardwired. This module replaces that
pattern with three editable product attributes and renders clean, on-brand buttons on the
PDP.

  • Adds three per-product attributes — variant_options_url, variant_finishes_url,
    variant_sizes_url — each holding a relative URL (path + filter query), e.g.
    /euro-cylinders?manufacturer=2081. The frontend prepends the store base URL, so the
    domain is always correct. A blank value hides that button.
  • Editable in the admin product form (group Variant Links) and importable via the
    standard product CSV.
  • Legacy stripping: removes old hand-coded "View Other …" anchors from the
    description at render time, so the migration is reversible — the source description is
    untouched.
  • Dynamic mode (optional, off by default): instead of stored URLs, build the target
    link at render time from a category + filter attribute, via DynamicLinkBuilder /
    FilterUrlBuilder.
  • Bulk import + a legacy-button migration CLI for one-shot catalogue conversion.

Install

composer require etechflow/module-variant-links
bin/magento module:enable ETechFlow_VariantLinks
bin/magento setup:upgrade
bin/magento setup:di:compile        # production

The setup:upgrade runs the data patch that creates the three attributes.

Configuration

Stores → Configuration → ETechFlow → Variant Links (etechflow_variantlinks/*):

Setting Default Purpose
buttons/enabled variant_finishes,variant_sizes Which buttons render
buttons/options_label View Other Options Label for the options button
buttons/finishes_label View Other Finishes Label for the finishes button
buttons/sizes_label View Other Sizes Label for the sizes button
dynamic/enabled 0 Build links at render time instead of from stored URLs
dynamic/default_size_attribute Attribute used for dynamic size links
dynamic/size_attribute_map Per-category size-attribute overrides

Rendering

The buttons are produced by ViewModel\VariantLinks. Wire it into the theme's
product-info template (or equivalent) to output the buttons; LegacyButtonStripper
cleans the old anchors out of the description in the same pass.

Note: FilterUrlBuilder is intentionally kept as a separate seam so a future SEO
layered-navigation module can share readable filter-URL generation.

CLI

bin/magento etechflow:variantlinks:import        # bulk import variant link attributes
bin/magento etechflow:variantlinks:migrate-legacy # convert hardcoded in-description buttons

Requirements

  • PHP >= 8.1
  • Magento 2 (magento/framework, magento/module-catalog)

License

Proprietary — © ETechFlow.

No changelog yet

The vendor hasn't published a changelog. Tagged releases appear in the Versions tab.

Versions
Version Stability QA Status Compatibility Released
1.2.1 stable Fail Magento 2.4.7-2.4.8 Details 2026-06-22 14:35:24
1.2.0 stable Not tested Not yet tested Details 2026-06-22 14:25:41
1.1.1 stable Not tested Not yet tested Details 2026-06-15 15:38:57
1.1.0 stable Not tested Not yet tested Details 2026-06-15 12:02:54

Requires 3

Package Constraint
magento/framework *
magento/module-catalog *
php >=8.1

Compatibility

Each Magento release line is installed on its supported PHP versions, then the module is built (DI compilation + static-content deploy) and its unit and integration suites are run. The matrix shows the lines and PHP versions the module is confirmed to install and run on. Code-quality results further down (phpstan, phpcs, …) are reported separately and never affect compatibility.

Compatibility matrix (Magento × PHP)
Magento PHP 8.2 PHP 8.3 PHP 8.4 PHP 8.5
2.4.7 Pass Pass
2.4.8 Pass Pass
2.4.9 not tested Pass

Code Quality

Advisory checks against the module's source. Static analysis runs once across the whole module; PHPStan re-runs per Magento + PHP version because resolvable symbols differ between releases. These NEVER affect the Compatibility badge — a phpcs finding can't make a module incompatible.

Static analysis

Coding standards (phpcs), mess detection (phpmd), copy-pasted code (cpd), PHP cross-version compatibility, composer.json validity. Each runs once for the whole module.

Static analysis results
Tool Status Findings Summary
PHPCS Fail 197 3 errors, 194 warnings (ruleset: Magento2) — 109 auto-fixable with phpcbf
PHPMD Warning 34 34 rule violations (NPathComplexity:8, UnusedFormalParameter:7, EmptyCatchBlock:7, CyclomaticComplexity:6, UnusedLocalVariable:4)
Cpd Pass 0
Composer validate Info 3 valid; 3 advisory notes (composer validate --strict)

PHPStan

Type-checks the module's PHP against a real Magento install at the configured gate level. Re-runs per Magento and PHP version because resolvable symbols differ between releases. Cell → details modal.

PHPStan results by Magento and PHP version
Magento PHP 8.2 PHP 8.3 PHP 8.4 PHP 8.5
2.4.7 21 21
2.4.8 21 21
2.4.9 21 21

Tests

Unit and integration suites, run for each applicable Magento and PHP version. A test failure speaks to the module's behaviour, not its compatibility with a Magento line, so it is reported here separately and never reddens the compatibility matrix.

Unit tests

Unit tests results by Magento and PHP version
Magento PHP 8.2 PHP 8.3 PHP 8.4 PHP 8.5
2.4.7 N/A N/A
2.4.8 N/A N/A
2.4.9 N/A N/A

Integration tests

Integration tests results by Magento and PHP version
Magento PHP 8.2 PHP 8.3 PHP 8.4 PHP 8.5
2.4.7 N/A N/A
2.4.8 N/A N/A
2.4.9 N/A N/A

Security

Security checks run directly against the module: an audit of its declared dependencies for known vulnerabilities (composer audit) and a scan of its source for malware and web-shell signatures. Each runs once. A malware detection fails the version outright.

Security results
Tool Status Findings Summary
Composer audit Pass 0
Malware scan Pass 0
License
proprietary

More from etechflow

View vendor
Make it pay

Turn an existing module into recurring revenue.

If you already maintain a Magento 2 module on GitHub or GitLab, listing it on Packagento takes about five minutes. We mirror your tags, handle distribution signing, and route paid licenses through Stripe Connect, so you can keep shipping the way you already do.