Skip to content

Commit

Permalink
TASK: Extract forms and add basic extensibility
Browse files Browse the repository at this point in the history
Packages can add additional fields to the forms of taxonomies and vocabularies. To do this the following steps are required.

1. Extend the NodeTypes `Sitegeist.Taxonomy:Taxonomy` or `Sitegeist.Taxonomy:Vocabulary` in your package.
2. Add a Views.yaml to your package and configure additional Fusion pathes to be loaded.
3. In the fusion code define each field as prototype that accepts the props `taxon` & `defaultTaxon` resp. `vocabulary` & `defaultVocabulary`.
4. Register those prototypes by adding them to the property `additionalFieldPrototypeNames` of the prototype `Sitegeist.Taxonomy:Form.Taxonomy` or `Sitegeist.Taxonomy:Form.Vocabulary`
  • Loading branch information
mficzel committed Jan 13, 2023
1 parent 394cd49 commit 4c9aea3
Show file tree
Hide file tree
Showing 7 changed files with 163 additions and 127 deletions.
15 changes: 11 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ multiple sites and the taxonomy documents can be defined without interfering wit

It also provides a separate backend module for managing vocabularies and taxonomies.

## Installation

Sitegeist.Taxonomy is available via packagist `composer require sitegeist/taxonomy`.
We use semantic-versioning, so every breaking change will increase the major version number.

## Storing vocabularies and taxonomies in the ContentRepository

Expand Down Expand Up @@ -113,12 +117,15 @@ of taxonomies:

Reading and referencing taxonomies from other nodes is currently not limited.

## Installation
## Extensibility

Sitegeist.Taxonomy is available via packagist. `"sitegeist/taxonomy" : "^1.0"` to the require section of the composer.json
or run `composer require sitegeist/taxonomy`.
Packages can add additional fields to the forms of taxonomies and vocabularies. To do this
the following steps are required.

We use semantic-versioning, so every breaking change will increase the major version number.
1. Extend the NodeTypes `Sitegeist.Taxonomy:Taxonomy` or `Sitegeist.Taxonomy:Vocabulary` in your package.
2. Add a Views.yaml to your package and configure additional Fusion pathes to be loaded.
3. In the fusion code define each field as prototype that accepts the props `taxon` & `defaultTaxon` resp. `vocabulary` & `defaultVocabulary`.
4. Register those prototypes by adding them to the property `additionalFieldPrototypeNames` of the prototype `Sitegeist.Taxonomy:Form.Taxonomy` or `Sitegeist.Taxonomy:Form.Vocabulary`

## Contribution

