PHPackages                             oliverthiele/ot-testimonials - 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. [Utility &amp; Helpers](/categories/utility)
4. /
5. oliverthiele/ot-testimonials

ActiveTypo3-cms-extension[Utility &amp; Helpers](/categories/utility)

oliverthiele/ot-testimonials
============================

Testimonials - Accessible testimonials slider with WCAG 2.1 AA compliance and schema.org structured data.

v1.0.0(1mo ago)035↓70.4%GPL-2.0-or-laterPHPPHP &gt;=8.4

Since Jun 2Pushed 1mo agoCompare

[ Source](https://github.com/oliverthiele/ot-testimonials)[ Packagist](https://packagist.org/packages/oliverthiele/ot-testimonials)[ RSS](/packages/oliverthiele-ot-testimonials/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (2)Versions (3)Used By (0)

Testimonials — TYPO3 Accessible Testimonials Slider
===================================================

[](#testimonials--typo3-accessible-testimonials-slider)

A TYPO3 v14 testimonials slider built for **WCAG 2.1 AA compliance**: autoplay with pause control, keyboard navigation, hover-pause scoped to the slide area, `prefers-reduced-motion` support, and `schema.org/Review`structured data for SEO.

[![TYPO3](https://camo.githubusercontent.com/309a8731f095ee93250b88cfa7d6fbc4e3ed3917cf6b981716e6fd068831654f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5459504f332d31342e332d6f72616e67652e737667)](https://typo3.org/)[![Packagist Version](https://camo.githubusercontent.com/ffaaf732b94fd86519e71fae6414909ac312f84ffaa8007a6153b62adfa2614b/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6f6c69766572746869656c652f6f742d74657374696d6f6e69616c732e737667)](https://packagist.org/packages/oliverthiele/ot-testimonials)[![PHP](https://camo.githubusercontent.com/6488fa9a1936eee4c7819ebd07d6bcddb540fe27aed72c57d6bbfccbdc637ff3/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f646570656e64656e63792d762f6f6c69766572746869656c652f6f742d74657374696d6f6e69616c732f7068702e737667)](https://php.net/)[![License](https://camo.githubusercontent.com/c22767ad38b9a1c0b6132a208ba19c7910de34b2c81818ee21c178a6da799b4d/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f6f6c69766572746869656c652f6f742d74657374696d6f6e69616c732e737667)](LICENSE)[![Changelog](https://camo.githubusercontent.com/6bc02a7bc61afc1cb3faaa53420df6d904b9940d7f3e2e11a463e1fdbb3cd52d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4368616e67656c6f672d4348414e47454c4f472e6d642d626c75652e737667)](CHANGELOG.md)

---

Features
--------

[](#features)

- **WCAG 2.1 AA accessible** — `role="region"`, `aria-live`, `role="group"` per slide, full keyboard support
- **Autoplay with pause control** — explicit pause button; hover-pause scoped to slides only (not controls)
- **Keyboard navigation** — `ArrowLeft` / `ArrowRight` navigate, `Escape` releases focus from the slider
- **`prefers-reduced-motion`** — autoplay and CSS transitions disabled automatically when set by the visitor
- **CSS transform slider** — smooth `translateX` animation, no layout shift (all slides remain in the DOM)
- **Responsive** — 2 slides per page on desktop (≥lg), 1 on mobile; `ResizeObserver` recalculates on any resize
- **Optional page indicator** — dots (clickable, keyboard-accessible) or text counter (e.g. `1 / 3`)
- **schema.org/Review structured data** — JSON-LD `ItemList` of `Review` objects with author, job title, company
- **SiteSet configuration** — TYPO3 v14 SiteSet; autoplay, indicator and structured data name configurable site-wide
- **FlexForm** — storage folder selectable per content element

---

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

[](#requirements)

RequirementVersionTYPO314.3+PHP8.4+Bootstrap5.x---

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

[](#installation)

```
composer require oliverthiele/ot-testimonials
```

Then run the TYPO3 setup:

```
vendor/bin/typo3 extension:setup -e ot_testimonials
# or via DDEV:
ddev exec typo3 extension:setup -e ot_testimonials
```

Run the database schema update to create the testimonials table:

```
vendor/bin/typo3 database:updateschema
```

---

Configuration
-------------

[](#configuration)

### 1. Add SiteSet

[](#1-add-siteset)

Add the extension as a SiteSet dependency in your site configuration (`config/sites/yoursite/config.yaml`):

```
dependencies:
    - oliverthiele/ot-testimonials
```

### 2. Add SCSS

[](#2-add-scss)

Import the source SCSS into your project build. The file uses Bootstrap 5 variables and mixins, so it must be imported after Bootstrap is set up:

```
@import 'path/to/vendor/oliverthiele/ot-testimonials/Resources/Private/Scss/OtTestimonials';
```

### 3. Load TypoScript

[](#3-load-typoscript)

If your project does not rely exclusively on SiteSets for TypoScript, import the setup file in your sitepackage:

```
@import 'EXT:ot_testimonials/Configuration/TypoScript/setup.typoscript'

```

### 4. Create testimonial records

[](#4-create-testimonial-records)

Create a sysfolder in the TYPO3 page tree and add testimonial records there. Each record has:

- **Quote** (RTE)
- **Author name**
- **Position / Role**
- **Company name**
- **Company logo** (FAL image)

### 5. Add content element

[](#5-add-content-element)

Insert a **Testimonials** content element on any page, set the storage folder in the FlexForm, and the slider renders automatically.

---

SiteSet Settings
----------------

[](#siteset-settings)

All settings are configurable via the TYPO3 backend site wizard or TypoScript constants.

### Slider

[](#slider)

SettingDefaultDescription`otTestimonials.slider.interval``7000`Autoplay interval in milliseconds.`otTestimonials.slider.autoplay``1`Enable autoplay (`1` = on, `0` = off). Always disabled when visitor has `prefers-reduced-motion` set.`otTestimonials.slider.indicator``none`Page indicator below the slider: `none`, `dots` (clickable), `counter` (e.g. `1 / 3`).### Structured Data

[](#structured-data)

SettingDefaultDescription`otTestimonials.itemReviewedName```Name of the organisation being reviewed in `schema.org/Review` structured data (`itemReviewed`). Example: `Acme Corporation`.---

FlexForm Options (per content element)
--------------------------------------

[](#flexform-options-per-content-element)

OptionDescription**Storage folder**One or more TYPO3 sysfolders containing the testimonial records to display.---

Accessibility
-------------

[](#accessibility)

The slider is built around WCAG 2.1 AA requirements:

CriterionImplementationSC 1.3.1 Info and Relationships`role="region"`, `role="group"` with `aria-label` per slideSC 2.1.1 Keyboard`ArrowLeft` / `ArrowRight` navigate; all controls are standard `` elementsSC 2.1.2 No Keyboard Trap`Escape` moves focus out of the slider regionSC 2.2.2 Pause, Stop, HidePause/Resume button; hover-pause on slide area; `prefers-reduced-motion` disables autoplaySC 4.1.2 Name, Role, Value`aria-pressed` on pause button; `aria-current` on active dot`aria-live="off"` during autoplay (prevents screen reader interruptions); switches to `aria-live="polite"` on manual navigation.

---

Template Customization
----------------------

[](#template-customization)

Override template paths in your sitepackage TypoScript:

```
plugin.tx_ottestimonials {
    view {
        templateRootPaths.20 = EXT:your_sitepackage/Resources/Private/Templates/
        partialRootPaths.20  = EXT:your_sitepackage/Resources/Private/Partials/
        layoutRootPaths.20   = EXT:your_sitepackage/Resources/Private/Layouts/
    }
}

```

### Template variables

[](#template-variables)

VariableTypeDescription`{testimonials}``QueryResultInterface`All testimonial records from the configured storage folder`{structuredData}``string`Ready-to-output `` block`{settings}``array`All resolved SiteSet + FlexForm settings### Data attributes (slider root element)

[](#data-attributes-slider-root-element)

The `` element carries configuration for the JavaScript:

AttributeSourceDescription`data-interval``settings.interval`Autoplay interval in ms`data-autoplay``settings.autoplay``1` or `0``data-indicator``settings.indicator``none`, `dots`, or `counter``data-label-page``locallang.xlf`Translated aria-label pattern for dot buttons`data-label-current``locallang.xlf`Translated "current page" label for active dot---

SiteKit Integration (optional)
------------------------------

[](#sitekit-integration-optional)

If your project uses [OT SiteKit Base](https://github.com/oliverthiele/ot-sitekit-base), the extension ships with a `Configuration/SiteKit.yaml` that registers the content element with the SiteKit grid system:

```
elements:
    - ctype: ottestimonials_testimonials
      groups: [group_content_wide]
      grid: { minCols: 12, requiresFullWidth: true }
```

Without SiteKit installed, this file is ignored.

---

License
-------

[](#license)

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

Author
------

[](#author)

Oliver Thiele — [oliver-thiele.de](https://www.oliver-thiele.de)

###  Health Score

43

—

FairBetter than 89% of packages

Maintenance92

Actively maintained with recent releases

Popularity10

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity52

Maturing project, gaining track record

 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

Unknown

Total

1

Last Release

52d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/5030298?v=4)[Oliver Thiele](/maintainers/oliverthiele)[@oliverthiele](https://github.com/oliverthiele)

---

Top Contributors

[![oliverthiele](https://avatars.githubusercontent.com/u/5030298?v=4)](https://github.com/oliverthiele "oliverthiele (3 commits)")

### Embed Badge

![Health badge](/badges/oliverthiele-ot-testimonials/health.svg)

```
[![Health](https://phpackages.com/badges/oliverthiele-ot-testimonials/health.svg)](https://phpackages.com/packages/oliverthiele-ot-testimonials)
```

###  Alternatives

[friendsoftypo3/content-blocks

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

103519.9k57](/packages/friendsoftypo3-content-blocks)[wazum/sluggi

TYPO3 extension for URL slug management with inline editing, auto-sync, locking, access control, and redirects

40529.5k](/packages/wazum-sluggi)[typo3/cms-lowlevel

TYPO3 CMS Lowlevel - Technical analysis of the system. This includes raw database search, checking relations, counting pages and records etc.

178.2M328](/packages/typo3-cms-lowlevel)[typo3/cms-redirects

TYPO3 CMS Redirects - Create manual redirects, list existing redirects and automatically createredirects on slug changes.

167.4M81](/packages/typo3-cms-redirects)[typo3/cms-form

TYPO3 CMS Form - Flexible TYPO3 frontend form framework that comes with a backend editor interface.

147.6M269](/packages/typo3-cms-form)[derhansen/sf_event_mgt

Event management and registration - Configurable event management and registration extension based on ExtBase and Fluid

66338.4k10](/packages/derhansen-sf-event-mgt)

PHPackages © 2026

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