https://docs.typo3.org/m/typo3/docs-how-to-document/main/en-us/GeneralConventions/FileStructure.html#includes-rst-txt

Yellowpages2 

Extension key

yellowpages2

Package name

jweiland/yellowpages2

Version

main

Language

en

Author

Stefan Froemken, Hoja Mustaffa Abdul Latheef

License

This document is published under the Creative Commons BY 4.0 license.

Rendered

Thu, 10 Sep 2026 12:46:02 +0000


With yellowpages2 you can build your own industry directory.


Table of Contents:

https://docs.typo3.org/m/typo3/docs-how-to-document/main/en-us/GeneralConventions/FileStructure.html#includes-rst-txt

Users manual 

Target group: Editors

  1. Select a page where you want to insert yellowpages2
  2. Insert a new content element of type General Plugin
  3. On tab Plugin, select Industry Directory from the selectbox
  4. Confirm the reload to load the extension's FlexForm fields
  5. Save

Plugin options 

Choose view 

Switch between the list and the detail view.

PID of detail page 

Move the detail view onto another page for a different layout. Set its page ID here.

PID of list page 

If you have set a PID for the detail page, set this value too, so the plugin can generate correct links back to the list page.

Preset trade 

Preselect a trade to narrow down the result list on page load.

District 

Narrow down the result list to a single district.

Company record 

  1. Select a storage page
  2. Create a new record of type Company
  3. Give it a title. The first letter of the title is used for the glossary navigation.
  4. Enter a description and assign one or more trades to it.
  5. Add a logo and up to two images. Both fields accept a maximum of two files.

https://docs.typo3.org/m/typo3/docs-how-to-document/main/en-us/GeneralConventions/FileStructure.html#includes-rst-txt

Installation 

Target group: Administrators

Install yellowpages2 like any other TYPO3 extension.

Installation using Composer 

composer require jweiland/yellowpages2
Copied!

Installation using Extension Manager 

If you cannot use Composer, install yellowpages2 through the Extension Manager instead:

  1. Open the Extension Manager
  2. Switch to Get Extensions
  3. Search for yellowpages2
  4. Install the extension

Next step 

Configure the extension.

https://docs.typo3.org/m/typo3/docs-how-to-document/main/en-us/GeneralConventions/FileStructure.html#includes-rst-txt

Extension settings 

Configure yellowpages2 in the backend module Admin Tools > Settings > Extension Configuration.

poiCollectionPid

poiCollectionPid
Type
integer
Default
0

Only relevant if EXT:maps2 is installed. While creating a company record on the frontend, the address is geocoded and a maps2 record is created for it automatically. Define the storage page ID for these records here.

emailFromAddress

emailFromAddress
Type
string
Default
(empty, falls back to the install-wide default from address)

Sender address used for all notification emails triggered when a visitor creates or updates a company record on the frontend.

emailFromName

emailFromName
Type
string
Default
(empty, falls back to the install-wide default from name)

Sender name used for the notification emails described above.

emailToAddress

emailToAddress
Type
string
Required

true

Default
(empty)

Recipient address for the administrator notification sent whenever a visitor creates or updates a company record on the frontend. This is also the address that receives the moderation link to edit or activate the record. Unlike emailFromAddress, there is no fallback: leaving this empty causes sending to fail once a company is created or updated on the frontend.

emailToName

emailToName
Type
string
Default
(empty)

Recipient name for the administrator notification described above.

Name Type Default
integer 0
string (empty)
string (empty, falls back to the install-wide default from address)
string (empty, falls back to the install-wide default from name)
string (empty)
string (empty)

https://docs.typo3.org/m/typo3/docs-how-to-document/main/en-us/GeneralConventions/FileStructure.html#includes-rst-txt

Site Set settings 

yellowpages2 ships its configuration as the Site Set jweiland/yellowpages2. Add it to the dependencies list of your site configuration (config/sites/<your-site-identifier>/config.yaml), then override any of the following settings for your site in config/sites/<your-site-identifier>/settings.yaml:

config/sites/my_site/settings.yaml
yellowpages2.storagePid: '21,45,3234'
yellowpages2.pidOfMaps2Plugin: 12
Copied!

