Content Planner 

Extension key

xima_typo3_content_planner

Package name

xima/xima-typo3-content-planner

Version

main

Language

en

Author

Konrad Michalik & contributors

License

This extension documentation is published under the CC BY-NC-SA 4.0 (Creative Commons) license.


This extension provides a colorful page* status functionality to support the planning of content work, e.g. a migration process.

(* also supports other records as well)


Introduction 

A quick overview about the main features provided by this extension.

Installation 

Instructions on how to install this extension and which TYPO3 and PHP versions are currently supported.

Configuration 

Learn how to configure the extension in various ways. This includes extension configuration, user settings, permission handling and status configuration.

Usage 

This section describes the usages of this extension. Learn how to use it the status change, the interaction possibilities, the console command or using the dashboard.

Developer corner 

A quick overview about all relevant classes provided by this extension.

Introduction 

What does it do? 

This extension provides a page status functionality to support the planning of content work, e.g. a migration process.

Content Planner Intro

Features 

  • Extended page properties for content status, assignee and additional comments
  • Colorful representation of the status within the backend
  • Easy change of status
  • User assignment for distribution of content work
  • Comments with todo and resolve feature for additional information
  • Extensive dashboard for detailed content planning
  • Recent updates widget for quick access to the latest changes
  • Filterable content planner record overview
  • Extend additional database records with status behavior
  • Content element (tt_content) support out of the box
  • Filelist support for files and folders

Screencast 

Screencast Content Planner

Support 

There are several ways to get support for this extension:

License 

This extension is licensed under GNU General Public License 2.0 (or later).

Installation 

Requirements 

  • PHP 8.2 - 8.5
  • TYPO3 13.4 LTS & 14.0+

Version Matrix 

Version TYPO3 PHP
2.x 13-14 8.2-8.5
1.x 12-13 8.1-8.5

Install 

Require the extension via Composer (recommended):

composer require xima/xima-typo3-content-planner
Copied!

Or download it from the TYPO3 extension repository.

Setup 

After the installation, update the database schema and setup the extension:

vendor/bin/typo3 database:updateschema
vendor/bin/typo3 extension:setup --extension=xima_typo3_content_planner
Copied!

Configuration 

The extension is ready to use without any further setup.

You can also adapt the extension to your needs, switch features on and off and influence the visibility of the Content Planner.

Learn what configuration options are available on the following pages:

Status 

Default Status 

By default, they are four different default status available:

  • Pending: The page is not yet ready for editing.
  • In progress: The page is currently being edited.
  • Needs review: The page is ready for review.
  • Completed: The page is ready to be published.
Initial status selection

Custom Status 

The status are content generated on the root page.

Default Status Records

Default Status Records

You can add a new status, edit an existing status, change the status order or delete a status.

Edit Status Record

Edit Status Record

Field:

Description:

Title

Title of the status.

Icon

Select one of the existing icons as representative picture of the status.

Color

Select one of the existing colors for this status.

Extension configuration 

  1. Go to Admin Tools > Settings > Extension Configuration
  2. Choose xima_typo3_content_planner

The extension currently provides the following configuration options:

Features 

recordListStatusInfo

recordListStatusInfo
Type
boolean
Default
1

Enable record list status info

enableFilelistSupport

enableFilelistSupport
Type
boolean
Default
1

Enable filelist support for files (sys_file_metadata) and folders

enableContentElementSupport

enableContentElementSupport
Type
boolean
Default
1

Enable content element support (tt_content). When enabled, content elements can have their own status, assignee and comments.

recordEditHeaderInfo

recordEditHeaderInfo
Type
boolean
Default
1

Enable record edit header info

webListHeaderInfo

webListHeaderInfo
Type
boolean
Default
1

Enable web list header info

treeStatusInformation

treeStatusInformation
Type
options
Default
comments

Enable additional information in the page tree. Choose between:

  • Nothing (0): No additional information
  • Comments (comments): Show comment count
  • Todos (todos): Show todo count

resetContentElementStatusOnPageReset

resetContentElementStatusOnPageReset
Type
boolean
Default
0

