PHPackages                             dmk/mkoptin - 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. dmk/mkoptin

ActiveTypo3-cms-extension

dmk/mkoptin
===========

MK Optin Extension

v10.0.0(4y ago)057GPL-2.0-or-laterPHPPHP ^7.4

Since Dec 8Pushed 2y ago12 watchersCompare

[ Source](https://github.com/DMKEBUSINESSGMBH/typo3-mkoptin)[ Packagist](https://packagist.org/packages/dmk/mkoptin)[ Docs](http://www.dmk-ebusiness.de/)[ RSS](/packages/dmk-mkoptin/feed)WikiDiscussions 10.4 Synced 1mo ago

READMEChangelog (1)Dependencies (15)Versions (2)Used By (0)

MK Optin
========

[](#mk-optin)

[![TYPO3 compatibility](https://camo.githubusercontent.com/3e97080e7735ffb92dd0335a364e3417db4472d72563f2b08484d6d451bbac38/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5459504f332d31302e342d6f72616e67653f6d61784167653d33363030267374796c653d666c61742d737175617265266c6f676f3d7479706f33)](https://camo.githubusercontent.com/3e97080e7735ffb92dd0335a364e3417db4472d72563f2b08484d6d451bbac38/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5459504f332d31302e342d6f72616e67653f6d61784167653d33363030267374796c653d666c61742d737175617265266c6f676f3d7479706f33)[![Latest Stable Version](https://camo.githubusercontent.com/29a58fdd25a180c400e403d3cd53bdda8f27aed396a50f45737c6390f20be1c1/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f646d6b2f6d6b6f7074696e2e7376673f6d61784167653d33363030267374796c653d666c61742d737175617265266c6f676f3d636f6d706f736572)](https://packagist.org/packages/dmk/mkoptin)[![Total Downloads](https://camo.githubusercontent.com/486ce6c0a68bf51b7ce7cf1dc0580187973ceb589890972534a3daa690338950/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f646d6b2f6d6b6f7074696e2e7376673f6d61784167653d33363030267374796c653d666c61742d737175617265)](https://packagist.org/packages/dmk/mkoptin)[![Build Status](https://camo.githubusercontent.com/4a62ac7aeaeb56a0a13c7948ed81479b697a4814eeab3aacd182c6900368d108/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f444d4b45425553494e455353474d42482f7479706f332d6d6b6f7074696e2f70687063692e796d6c3f6272616e63683d31302e34266d61784167653d33363030267374796c653d666c61742d737175617265266c6f676f3d6769746875622d616374696f6e73)](https://github.com/DMKEBUSINESSGMBH/typo3-mkoptin/actions/workflows/phpci.yml)[![Code Coverage](https://camo.githubusercontent.com/c2fd292320f6642ebcf5515cfcfce242449e8929271fb458451b0756f4c96a5a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f7665726167652d25334525334425323039302532352d677265656e3f6d61784167653d33363030267374796c653d666c61742d737175617265266c6f676f3d636f6465636f76)](https://github.com/DMKEBUSINESSGMBH/typo3-mkoptin/actions?query=workflow%3A%22PHP+Checks%22)[![License](https://camo.githubusercontent.com/10535311b0f2bd4ee77a2480cef82c224e9068834e24a046894a38d9ab369eca/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f646d6b2f6d6b6f7074696e2e7376673f6d61784167653d33363030267374796c653d666c61742d737175617265266c6f676f3d676e75)](https://packagist.org/packages/dmk/mkoptin)

This TYPO3 extension provides an opt-in process via fluid mails.

What it does in short:

- Can be triggered to send an Opt-In-E-Mail
- Processes the verification via activation link in email.
- triggers a opt-in validation success event.
- Adds opt-in information to tca.

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

[](#installation)

Install TYPO3 via composer.
From project root you need to run

```
composer require dmk/mkoptin

```

Start a new opt-in process
--------------------------

[](#start-a-new-opt-in-process)

```
class MyAwesomeManager
{
    private OptinManager $optinManager;

    public function __construct(
        OptinManager $optinManager
    ) {
        $this->optinManager = $optinManager;
    }

    protected function handleOptIn(string $email): void
    {
        $optin = $this->optinManager->createOptinForEmail($email);

        // opt in already done :)
        if ($optin->isValidated()) {
            // opt-in already performed, do your finalize stuff here

            return;
        }

        // opt-in outstanding, send opt-in mail
        // finalize stuff has to be performed by event listener after opt-in validation

        $this->optinManager->sendValidationMailForOptin($optin);
    }
}
```

register opt-in validation success event listeners
--------------------------------------------------

[](#register-opt-in-validation-success-event-listeners)

Why we need this?
To do things after the email has been verified, such as activate the record or send confirmation emails.

```
services:
    DMK\MyAwesomeExtension\Event\EventListener\OptinValidationSuccessEventListener:
        tags:
            -
                name: 'event.listener'
                identifier: 'MyAwesomeOptinValidationSuccessEventListener'
                event: DMK\Optin\Event\OptinValidationSuccessEvent
```

```
class OptinValidationSuccessEventListener
{
    private MyAwesomeManager $manager;

    public function __construct(
        MyAwesomeManager $manager
    ) {
        $this->manager = $manager;
    }

    public function __invoke(OptinValidationSuccessEvent $event): void
    {
        $this->manager->handleOptinValidation($event->getOptin());
    }
}

class MyAwesomeManager
{
    public function handleOptinValidation(Optin $optin): void
    {
        // opt-in performed, do your finalize stuff here
    }
}
```

Add opt-in information to TCA
-----------------------------

[](#add-opt-in-information-to-tca)

In order to output the opt-in information for a data record, the following TCA column must be added:

```
return [
    'columns' => [
        'optin' => [
            'label' => 'LLL:EXT:mkoptin/Resources/Private/Language/locallang_db.xlf:tx_mkoptin_domain_model_optin',
            'config' => [
                'type' => 'user',
                'renderType' => 'optInStateElement',
            ],
        ],
    ]
];
```

[![OptIn State Element](Documentation/Images/OptInStateElement.png "OptIn State Element")](Documentation/Images/OptInStateElement.png)

WARNING: Currently the field in the data record must always be `email`!

Templates
---------

[](#templates)

```
plugin {
    tx_mkoptin {
        view {
            templateRootPath = EXT:myawesomeextension/Resources/Private/Templates/Optin
            partialRootPath = EXT:myawesomeextension/Resources/Private/Partials/Optin
            layoutRootPath = EXT:myawesomeextension/Resources/Private/Layouts/Optin
        }
    }
}

```

@TODOs
------

[](#todos)

- Implement table email field configuration

###  Health Score

24

—

LowBetter than 32% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity8

Limited adoption so far

Community13

Small or concentrated contributor base

Maturity50

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 97.2% 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 ~638 days

Total

2

Last Release

982d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/5131653?v=4)[Michael Wagner](/maintainers/rengaw83)[@rengaw83](https://github.com/rengaw83)

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

---

Top Contributors

[![rengaw83](https://avatars.githubusercontent.com/u/5131653?v=4)](https://github.com/rengaw83 "rengaw83 (35 commits)")[![hannesbochmann](https://avatars.githubusercontent.com/u/6302628?v=4)](https://github.com/hannesbochmann "hannesbochmann (1 commits)")

---

Tags

opt-inphptypo3typo3-extensionTYPO3 CMSoptin

###  Code Quality

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/dmk-mkoptin/health.svg)

```
[![Health](https://phpackages.com/badges/dmk-mkoptin/health.svg)](https://phpackages.com/packages/dmk-mkoptin)
```

###  Alternatives

[fluidtypo3/vhs

This is a collection of ViewHelpers for performing rendering tasks that are not natively provided by TYPO3's Fluid templating engine.

1954.1M49](/packages/fluidtypo3-vhs)[typo3/testing-framework

The TYPO3 testing framework provides base classes for unit, functional and acceptance testing.

675.0M775](/packages/typo3-testing-framework)[in2code/in2publish_core

Content publishing extension to connect stage and production server

40135.8k](/packages/in2code-in2publish-core)[apache-solr-for-typo3/solr

Apache Solr for TYPO3 - Apache Solr for TYPO3 is the enterprise search server you were looking for with special features such as Faceted Search or Synonym Support and incredibly fast response times of results within milliseconds.

1473.0M32](/packages/apache-solr-for-typo3-solr)[pagemachine/typo3-formlog

Form log for TYPO3

23225.3k6](/packages/pagemachine-typo3-formlog)[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.

20229.9k](/packages/eliashaeussler-typo3-warming)

PHPackages © 2026

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