Yellowpages2

Yellowpages2
Label
Yellowpages2

Yellowpages2.templates

Yellowpages2.templates
Label
Templates

yellowpages2.templateRootPath

yellowpages2.templateRootPath
Type
string
Default
"EXT:yellowpages2/Resources/Private/Templates/"
Label
Templates
Category
Yellowpages2 > Templates

Path to template root

yellowpages2.partialRootPath

yellowpages2.partialRootPath
Type
string
Default
"EXT:yellowpages2/Resources/Private/Partials/"
Label
Partials
Category
Yellowpages2 > Templates

Path to partial root

yellowpages2.layoutRootPath

yellowpages2.layoutRootPath
Type
string
Default
"EXT:yellowpages2/Resources/Private/Layouts/"
Label
Layouts
Category
Yellowpages2 > Templates

Path to layout root

Yellowpages2.pages

Yellowpages2.pages
Label
Pages

yellowpages2.storagePid

yellowpages2.storagePid
Type
string
Label
Default storage PID
Category
Yellowpages2 > Pages

Folder for storing records and fetched data

yellowpages2.pidOfMaps2Plugin

yellowpages2.pidOfMaps2Plugin
Type
page
Default
0
Label
PID for maps2
Category
Yellowpages2 > Pages

PID where maps2 plugin for detail view is inserted

yellowpages2.startingUidForCategories

yellowpages2.startingUidForCategories
Type
int
Default
0
Label
Root for categories
Category
Yellowpages2 > Pages

Starting/Parent UID of all available categories for this plugin

yellowpages2.uidOfDefaultDistrict

yellowpages2.uidOfDefaultDistrict
Type
int
Default
2
Label
Default District
Category
Yellowpages2 > Pages

UID of the default district to show in selectbox

yellowpages2.pidOfDetailPage

yellowpages2.pidOfDetailPage
Type
page
Default
0
Label
PID of Detail page
Category
Yellowpages2 > Pages

Leave empty to show details on current page

yellowpages2.pidOfListPage

yellowpages2.pidOfListPage
Type
page
Default
0
Label
PID of List page
Category
Yellowpages2 > Pages

List Page UID: If empty, the current page ID will be used.

yellowpages2.userGroup

yellowpages2.userGroup
Type
int
Default
1
Label
Usergroup Uid
Category
Yellowpages2 > Pages

The user group allowed to create new companies. This determines the rendering of the edit and create links on the list page.

Yellowpages2.pagination

Yellowpages2.pagination
Label
Pagination

yellowpages2.pageBrowser.itemsPerPage

yellowpages2.pageBrowser.itemsPerPage
Type
int
Default
15
Label
Records per page
Category
Yellowpages2 > Pagination

How many items should be displayed on one page

yellowpages2.pageBrowser.insertAbove

yellowpages2.pageBrowser.insertAbove
Type
bool
Default
1
Label
Insert above
Category
Yellowpages2 > Pagination

Should pagebrowser be displayed on top of the list

yellowpages2.pageBrowser.insertBelow

yellowpages2.pageBrowser.insertBelow
Type
bool
Default
0
Label
Insert below
Category
Yellowpages2 > Pagination

Should pagebrowser be displayed at bottom of the list

https://docs.typo3.org/m/typo3/docs-how-to-document/main/en-us/GeneralConventions/FileStructure.html#includes-rst-txt

Routes 

Configure RouteEnhancers to get speaking URLs for the company list, letter, and detail views.

Example configuration 

config/sites/my_site/config.yaml
routeEnhancers:
  Yellowpages2Plugin:
    type: Extbase
    extension: Yellowpages2
    plugin: Directory
    routes:
      -
        routePath: '/first-company-page'
        _controller: 'Company::list'
      -
        routePath: '/company-page-{page}'
        _controller: 'Company::list'
        _arguments:
          page: '@widget_0/currentPage'
      -
        routePath: '/company-by-letter/{letter}'
        _controller: 'Company::list'
      -
        routePath: '/show/{company_title}'
        _controller: 'Company::show'
        _arguments:
          company_title: company
    requirements:
      letter: '^(0-9|[a-z])$'
      company_title: '^[a-zA-Z0-9]+$'
    defaultController: 'Company::list'
    aspects:
      company_title:
        type: PersistedAliasMapper
        tableName: tx_yellowpages2_domain_model_company
        routeFieldName: path_segment