Expand Down
67 changes: 67 additions & 0 deletions Resources/Private/Fusion/Backend/Form/Taxonomy.fusion
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
prototype(Sitegeist.Taxonomy:Form.Taxonomy) < prototype(Neos.Fusion:Component) {

i18nMain = ${Translation.value('').package("Sitegeist.Taxonomy").source('Main')}
i18nVocabulary = ${Translation.value('').package("Sitegeist.Taxonomy").source('NodeTypes/Vocabulary')}
i18nTaxonomy = ${Translation.value('').package("Sitegeist.Taxonomy").source('NodeTypes/Taxonomy')}

targetAction = null
taxonomy = null
defaultTaxonomy = null
parent = null
vocabulary = null

additionalFieldPrototypeNames = Neos.Fusion:DataStructure

renderer = afx`
<Neos.Fusion.Form:Form form.target.action={props.targetAction} form.data.properties={props.taxonomy.properties}>

<Neos.Fusion.Form:Hidden field.name="taxonomy" field.value={props.taxonomy.contextPath} @if={props.taxonomy}/>
<Neos.Fusion.Form:Hidden field.name="parent" field.value={props.parent.contextPath} @if={props.parent}/>

<fieldset>
<div class="neos-control-group">
<label class="neos-control-label" for="title">
{props.i18nTaxonomy.id('properties.title')}
<span @if={props.defaultTaxonomy}>: {props.defaultTaxonomy.properties.title}</span>
</label>
<Neos.Fusion.Form:Textarea attributes.class="neos-span6" field.name="properties[title]" />
</div>

<div class="neos-control-group">
<label class="neos-control-label" for="description">
{props.i18nTaxonomy.id('properties.description')}
<span @if={props.defaultTaxonomy}>: {props.defaultTaxonomy.properties.description}</span>
</label>
<Neos.Fusion.Form:Textarea attributes.class="neos-span6 form-inline" field.name="properties[description]"/>
</div>

<Neos.Fusion:Fragment @if={props.additionalFieldPrototypeNames}>
<Neos.Fusion:Loop items={props.additionalFieldPrototypeNames} itemKey="key" itemName="prototypeName">
<div class="neos-control-group">
<Neos.Fusion:Renderer
type={prototypeName}

element.name={key}
element.taxonomy={props.taxonomy}
element.defaultTaxonomy={props.defaultTaxonomy}
/>
</div>
</Neos.Fusion:Loop>
</Neos.Fusion:Fragment>

<div class="neos-control-group">
<Neos.Fusion:Link.Action
class="neos-button"
href.action="vocabulary"
href.arguments.vocabulary={props.vocabulary}
>
{props.i18nMain.id('generic.cancel')}
</Neos.Fusion:Link.Action>
&nbsp;
<Neos.Fusion.Form:Button attributes.class="neos-button neos-button-primary">{props.i18nMain.id('generic.save') + ''}</Neos.Fusion.Form:Button>
</div>
</fieldset>
</Neos.Fusion.Form:Form>
`

}
64 changes: 64 additions & 0 deletions Resources/Private/Fusion/Backend/Form/Vocabulary.fusion
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
prototype(Sitegeist.Taxonomy:Form.Vocabulary) < prototype(Neos.Fusion:Component) {

i18nMain = ${Translation.value('').package("Sitegeist.Taxonomy").source('Main')}
i18nVocabulary = ${Translation.value('').package("Sitegeist.Taxonomy").source('NodeTypes/Vocabulary')}

targetAction = null
vocabulary = null
defaultVocabulary = null
taxonomyRoot = null

additionalFieldPrototypeNames = Neos.Fusion:DataStructure

renderer = afx`
<Neos.Fusion.Form:Form form.target.action={props.targetAction} form.data.properties={props.vocabulary ? props.vocabulary.properties : null}>

<Neos.Fusion.Form:Hidden field.name="vocabulary" field.value={props.vocabulary.contextPath} @if={props.vocabulary}/>
<Neos.Fusion.Form:Hidden field.name="taxonomyRoot" field.value={props.taxonomyRoot.contextPath} @if={props.taxonomyRoot}/>

<fieldset>
<div class="neos-control-group">
<label class="neos-control-label" for="title">
{props.i18nVocabulary.id('properties.title')}
<span @if={props.defaultVocabulary}>: {props.defaultVocabulary.properties.title}</span>
</label>
<Neos.Fusion.Form:Textarea attributes.class="neos-span6" field.name="properties[title]" />
</div>

<div class="neos-control-group">
<label class="neos-control-label" for="description">
{props.i18nVocabulary.id('properties.description')}
<span @if={props.defaultVocabulary}>: {props.defaultVocabulary.properties.description}</span>
</label>
<Neos.Fusion.Form:Textarea attributes.class="neos-span6 form-inline" field.name="properties[description]"/>
</div>

<Neos.Fusion:Fragment @if={props.additionalFieldPrototypeNames}>
<Neos.Fusion:Loop items={props.additionalFieldPrototypeNames} itemKey="key" itemName="prototypeName">
<div class="neos-control-group">
<Neos.Fusion:Renderer
type={prototypeName}
element.name={key}
element.vocabulary={props.vocabulary}
element.defaultVocabulary={props.defaultVocabulary}
/>
</div>
</Neos.Fusion:Loop>
</Neos.Fusion:Fragment>

<div class="neos-control-group">
<Neos.Fusion:Link.Action
class="neos-button"
href.action="index"
href.arguments.root={taxonomyRoot}
>
{props.i18nMain.id('generic.cancel')}
</Neos.Fusion:Link.Action>
&nbsp;
<Neos.Fusion.Form:Button attributes.class="neos-button neos-button-primary">{props.i18nMain.id('generic.save') + ''}</Neos.Fusion.Form:Button>
</div>
</fieldset>
</Neos.Fusion.Form:Form>
`

}
40 changes: 6 additions & 34 deletions Resources/Private/Fusion/Backend/Views/Taxonomy.Edit.fusion
Original file line number Diff line number Diff line change
Expand Up @@ -7,40 +7,12 @@ prototype(Sitegeist.Taxonomy:Views.Module.Taxonomy.Edit) < prototype(Neos.Fusion
renderer = afx`
<legend>{props.i18nMain.id('taxon')}: {taxonomy.properties.title}</legend>
<legend @if={defaultTaxonomy}>{props.i18nMain.id('generic.default')}: {defaultTaxonomy.properties.title}</legend>

<Neos.Fusion.Form:Form form.target.action="updateTaxonomy" form.data.properties={taxonomy.properties}>
<Neos.Fusion.Form:Hidden field.name="taxonomy" field.value={taxonomy.contextPath} />

<fieldset>
<div class="neos-control-group">
<label class="neos-control-label" for="title">
{props.i18nTaxonomy.id('properties.title')}
<span @if={defaultTaxonomy}>: {defaultTaxonomy.properties.title}</span>
</label>
<Neos.Fusion.Form:Textarea attributes.class="neos-span6" field.name="properties[title]" />
</div>

<div class="neos-control-group">
<label class="neos-control-label" for="description">
{props.i18nTaxonomy.id('properties.description')}
<span @if={defaultTaxonomy}>: {defaultTaxonomy.properties.description}</span>
</label>
<Neos.Fusion.Form:Textarea attributes.class="neos-span6 form-inline" field.name="properties[description]"/>
</div>

<div class="neos-control-group">
<Neos.Fusion:Link.Action
class="neos-button"
href.action="vocabulary"
href.arguments.vocabulary={vocabulary}
>
{props.i18nMain.id('generic.cancel')}
</Neos.Fusion:Link.Action>
&nbsp;
<Neos.Fusion.Form:Button attributes.class="neos-button neos-button-primary">{props.i18nMain.id('generic.save') + ''}</Neos.Fusion.Form:Button>
</div>
</fieldset>
</Neos.Fusion.Form:Form>
<Sitegeist.Taxonomy:Form.Taxonomy
targetAction="updateTaxonomy"
taxonomy={taxonomy}
defaultTaxonomy={defaultTaxonomy}
vocabulary={vocabulary}
/>
`

}
33 changes: 5 additions & 28 deletions Resources/Private/Fusion/Backend/Views/Taxonomy.New.fusion
Original file line number Diff line number Diff line change
Expand Up @@ -5,33 +5,10 @@ prototype(Sitegeist.Taxonomy:Views.Module.Taxonomy.New) < prototype(Neos.Fusion:

renderer = afx`
<legend>{props.i18nMain.id('taxon.createBelow')} "{parent.properties.title}"</legend>
<Neos.Fusion.Form:Form form.target.action="createTaxonomy">
<Neos.Fusion.Form:Hidden field.name="parent" field.value={parent.contextPath} />

<fieldset>

<div class="neos-control-group">
<label class="neos-control-label" for="title">{props.i18nTaxonomy.id('properties.title')}</label>
<Neos.Fusion.Form:Textarea attributes.class="neos-span6" field.name="properties[title]" />
</div>

<div class="neos-control-group">
<label class="neos-control-label" for="description">{props.i18nTaxonomy.id('properties.description')}</label>
<Neos.Fusion.Form:Textarea attributes.class="neos-span6" field.name="properties[description]"/>
</div>

<div class="neos-control-group">
<Neos.Fusion:Link.Action
class="neos-button"
href.action="vocabulary"
href.arguments.vocabulary={vocabulary}
>
{props.i18nMain.id('generic.cancel')}
</Neos.Fusion:Link.Action>
&nbsp;
<Neos.Fusion.Form:Button attributes.class="neos-button neos-button-primary">{props.i18nMain.id('taxon.create') + ''}</Neos.Fusion.Form:Button>
</div>
</fieldset>
</Neos.Fusion.Form:Form>
<Sitegeist.Taxonomy:Form.Taxonomy
targetAction="createTaxonomy"
parent={parent}
vocabulary={vocabulary}
/>
`
}
40 changes: 6 additions & 34 deletions Resources/Private/Fusion/Backend/Views/Vocabulary.Edit.fusion
Original file line number Diff line number Diff line change
Expand Up @@ -8,40 +8,12 @@ prototype(Sitegeist.Taxonomy:Views.Module.Vocabulary.Edit) < prototype(Neos.Fusi
<legend>{props.i18nMain.id('vocabulary')}: {vocabulary.properties.title}</legend>
<legend @if={defaultVocabulary}>{props.i18nMain.id('generic.default')}: {defaultVocabulary.properties.title}</legend>
</div>

<Neos.Fusion.Form:Form form.target.action="updateVocabulary" form.data.properties={vocabulary.properties}>
<Neos.Fusion.Form:Hidden field.name="vocabulary" field.value={vocabulary.contextPath} />

<fieldset>
<div class="neos-control-group">
<label class="neos-control-label" for="title">
{props.i18nVocabulary.id('properties.title')}
<span @if={defaultVocabulary}>: {defaultVocabulary.properties.title}</span>
</label>
<Neos.Fusion.Form:Textarea attributes.class="neos-span6" field.name="properties[title]" />
</div>

<div class="neos-control-group">
<label class="neos-control-label" for="description">
{props.i18nVocabulary.id('properties.description')}
<span @if={defaultVocabulary}>: {defaultVocabulary.properties.description}</span>
</label>
<Neos.Fusion.Form:Textarea attributes.class="neos-span6 form-inline" field.name="properties[description]"/>
</div>

<div class="neos-control-group">
<Neos.Fusion:Link.Action
class="neos-button"
href.action="index"
href.arguments.root={taxonomyRoot}
>
{props.i18nMain.id('generic.cancel')}
</Neos.Fusion:Link.Action>
&nbsp;
<Neos.Fusion.Form:Button attributes.class="neos-button neos-button-primary">{props.i18nMain.id('generic.save') + ''}</Neos.Fusion.Form:Button>
</div>
</fieldset>
</Neos.Fusion.Form:Form>
<Sitegeist.Taxonomy:Form.Vocabulary
targetAction="updateVocabulary"
taxonomyRoot={taxonomyRoot}
vocabulary={vocabulary}
defaultVocabulary={defaultVocabulary}
/>
`

}
31 changes: 4 additions & 27 deletions Resources/Private/Fusion/Backend/Views/Vocabulary.New.fusion
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,9 @@ prototype(Sitegeist.Taxonomy:Views.Module.Vocabulary.New) < prototype(Neos.Fusio

renderer = afx`
<legend>{props.i18nMain.id('vocabulary.create')}</legend>

<Neos.Fusion.Form:Form form.target.action="createVocabulary">
<Neos.Fusion.Form:Hidden field.name="taxonomyRoot" field.value={taxonomyRoot.contextPath} />
<fieldset>
<div class="neos-control-group">
<label class="neos-control-label" for="title">{props.i18nVocabulary.id('properties.title')}</label>
<Neos.Fusion.Form:Textarea attributes.class="neos-span6" field.name="properties[title]" />
</div>

<div class="neos-control-group">
<label class="neos-control-label" for="description">{props.i18nVocabulary.id('properties.description')}</label>
<Neos.Fusion.Form:Textarea attributes.class="neos-span6" field.name="properties[description]"/>
</div>

<div class="neos-control-group">
<Neos.Fusion:Link.Action
class="neos-button"
href.action="index"
href.arguments.root={taxonomyRoot}
>
{props.i18nMain.id('generic.cancel')}
</Neos.Fusion:Link.Action>
&nbsp;
<Neos.Fusion.Form:Button attributes.class="neos-button neos-button-primary">{props.i18nMain.id('vocabulary.create') + ''}</Neos.Fusion.Form:Button>
</div>
</fieldset>
</Neos.Fusion.Form:Form>
<Sitegeist.Taxonomy:Form.Vocabulary
targetAction="createVocabulary"
taxonomyRoot={taxonomyRoot}
/>
`
}

0 comments on commit 4c9aea3

Please sign in to comment.