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.
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, viaDynamicLinkBuilder/
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:
FilterUrlBuilderis 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.
| 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.
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.
| 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.
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
| 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
| 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.
More from etechflow
View vendorTheme-agnostic mega menu for Magento 2. Renders on Hyvä, Luma, Adobe Commerce default and custom themes via automatic runtime detection. Provides a JSON endpoint for lazy-loaded subcategory + featured-product data.
EtechFlow Store Locator — admin-managed store/branch finder for Magento 2 with a Leaflet + OpenStreetMap map and postcode proximity search (postcodes.io). Hyva and Luma compatible. No paid map API key required.
Universal Product Fitment Finder for Magento 2 — Make/Model/Year/Part filtering on any fitment domain (automotive, motorcycle, marine, RV, phone cases, watches, appliance parts, anywhere a customer asks "will this fit my X?"). Admin-configurable labels + URL prefix so the same module rebrands to any merchant domain. Includes PDP fitment badge, SEO URLs, customer garage with cross-device sync, OEM/part-number search, and admin tooltips throughout. Theme-agnostic — Hyvä, Luma, custom themes. Renamed from "module-vehicle-compat" in v2.0.0.
Help-Centre / FAQ module for Magento 2 with categories, slug-based detail pages, search, related articles, REST API, and admin management. Theme-agnostic — works on Hyvä, Luma, and any custom theme.
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.