Copied!

https://docs.typo3.org/m/typo3/docs-how-to-document/main/en-us/GeneralConventions/FileStructure.html#includes-rst-txt

Pagination 

yellowpages2 uses TYPO3 Core's SimplePagination to navigate through records with first, previous, next, and last buttons. If you need something more complex, like 1, 2 ... 56, 57, 58 ... 123, 124, use another pagination library or build your own. The following steps show how to plug in Georg Ringer's numbered_pagination extension instead.

  1. Install numbered_pagination

    Install and activate numbered_pagination extension from Georg Ringer. Please check in your SitePackage extension that numbered_pagination is set as a dependency and will be loaded before yellowpages2 and your SitePackage.

  2. Change pagination class in TypoScript

    plugin.tx_yellowpages2.pageBrowser.class = GeorgRinger\NumberedPagination\NumberedPagination
    Copied!
  3. Change path to yellowpages2 partials

    Set constant partialRootPath to a location within your SitePackage:

    plugin.tx_yellowpages2.view.partialRootPath = EXT:site_package/Resources/Private/Extensions/Yellowpages2/Partials/
    Copied!
  4. Create Pagination template

    Create file Resources/Private/Extensions/Yellowpages2/Partials/Component/Pagination.html with example content from numbered_pagination https://github.com/georgringer/numbered_pagination/blob/master/Resources/Private/Partials/Pagination.html

    <html lang="en"
          xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
          data-namespace-typo3-fluid="true">
    
    <ul class="f3-widget-paginator">
        <f:if condition="{pagination.previousPageNumber} && {pagination.previousPageNumber} >= {pagination.firstPageNumber}">
            <li class="previous">
                <a href="{f:uri.action(action:actionName, arguments:{currentPage: pagination.previousPageNumber})}" title="{f:translate(key:'pagination.previous')}">
                    {f:translate(key:'widget.pagination.previous', extensionName: 'fluid')}
                </a>
            </li>
        </f:if>
        <f:if condition="{pagination.hasLessPages}">
            <li></li>
        </f:if>
        <f:for each="{pagination.allPageNumbers}" as="page">
            <li class="{f:if(condition: '{page} == {paginator.currentPageNumber}', then:'current')}">
                <a href="{f:uri.action(action:actionName, arguments:{currentPage: page})}">{page}</a>
            </li>
        </f:for>
        <f:if condition="{pagination.hasMorePages}">
            <li></li>
        </f:if>
        <f:if condition="{pagination.nextPageNumber} && {pagination.nextPageNumber} <= {pagination.lastPageNumber}">
            <li class="next">
                <a href="{f:uri.action(action:actionName, arguments:{currentPage: pagination.nextPageNumber})}" title="{f:translate(key:'pagination.next')}">
                    {f:translate(key:'widget.pagination.next', extensionName: 'fluid')}
                </a>
            </li>
        </f:if>
    </ul>
    </html>
    Copied!
  5. Clear Cache

    Needed to reload the fluid templates.

https://docs.typo3.org/m/typo3/docs-how-to-document/main/en-us/GeneralConventions/FileStructure.html#includes-rst-txt

Updating 

If you update EXT:yellowpages2 to a newer version, please read this section carefully!

Upgrade to version 9.0.0 

This version closes a security issue and changes how company logo and image uploads are handled.

The activate action, used by the link in the administrator notification email to publish a company record straight away, previously had no authorization check at all. Anyone who knew or guessed a company's UID could activate it. activate, edit, and update now require a signed moderationToken request argument in addition to (or, for activate, instead of) the existing frontend user check. If you have overridden Templates/Map/Create.html or Templates/Map/Update.html in your own site package, add moderationToken to the arguments of both f:link.action calls, otherwise the links in the email no longer work:

<f:link.action action="edit" controller="Company" absolute="1"
                arguments="{company: company, moderationToken: moderationToken}">
    Edit record
