JTL Source (EN)

Adds the products of your JTL shop as a dynamic content source to the YOOtheme Pro page builder · Version 1.12.1 · Stand 07.09.2026

JTL Source at a glance

What the extension does

JTL Source makes the products of your JTL shop available as dynamic content in the YOOtheme Pro builder. You build product lists and product pages with the builder's own elements — grids, cards, sliders — and map their fields to the data from the shop.

The shop itself stays untouched. The extension reads from its database; it writes nothing and changes nothing.

The screenshots in this manual were taken on a German Joomla installation. The extension follows the language of your installation, so the labels appear in English on an English backend.

What comes from the shop

The builder offers two entry points:

Available per product are, among others: name, article number, description and short description, stock, creation and modification date, the address in the shop, prices, images, attributes, variations and characteristics. The details are listed under Fields and properties.

What you need for it

If shop and website are on different servers, the shop's database server has to accept connections from outside. That is a deliberate decision with security implications — please read Setting up the shop connection on this.

How the data reaches the page

  1. You enter the credentials once in the plugin settings.
  2. In the builder you pick one of the two sources on the element, in the group Graup-IT, and set the filters.
  3. When the page is built, the extension fetches exactly those products that match the filters — limited to the configured count.
  4. The builder places the fields into your layout.

The selection lists in the builder (categories, manufacturers, characteristics, products) are only built there. On a regular page view they are skipped — which saves several queries against the shop on every request.

Applies to version 1.12.1.

Deutsche Fassung

Requirements and installation

Requirements

The extension works without Joomla's compatibility plugin. If you have enabled it for other reasons, that does no harm — it is simply not needed here.

Installation

  1. Download the installation package plg_system_jtlshop-x.y.z.zip from your customer account on graup-it.de.
  2. In the Joomla backend, open System → Install → Extensions.
  3. Drag the ZIP file into the upload area or select it via Browse.

On a first installation the plugin is enabled automatically. You will find it afterwards under System → Plugins as System - JTL Source.

After the installation an overview panel appears showing the installed version and the entry points to Getting started, Download key and Manual. After an update, the changelog takes the place of "Getting started".

The overview panel after an update, with the version number and the cards What's new, Enable updates and Help

If the environment does not fit — Joomla too old, PHP too old — the installation stops with a clear message instead of leaving behind an extension that silently fails later.

After the installation

  1. Set up the connection to the shop and verify it with the built-in button — see Setting up the shop connection. Without a connection the sources in the builder stay empty.
  2. Clear the YOOtheme cache: YOOtheme → Settings → Advanced → Clear Cache.
  3. Open a page in the builder — the dynamic content now offers the group Graup-IT with the two sources.
  4. Enter your download key for automatic updates — see Download key and updates.

Uninstalling

Uninstall the plugin via System → Manage Extensions. The extension creates no tables of its own in Joomla, and it changes nothing in the JTL shop anyway. All that remains are the plugin settings, and those are removed with the uninstallation.

Remember to remove the database user you created for the connection in the shop as well, once you no longer need it.

Applies to version 1.12.1.

Deutsche Fassung

Download key and updates

JTL Source receives updates through the official Joomla update mechanism. To allow your website to fetch them, enter your personal download key once.

Entering the download key

  1. Create your download key in your customer account on graup-it.de (menu item Download IDs). One key applies per website and covers all extensions obtained through it.
  2. In the backend, open System → Update → Update Sites.
  3. Open the entry JTL Source Updates and enter the key into the field Download Key.
  4. Save.

Make sure to paste the key without leading or trailing spaces. A space copied along with it makes the update fail with an error message ("URL rejected" or "Package download failed").

Installing updates

  1. Open System → Update → Extensions.
  2. If a new version is available, JTL Source appears in the list. Select it and click Update.
  3. Joomla downloads the package using your download key, verifies the checksum and installs the new version. Your settings and your builder layouts are preserved.

If Joomla finds no update although a new version exists, click Check for Updates first to refresh the cache.

The manual route

You can also install any version by hand: download the ZIP and install it via System → Install → Extensions, just like the first installation. An update through the package overwrites the existing installation and keeps your settings.

Applies to version 1.12.1.

Deutsche Fassung

Setting up the shop connection

You set up the connection once under System → Plugins in the entry System - JTL Source. The settings live in two tabs: JTL Shop Database and Plugin Options.

First: create a database user of your own

