Downloadable

Version 1.0.0 Stable

Joomla! 6.0 Joomla! 6.1

Released on: Wednesday, 02 September 2026
Maturity Stable
Released on Wednesday, 02 September 2026

Release notes

First public release of Downloadable Products for Solidshop (pkg_solidshopdownloadable), the free package that adds a Downloadable product type to a Solidshop store and delivers the files through token-secured links. It holds two extensions: the feature plugin plg_solidshop_downloadable and the scheduler plugin plg_task_solidshopdownloads, which purges expired download tokens and installs disabled. Establishes the baseline that all future changelog entries are deltas against.

Added

  • A Downloadable product type, registered through the product-type registry so it joins Physical in the product-type picker the moment the plugin is enabled. It is not shippable and does not track stock by default; everything else about the product — price, tax class, categories, custom fields, translations, SEO, listings, cart and checkout — is unchanged.
  • A Downloads tab on the product edit form: as many files as the product needs, each with an optional display name separate from the name on disk, reordered by drag handle. Uploads, renames, deletes and reordering happen inline without a page reload. Files belong to the product as a whole and are delivered for every variant of it.
  • Per-product download limit (downloads per file, per purchase; 0 for unlimited) and download expiry (seconds after purchase; 0 for never). Both are per purchase: a later order for the same product issues fresh links with a fresh counter and expiry, and links already issued keep the terms they were sold under when the product's numbers change.
  • Token-secured delivery. Order placement mints one random 64-character token per file, per order line, each with its own counter, limit and expiry. The download endpoint checks the token, the expiry and the remaining count, increments the counter and streams the file as an attachment; the file's location on disk appears in no URL. An expired or exhausted link answers "gone" rather than serving the file.
  • Downloads unlock on payment. Tokens exist from the moment the order is placed, but nothing is served until the order's payment status is Paid, so bank-transfer and cash-on-delivery orders show an Awaiting payment badge and no button until then. A partial refund leaves access intact; a full refund removes it. The paid/expired/limit verdict lives in the core library (Solidshop\Lib\Download\DownloadAvailability, Core 1.4.0), so the account page and the download endpoint cannot disagree.
  • An Account → Downloads page listing every file the logged-in customer is entitled to across all their orders, with the product, the order, the remaining downloads and the expiry date. Exhausted and expired rows stay in the list with the reason shown. Served by a site model (DownloadModel); the template is an ordinary Joomla layout override target, with Bootstrap markup for Cassiopeia and a Foundra override.
  • A "Your downloads" block in the order emails — the order confirmation and the payment-received email — listing every file as a direct link grouped by order line. The token is the credential, so the links work without a login and guest checkouts are delivered properly. If payment is still pending when the confirmation goes out, the block says so and the same links start working once the order is marked paid. For orders that carry downloads the payment-received email is sent even when it is switched off for ordinary orders, and an order with nothing to ship no longer promises a shipping confirmation.
  • Storefront presentation: a Download info tab on the product page (instant download, downloads per purchase, link validity), plus a dedicated Downloadable option in the product's Layout dropdown that renders the same summary inline.
  • Storage inside the Joomla installation, under files/shop/{store}/downloads/ by default and anywhere else via the plugin's storage-path setting. Filenames are sanitised and given a random 16-character suffix; deny-all guard files (.htaccess, web.config, a blank index.html) are created automatically and re-created if they go missing. On nginx, which honours neither, the random suffix is the protection — deny the directory in a location block or move the storage path outside the web root.
  • Two upload safeguards: a configurable extension allowlist (PDFs, archives, audio, video, eBooks, office documents and installers by default) and a server-side content-type check that rejects server-executable files regardless of extension. Uploading requires the Solidshop Manage Products permission.
  • The companion scheduler plugin plg_task_solidshopdownloads, which registers a Solidshop: Expired Download Token Cleanup task type that deletes tokens whose expiry has passed. Expired links answer correctly whether or not it runs; the task only stops the token table growing.
  • Shipped as one Joomla package with blockChildUninstall, so the plugin and its task companion install, update and uninstall as a unit. The package owns the update stream; the package installer refuses to run against a Solidshop older than 1.4.0 before either plugin is touched. Uninstalling drops both tables and leaves the uploaded files on disk.
  • Twenty-three administrator locales.

View files