Reset status of content element, if status on corresponding page is reset

Assignee 

autoAssignment

autoAssignment
Type
boolean
Default
1

Enable the auto assignment of the current user when a new status is set to the record.

currentAssigneeHighlight

currentAssigneeHighlight
Type
boolean
Default
1

Enable the current assignee hint to highlight records assigned to the current user.

Records with your user assigned will be highlighted for you in a light yellow color.

Comments 

clearCommentsOnStatusReset

clearCommentsOnStatusReset
Type
boolean
Default
1

Delete corresponding comments when status is reset

commentTodos

commentTodos
Type
boolean
Default
1

Parse the todos from comments and show them as separate hint

Todos from comments

Todos from comments

Permissions 

Access to the Content Planner functionalities is generally available to all admin users.

All other users require the necessary authorization via the TYPO3 backend permissions module.

Basic Permissions 

Via the "Access Rights" tab add one of the following permissions within the Custom module options:

View Only (tx_ximatypo3contentplanner:view-only)
Enables Content Planner visibility (status indicators, comments panel) without any action permissions. Use this in combination with granular permissions.
Full Access (tx_ximatypo3contentplanner:content-status)
Grants visibility and all Content Planner permissions at once. This is useful for power users who should have unrestricted access to all features.

Granular Permissions 

In addition to the basic permissions, you can configure granular permissions to control specific actions. These require either View Only or Full Access as a prerequisite for visibility.

Status Permissions 

Change Status (tx_ximatypo3contentplanner:status-change)
Allow changing the status of records. Without this permission, users can view status information but cannot modify it.
Unset Status (tx_ximatypo3contentplanner:status-unset)
Allow removing/resetting the status from records. Users without this permission can only set a status, but not clear it.

Comment Permissions 

Create Comments (tx_ximatypo3contentplanner:comment-create)
Allow creating new comments on records.
Edit Own Comments (tx_ximatypo3contentplanner:comment-edit-own)
Allow editing of comments created by the user themselves.
Edit Foreign Comments (tx_ximatypo3contentplanner:comment-edit-foreign)
Allow editing of comments created by other users.
Resolve Comments (tx_ximatypo3contentplanner:comment-resolve)
Allow marking comments as resolved or unresolving them.
Delete Own Comments (tx_ximatypo3contentplanner:comment-delete-own)
Allow deletion of comments created by the user themselves.
Delete Foreign Comments (tx_ximatypo3contentplanner:comment-delete-foreign)
Allow deletion of comments created by other users.

Assignment Permissions 

Assign Self (tx_ximatypo3contentplanner:assign-self)
Allow assigning and unassigning yourself. Users with this permission can use the "Assign to me" shortcut and select themselves from the assignee dropdown. Unassigning is only possible if the record is currently assigned to the user themselves.
Assign Others (tx_ximatypo3contentplanner:assign-others)
Allow assigning, reassigning and unassigning any user. This is a superset of Assign Self - users with this permission can select any user from the assignee dropdown, change existing assignments, and unassign anyone.

Read-Only Fields in Record Editing 

When editing records (e.g. page properties), the Content Planner fields are automatically set to read-only if the user lacks the corresponding permission:

  • Status field: read-only without Change Status permission
  • Assignee field: read-only without any assignment permission (Assign Self or Assign Others)
  • Comments field: read-only without Create Comments permission (or missing tables_modify for the comment table)

This ensures that users with View Only access can see the current status, assignee, and comments, but cannot modify them directly in the record form.

Per-Group Restrictions 

In addition to the custom module options, you can restrict which statuses and tables a user group can work with:

Allowed Statuses 

In the backend user group settings (Content Planner tab), you can specify which statuses are allowed for the group. If left empty, all statuses are available.

Allowed Tables 

Similarly, you can restrict which record tables (pages, tt_content, sys_file_metadata, etc.) a group can manage with Content Planner features.

Migration from Previous Versions 

If you upgrade from a version without granular permissions, existing user groups with the Content Status permission will continue to work as before - the permission now grants full access.

