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. [Utility &amp; Helpers](/categories/utility)
4. /
5. sitegeist/papertiger

ActiveNeos-plugin[Utility &amp; Helpers](/categories/utility)

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

Editable forms for Neos CMS

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

Since Apr 7Pushed 4mo 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 2d 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

48

—

FairBetter than 93% of packages

Maintenance55

Moderate activity, may be stable

Popularity33

Limited adoption so far

Community22

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

135d 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

[sandstorm/neostwofactorauthentication

1327.0k](/packages/sandstorm-neostwofactorauthentication)[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.

1151.0M777](/packages/neos-neos)[neos/demo

Site package for the Neos Demo Site

18188.3k10](/packages/neos-demo)[neos/seo

SEO configuration and tools for Neos

141.0M31](/packages/neos-seo)[sitegeist/taxonomy

Manage vocabularies and taxonomies as separate node-hierarchy.

1595.1k1](/packages/sitegeist-taxonomy)[sitegeist/kaleidoscope

Responsive-images for Neos

29370.3k12](/packages/sitegeist-kaleidoscope)

PHPackages © 2026

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