PHPackages                             schwarz-weiss-reutlingen/couple-manager - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Admin Panels](/categories/admin)
4. /
5. schwarz-weiss-reutlingen/couple-manager

ActiveTypo3-cms-extension[Admin Panels](/categories/admin)

schwarz-weiss-reutlingen/couple-manager
=======================================

1.7.1(1mo ago)148GPL-2.0-or-laterPHPPHP ^7.2 || ^8.0

Since Nov 2Pushed 6mo ago1 watchersCompare

[ Source](https://github.com/zolthan/typo3-couple-manager)[ Packagist](https://packagist.org/packages/schwarz-weiss-reutlingen/couple-manager)[ Docs](https://www.schwarz-weiss-rt.de)[ RSS](/packages/schwarz-weiss-reutlingen-couple-manager/feed)WikiDiscussions master Synced 2w ago

READMEChangelogDependencies (10)Versions (29)Used By (0)

Couple Manager
==============

[](#couple-manager)

> TYPO3 Extbase extension to manage dance couples, competition results, and events — built for the dance sport community.

[![TYPO3](https://camo.githubusercontent.com/c6a4c02acdbe56cdb3a2f3df84309586339bdbd051f3ddb967a0b6b958f9d811/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5459504f332d392e352b2d6f72616e67652e737667)](https://typo3.org)[![PHP](https://camo.githubusercontent.com/89aaade83662daec5e22babcf77d13f249ab64a544d61601376369da95171363/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d372e322b2d626c75652e737667)](https://php.net)[![License](https://camo.githubusercontent.com/36be30f8feb7f55eb28b8a3026863de08ab79c957b768d8f16009c2f5cff8830/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d47504c2d2d322e302d2d6f722d2d6c617465722d677265656e2e737667)](LICENSE)[![Version](https://camo.githubusercontent.com/e4df30614e5c269a6b79f336ccca65cceac8da080cf697f29c1e37ca87632cea/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f76657273696f6e2d312e372e312d627269676874677265656e2e737667)](https://github.com/zolthan/typo3-couple-manager/releases)

---

Features
--------

[](#features)

- **Couple profiles** — manage dance couples and soloists with photo, starting group, class, and active status
- **Competition results** — record placements, disciplines, promotion flags, and participant counts
- **Competition calendar** — upcoming events with organizer, location, and date
- **Smart frontend plugins** — switchable views (list, detail, results, future events) via FlexForm
- **Highlights view** — automatically surfaces championships, promotions, and top-3 placements
- **Speaking URLs** — per-couple slug field for clean detail-page URLs via TYPO3 RouteEnhancer
- **Custom page title** — `CouplePageTitleProvider` surfaces the couple's name in the page title/breadcrumb
- **Backend optimised** — custom TCA labels, sorted selects, full workspace and localization support

---

Requirements
------------

[](#requirements)

ComponentVersionTYPO39.5 or higherPHP7.2, 7.4, 8.0, 8.1, 8.2EXT:extbasebundled with TYPO3EXT:fluidbundled with TYPO3---

Installation
------------

[](#installation)

### Via Composer (recommended)

[](#via-composer-recommended)

```
composer require schwarz-weiss-reutlingen/couple-manager
```

### Via TYPO3 Extension Manager

[](#via-typo3-extension-manager)

Download the extension and install it through **Admin Tools → Extensions**.

---

Setup
-----

[](#setup)

### 1. Include Static TypoScript

[](#1-include-static-typoscript)

In **Web → Template**, add the static template **"Couple Manager"** to your root template.

### 2. Configure the Storage PID

[](#2-configure-the-storage-pid)

The extension defaults to `storagePid = 137`. Override this in your site's TypoScript constants to match the SysFolder where your records live:

```
plugin.tx_couplemanager.persistence.storagePid =

```

### 3. Create Backend Records

[](#3-create-backend-records)

In the configured SysFolder, create:

- **Couples** (`tx_couplemanager_domain_model_couple`)
- **Competition Types** (`tx_couplemanager_domain_model_competitiontype`)
- **Organizers** (`tx_couplemanager_domain_model_organizer`)
- **Competitions** (`tx_couplemanager_domain_model_competition`)
- **Results** (`tx_couplemanager_domain_model_result`)

### 4. Enable speaking URLs (optional)

[](#4-enable-speaking-urls-optional)

Each couple has a `slug` field (`uniqueInSite`). To resolve it into clean detail-page URLs, add a RouteEnhancer to your site's `config.yaml`:

```
routeEnhancers:
  CoupleDetail:
    type: Extbase
    limitToPages: []
    extension: CoupleManager
    plugin: Couple
    routes:
      - routePath: '/{couple_slug}'
        _controller: 'Couple::detail'
        _arguments:
          couple_slug: couple
    defaultController: 'Couple::detail'
    aspects:
      couple_slug:
        type: PersistedAliasMapper
        tableName: tx_couplemanager_domain_model_couple
        routeFieldName: slug
```

⚠️ If other RouteEnhancers (e.g. `georgringer/news`) are also configured on the same page and lack a strict `_arguments` mapping, they may match the URL first. Place `CoupleDetail` **before**such enhancers in `config.yaml` — enhancers are evaluated in declaration order.

### 5. Enable the couple name as page title (optional)

[](#5-enable-the-couple-name-as-page-title-optional)

Register `CouplePageTitleProvider` in your site's TypoScript to surface the couple's name in the page title and breadcrumb instead of the static page title:

```
config.pageTitleProviders {
    couple {
        provider = SchwarzWeissReutlingen\CoupleManager\PageTitle\CouplePageTitleProvider
        before = altPageTitle
    }
}

```

---

Plugins
-------

[](#plugins)

### Couple Manager (`tx_couplemanager_couple`)

[](#couple-manager-tx_couplemanager_couple)

The main plugin. Select the action via the **Mode** tab in the FlexForm.

ActionDescription`Couple → list`Grid of all couples, optionally with a link to the detail page`Couple → detail`Single couple profile with past results`Competition → list`List of all competitions`Result → list`Paginated past results with optional date/limit filters`Result → listSuccess`Highlights: championships, promotions, top-3, strong finishes`Result → listFuture`Upcoming events for couples with *Show Future* enabled#### FlexForm options

[](#flexform-options)

**Couple List tab**

SettingDescriptionActive couples firstSort active couples before inactive onesDetail view pagePage UID that contains the Couple Detail plugin**Result List tab**

SettingDescriptionTemplate layout`Erfolge` (achievements) or `Home Accordion`LimitMaximum number of results to displayDate from / toFixed date range filterRolling window (days)Show results from the last N days---

### Couple Manager: Menu (`schwarzweissreutlingen_couplemanager_menu`)

[](#couple-manager-menu-schwarzweissreutlingen_couplemanager_menu)

Renders a compact couple navigation menu. Shows active couples sorted by name.

---

Domain Model
------------

[](#domain-model)

```
Couple ──< Result >── Competition
                 └── CompetitionType
Competition >── Organizer

```

### Couple

[](#couple)

FieldTypeNotes`manFirstName` / `manLastName`stringMale partner (omit for soloists)`womanFirstName` / `womanLastName`stringFemale partner`startingGroup`stringAge/skill group`startingClassLatin` / `startingClassStandard`stringDance class per discipline`activeCouple`boolShown/sorted as active`hideResults`boolSuppress results on frontend`showFuture`boolInclude in upcoming-events view`image`FileReferenceCouple photo (FAL)`slug`stringURL slug for the detail page, unique per site — see [Setup](#4-enable-speaking-urls-optional)`getCoupleName()` automatically formats the display name — handles soloists, shared surnames, and full couple names.

### Result

[](#result)

FieldTypeNotes`couple`RelationCouple this result belongs to`competition`RelationEvent`competitionType`Relatione.g. Deutsche Meisterschaft`date`DateTime`discipline`stringLatin / Standard`startingGroup` / `startingClass`stringClassification at time of result`position`intFinal placement (0 = future/pending)`participantCount`intField size`promotion`boolPromotion achieved### Competition

[](#competition)

FieldType`title`string`dateStart` / `dateEnd`DateTime`city`, `country`, `address`string`organizer`Relation (Organizer)### CompetitionType / Organizer

[](#competitiontype--organizer)

Lookup tables for categorising competitions and storing organizer contact data.

---

Result Highlights Logic (`listSuccess`)
---------------------------------------

[](#result-highlights-logic-listsuccess)

The **Erfolge** view automatically groups results into four tiers:

TierCriteria**Championships**`competitionType` is Deutsche or Landesmeisterschaft, `position ≤ 1`**Promotions**`promotion = true`**Top 3**`position ∈ {1, 2, 3}`**Strong finishes**`position / participantCount < 0.25` (top quarter)---

Development
-----------

[](#development)

```
# Install dev dependencies
composer install

# Code style check / fix
composer cs:check
composer cs:fix

# Unit tests
composer test:unit
```

---

Changelog
---------

[](#changelog)

### 1.7.1

[](#171)

- `ListFuture` ("Wer tanzt wo?") mobile view replaced with a non-interactive list (`FutureStartItem` partial) instead of a squeezed table — date, couple, tournament, tournament type/city, and starting class all visible without tapping
- Desktop table wrapped in `.table-responsive` and given subtle themed styling (caption, header row, striped rows) instead of default Bootstrap grey

### 1.7.0

[](#170)

- Added `slug` field to Couple (TCA + model) for speaking detail-page URLs
- Migration script to generate slugs for all existing couples
- Works together with a `PersistedAliasMapper` RouteEnhancer in the consuming site
- Added `CouplePageTitleProvider` to surface the couple's name as page title/breadcrumb

### 1.6.1

[](#161)

- `ListFuture` logic moved into `CoupleController::detailAction()` — upcoming tournaments ("Nächste Starts") now shown directly on the couple detail page, grouped by discipline
- Detail and List templates redesigned

### 1.5.0

[](#150)

- Accordion IDs now based on `contentObjectUid` (avoids ID collisions with multiple plugin instances)
- `panel-group` → `accordion` markup (Bootstrap 4)

### 1.4.0

[](#140)

- Bootstrap 3 → 4 template migration (7 templates)

### 1.3.0

[](#130)

- Enhanced couple listing and detail templates
- Improved type safety across domain models and simplified methods
- Developer tooling and unit test coverage improvements

### 1.2.x

[](#12x)

- FAL image handling via native `` (lazysizes removed)
- Bootstrap 4 grid classes in templates
- Fully-qualified `ObjectStorage` type annotations for TYPO3 9.5 compatibility

### 1.1.0

[](#110)

- Initial public release

---

License
-------

[](#license)

GPL-2.0-or-later — see [LICENSE](LICENSE).

---

Author
------

[](#author)

**Sebastian Wilhelm** · [Tanzsportclub Schwarz-Weiß Reutlingen e.V.](https://www.schwarz-weiss-rt.de)

###  Health Score

48

—

FairBetter than 94% of packages

Maintenance78

Regular maintenance activity

Popularity13

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity78

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~112 days

Recently: every ~4 days

Total

26

Last Release

34d ago

Major Versions

0.9.0 → 1.0.02018-11-02

### Community

Maintainers

![](https://www.gravatar.com/avatar/fabcda65795413077ed16f48c5465f038574b63cc7707a876b58bcb776353818?d=identicon)[zolthan](/maintainers/zolthan)

---

Top Contributors

[![zolthan](https://avatars.githubusercontent.com/u/3035434?v=4)](https://github.com/zolthan "zolthan (112 commits)")

### Embed Badge

![Health badge](/badges/schwarz-weiss-reutlingen-couple-manager/health.svg)

```
[![Health](https://phpackages.com/badges/schwarz-weiss-reutlingen-couple-manager/health.svg)](https://phpackages.com/packages/schwarz-weiss-reutlingen-couple-manager)
```

###  Alternatives

[friendsoftypo3/content-blocks

TYPO3 CMS Content Blocks - Content Types API | Define reusable components via YAML

103574.3k70](/packages/friendsoftypo3-content-blocks)[typo3/cms-install

TYPO3 CMS Install Tool - The Install Tool is used for installation, upgrade, system administration and setup tasks.

1812.5M579](/packages/typo3-cms-install)[web-vision/wv_deepltranslate

DeepL Translate (CORE) - This extension provides option to translate content element, and TCA record texts to DeepL supported languages.

34311.2k](/packages/web-vision-wv-deepltranslate)[web-vision/deepltranslate-core

DeepL Translate (CORE) - This extension provides option to translate content element, and TCA record texts to DeepL supported languages.

34162.0k10](/packages/web-vision-deepltranslate-core)[eliashaeussler/typo3-warming

Warming - Warms up Frontend caches based on an XML sitemap. Cache warmup can be triggered via TYPO3 backend or using a console command. Supports multiple languages and custom crawler implementations.

22272.4k](/packages/eliashaeussler-typo3-warming)[pagemachine/typo3-formlog

Form log for TYPO3

23243.0k8](/packages/pagemachine-typo3-formlog)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