Do not use the shop's own database user. Create a user on the shop's database server that is allowed to read only. The extension never writes — a user with write permissions would be a risk without any benefit.

An example for MySQL. Replace the schema name, the user name, the password and the address the access comes from:

CREATE USER 'joomla_read'@'203.0.113.10' IDENTIFIED BY 'a-long-password';
GRANT SELECT ON jtlshop.tartikel                     TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.tartikelmerkmal              TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.tartikelsprache              TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.tartikelpict                 TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.tartikelsichtbarkeit         TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.tattribut                    TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.tattributsprache             TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.teigenschaft                 TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.teigenschaftsichtbarkeit     TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.teigenschaftsprache          TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.teigenschaftwert             TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.teigenschaftwertaufpreis     TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.teigenschaftwertpict         TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.teigenschaftwertsichtbarkeit TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.teigenschaftwertsprache      TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.thersteller                  TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.tkategorie                   TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.tkategorieartikel            TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.tmerkmal                     TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.tmerkmalwert                 TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.tmerkmalwertsprache          TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.tpreis                       TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.tpreisdetail                 TO 'joomla_read'@'203.0.113.10';
GRANT SELECT ON jtlshop.tsprache                     TO 'joomla_read'@'203.0.113.10';
FLUSH PRIVILEGES;

As of version 1.12.0 this list contains different tables than before. Up to 1.11.0 it named two tables that do not exist in the JTL shop — the extension queried them, and the fields attributes and variations therefore always stayed empty. If you granted the permissions one by one, please add the new ones. If you used GRANT SELECT ON jtlshop.*, there is nothing to do.

The t at the start of the table names is the usual JTL prefix. If yours differs, adjust the names — and enter your prefix in the field Table prefix below.

If you prefer it simple, grant GRANT SELECT ON jtlshop.*. That is more generous than necessary, but still far better than a user with write permissions.

Tab "JTL Shop Database"

Database hostAddress of the database server. If the shop is on the same server, usually localhost.
Database nameName of the schema, for example jtlshop.
Database userThe read-only user you just created.
Database passwordShown masked in the form. On how it is stored, see below.
Table prefixDefault t.
Database portDefault 3306.

Testing the connection

Above the first field sits the button Test database connection. Without saving, it checks:

The tab JTL Shop Database with the button Test database connection and the response: connection successful, database jtlshop_demo (MySQL 8.4.3), 8 tables found

If tables are reported as missing, the prefix is usually wrong.

The test is only reachable for logged-in users who are allowed to manage extensions. Up to version 1.9.8 it could be called without logging in — one more reason to update to 1.10.0.

Tab "Plugin Options"

Shop base URLAddress of the shop, for example https://shop.example.com. The image and article addresses are assembled from it. If the field stays empty, the address of the Joomla website is used — and the images lead nowhere.
Default currencyCurrency code for price output, default EUR.
Default languageISO code of the language the article data is maintained in, default ger. It controls which translated attribute names are read. For an English-language shop, eng.
Customer groupThe website reads the shop from the perspective of this customer group, default 1. It determines two things: which price is output and which products count as visible. In most shops 1 is the default group — which one it is in yours can be seen in the shop backend under Customers → Customer groups.

The tab Plugin Options with the fields Shop base URL, Default currency and Default language

Where the password ends up

Joomla stores plugin settings unencrypted in its own database. That applies to this password as well — Joomla offers nothing else for plugin parameters, and no extension can change that.

Hence the recommendation above: a dedicated user that may only read. Then the damage is limited should someone gain access to the Joomla database.

Connections from outside

If shop and website are on different servers, the shop's MySQL server has to accept connections from outside. Narrow that down as far as you can:

Applies to version 1.12.1.

Deutsche Fassung

Using the sources in the builder

Assigning a source

  1. Open the page in the YOOtheme builder.
  2. Select the element that is to show the products — a grid or a card list, for example.
  3. Switch to the Advanced tab of the element. There you find the selector Dynamic Content.
  4. Open it and go to the group Graup-IT. Choose JTL Products for a list or JTL Product for exactly one product.

As soon as the source is selected, its settings appear underneath:

The Dynamic Content selector with the source JTL Products selected, below it the filters Categories, Manufacturers and Characteristics as well as Offset, Count, Sorting, Direction and the switch for visible products only

After that you map the element's fields to the fields of the source — title to name, image to main_image and so on. Which fields exist is listed under Fields and properties.