To use granular permissions:

  1. Use View Only for read-only access or Full Access for unrestricted access
  2. Add the desired fine-grained permissions for each user group
  3. Optionally restrict allowed statuses and tables per group

Additional Required Permissions 

Don't forget to also add the following permissions as well:

  • "Tables (listing)" (tables_select) and "Tables (modify)" (tables_modify) permissions for the Content Planner Comment [tx_ximatypo3contentplanner_comment] table
  • All desired dashboard widgets in the "Dashboard widgets" (availableWidgets) permission.

User Settings 

The following options can be set in the user settings:

hideContentPlannerStatus

hideContentPlannerStatus
Type
boolean
Default
0

If enabled, the Content Planner status information and colors will be hidden in the TYPO3 backend.

Content Planner User Settings

Status Change 

Table of Contents

They are several ways to change the status of a page or a record.

Page Tree 

Change page status in the page tree

Change page status in the page tree

In the page tree, you can change the status of a page via the context menu.

Module Header 

Change page status in the module header

Change page status in the module header

In the module header of the modules web_layout, web_list, record_edit and file_list, you can change the status of a page via the status dropdown.

Edit Form 

Change page status in the edit form

Change page status in the edit form

In the edit form of a record, you can change the status in the "Content Planner" tab.

Record List 

Change page status in the record list

Change page status in the record list

In the record list, you can change the status of a record via the dropdown.

Records Screencast Content Planner

Update multiple records 

Within the record list, you can also change the status of multiple records at once.

Select the records you want to change the status of (or "Check all") and use the status dropdown in the table header.

Change page status in the record list

Change page status in the record list

Assignee 

Table of Contents

For every content planner record, an assignee can be set. The assignee is the person responsible for the record.

Assignee Screencast Content Planner

Only users with admin rights and the necessary permission can be selected.

Current assignment highlight

Current assignment highlight

Selection 

By clicking the assignee field in the header bar, a selection dialog will open. This dialog allows you to select a user as assignee for the record. The dialog will show all users with admin rights and the necessary permission.

Select an assignee

Select an assignee

Shortcuts 

Use the shortcuts beneath the select field for "Assign to me" and "Unassign" to quickly change the assignee.

Assignment shortcuts

Assignment shortcuts

Edit Form 

The assignee can be select in the edit form of the record in the "Content Planner" tab.

Change the assignee of a record

Change the assignee of a record

Comments 

Table of Contents

Every backend user with Content Planner access can add comments to records. Comments are a great way to communicate with other users about the status of a record or to provide additional information.

Screencast of comments

Comments screencast

Create new comment 

Create new comment modal dialog

Create new comment modal dialog

Show comments 

Hint for comments

Hint for comments

Show comments of a record

Show comments of a record

Edit comments 

Use the context menu to edit, resolve or delete a comment.

Edit or delete comments of a record

Edit, resolved or delete comments of a record

An edited comment is marked with a label.

Edited comment

Subsequently edited comment

ToDos 

Use the ToDo list within the editor to track the progress of your comments.

ToDo list in editor

ToDo list in editor

The ToDo count is automatically updated when you add or remove a ToDo item in the comment.

ToDo count in header

ToDo count in header

Use the ToDo widget to keep track of your ToDo tasks.

ToDo widget

ToDo widget

Resolution 

In addition to the ToDos in the comments, there is also the option of marking entire comments as completed, in order to keep the comment list clear and organized.

A comment can be marked as completed via the context menu.

Resolved comments

Resolved comments can can be displayed again using the filter

Filelist 

New in version 2.0.0

Filelist support for files and folders was introduced in version 2.0.

The Content Planner extension supports status management for files and folders in the TYPO3 Filelist module. This allows you to track the status of media assets during content migration or review processes.

Filelist with Content Planner support

Filelist module with status support for folders and files

Table of Contents

Enable Filelist Support 

Filelist support is enabled by default. You can disable it in the extension configuration.

Folder Status 

Folders can have a status assigned. The status is displayed in the folder tree and in the filelist header when viewing the folder contents.

Filelist screencast

Changing folder and file status in the filelist

