PHPackages                             sitegeist/papertiger - 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. sitegeist/papertiger

ActiveNeos-plugin

sitegeist/papertiger
====================

Editable forms for Neos CMS

v2.0.2(2mo ago)223.3k↓15.3%4[2 issues](https://github.com/sitegeist/Sitegeist.PaperTiger/issues)[1 PRs](https://github.com/sitegeist/Sitegeist.PaperTiger/pulls)2GPL-3.0+PHPPHP &gt;=8.2CI failing

Since Apr 7Pushed 2mo ago2 watchersCompare

[ Source](https://github.com/sitegeist/Sitegeist.PaperTiger)[ Packagist](https://packagist.org/packages/sitegeist/papertiger)[ RSS](/packages/sitegeist-papertiger/feed)WikiDiscussions 2.0 Synced 1mo ago

READMEChangelog (10)Dependencies (10)Versions (45)Used By (2)

Sitegeist.PaperTiger
====================

[](#sitegeistpapertiger)

Form builder for Neos CMS based on Neos.Fusion.Form
---------------------------------------------------

[](#form-builder-for-neos-cms-based-on-neosfusionform)

This package allows editors to define simple forms and the submit action using nodes. Since the package is build on top of [Neos.Fusion.Form](https://github.com/neos/fusion-form) the whole this package is designed to be easily adjustable and extensible especially with custom rendering.

!!! This package does not and likely will never support MultiStep Forms. This is not a technical limitation, we simply are convinced that forms that require multiple steps should be implemented as frontend application !!!

!!! This package uses several other sitegeist packages as dependencies. !!!

### Authors &amp; Sponsors

[](#authors--sponsors)

- Martin Ficzel -

*The development and the public-releases of this package is generously sponsored by our employer .*

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

[](#installation)

Sitegeist.PaperTiger is available via packagist run `composer require sitegeist/papertiger` to install.

We use semantic-versioning so every breaking change will increase the major-version number.

Usage `Sitegeist.PaperTiger:Form`
---------------------------------

[](#usage-sitegeistpapertigerform)

The package adds the content prototype `Sitegeist.PaperTiger:Form` to Neos cms. This content allows to

[![](./Documentation/Screenshots/FormBackend.png)](./Documentation/Screenshots/FormBackend.png)

### Form Contents, aka "Form fields"

[](#form-contents-aka-form-fields)

The contents of the Form are defined as nodes in the section "Form fields" (fields, Sitegeist.PaperTiger: Field.Collection).

[![](./Documentation/Screenshots/FieldNodeTypes.png)](./Documentation/Screenshots/FieldNodeTypes.png)

The package comes with the following field NodeTypes, all of them can have a label and can be declared as beeing required with additional constraints depending on the fieldtype.

- `Sitegeist.PaperTiger:Field.Text.SingleLine`
- `Sitegeist.PaperTiger:Field.Text.MultiLine`
- `Sitegeist.PaperTiger:Field.Dropdown` - Dropdown managing the available options as nested properties with [Sitegeist.InspectorGadget](https://github.com/sitegeist/Sitegeist.InspectorGadget)
- `Sitegeist.PaperTiger:Field.RadioButtons`
- `Sitegeist.PaperTiger:Field.CheckBoxes`
- `Sitegeist.PaperTiger:Field.Date`
- `Sitegeist.PaperTiger:Field.Email`
- `Sitegeist.PaperTiger:Field.Number`
- `Sitegeist.PaperTiger:Field.Slider`
- `Sitegeist.PaperTiger:Field.TelephoneNumber`
- `Sitegeist.PaperTiger:Field.Upload` - Upload field based on [Sitegeist.FusionForm.Upload](https://github.com/sitegeist/Sitegeist.FusionForm.Upload)
- `Sitegeist.PaperTiger:Field.Fieldset` - A group of fields with a common label.

Special:

- `Sitegeist.PaperTiger:Field.Honeypot` - A invisible field that is validated to be empty
- `Sitegeist.PaperTiger:Field.Hidden` - A hidden field with the specified value
- `Sitegeist.PaperTiger:Field.FriendlyCaptcha` - Captcha using [Sitegeist.FusionForm.FriendlyCaptcha](https://github.com/sitegeist/Sitegeist.FusionForm.FriendlyCaptcha)

The NodeType `Sitegeist.PaperTiger:Field.Collection` accepts all contents with the constraint `Sitegeist.PaperTiger:Field.Constraint`. During rendering the contents with the supertype `Sitegeist.PaperTiger:Field` will be handled differently and are expected to be implemented by a `NodeType.Name` and a `NodeType.Name.Schema`as is described in section [Custom field NodeTypes](#custom-field-nodetypes).

### Follow up actions

[](#follow-up-actions)

The actions to be performed after the successful form submission are defined in the section "Follow up actions" (`actions`, `Sitegeist.PaperTiger:Action.Collection`). The actions are configured in the inspector and show a preview in the backend.

- `Sitegeist.PaperTiger:Action.Message` - Show a specified `message` while replacing `{identifier}` with submitted data.
- `Sitegeist.PaperTiger:Action.Redirct` - Redirect the user to the specified Document afer submit.
- `Sitegeist.PaperTiger:Action.Email` - Email action using [Sitegeist.Neos.SymfonyMailer](https://github.com/sitegeist/Sitegeist.Neos.SymfonyMailer)The properties `subject`, `text` and `html` will replace `{identifier}` with submitted data. Submitted files can be added as attachments.

!!! During submission some properties will replace parts `{identifier}` with submitted data by applying the processor `Sitegeist.PaperTiger:Action.DataTemplate`. !!!

[![](./Documentation/Screenshots/ActionNodeTypes.png)](./Documentation/Screenshots/ActionNodeTypes.png)

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

[](#configuration)

### Symfony Mailer

[](#symfony-mailer)

Don't forget to configure the Symfony Mailer `dsn`. Here is an example:

```
Sitegeist:
  Neos:
    SymfonyMailer:
      dsn: 'native://default'
```

### Custom field NodeTypes

[](#custom-field-nodetypes)

A new field NodeType is defined as a NodeType with the supertype `Sitegeist.PaperTiger:Field`.

```
Sitegeist.PaperTiger:Field.Slider:
  ui:
    label: "Slider"
  superTypes:
    'Sitegeist.PaperTiger:Field': true
    'Sitegeist.PaperTiger:Mixin.Label': true
    'Sitegeist.PaperTiger:Mixin.IsRequired': true
  properties:
    minimumValue:
      type: integer
    maximumValue:
      type: integer
```

Other than usual contents NodeTypes with the `Sitegeist.PaperTiger:Field` supertype are expected to be implemented an additional `NodeType.Name.Schema` prototype accompanying the default `NodeType.Name` renderer.

The `NodeType.Name` prototype specifies the frontend representation. It is recommended to wrap the rendered form into a `Sitegeist.PaperTiger:FieldContainer` and pass a `label` if this fits the nodetype.

```
prototype(Sitegeist.PaperTiger:Field.Slider) < prototype(Neos.Neos:ContentComponent) {
  identifier = ${q(node).property('identifier')}
  label = ${q(node).property('label')}
  isRequired = ${q(node).property('isRequired')}
  minimumValue = ${q(node).property('minimumValue')}
  maximumValue = ${q(node).property('maximumValue')}

  renderer = afx`

  `
}

```

After submission an `.Schema` NodeType is used to define the type mapping and validation. This NodeType is expected to return a Schema as described in [Neos.FusionForm:RuntimeFormBasics](https://github.com/neos/fusion-form/blob/master/Documentation/RuntimeFormBasics.md).

```
prototype(Sitegeist.PaperTiger:Field.Slider.Schema) < prototype(Neos.Fusion:Component) {
  isRequired = ${q(node).property('isRequired')}
  rangeValidatorOptions = Neos.Fusion:DataStructure {
    minimum = ${q(node).property('minimumValue')}
    minimum.@if.isDefined = ${q(node).property('minimumValue')}

    maximum = ${q(node).property('maximumValue')}
    maximum.@if.isDefined = ${q(node).property('maximumValue')}
  }

  renderer = ${Form.Schema.integer()}
  renderer.@process.addIsRequired = ${props.isRequired ?  value.required : value}
  renderer.@process.addRangeValidator = ${props.rangeValidatorOptions ? value.validator('NumberRange', props.rangeValidatorOptions) : value}
}

```

### Custom action

[](#custom-action)

A new action NodeType is defined as a NodeType with the supertype `Sitegeist.PaperTiger:Action`.

```
Sitegeist.PaperTiger:Action.Message:
  ui:
      label: 'Show message'
  superTypes:
    'Sitegeist.PaperTiger:Action': true
  properties:
    message:
      type: string
```

Other than usual contents NodeTypes with the `Sitegeist.PaperTiger:Action` supertype are expected to be accompanied by two fusion-prototype a `.Definition` and a `.Preview`which are both prefixed with the name of the NodeType.

The `.Preview` prototype is expected to render an overview of the configuration for editors that is only visible in the backend.

```
prototype(Sitegeist.PaperTiger:Action.Message.Preview) < prototype(Neos.Fusion:Component) {
  message = ${q(node).property('message')}
  renderer = afx`
    {props.message}
  `
}

```

The `.Definition` prototype configures an action using the `Sitegeist.PaperTiger:Action` as renderer. by applying `Sitegeist.PaperTiger:Action.DataTemplate` as processor those options can be configured to replace `{identifier}` markers with submitted data.

```
prototype(Sitegeist.PaperTiger:Action.Message.Definition) < prototype(Neos.Fusion:Component) {
  message = ${q(node).property('message')}

  renderer = Sitegeist.PaperTiger:Action {
    type = 'Neos.Fusion.Form.Runtime:Message'
    options {
      message = ${props.message}
      message.@process.asTemplate = Sitegeist.PaperTiger:Action.DataTemplate
    }
  }
}

```

#### Allow classic contents in forms.

[](#allow-classic-contents-in-forms)

To allow any contents that are derived from `Neos.Neos:Content` in a form the constraint `Sitegeist.PaperTiger:Field.Constraint`has to be added to the NodeTypes.

The example allows the use of `Text` and `Image` from Neos.Demo inside of forms:

```
'Neos.Demo:Content.Text':
  superTypes:
    'Sitegeist.PaperTiger:Field.Constraint': true

'Neos.Demo:Content.Image':
  superTypes:
    'Sitegeist.PaperTiger:Field.Constraint': true
```

### Customize rendering

[](#customize-rendering)

#### Override defaults

[](#override-defaults)

The simplest way to adjust the rendering is overriding top level properties of the existing fusion prototyoes. It is not recommended to use this on properties that are not on the top level.

```
prototype(Sitegeist.PaperTiger:Form) {
    class = 'form my-8'
}

prototype(Sitegeist.PaperTiger:Error) {
    customErrorClass = 'form-errors'
}

prototype(Sitegeist.PaperTiger:SubmitButton) {
    class  = 'submit mt-8'
}

```

Contribution
------------

[](#contribution)

We will gladly accept contributions. Please send us pull requests.

License
-------

[](#license)

See [LICENSE](LICENSE)

###  Health Score

49

—

FairBetter than 95% of packages

Maintenance62

Regular maintenance activity

Popularity32

Limited adoption so far

Community21

Small or concentrated contributor base

Maturity70

Established project with proven stability

 Bus Factor1

Top contributor holds 79.5% 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 ~39 days

Recently: every ~33 days

Total

28

Last Release

89d ago

Major Versions

v0.8.1 → v1.0.02025-04-07

v0.9.0 → 1.0.x-dev2025-10-10

1.0.x-dev → v2.0.02025-10-10

PHP version history (2 changes)v0.1.0PHP &gt;=8.1

v2.0.0PHP &gt;=8.2

### Community

Maintainers

![](https://www.gravatar.com/avatar/51e0a02d8e12b73949ec858638aa7e295e103022cc5a879f86ac8532c2c170bd?d=identicon)[sitegeist](/maintainers/sitegeist)

![](https://www.gravatar.com/avatar/829b4ccb51e8cff3c1e4b59d60cfe8d1b86f6d77fc31a6b3fc99227f432542ca?d=identicon)[mficzel](/maintainers/mficzel)

---

Top Contributors

[![mficzel](https://avatars.githubusercontent.com/u/1309380?v=4)](https://github.com/mficzel "mficzel (124 commits)")[![jonnitto](https://avatars.githubusercontent.com/u/4510166?v=4)](https://github.com/jonnitto "jonnitto (17 commits)")[![robinroloff](https://avatars.githubusercontent.com/u/116283647?v=4)](https://github.com/robinroloff "robinroloff (10 commits)")[![lorenzulrich](https://avatars.githubusercontent.com/u/1816023?v=4)](https://github.com/lorenzulrich "lorenzulrich (3 commits)")[![Dam1an1208](https://avatars.githubusercontent.com/u/65904501?v=4)](https://github.com/Dam1an1208 "Dam1an1208 (1 commits)")[![hedayati-m](https://avatars.githubusercontent.com/u/66601551?v=4)](https://github.com/hedayati-m "hedayati-m (1 commits)")

---

Tags

formsfusionhacktoberfestneoscms

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP\_CodeSniffer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/sitegeist-papertiger/health.svg)

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

###  Alternatives

[neos/neos

An open source Content Application Platform based on Flow. A set of core Content Management features is resting within a larger context that allows you to build a perfectly customized experience for your users.

116989.0k674](/packages/neos-neos)[neos/neos-ui

Neos CMS UI written in React

2661.0M104](/packages/neos-neos-ui)[sandstorm/neostwofactorauthentication

1223.6k](/packages/sandstorm-neostwofactorauthentication)[neos/demo

Site package for the Neos Demo Site

18181.0k6](/packages/neos-demo)[neos/fusion-afx

JSX inspired compact syntax for Neos.Fusion

26940.5k53](/packages/neos-fusion-afx)[flowpack/searchplugin

Plugin for search integration via content node

24257.5k1](/packages/flowpack-searchplugin)

PHPackages © 2026

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