JTL Products

This source delivers several products. All filters can be combined; empty filters do not restrict anything.

CategoriesMultiple selection from the shop's categories. Only products belonging to one of the selected categories are returned.
ManufacturersMultiple selection from the manufacturers.
CharacteristicsMultiple selection from the characteristic values. Each is shown as Characteristic: value (number of products); characteristic values without products do not appear at all.
OffsetHow many products are skipped. Default 0.
CountHow many products are returned at most. Default 10.
SortingProduct name, article number, price or Date added.
DirectionAscending or descending.
Visible products onlyHides products that are blocked in the shop for the configured customer group. Recommended for public pages. Default: on.

What "visible" means here. JTL has no active flag on the article. If someone deselects an article for this shop in the ERP system, the next synchronisation deletes its record from the shop database — the extension cannot find such products at all any more. What the shop does maintain is a block per customer group: the product stays in the database but is not shown to certain customer groups. That is exactly what this switch filters on, against the customer group from the plugin options.

Your read-only user needs SELECT on tartikelsichtbarkeit for this. If the table or the permission is missing, the extension still returns the products — unfiltered then, with a notice in the Joomla backend and in the log.

Products with a release date in the future stay visible. That matches the shop, which also shows such articles and marks them as coming soon.

Set the count deliberately. Every product pulls in further queries for prices, images, attributes and variations while the page is being built — and those run against a remote database. A list of 200 products is noticeably slower than one of 12.

The source also knows a search term that searches product name, description and article number. There is no input field for it in the form — the value is set through YOOtheme's dynamic parameters, from a URL parameter for instance. For a fixed list you do not need it.

JTL Product

This source delivers exactly one product. You pick it in the field Product from a list that shows article number – product name and is sorted by article number.

The list is limited to 500 products. If your shop has more, the product you are looking for may not be among them — build the page via JTL Products with a filter in that case.

Sorting and order

Sorting by price uses the shop's net price. Products without a price on record may end up at the front or at the back depending on the data — if the order matters, check the result with real data.

The selection lists stay empty

Categories, manufacturers, characteristics and the product list are built in the builder interface only, not on a regular page view — which saves several queries against the shop on every request. If they are empty, the database connection is usually not working: check it in the plugin settings with Test database connection.

Changes in the shop do not appear immediately

YOOtheme caches generated pages. After changes in the shop, clear the cache under YOOtheme → Settings → Advanced → Clear Cache. The same applies when you have created new categories or manufacturers in the shop and they are still missing from the builder's selection lists.

Applies to version 1.12.1.

Deutsche Fassung

Fields and properties

This page lists the fields both sources deliver. In the builder you map them to the parts of your element.

Product

idInternal identifier of the product in the shop. Unique, but not meant for visitors.
nameProduct name.
article_noArticle number as maintained in the shop.
descriptionFull description, contains HTML from the shop.
short_descriptionShort description.
stockStock level as a number.
in_stockYes/no — more convenient for conditions in the builder than the numeric value.
seo_urlReadable address of the product, relative to the shop.
shop_urlFull address of the product in the shop — assembled from the shop base URL. The field for "go to product" links.
created_atCreation date.
updated_atDate of the last change.
main_imageThe first image of the product — the normal case for cards and grids.
pricePrice details, see below.
imagesAll images as a list, with a maximum count.
attributesAttributes as a list.
variationsVariations as a list.
merkmaleCharacteristics as a list.

description contains the markup from the shop. If your element outputs the text escaped, visitors will see the HTML tags. Use an element that allows HTML in that case, or short_description.

Price

price_netNet price as a number.
price_grossGross price as a number.
formatted_netNet price as a ready-made string with currency.
formatted_grossGross price as a ready-made string with currency.
rrpRecommended retail price, if maintained in the shop.
has_discountYes/no — whether the price is below the recommended retail price.
currencyCurrency code from the plugin settings.

On displaying prices: which price actually applies in the shop depends on customer group, tiered prices and promotions. This extension reads the stored default price. If your shop works with customer-group-dependent prices, check whether the display on the website matches — and point out where appropriate that the price in the shop is the binding one.

Image

idIdentifier of the image.
sort_orderOrder as maintained in the shop.
url_small, url_medium, url_largeThe three sizes JTL generates — each as a full address.

All three addresses are assembled from the shop base URL. If it is not set, the images lead nowhere.

