Skip to content

Ibexa DXP editions > Ibexa Headless #2242

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 67 commits into from
Jan 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
575e112
main.py: Add external URL handling to cards()
adriendupuis Dec 6, 2023
db3b3d6
Start Ibexa products/Ibexa DXP editions
adriendupuis Dec 6, 2023
73a7a16
Start Ibexa products/Ibexa DXP editions
adriendupuis Dec 6, 2023
a7fe626
main.py: Fix href slashes in cards
adriendupuis Dec 6, 2023
57f290e
Merge branch 'enh-cards' into editions
adriendupuis Dec 6, 2023
1e910a9
mkdocs.yml: Reword ToC about editions
adriendupuis Dec 7, 2023
431b1a6
mkdocs.yml: Add connect_doc
adriendupuis Dec 7, 2023
519b80c
headless.md: Start "Ibexa DXP Headless edition product guide"
adriendupuis Dec 7, 2023
b263a90
headless.md: Update Availability
adriendupuis Dec 11, 2023
5c2c17e
main.py cards use og:
adriendupuis Dec 11, 2023
09a7c6f
Merge branch 'enh-cards' into editions
adriendupuis Dec 11, 2023
ac190bf
main.py: `cards` accepts only external URLs to *.ibexa.co
adriendupuis Dec 11, 2023
b7c2b62
Merge branch 'enh-cards' into editions
adriendupuis Dec 11, 2023
81a12b5
headless.md: Partially fix style w/ vale
adriendupuis Dec 11, 2023
c1f195e
headless.md: Ibexa.VariablesGlobal
adriendupuis Dec 11, 2023
763d122
headless.md: Partially fix style w/ vale
adriendupuis Dec 12, 2023
b88006a
headless.md: Continue "Use cases"
adriendupuis Dec 13, 2023
355ffb8
Headless product guide: Remove raw feature list
adriendupuis Dec 19, 2023
3754632
headless.md: "back office" → "Back Office"
adriendupuis Dec 19, 2023
c54749f
headless.md: Fix Ibexa.VariablesGlobal
adriendupuis Dec 19, 2023
813241f
headless.md: Fix Ibexa.DomainTermCapitalization
adriendupuis Dec 19, 2023
cb2a152
headless.md: Fix Microsoft.Terms
adriendupuis Dec 19, 2023
6df32d0
headless.md: Illustrate headless
adriendupuis Dec 19, 2023
d7c30f8
headless.md: Illustrate headless
adriendupuis Dec 19, 2023
204f143
headless.md: Illustrate headless
adriendupuis Dec 19, 2023
d5dee2e
headless.md: Illustrate headless
adriendupuis Dec 19, 2023
b83a836
Onion skin diagram version
dabrt Dec 19, 2023
59b5e33
Add png
dabrt Dec 19, 2023
46c506f
Headless Ibexa onion skin
adriendupuis Dec 19, 2023
c2183ba
Headless Ibexa onion skin
adriendupuis Dec 19, 2023
fc4be31
Headless Ibexa onion skin
adriendupuis Dec 19, 2023
c0f0aba
Headless Ibexa onion skin
adriendupuis Dec 19, 2023
32a5082
headless.md: Rewording
adriendupuis Dec 20, 2023
03dd362
Headless Ibexa onion skin
adriendupuis Dec 20, 2023
8e4f04b
Headless Ibexa onion skin
adriendupuis Dec 20, 2023
4cfecca
Headless Ibexa onion skin
adriendupuis Dec 20, 2023
c64689d
Headless Ibexa onion skin
adriendupuis Dec 20, 2023
e08e76a
Headless Ibexa onion skin
adriendupuis Dec 20, 2023
c5c9d6d
Headless Ibexa onion skin
adriendupuis Dec 20, 2023
93156cc
Headless Ibexa onion skin
adriendupuis Dec 20, 2023
400ccdc
Headless Ibexa onion skin
adriendupuis Dec 20, 2023
90bb806
headless.md: Fix list indent
adriendupuis Dec 20, 2023
51f4f3b
Headless Ibexa onion skin: remove inspiring counter-proposal
adriendupuis Dec 20, 2023
d0df4c2
Apply suggestions from code review
adriendupuis Dec 21, 2023
981b31f
Apply suggestions from code review
adriendupuis Dec 21, 2023
8030b4e
headless.md: Reorder "Technical backstage" section
adriendupuis Dec 21, 2023
baeed8e
Apply suggestions from code review
adriendupuis Dec 21, 2023
6c0a2c2
Apply suggestions from code review
adriendupuis Dec 21, 2023
403e581
Update docs/ibexa_products/headless.md
adriendupuis Dec 21, 2023
7574aac
Change links to other product guides
adriendupuis Dec 21, 2023
d72fbd7
headless.md: Rework "Use cases"
adriendupuis Dec 21, 2023
f0d4381
headless.md: Fix style
adriendupuis Dec 21, 2023
0397f9b
headless.md: Rm instruction manual phone app
adriendupuis Dec 21, 2023
c6c93b3
Headless Ibexa onion skin: Colorize, capitalize
adriendupuis Dec 21, 2023
85f9cb8
headless.md: Add a section intro
adriendupuis Dec 22, 2023
7ec9b4d
Update docs/ibexa_products/headless.md
adriendupuis Dec 22, 2023
59d7458
headless.md: Add a section intro
adriendupuis Dec 22, 2023
31964d7
headless.md: Fix meta-desc not displayed in card
adriendupuis Dec 22, 2023
fa5e4b0
headless.md: change sentence of links to other product guides.
adriendupuis Dec 22, 2023
35c5024
Update docs/ibexa_products/headless.md
adriendupuis Jan 2, 2024
33246f4
headless.md: Balance "Ibexa DXP Headless edition"/"Ibexa Headless" us…
adriendupuis Jan 2, 2024
6b7ad15
headless.md: Balance "Ibexa DXP Headless edition"/"Ibexa Headless" us…
adriendupuis Jan 2, 2024
f9ce5c8
headless.md: Balance "Ibexa DXP Headless edition"/"Ibexa Headless" us…
adriendupuis Jan 2, 2024
0154b42
headless.md: Balance "Ibexa DXP Headless edition"/"Ibexa Headless" us…
adriendupuis Jan 2, 2024
82b90bd
Update docs/ibexa_products/headless.md
adriendupuis Jan 5, 2024
af9e4bd
Update Ibexa Headless schema
adriendupuis Jan 12, 2024
6696497
Apply suggestions from code review
adriendupuis Jan 18, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions docs/ibexa_products/editions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
description: Learn more about various Ibexa DXP editions' features to help yourself choose the right one for your project.
page_type: landing_page
---

