The 5.7 branch of Magnolia reached End-of-Life on December 31, 2023, as specified in our End-of-life policy. This means the 5.7 branch is no longer maintained or supported. Please upgrade to the latest Magnolia release. By upgrading, you will get the latest release of Magnolia featuring significant improvements to the author and developer experience. For a successful upgrade, please consult our Magnolia 6.2 documentation. If you need help, please contact info@magnolia-cms.com.

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

This page provides an overview of all ways to define custom JCR node types and create new workspaces with Magnolia.

Even though it has always been possible to define node types and create workspaces within Magnolia Maven modules, the Content Types module brings this functionality also to the light modules. Both approaches are valid. 

Whichever approach you choose, we recommend not to develop and refine these definitions in a productive environment.

Editing node type and workspace definitions can lead to new node type definitions and workspaces which are registered again, whereas the system keeps the "old" ones which become obsolete.


With content types

The Magnolia Content Types module is currently available as a Developer Preview. Development for the first official release is still underway.

This developer preview brings several powerful features. Please try it out and feel free to send us your feedback and suggestions based on your experience.

We are working to finalize the module as soon as possible.

By utilizing the magnolia-content-types module you can define custom JCR content types and workspaces within light modules.

Defining content types within light modules can be accomplished on a running Magnolia system without redeploying the WAR file of your Magnolia instances and without restarting the instance or a module. This makes it a perfect approach if you have a Magnolia Cloud subscription package.

A content type definition in one file

You can define all of the following in just one file:

  1. JCR workspace
  2. JCR nodetype
    This node type inherits from the Magnolia node type mgnl:content. To define more sophisticated node types, you can create a node type definition file in a light module
  3. JCR namespace

Example

Error rendering macro 'code-pro'

Error 401 retrieving server data from URL. User is not authorized to perform the request.

Best practice

If a node type inheriting from mgnl:content complies with your requirements, we recommend defining all of the items – namespace, node type and workspace in the content type definition, all in one file.

Defining and using a node type definition

You can define an XML-based node type definition. Since this definition must be readable as a Magnolia Resource, it can be a file in a light module or in a JAR file or in the resources JCR workspace.

The XML node type definition resource is loaded only if the XML resource is referenced in the Content type Data source definition of a Content type definition.

Once the resource is loaded, the system registers the defined JCR node types and name spaces. If required and Jackrabbit allows it, the system may update the definitions.

Example:

  1. Create an XML-based node type definition file in your light module:

    Error rendering macro 'code-pro'

    Error 401 retrieving server data from URL. User is not authorized to perform the request.

  2. Reference the node type definition from a content type definition:

    Error rendering macro 'code-pro'

    Error 401 retrieving server data from URL. User is not authorized to perform the request.

    Line 4: References the node type definition resource via nodeTypeDefinition.

With a Magnolia Maven module descriptor

With Magnolia Maven modules you can register new JCR workspaces and node types. The registration involves the XML-based module descriptor.

Magnolia registers workspaces and node types during a module's start-up phase in case they have not yet been registered.


 Example of a module descriptor:

my-maven-module/src/main/resources/META-INF/magnolia/my-module.xml
<!DOCTYPE module SYSTEM "module.dtd" >
<module>
  <name>my-module</name>
  <displayName>${project.name}</displayName>
  <description>${project.description}</description>
  <class>com.example.magnolia.myModule.MyModuleDefinition</class>
  <versionHandler>com.example.magnolia.myModule.setup.MyModuleVersionHandler</versionHandler>
  <version>${project.version}</version>

  <dependencies>
    <dependency>
      <name>core</name>
      <version>5.6/*</version>
    </dependency>
  </dependencies>

  <repositories>
    <repository>
      <name>magnolia</name>
      <workspaces>
        <workspace>products</workspace>
      </workspaces>
      <nodeTypeFile>/mgnl-nodetypes/products-nodetypes.xml</nodeTypeFile>
    </repository>
  </repositories>

</module>

Workspaces

In the XML-based module descriptor you can add a <workspace /> section in /repositories/repository/workspaces.

<workspaces>
  <workspace>products</workspace>
</workspaces>

Node types

To define and register new node types requires two things:

  1. Creating an XML-based node type definition where you define the required node types and name spaces. Create the XML file in the my-maven-module/src/main/resources/mgnl-nodetypes/ folder.
    Example:

    my-maven-module/src/main/resources/mgnl-nodetypes/my-node-types.xml
    <nodeTypes
        xmlns:mgnl="http://www.magnolia.info/jcr/mgnl"
        xmlns:mgnld="https://www.magnolia-cms.com/jcr/mgnld">
      <nodeType name="mgnld:product" isMixin="false" hasOrderableChildNodes="true" primaryItemName="">
        <supertypes>
          <supertype>mgnl:content</supertype>
        </supertypes>
      </nodeType>
    </nodeTypes>

  2. Referencing the node type file in the XML-based module descriptor:
    Example:

    my-maven-module/src/main/resources/META-INF/magnolia/my-module.xml (fragment)
    <nodeTypeFile>/mgnl-nodetypes/my-node-types.xml</nodeTypeFile>

  • No labels