</f:link.action>
Copied!

Company logo and image uploads have been migrated to Extbase's native #[FileUpload] API (TYPO3 >= 13.3), replacing the extension's own UploadMultipleFilesConverter property mapper and AssignMediaTypeConverterEventListener, both of which have been removed. If you have overridden Partials/Company/Fields/Logo.html or Images.html, replace the old per-index upload fields (logo.0, images.0 through images.4) with the native multi-file pattern:

<f:form.upload property="logo" multiple="1"/>
<f:form.upload property="images" multiple="1"/>
Copied!

DomainModelCompany::getOriginalLogo(), getOriginalImages(), getOriginalMainTrade(), and getOriginalTrades() have been removed. Their former callers should use getLogo(), getImages(), getMainTrade(), and getTrades() instead, which now return the underlying ObjectStorage directly rather than a plain array. Code iterating these values in Fluid keeps working unchanged; PHP code expecting a plain array must call ->toArray() itself.

The classic static template registration under Configuration/TypoScript/ has been removed in favor of the jweiland/yellowpages2 Site Set. If your site still relies on the classic "Include static (from extensions)" template mechanism instead of Site Sets, add the jweiland/yellowpages2 Site Set to your site's dependencies in config.yaml, see Site Set settings.

Upgrade to version 7.0.0 

This version is focused on upgrading the compatibility version to TYPO3 version 12 LTS. We moved some extension functionalities from PSR-14 Event Listeners to Middlewares as the request setArgument not possible anymore with TYPO3 version 12.

Upgrade to version 6.1.0 

If you make use of the ModifyQueryToFindCompanyByLetterEvent or ModifyQueryToSearchForCompaniesEvent event: We have changed the strict type of TYPO3 QueryBuilder to Extbase QueryResult. Yes, this is a breaking change, but it seems that no one makes use of it. Please adapt your code to use QueryResult. You can retrieve the Extbase query with method getQuery().

Upgrade to version 6.0.0 

As TYPO3 has deprecated the ObjectManager, we have changed many properties in our scheduler task Update yellowpages. Please remove that scheduler task completely and create a new one of type Inform users to update their company record.

We have changed a lot of classes. Please click the Flush Cache button in the Install Tool to rebuild the Dependency Injection cache.

If you have maps2 version 9 installed you have to override or change following part in Properties.html from:

<f:link.action title="Map detail"
                         action="show"
                         controller="PoiCollection"
                         extensionName="maps2"
                         pluginName="maps2"
                         pageUid="{settings.pidOfMaps2Plugin}"
                         arguments="{poiCollectionUid: company.txMaps2Uid}">
Copied!

to:

<f:link.action title="Map detail"
                         action="show"
                         controller="PoiCollection"
                         extensionName="maps2"
                         pluginName="maps2"
                         pageUid="{settings.pidOfMaps2Plugin}"
                         arguments="{poiCollection: company.txMaps2Uid}">
Copied!

Upgrade to version 5.0.0 

We have moved a lot of code of yellowpages2 controllers to EventListeners. Please flush the cache in the maintenance module.

As a developer, you should check whether you have overwritten some methods of MapController or CompanyController and adapt them to the new structure.

Upgrade to version 4.0.0 

We have removed column wsp_member as this column was specific to one of our customers. If you have used it, you have to add it back with the help of EXT:extender.

We have removed column icon from table sys_category. This also removed fallbackIconPath. If you have used it, you have to add it back with the help of EXT:extender.

We are using the API of glossary2 now. Please check whether your own queries are still working.

https://docs.typo3.org/m/typo3/docs-how-to-document/main/en-us/GeneralConventions/FileStructure.html#includes-rst-txt

Contribute 

Contribution to yellowpages2 is very welcome.

If you wish to contribute, please follow these conventions:

Writing issues 

  • If you find a problem in the extension, please write an issue.
  • If you can fix the problem yourself, please submit a pull request. In this case, it is not necessary to create an issue first.

Submitting a pull request 

Please see the general GitHub documentation for more information, for example Creating a pull request

https://docs.typo3.org/m/typo3/docs-how-to-document/main/en-us/GeneralConventions/FileStructure.html#includes-rst-txt