# Ibexa DXP editions

[[= cards([
"ibexa_products/headless",
"https://www.ibexa.co/products/ibexa-experience",
"https://www.ibexa.co/products/ibexa-commerce",
], columns=4) =]]
194 changes: 194 additions & 0 deletions docs/ibexa_products/headless.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
---
title: Ibexa Headless
description: Explore Ibexa Headless' features, capabilities and benefits.
---

# Ibexa DXP Headless edition product guide

## What is [[= product_name_headless =]]

The Headless edition of [[= product_name =]] focuses on content management.
It provides tools to collaboratively create content, and interfaces (API) to distribute this content.

Multilingual, multichannel, extensible, [[= product_name_headless =]] is an advanced Content Management Framework (CMF), a Product Information Management (PIM) platform, as well as a Digital Asset Management (DAM) repository.
It's provided without a default front office, but with a complete Back Office and several APIs to manage and access content.

## Availability

To start using [[= product_name_headless =]] you must purchase a product license.
For more information, see [[[= product_name_headless =]] license pricing](https://www.ibexa.co/products/pricing?tab=1).
You can [contact us](https://www.ibexa.co/products/pricing) or [contact one of our partners](https://www.ibexa.co/partners).

## How it works

### Editorial stage

You access with any web browser from any platform to a rich Back Office, the main place to

- define users and their rights (customers, subscribers, editors, etc.),
- organize content (content types, fields, tree, tags, languages, and more),
- edit content in a collaborative workplace with versions and workflows.

Then, content is available to end users through REST, GraphQL, or every output you can imagine like websites or apps.

### Technical backstage

When you have a license, you install [[= product_name_headless =]] through Composer
on an architecture including at least a web server with PHP and a relational database server.
For performance, several bricks can be added to your stack such as a reverse proxy or a search engine.

[[= product_name_headless =]] is based on Symfony. Any Symfony developer, or even PHP developer, can quickly learn how to extend it with the help of an online documentation.

By using a version control system and environment variables, you can deploy your configuration and extensions on several environments including [[= product_name_cloud =]].

Standard web APIs and [[= product_name_connect =]] help establish interoperability, even if you aren't an advanced developer.

![Ibexa Headless data inputs and outputs](img/headless.png)

APIs summary:

- The REST and GraphQL APIs give access to access the content in standardized ways.
- The OAuth 2 Client and Server allow to connect to an SSO or be the SSO.
- The design engine and its theme templates mechanism allows to serve the content in several shapes.
- The PHP API opens [[= product_name_headless =]] to extendability to fit your needs.
For example, content can be computed, edited or served in specific ways such as
scheduled/live imports/exports, automated edition tasks, or specific controllers to communicate with other applications.

## Capabilities and benefits

[[= product_name_headless =]] is a tool box with a Back Office.
It comes without a default front office.
You don't lose time to develop a theme for a provided front office before discovering it won't fit your needs.
No distraction.
[[= product_name_headless =]] helps you focus on the content, create and organize with its straightforward user interface (UI),
imagine its inputs/outputs, and implement them with its various layers' APIs.

### Core features

The core of [[= product_name_headless =]] offers everything to structure your content repositories and access them.

#### Content model

Content modeling and management are the foundation of [[= product_name =]] with the following main layers:

- Content items are organized as a tree in a repository.
- An item can have multiple locations in this tree.
- Content items are typed.
- Content types are sets of typed data fields, with eventually conditions on the possible values.
- Rich Text Field Type comes with an [online editor](online_editor_guide.md).
- Multilingual, it can store a content in several languages, the content model define which field must be translated, and which don't vary.

For more information, see [Content management product guide](content_management_guide.md).

#### User management

User and user group rights are set by roles with thin granular limited permission policies in a safe deny-by-default security system.
Users are content items as well, so your knowledge about content management is reused.

For more information, see [User management product guide](user_management_guide.md).

#### Content access

There are many paths to access the content in many shapes:

- The REST API and GraphQL API support access to, and edition of the content.
- [[= product_name_headless =]] offers a complete PHP API to extend the ways to access content.
- A design engine and a view controller offer to create plain text content views (such as HTML, JSON, XML, CSS, JS, CSV, or Markdown),
and to factorize those views by using theme cascades.
This design engine is used in the Back Office which is equally extendable.
- Multichannel, content can be accessed through several channel configurations,
such as the domain name it replies to, the sub-part of the content tree it starts from, the users rights, or the design theme.
The Back Office itself is such a channel.
- Multi-repository, the same platform can use separate databases if impermeability is needed between channel groups.

### Advanced features

On top of this strong core, [[= product_name_headless =]] brings tools to increase user experience, from final front users to Back Office contributors.

#### Complete DXP

[[= product_name_headless =]] is a complete Digital Experience Platform (DXP), which comes with the following components to enhance user's journey:

- [Personalization](personalization_brochure.md) engine, which allows you to recommend content to end users according to their behavior,
or, when authenticated, by matching with their segment/group.
- Content scheduler, which allows you to establish the future of the content and use events to have a living front application, even when the editorial team is absent or reduced.
This way, visitors can discover new content at midnight, during weekends or vacations.
A calendar summarises those scheduled content events.
Like everything in the Back Office, the calendar is extendable: you can add an event source to coordinate content events with other company events.

#### Many ways to structure and organize content

[Product Information Management](pim_guide.md) (PIM) helps organize complex products and their catalogs:
- Product are organized per product types × variants × catalogs × categories × tags.
- Product attributes are grouped and factorized among product types. For example, fabric + color + size can be shared by many clothing product types.
- Product variants can rapidly be created by the automatic declination of attributes having a defined set of values.
- With taxonomy, you can tag content items to organize them by topics in a much intuitive way for the editor than a content tree with multiple locations would.
Tags themselves are organized in a tree, and synonyms are linked to a favorite terms. This tags organization can be the task of a supervisor who won't need to move content items around a corporate content tree. At search time, tags can be keywords with a high value in relevance score to help the end user having results closer to the searched topic.

#### Collaboration

Several features help end users collaborate on the content, such as:

- Version comparison helps track changes and solve concurrent editing conflicts.
- Workflows helps with collaborative editing chain.
A built-in “Quick review“ workflow allows an editor to send a content draft to a colleague for review, and comment or publishing.
But, as a framework, more complex workflows can be imagined, with several steps and paths, even some automated tasks.

#### Accelerated content editing

- [[= product_name_headless =]]'s content tree has several actions available directly on its items. For example, no need to open a content to hide it, you can do it directly from the content tree.
- An Image Editor offers to crop and flip images. When serving the image in various context, you can even set a focal point to indicate to automated cropping which part of the image should be kept.
- A Digital Asset Management (DAM) helps you crawl through your image resources to use and reuse them in your content. And a DAM connector allows you to search for images hosted on third party DAM servers.

#### Network integration

##### Intranets and extranets

- [[= product_name_connect =]]'s role is to create application interconnections with low code and drag-and-drop, in a compelling visual interface.
Complex data flows can be easily implemented with a huge library of connectors and actions for famous to specific applications.
For more information, see [[[= product_name_connect =]] product guide]([[= connect_doc =]]/general/ibexa_connect/).
- An OAuth 2 server offers the possibility to use the DXP as the authentication service for other applications.
- An OAuth 2 client supports authentication with a third-party OAuth 2 server.
- A DAM Connector, previously mentioned, helps to access any image repository when needing to illustrate a content.
- [[= product_name_headless =]] supports Elasticsearch and Solr.
It gives the choice between using Solr or Elasticsearch as a search engine, whether hosted on [[= product_name_cloud =]] or on-premises.
This choice might be influenced by technology you already use, or you want to invest in for other internal projects.
- [[= product_name_headless =]] offers to export and import from command line part of the content model or content items.
For example, it can be used to move new content types and items from a staging instance to the production one.

##### Internet, delivery, web search engines, and social networks

- [[= product_name_headless =]] comes with the support of Fastly content delivery network (CDN).
The HTTP cache varies on current user's role and is purged when content change.
With is huge network of points of presence (POP) around the world, Fastly is quickly delivering cached content from nearest server for a better user experience.
- A Search Engine Optimization (SEO) field implements best practices about web search engine indexing and social network sharing.
It covers canonical URLs which are mandatory if multiple locations are used for a same Content item to avoid duplicate content,
Open Graph protocol to better describe a Content item to social networks and search engine, and Twitter Cards.

## Use cases

As a content repository with an omnipotent Back Office,
many APIs to absorb, compute and distribute content,
even a recommendation engine to deliver the right content to various readers,
[[= product_name_headless =]] can be used in several cases.
Here are few examples.

### Brick and mortar, but with an online showcase

If you prefer the human warmth of a retail store,
if your products' numerous complex options should be discussed,
or if you're simply not ready yet to sell online,
[[= product_name_headless =]] helps to build an exposition of your product catalog and your philosophy,
an online presence to keep earlier customers interested and gather new ones.
It can be a structuring first step to test customer's adoption of your website,
before increasing user experience with [[= product_name_exp =]],
and finally becoming an online store with [[= product_name_com =]].

### Large network with multiple inputs and outputs

Departments, subsidiaries, and even partners now produce content in the same repository from the same collaborative workspace.
Thanks to migration feature and PHP API, existing content has been imported from previous repositories.
Fine-tuned user rights and workflows ensure that each collaborator can focus on their own tasks without the risk to disturb the content model or content organization.
Content is distributed on several websites and applications, some running on the [[= product_name_base =]] platform itself, some on third parties' servers, some as native mobile apps.
Part of the content has multiple locations or is translated, and reused from place to place.
While the Back Office offers to search into the whole repository, the front end apps have correctly circumscribed search capabilities.
Binary file added docs/ibexa_products/img/headless.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
79 changes: 49 additions & 30 deletions main.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import os
import pprint
import re
import urllib.request
from mkdocs.structure.pages import Page
from mkdocs.utils import meta

CARDS_TEMPLATE = """
<div class="card-wrapper">
<div>
<a href="/%s" class="card">
<a href="%s" class="card">
<div>
<p class="title">%s</p>
<p class="description">%s</p>
Expand Down Expand Up @@ -55,35 +56,53 @@ def cards(pages, columns=1, style="cards", force_version=False):
pages = [pages]
cards = []
for page in pages:
with open("docs/%s.md" % page, "r") as doc_file:
doc = doc_file.read()
match = re.search("^# (.*)", doc, re.MULTILINE)
if match:
header = match.groups()[0]
else:
header = ""
default_meta = {
"title": header,
"short": "",
"description": ""
}
doc_meta = {
**default_meta,
**meta.get_data(doc)[1]
}
cards.append(
CARDS_TEMPLATE % (
'/'.join((
'',
site,
language,
version,
page
)),
doc_meta['short'] or doc_meta['title'],
doc_meta['description'] or "&nbsp;"
# site_url
)
match = re.search("https://[^@/]+.ibexa.co", page)
if match:
with urllib.request.urlopen(page) as file:
content = file.read().decode('utf-8')
match = re.search("<meta property=\"og:title\" content=\"(.*)\"", content, re.MULTILINE)
if match:
title = match.groups()[0]
else:
title = ""
match = re.search("<meta property=\"og:description\" content=\"(.*)\"", content, re.MULTILINE)
if match:
description = match.groups()[0]
else:
description = ""
href = page
else:
with open("docs/%s.md" % page, "r") as doc_file:
doc = doc_file.read()
match = re.search("^# (.*)", doc, re.MULTILINE)
if match:
header = match.groups()[0]
else:
header = ""
default_meta = {
"title": header,
"short": "",
"description": ""
}
doc_meta = {
**default_meta,
**meta.get_data(doc)[1]
}
href = '/'.join((
'/',
site,
language,
version,
page
))
title = doc_meta['short'] or doc_meta['title']
description = doc_meta['description'] or "&nbsp;"
cards.append(
CARDS_TEMPLATE % (
href,
title,
description
)
)

return """<div class="%s col-%s">%s</div>""" % (style, columns, "\n".join(cards))
4 changes: 4 additions & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ site_url: https://doc.ibexa.co/en/latest/
copyright: "Copyright 1999-2023 Ibexa AS and others"
nav:
- Ibexa Developer Documentation: index.md
- Ibexa DXP editions:
- Editions: ibexa_products/editions.md
- Ibexa Headless: ibexa_products/headless.md
- Getting started:
- Getting started: getting_started/getting_started.md
- Requirements: getting_started/requirements.md
Expand Down Expand Up @@ -847,6 +850,7 @@ extra:

symfony_doc: 'https://symfony.com/doc/5.4'
user_doc: 'https://doc.ibexa.co/projects/userguide/en/master'
connect_doc: 'https://doc.ibexa.co/projects/connect/en/latest'

extra_css:
- fonts/MavenPro.css
Expand Down