TYPO3 extension
The iframe plugin, the nearest places and the neighbourhood text as three Fluid ViewHelpers: map, points of interest, travel times and a written, indexable description of the neighbourhood in the templates of your property pages, configured from the extension settings instead of URL parameters. No JavaScript of its own, no dependency beyond TYPO3.
Install
The extension is yatmo_map, for TYPO3 12.4, 13.4 and 14. Install it with Composer, or from the Extension Repository in classic mode:
composer require yatmo/typo3-yatmo-map
Extension page: extensions.typo3.org/extension/yatmo_map; source on GitHub. Then open Admin Tools > Settings > Extension Configuration > yatmo_map, enter your licence key and choose your country. The yatmo Fluid namespace is registered globally: the ViewHelpers work in every template without a declaration.
<yatmo:map latitude="{property.latitude}" longitude="{property.longitude}" />
<yatmo:text latitude="{property.latitude}" longitude="{property.longitude}" />
<yatmo:pois latitude="{property.latitude}" longitude="{property.longitude}" categories="education,transport,shopping" />
Settings
The extension configuration holds the keys, the country, the language (empty: the language of the current site language), the cache duration in days, the map defaults (layout, height, zoom, style, accent colour, pin or circle, isochrones, routes) and the text defaults (heading level, street and city in the headings). Every ViewHelper starts from these defaults; any argument given in the template overrides them for that call.
The map
<yatmo:map> renders the iframe plugin at the position of the property: places around it by category, travel times on foot, by bike, by car and by public transport, optional isochrones and routes, favourite addresses of the visitor.
| Name | In | Type | Description |
|---|---|---|---|
| mode | string | overlay, overlay-scores, map-top, map, summary or summary-tabs. See display modes. Default: the settings. | |
| height | string |
Pixels (560) or a CSS length (70vh). The width fills the container.
Default: 560. |
|
| zoom | integer 7-20 |
Initial zoom.
Default: 15. |
|
| mapStyle | integer 1-7 |
Basemap style.
Default: 1. |
|
| accentColor | string |
Hex colour of the pin and highlights.
Default: #428BFF. |
|
| marker | string |
pin or circle (with circleRadius in metres, 50 to 2000) for discreet listings.
Default: pin. |
|
| rounded | integer 0-15 |
Corner radius in pixels.
Default: 0. |
|
| isochrone | string | left, right or off. See Isochrones. | |
| routeFrom | string | left, right, popup or off. | |
| userId | string | Stable anonymous id of a logged-in visitor, for the favourite addresses. | |
| title | string | Accessible title of the iframe. | |
| class | string | Extra CSS class on the iframe. |
Neighbourhood text
<yatmo:text> renders the text generated by Yatmo for the location, on the server as ordinary headings and paragraphs styled by your theme, with the key places in <strong>. One API call per location returns every language of the country (French, Dutch and English in Belgium, for example); the text comes out in the language of the site language, or in English when the country does not speak it.
<yatmo:text latitude="{property.latitude}" longitude="{property.longitude}" titles="city" heading="h2" paragraphs="education,shopping,publictransports" />
| Name | In | Type | Description |
|---|---|---|---|
| paragraphs | string |
Comma-separated among education, shopping, publictransports, transports, tourism, cities. Default: all six.
|
|
| heading | string |
Heading level of each paragraph title, h2 to h6. Default: the settings.
Default: h3. |
|
| titles | string |
street-city: the first heading names the street, the second the city. city: the city only, for discreet listings. generic: neither.
Default: street-city. |
|
| language | string | Language code. Default: the settings, then the site language. | |
| class | string |
Extra CSS class on the yatmo-text wrapper.
|
Nearest places
<yatmo:pois> renders the nearest places by sub-category (nurseries, primary schools, supermarkets, bus stops, stations, parks...) as headings and lists, each place with its distance and travel time. Plain HTML you style with your own CSS, indexable like the text.
<yatmo:pois latitude="{property.latitude}" longitude="{property.longitude}" categories="education,transport" mode="transit" limit="2" heading="h4" />
| Name | In | Type | Description |
|---|---|---|---|
| categories | string |
Comma-separated among education, transport, shopping, tourism. Default: all.
|
|
| mode | string |
Travel time shown: walking, bicycling, driving or transit. A place without that mode (an airport on foot) shows the first computed one.
Default: walking. |
|
| limit | integer |
Places per sub-category.
Default: 1. |
|
| heading | string |
Heading level of each group.
Default: h3. |
|
| language | string | Language of the labels. Default: the settings, then the site language. | |
| class | string |
Extra CSS class on the yatmo-pois wrapper.
|
Location of the property
The three ViewHelpers share the location arguments. Give latitude and longitude when your records hold them; otherwise give address and Yatmo locates it in the country of the settings (or of the country argument) and keeps the result for 90 days. Without a location, nothing is rendered.
<yatmo:map address="{property.street} {property.number}, {property.zip} {property.city}" />
Service
From your own extension, the service Yatmo\YatmoMap\Service\YatmoService (injectable) returns the same HTML and the raw API answers:
$html = $this->yatmo->map(50.8461, 4.3664, ['mode' => 'map-top', 'marker' => 'circle']);
$text = $this->yatmo->text(50.8461, 4.3664, ['education', 'shopping'], 'h2', 'city');
$raw = $this->yatmo->summary('BE', 50.8461, 4.3664, 'FR'); // the /summary answer, cached
$point = $this->yatmo->geocode('Rue de la Loi 16, 1000 Bruxelles'); // ['lat' => ..., 'lng' => ...]
Cache and keys
The text and the places are kept in a dedicated yatmo_map cache (database backend, part of the pages group, so Flush frontend caches empties it) for the number of days of the settings, 30 by default. Outages are never cached. The licence key goes into the iframe; the backend key, when set, is only used server side and never reaches the browser.
Search engines
The neighbourhood text and the places are part of your page’s HTML, rendered on the server and kept by TYPO3’s page cache: search engines and AI assistants read them as part of your listing. The summary panel inside the map widget is not indexed, since the widget is an iframe; use both for the best of both.
TYPO3 versions
One extension for TYPO3 12.4, 13.4 and 14 (PHP 8.1 or later), in Composer mode or classic mode. The ViewHelpers are ordinary Fluid ViewHelpers resolved through the dependency injection container; the settings use the standard extension configuration. TYPO3 11 and earlier are not supported.