The folder status header shows:

  • Current status with color indicator
  • Assignee selection
  • Quick actions for comments

File Status 

Individual files (via sys_file_metadata) can also have a status assigned. The status dropdown appears in the file row actions.

Supported Views 

The Content Planner integration works in the following filelist views:

  • List View: Full support with status dropdowns and color indicators
  • Tiles View: Status color indicators on tiles

Dashboard 

Table of Contents

The extension brings a prepared dashboard preset with a set of widgets to support the content planning process.

Create 

To create a new dashboard, click on the "Add dashboard" (+) button near the dashboard tabs in the dashboard module.

Create new dashboard using the preset

Create new dashboard using the preset

Otherwise you can add the widgets manually to an existing dashboard.

Select the content planner widgets

Select the content planner widgets

Widgets 

The dashboard provides a set of helpful widgets to get an overview of the current status of the content planner records.

Dashboard overview

Dashboard overview

Widget:

Description:

Overview

Bar chart showing the distribution of records by status.

Recent Updates

Update stream showing the latest changes to the content planner records.

Current Assignee

Short list with all records assigned to the current user.

ToDo

Display all records with open todos in the comments.

Recent Comments

Showings the latest comments on the content planner records.

Status

Filterable list of all records with the current status.

Content Planner (Configurable)

A fully customizable widget that combines the functionality of multiple widgets. Available in TYPO3 v14+ only. See Configurable Widget for details.

Configurable Widget 

The Content Planner (Configurable) widget is a powerful, customizable widget. It allows you to create multiple instances with different configurations, each tailored to your specific needs.

Settings 

The widget can be configured through the widget settings dialog:

Setting:

Description:

Custom Title

Set a custom title for the widget. If left empty, an automatic title based on the selected mode will be used.

Display Mode

Choose what kind of records to display:

  • All Status Records: Shows all records with any content planner status
  • Assigned Records: Shows records filtered by assignee
  • Records with open TODOs: Shows only records that have open tasks in their comments

Status Filter

Filter records by a specific status. Select "All statuses" to show records with any status.

Assignee Filter

Filter records by assignee:

  • All assignees: No assignee filter
  • Current User: Shows only records assigned to the logged-in user
  • Specific user: Select a specific backend user

Record Type Filter

Filter records by table type (e.g., pages, news, etc.). Select "All record types" to show all registered tables.

Use Cases 

Here are some example configurations:

Personal Task List
Set "Display Mode" to "Assigned Records" and "Assignee Filter" to "Current User" with a custom title like "My Tasks".
Review Queue
Set "Status Filter" to your "In Review" status to create a dedicated review queue widget.
Open TODOs Overview
Set "Display Mode" to "Records with open TODOs" to track all unfinished tasks across the project.
News Articles Status
Set "Record Type Filter" to "News" to monitor only news article statuses.

Command 

The extension provides the following console commands:

content-planner:bulk-update 

A command to update multiple records based on a given configuration.

vendor/bin/typo3 content-planner:bulk-update
Copied!
typo3/sysext/core/bin/typo3 content-planner:bulk-update
Copied!

The following command arguments are available:

table

table
Type
string
Required
false
Default
"pages"
Multiple allowed
false

Defines the table of content planner records to be updated.

Supported tables:

  • pages - Update page records
  • tt_content - Update content element records (requires enabled Content Element support)
  • sys_file_metadata - Update file metadata records (requires enabled Filelist support)
  • folder - Update folder status (requires enabled Filelist support, use combined identifier as uid)
  • Any custom table registered via registerAdditionalRecordTables

Example:

vendor/bin/typo3 content-planner:bulk-update pages
vendor/bin/typo3 content-planner:bulk-update sys_file_metadata
vendor/bin/typo3 content-planner:bulk-update folder
Copied!
typo3/sysext/core/bin/typo3 content-planner:bulk-update pages
typo3/sysext/core/bin/typo3 content-planner:bulk-update sys_file_metadata
typo3/sysext/core/bin/typo3 content-planner:bulk-update folder
Copied!

uid

