Skip to main content

Discontinued products

Audience: developers & AI agents · Scope: the product and family discontinued flags 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
FileRole
data/customization/model_property_customization/adminproducts.php:398-414defines the bc_discontinued property, its label, tooltip, list column + filter
data/customization/templates/configuratorpage/complete_page.php:39-43short-circuits the product page — renders the stub and returns
data/customization/templates/configuratorpage/discontinued_product.phpthe 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-300getRelatedProducts() — excludes discontinued; powers Similar Products
data/customization/models/bcconfigurator.php:209-219getCountRelatedProducts() — decides whether the Similar Products button renders
data/customization/views/adminbcproducttree2/view.html.php:181-186the admin tree's No Discontinued Filter / Only discontinued / No discontinued dropdown
data/customization/models/adminproductfamilies.php:73-82the 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:

FieldWhere setDefaultOff
Discontinued (bc_discontinued)Product edit → General0Product behaves normally
Discontinued (discontinued)Product Families edit0Family 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

ColumnTableAdded by
bc_discontinued ENUM('0','1') NOT NULL DEFAULT '0', indexed#__configbox_external_product_appendsdata/customization/updates/0.0.38.php
discontinued INT UNSIGNED DEFAULT 0#__configbox_external_product_familiesdata/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:

  1. Open the product → General → set Discontinued to YesSave.
  2. If a successor exists, confirm it shares the discontinued product's Product Family, or no Similar Products button will render.
  3. 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=N without page_id returns "This product does not exist or is not active" for any product, discontinued or not — it looks like discontinuation behaviour and isn't. Use view=configuratorpage&prod_id=N&page_id=<firstPageId> (as views/bcproducts/view.html.php:267 builds 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.
  • 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