ChangeLog 

Version 9.0.0 

  • [SECURITY] Require a signed moderation token for the "activate" action to prevent unauthenticated activation of arbitrary companies
  • [BUGFIX] Keep company record hidden until the POI position is confirmed on the map
  • [BUGFIX] Fix broken uniqueness check in Yellowpages2SlugUpdate (Doctrine DBAL Result misuse)
  • [BUGFIX] Fix storagePid Site Set setting type (string instead of page)
  • [BREAKING] Migrate company logo/images upload to the native Extbase FileUpload API, remove UploadMultipleFilesConverter and AssignMediaTypeConverterEventListener
  • [BREAKING] Consolidate Company::getOriginalLogo()/getOriginalImages()/getOriginalMainTrade()/getOriginalTrades() into getLogo()/getImages()/getMainTrade()/getTrades(), now returning ObjectStorage instead of array
  • [BREAKING] Remove legacy Configuration/TypoScript static template registration in favor of the Yellowpages2 Site Set

Version 8.1.3 

  • [BUGFIX] Fix broken hidden object registration in HiddenObjectHelper
  • [BUGFIX] Use type page for PID site settings
  • [BUGFIX] Load maps2 before yellowpages2 if present
  • [BUGFIX] Remove now auto-created system TCA columns and ext_tables.sql
  • [BUGFIX] Remove dead code in ext_localconf.php and Services.php
  • [TASK] Use AsEventListener attribute instead of Services.yaml tags
  • [TASK] Make Events, EventListeners and Hook final and readonly
  • [TASK] Exclude Domain Models from DI autoconfiguration

Version 8.1.2 

  • [TASK] Add RestrictAccessEventListener to check update actions against unauthorised edits by non-owner fe_users

Version 8.1.1 

  • [BUGFIX] Replace hardcoded tab labels with localized labels in tt_content

Version 8.1.0 

  • [TASK] Remove POI creation logic from MapController
  • [TASK] Delegate POI creation to LocationService in CompanyController
  • [TASK] Refactor: Extract POI creation to LocationService
  • [TASK] Centralize extension key usage via ExtConf::EXT_KEY
  • [TASK] Add localized labels for invalid address errors
  • [TASK] Refactor ExtConf to modern immutable DI with factory method
  • [TASK] Refactor MailHelper to use MailerInterface and fresh MailMessage
  • [BUGFIX] Add maps2 partials to Yellowpages2 view paths
  • [BUGFIX] Check for Company UID before path segment update
  • [BUGFIX] Ensure company is hidden if POI mapping fails in newAction

Version 8.0.4 

  • [TASK] Updated wizard title with [extension] name format

Version 8.0.3 

  • [BUGFIX] Remove deprecated usage of SoftRef parser: images

Version 8.0.2 

  • [BUGFIX] Fixed Property Mapper with CheckFal validation issues

Version 8.0.1 

  • [BUGFIX] TCA migration fixes

Version 8.0.0 

  • Compatibility fixes for TYPO3 CMS 13.
  • TASK: Migrate all scheduler tasks to TYPO3 CLI Symfony Commands.
  • TASK: Migrate all list type general plugins to TYPO3 CType.
  • TASK: Created migration script for list_type to new CType.
  • Deprecated methods replaced.
  • Removed support for TYPO3 12 LTS

Version 7.0.2 

  • Removed Dialogue.js (jquery ui dependent) and it's inclusion from TypoScript
  • TASK: Remove DeleteUploadedFilesEventListener as invalid images already will not be assigned to company in TypeConverter.

Version 7.0.1 

  • BUGFIX: Category parent property lazy loading with LazyLoadingProxy type

Version 7.0.0 

  • Compatibility fixes for TYPO3 12 LTS
  • New Middleware implementations related to company create form
  • New Test cases for testing Middleware
  • Removed hard dependency with extension maps2
  • Testing Framework migrated to TYPO3 Testing Framework
  • Deprecated methods replaced
  • Removed support for TYPO3 11 LTS
  • BUGFIX: Fix Issue with Search Filter not repects district filter

Version 6.1.4 

  • BUGFIX: Fix for taking care of district FlexForm configuration