uid
Type
integer|string
Required
false
Default
1
Multiple allowed
false

Defines the uid of the record to be updated.

Example:

vendor/bin/typo3 content-planner:bulk-update pages 12
vendor/bin/typo3 content-planner:bulk-update sys_file_metadata 123
vendor/bin/typo3 content-planner:bulk-update folder "1:/user_upload/myfolder/"
Copied!
typo3/sysext/core/bin/typo3 content-planner:bulk-update pages 12
typo3/sysext/core/bin/typo3 content-planner:bulk-update sys_file_metadata 123
typo3/sysext/core/bin/typo3 content-planner:bulk-update folder "1:/user_upload/myfolder/"
Copied!

status

status
Type
integer
Required
false
Default
none
Multiple allowed
false

Defines the status uid to set. If empty, the status of the desired record will be cleared.

Example:

vendor/bin/typo3 content-planner:bulk-update pages 12 1
vendor/bin/typo3 content-planner:bulk-update sys_file_metadata 123 2
vendor/bin/typo3 content-planner:bulk-update folder "1:/user_upload/myfolder/" 3
Copied!
typo3/sysext/core/bin/typo3 content-planner:bulk-update pages 12 1
typo3/sysext/core/bin/typo3 content-planner:bulk-update sys_file_metadata 123 2
typo3/sysext/core/bin/typo3 content-planner:bulk-update folder "1:/user_upload/myfolder/" 3
Copied!

The following command options are available:

-r|--recursive

-r|--recursive
Type
boolean
Required
false
Default
false
Multiple allowed
false

Use this option to update all records beginning from the defined record in the console arguments recursively.

Example:

vendor/bin/typo3 content-planner:bulk-update pages 1 1 -r
Copied!
typo3/sysext/core/bin/typo3 content-planner:bulk-update pages 1 1 -r
Copied!

-a|--assignee

-a|--assignee
Type
integer
Required
false
Default
none
Multiple allowed
false

Use this option to assign the updated records to a specific user.

Example:

vendor/bin/typo3 content-planner:bulk-update pages 1 1 -a 2
vendor/bin/typo3 content-planner:bulk-update pages 1 1 --assignee=2
Copied!
typo3/sysext/core/bin/typo3 content-planner:bulk-update pages 1 1 -a 2
typo3/sysext/core/bin/typo3 content-planner:bulk-update pages 1 1 --assignee=2
Copied!

Additional Records 

By default the Content Planner supports the status functionality only for pages. If you want to use the status functionality for other record types, you can extend the Content Planner to support additional record types.

Categories as additional records

Categories as additional records

Follow the steps below to extend the Content Planner to support additional records, e.g. news or tt_content records:

  1. Extend the additional record TCA (e.g. for news records):
Configuration/TCA/Overrides/tx_news_domain_model_news.php
\Xima\XimaTypo3ContentPlanner\Utility\ExtensionUtility::addContentPlannerTabToTCA('tx_news_domain_model_news');
Copied!
  1. Extend the necessary database fields:
ext_tables.sql
CREATE TABLE tx_news_domain_model_news
(
    tx_ximatypo3contentplanner_status   int(11) DEFAULT NULL,
    tx_ximatypo3contentplanner_assignee int(11) DEFAULT NULL,
    tx_ximatypo3contentplanner_comments int(11) unsigned default '0' not null,
);
Copied!
  1. Register the additional record:
ext_localconf.php
$GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['xima_typo3_content_planner']['registerAdditionalRecordTables'][] = 'tx_news_domain_model_news';
Copied!
Content elements as additional records

Content elements as additional records

PSR-14 Events 

Table of Contents

The extension contains some PSR-14 events which make it possible to extend the extension with own functionality. You can for example adjust the status selection or react on status changes for implementing some kind of a workflow.

If you are new to PSR-14 events, please refer to the official TYPO3 documentation about PSR-14 events and Event Listeners.

PrepareStatusSelectionEvent 

This event is dispatched before the status selection is rendered. You can use it to modify the available status options.

Classes/EventListener/ModifyStatusSelectionListener.php
<?php
namespace MyVendor\MyExtension\EventListener;