Attribute

idIdentifier of the attribute.
nameLabel — in the language from the plugin settings, if translated.
valueValue.
formattedLabel and value as a ready-made string.

Variation

idIdentifier of the variation.
article_noArticle number of the variation.
stockStock level of the variation.
in_stockYes/no.

Characteristic

merkmal_id, merkmal_nameIdentifier and label of the characteristic, "colour" for instance.
wert_id, wert_nameIdentifier and label of the value, "blue" for instance.
sort_orderOrder from the shop.

Characteristics are optional in JTL. If your shop does not use them, the fields stay empty and the selection list in the builder is empty — that is not an error.

The field names merkmale, merkmal_id, merkmal_name, wert_id and wert_name are German on purpose: they are the names JTL itself uses, and renaming them would break every existing layout.

Applies to version 1.12.1.

Deutsche Fassung

Common questions and troubleshooting

The sources do not appear in the builder

  1. Is the plugin enabled under System → Plugins?
  2. Is YOOtheme Pro active as the site template? Without YOOtheme the plugin has no effect — that is by design.
  3. Clear the YOOtheme cache: YOOtheme → Settings → Advanced → Clear Cache.
  4. Look for the group Graup-IT under Dynamic Content.

The builder does not open at all any more

If the builder shows an error message containing mysqli object is not fully initialized instead of the page, you have hit a bug in versions up to 1.10.4: an unreachable shop database took down the entire builder there — even on pages without any shop content.

From version 1.10.5 on, only the selection lists stay empty in this case and the builder keeps working. Update to 1.10.5 or newer. If you can no longer reach the plugin settings, disable the plugin temporarily under System → Plugins; the builder can then be opened again.

The sources are there, but the selection lists are empty

This is almost always the database connection. Open the plugin settings and use Test database connection. The test tells you exactly what is wrong.

"The shop data is currently unavailable"

This message appears in the frontend when access to the shop fails. The exact wording deliberately does not appear there but in the Joomla log: the database's message names the server address, the user name and the schema name, and that is none of a visitor's business.

In the backend you see the full wording. Alternatively you find it in the log under plg_system_jtlshop.

The images are not displayed

Check the shop base URL in the plugin settings. If it is empty, the extension assembles the image addresses from the address of your Joomla website — but the images are not there. Enter the address of the shop, without a trailing slash.

Attribute names do not appear translated

The translated labels are read for the language entered under Default language — default ger. For an English-language shop, enter eng there.

The page is slow to build

Every product pulls in further queries for prices, images, attributes and variations, and those run against a remote database — every query costs network time.

Does the extension change anything in the shop?

No. It reads only. Still, create a database user that may only read — see Setting up the shop connection. Then it is not only meant that way, it is enforced.

Is the password stored securely?

No — Joomla stores plugin settings unencrypted. The field is masked in the form, in the database it is in plain text. Hence the recommendation to use a dedicated read-only user: then whatever is stored there is good for read access only.

Do I need the Joomla compatibility plugin?

No. The extension uses only interfaces that Joomla 6 provides without that plugin.

Does the extension work with Joomla 5?

No. From version 1.10.0 on, Joomla 6 and PHP 8.2 are required. On older installations the installation stops with a notice.

I am still on 1.9.8 — do I have to update?

Yes. In 1.9.8 the connection test was reachable without logging in. A visitor could use the website as a network probe through it and check whether a database service is running on any given machine. Version 1.10.0 requires a valid session token and the permission to manage extensions.

Applies to version 1.12.1.

Deutsche Fassung

Changelog

This changelog lists every released version of JTL Source, the most recent first.

This page is generated automatically from the product's changelog file when a release is made. Changes made by hand are lost at the next synchronisation.

Version 1.12.1 – 16 August 2026

Fixed

Version 1.12.0 – 14 August 2026

Added

Changed

Fixed

Notes

Version 1.11.0 – 14 August 2026

Added

Changed

Fixed

Notes

Version 1.10.5 – 14 August 2026

Changed

Fixed

Version 1.10.4 – 12 August 2026

Changed

Version 1.10.3 – 1 August 2026

Fixed

Version 1.10.2 – 1 August 2026

Changed

Version 1.10.1 – 1 August 2026

Fixed

Version 1.10.0 – 31 July 2026

Security

Added

Changed

Fixed

Version 1.9.8 – 6 June 2026

Notes

Deutsche Fassung