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" />
Which key
The licence key setting takes your frontend key, the one Yatmo locks to your domains: it is written into the map iframe. The optional backend key is used for the server calls (neighbourhood text, places, geocoding) when your licence has a separate one. See License & keys. Without a key, the ViewHelpers render nothing and log a warning.

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.