Discontinued products
Audience: developers & AI agents · Scope: the product and family
discontinuedflags and every surface that honours them · Last reviewed: 2026-07-20
TL;DR — Setting Discontinued on a product adds bc_discontinued = '1', which removes it from every
browse/quote surface but deliberately keeps its spec sheet reachable via a dedicated public
Discontinued Products page. The product's own URL still resolves and renders a short "this product has been
discontinued" stub instead of the configurator. The family flag is unrelated in effect: it only drops the
family from the family listings and does not cascade to its products.
What it is & why it exists
Beta-Calco stops selling fixtures, but installed fixtures keep needing documentation for years. Deleting or unpublishing a product would take its spec sheet away from exactly the people who need it. So discontinuation is a third state alongside published/unpublished: gone from the catalog, still documented.
Entry point (public): index.php?option=com_configbox&view=customview&viewname=bcdiscontinuedproducts, linked
from the site footer.
How it fits together
product_appends.bc_discontinued = '1'
│
├─ every listing query adds bc_discontinued = '0' → product vanishes from
│ catalog · family pages · downloads · related products · quote-maker picker
│
├─ configuratorpage template short-circuits → "This product has been
│ (complete_page.php:39 → renderView + return) discontinued" + Spec Sheet
│
└─ bcdiscontinuedproducts view filters = '1' → the public archive page,
(still gated by group + published) with Similar Products
| File | Role |
|---|---|
data/customization/model_property_customization/adminproducts.php:398-414 | defines the bc_discontinued property, its label, tooltip, list column + filter |
data/customization/templates/configuratorpage/complete_page.php:39-43 | short-circuits the product page — renders the stub and returns |
data/customization/templates/configuratorpage/discontinued_product.php | the stub: the notice + a Spec Sheet button (+ Similar Products when related products exist) |
data/customization/views/bcdiscontinuedproducts/ | the public archive page (view.html.php:31-35 sets the filters) |
data/customization/system_overrides/BcHelper.php:255-300 | getRelatedProducts() — excludes discontinued; powers Similar Products |
data/customization/models/bcconfigurator.php:209-219 | getCountRelatedProducts() — decides whether the Similar Products button renders |
data/customization/views/adminbcproducttree2/view.html.php:181-186 | the admin tree's No Discontinued Filter / Only discontinued / No discontinued dropdown |
data/customization/models/adminproductfamilies.php:73-82 | the family flag |
Surfaces that filter it out (all add product_appends.bc_discontinued = '0'):
views/bcproducts/view.html.php:147, views/bcproductsbyfamily/view.html.php:72,
views/bcfamilyproducts/view.html.php:62, views/bcproductdownloads/view.html.php:93,
views/bcqmposition/view.html.php:106 (the quote-maker picker), BcHelper.php:274 (related products),
controllers/adminexportimages.php:41, models/bccostingsheet.php:1015 (margin analysis), and
controllers/admindownloadluminaires.php:250-252 (marks availability off in the data-sheet / commerce export).
Admin settings
No Custom Settings entries. The feature is driven entirely by two per-record fields:
| Field | Where set | Default | Off |
|---|---|---|---|
Discontinued (bc_discontinued) | Product edit → General | 0 | Product behaves normally |
Discontinued (discontinued) | Product Families edit | 0 | Family listed normally |
Both are also list columns with dropdown filters.
Control / data flow
Requesting a discontinued product's page still routes normally — complete_page.php renders the container,
then checks the flag, renders discontinued_product and returns before the configurator, downloads, tech
specs and gallery blocks. There is no redirect and no 404.
The archive page applies three filters together: bc_discontinued = '1', published = '1', and the visitor's
customer group (customer groups & visibility). A discontinued product
that is unpublished, or not assigned to the visitor's group, appears nowhere at all.
Successor products are inferred, not configured: getRelatedProducts() collects published,
non-discontinued, group-visible products sharing the product's primary or secondary family (the count check
also considers the third family). There is no replacement/successor field anywhere in the schema.
Data model
| Column | Table | Added by |
|---|---|---|
bc_discontinued ENUM('0','1') NOT NULL DEFAULT '0', indexed | #__configbox_external_product_appends | data/customization/updates/0.0.38.php |
discontinued INT UNSIGNED DEFAULT 0 | #__configbox_external_product_families | data/customization/updates/0.4.31.php |
Language strings (data/customization/language_overrides/en-US/overrides.ini):
CONFIGURATOR_PRODUCT_IS_DISCONTINUED (41), PRODUCTS_DISCONTINUED_FLAGS (178),
DISCONTINUED_SIMILAR_TO (412), DISCONTINUED_BACK_TO_DISCONTINUED (413).
Deployment runbook (manual steps)
No manual steps — the columns ship via the migrations above and apply on the next page load. To discontinue a product in practice:
- Open the product → General → set Discontinued to Yes → Save.
- If a successor exists, confirm it shares the discontinued product's Product Family, or no Similar Products button will render.
- Smoke test: the product is gone from the catalog; its URL shows the stub with a working Spec Sheet button; it is listed on the Discontinued Products page.
Turning it off: set the flag back to No — fully reversible, nothing else is mutated.
Testing
No dedicated spec. Worth adding: a product flagged discontinued disappears from the catalog and the quote-maker picker, its page renders the stub, and it appears on the archive page. See testing/guide.md.
Gotchas & caveats
- Reproducing the product page needs
page_id.view=configuratorpage&prod_id=Nwithoutpage_idreturns "This product does not exist or is not active" for any product, discontinued or not — it looks like discontinuation behaviour and isn't. Useview=configuratorpage&prod_id=N&page_id=<firstPageId>(asviews/bcproducts/view.html.php:267builds it). - The family flag does not cascade. Discontinuing a family hides the family from the family listings
(
views/bcproductfamilies/view.html.php:24,views/bcproducts/view.html.php:113,201) and nothing else. Its products stay live unless individually flagged. - Discontinued ≠ unpublished. Unpublishing removes the product from the archive page too, taking the spec sheet with it — which defeats the purpose.
- Group gating still applies on the archive page. A discontinued product with no matching group assignment is invisible there as well.
- The margin/costing and export tools skip discontinued products, so reports won't reconcile against a raw product count.
Possible follow-ups
- An explicit successor/replacement field, if "similar by family" ever proves too coarse.
- A spec, per Testing above.
Related docs
- Admin Guide → Discontinue a product (
admin-guide/products-configurator/discontinue-a-product.md) — the operator how-to - Customer groups & visibility — the other reason a product disappears