use Xima\XimaTypo3ContentPlanner\Event\PrepareStatusSelectionEvent;

final class ModifyStatusSelectionListener
{
    public function __invoke(PrepareStatusSelectionEvent $event): void
    {
        $table = $event->getTable();
        $uid = $event->getUid();
        $selectionEntries = $event->getSelectionEntriesToAdd();

        // Remove a specific status from selection
        unset($selectionEntries['3']);

        $event->setSelectionEntriesToAdd($selectionEntries);
    }
}
Copied!
Configuration/Services.yaml
MyVendor\MyExtension\EventListener\ModifyStatusSelectionListener:
  tags:
    - name: event.listener
      identifier: 'my-extension/modify-status-selection'
Copied!

StatusChangeEvent 

This event is dispatched after the status of a record has been changed. You can use it to trigger additional actions like notifications or workflow transitions.

Note that $newStatus may be null when a status is cleared from a record.

Classes/EventListener/StatusChangeListener.php
<?php
namespace MyVendor\MyExtension\EventListener;

use Xima\XimaTypo3ContentPlanner\Event\StatusChangeEvent;

final class StatusChangeListener
{
    public function __invoke(StatusChangeEvent $event): void
    {
        $table = $event->getTable();
        $uid = $event->getUid();
        $newStatus = $event->getNewStatus();
        $previousStatus = $event->getPreviousStatus();

        // Example: Send notification when status changes to a specific status (uid 3)
        if ($newStatus?->getUid() === 3) {
            // Trigger notification logic
        }
    }
}
Copied!
Configuration/Services.yaml
MyVendor\MyExtension\EventListener\StatusChangeListener:
  tags:
    - name: event.listener
      identifier: 'my-extension/status-change'
Copied!

Planner Utility 

The PlannerUtility can be used to easily interact programmatically with the content planner.

class PlannerUtility
Fully qualified name
\Xima\XimaTypo3ContentPlanner\Utility\PlannerUtility

Utility class to use content planner functionalities.

getListOfStatus ( )

Simple function to get a list of all available status.

returntype

array

updateStatusForRecord ( $table, $uid, $status, $assignee = null)

Simple function to update the status of a record.

param string $table

Table name of the record.

param int $uid

UID of the record.

param \Xima\XimaTypo3ContentPlanner\Domain\Model\Status|int|string $status

Status object, UID or title of the status.

param \Xima\XimaTypo3ContentPlanner\Domain\Model\BackendUser|int|string|null $assignee

Optional user object, UID or username of the assignee.

returntype

void

getStatusOfRecord ( $table, $uid)

Simple function to get the status of a record.

param string $table

Table name of the record.

param int $uid

UID of the record.

returntype

\Xima\XimaTypo3ContentPlanner\Domain\Model\Status|null

getStatus ( $identifier)

Simple function to get a status.

param int|string $identifier

UID or title of the status record.

returntype

\Xima\XimaTypo3ContentPlanner\Domain\Model\Status|null

getCommentsOfRecord ( $table, $uid, $raw = false)

Simple function to fetch all comments of a record.

param string $table

Table name of the record.

param int $uid

UID of the record.

param bool $raw

Get raw comment records instead of optimized DTOs.

returntype

array

addCommentsToRecord ( $table, $uid, $comments, $author = null)

Simple function to fetch all comments of a record.

param string $table

Table name of the record.

param int $uid

UID of the record.

param array|string $comments

Single comment string or array of multiple comments in a row.

param \Xima\XimaTypo3ContentPlanner\Domain\Model\BackendUser|int|string|null $author

Optional user object, UID or username of the author.

returntype

void

generateTodoForComment ( $todos)

Simple function to generate the html todo markup for a comment to easily insert them into the comment content.

param array $todos

Array of todo strings.

returntype

string

clearCommentsOfRecord ( $table, $uid, $like = null)

Simple function to clear all comment(s) of a content planner record.

param string $table

Table name of the record.

param int $uid

UID of the record.

param string|null $like

Optional string to filter comments by content.

returntype

void