Version 6.1.3 

  • TASK: Add .crowdin.yml to .gitattributes

Version 6.1.2 

  • BUGFIX: Add tablemapping for FeUser object

Version 6.1.1 

  • Order list of categories by their title in search partial
  • Repair fetchRelated method to also fetch company records by trades
  • Prevent cartesian product in fetchRelated method of CategoryRepository

Version 6.1.0 

  • Migrate repo back to Extbase Query
  • Simplify implementation of own Pagination with TypoScript

Version 6.0.0 

  • Add TYPO3 11 compatibility
  • Replace controller constructors with inject methods
  • Add and update tests for TYPO3 11
  • Update structure of documentation
  • Migrate makeCategorizeable to TCA directly
  • Add defaults in TCA and ext_tables.sql

Version 5.1.1 

  • Add TS settings for GlossaryService

Version 5.1.0 

  • Use inject methods in controllers
  • Update dependency for glossary2 to 5.0.0

Version 5.0.2 

  • User should not get admin mail to activate entry on its own.

Version 5.0.1 

  • Move redirects to MapController back to CompanyController

Version 5.0.0 

  • Remove TYPO3 9 compatibility
  • Add TYPO3 10 compatibility
  • Replace f:widget.paginate with our own paginator
  • Restructure controllers. Move recurring code into EventListeners
  • Move SlugHelper from constructor argument into getSlugHelper()

Version 4.0.26 

  • Remove empty trades from request before ProperyMapping

Version 4.0.23 

  • Add activate action to non-cachable actions

Version 4.0.22 

  • Use a counter in URL for duplicate companies in Slug UpdateWizard

Version 4.0.21 

  • Update translation

Version 4.0.20 

  • Remove title from SVG icons

Version 4.0.19 

  • Use errorAction to redirect to previous action on Geocoding error

Version 4.0.18 

  • Repair new action, if POI could not be created
  • Add Error FlashMessage, why POI could not be created

Version 4.0.17 

  • Use correct logo/image TypeConverter of yellowpages2

Version 4.0.16 

  • Remove GROUP BY from query, as it is not compatible with pageBrowser

Version 4.0.15 

  • Replace Google+ column with Instagram

Version 4.0.14 

  • Remove injection of ExtConf of maps2 in MapController

Version 4.0.13 

  • Add getter to get first main trade

Version 4.0.12 

  • Better structure of getGlossar()
  • Use SchemaManager to build column names in Repo
  • Add String validator to listAction()

Version 4.0.11 

  • Wrap Fluid Templates with html namespace
  • Return one logo when using getLogo
  • Differ between image sizes for list and show view

Version 4.0.10 

  • Add Services.yaml for TYPO3 10 compatibility

Version 4.0.9 

  • Remove useless @param from getMaps2Uid

Version 4.0.8 

  • Allow max one Image for Logo

Version 4.0.7 

  • Set slug field separator to -

Version 4.0.6 

  • Add uid to generated slugs in UpgradeWizard

Version 4.0.5 

  • Add path_segment for human readable URLs to company records
  • Add Slug UpgradeWizard

Version 4.0.4 

  • Add settings to CompanyRepository SignalSlots

Version 4.0.3 

  • Set default sorting to company for QueryBuilder based statements

Version 4.0.2 

  • Change return value of mainTrade to nullable Category
  • Change return value of trades to array

Version 4.0.1 

  • Allow null for Distinct in Company model

Version 4.0.0 

  • Add TYPO3 10 compatibility
  • Remove TYPO3 8 compatibility
  • Update all PHP DocHeaders
  • Add strict types where possible
  • Add documentation
  • Remove sys_category icon implementation.
  • Move ExtIcon to Resources/Public/Icons
  • Update UnitTests
  • Remove maps2 as requirement.

Version 3.0.0 

  • Add TYPO3 9 compatibility
  • Remove @return void lines
  • Set description as required
  • Update to new GeoCode Service of maps2

Version 2.2.3 

  • Move all TCA modifying methods to TCA/Overrides

Version 2.2.2 

  • Remove idea directory
  • Remove default pageTSconfig for maps2