Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
24 changes: 12 additions & 12 deletions .markdownlint-cli2.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,27 +18,27 @@ config:
blanks-around-tables: true
descriptive-link-text: true
# table-column-style: aligned
# link-fragments: true
# no-alt-text: true
link-fragments: true
no-alt-text: true
single-trailing-newline: true
# no-emphasis-as-heading: true
no-space-in-code: true
no-space-in-links: true
fenced-code-language: true
# first-line-heading: true
# ol-prefix: one_or_ordered
# list-marker-space: true
# blanks-around-fences: true
first-line-heading: true
ol-prefix: one_or_ordered
list-marker-space: true
blanks-around-fences: true
blanks-around-lists: true
# single-title: true
single-title: true
no-trailing-punctuation:
punctuation: [".", ":", ";",]
# no-multiple-space-atx: true
# blanks-around-headings: true
no-multiple-space-atx: true
blanks-around-headings: true
# heading-increment: true
# ul-style: dash
# ul-indent:
# indent: 4
ul-style: dash
ul-indent:
indent: 4
no-trailing-spaces: true
no-multiple-blanks: true
commands-show-output: true
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
---
title: Back office configuration
description: Configure default upload locations, pagination limits, and more settings for the back office.
---

Expand Down
3 changes: 2 additions & 1 deletion docs/administration/back_office/browser/add_browser_tab.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ The module governs the creation of the new tab.
## Add tab to webpack config

In `webpack.config.js`, add the following declaration:

```js
const ibexaConfigManager = require('./ibexa.webpack.config.manager.js');
```
Expand Down Expand Up @@ -91,7 +92,7 @@ Finally, create an image view by adding an `image.js` to `assets/js/image-tab/co
[[= include_file('code_samples/back_office/udw/assets/js/image-tab/components/image.js') =]]
```

## Add styles
## Add styles

Ensure that the new tab is styled by adding the following files to `assets/css/`.

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
---
title: Default dashboard configuration
description: Configure default dashboard.
edition: experience
---
Expand Down
1 change: 0 additions & 1 deletion docs/administration/dashboard/customize_dashboard.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
---
title: Dashboard customization
description: Customize dashboard.
edition: experience
---
Expand Down
1 change: 0 additions & 1 deletion docs/administration/dashboard/php_api_dashboard_service.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
---
title: Dashboard service's PHP API
description: Use DashboardService to manage dashboards.
edition: experience
---
Expand Down
2 changes: 1 addition & 1 deletion docs/ai_actions/ai_actions.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

You can also extend it to perform other tasks or support additional AI services.

## Getting Started
## Getting Started

Check notice on line 14 in docs/ai_actions/ai_actions.md

View workflow job for this annotation

GitHub Actions / vale

[vale] docs/ai_actions/ai_actions.md#L14

[Ibexa.SentenceCapitalizationInHeadings] Use sentence-style capitalization in headings
Raw output
{"message": "[Ibexa.SentenceCapitalizationInHeadings] Use sentence-style capitalization in headings", "location": {"path": "docs/ai_actions/ai_actions.md", "range": {"start": {"line": 14, "column": 4}}}, "severity": "INFO"}

[[= cards([
"ai_actions/ai_actions_guide",
Expand Down
5 changes: 3 additions & 2 deletions docs/ai_actions/configure_ai_actions.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@

2. Go to **API keys** and click **Create Key**.

4. Select the workspace, enter a **Key Name** and click **Add**.
3. Select the workspace, enter a **Key Name** and click **Add**.

5. Take a note of the API key, because it is displayed only once.
4. Take a note of the API key, because it is displayed only once.

Check notice on line 59 in docs/ai_actions/configure_ai_actions.md

View workflow job for this annotation

GitHub Actions / vale

[vale] docs/ai_actions/configure_ai_actions.md#L59

[Ibexa.Passive] Try to avoid passive tense, when possible.
Raw output
{"message": "[Ibexa.Passive] Try to avoid passive tense, when possible.", "location": {"path": "docs/ai_actions/configure_ai_actions.md", "range": {"start": {"line": 59, "column": 43}}}, "severity": "INFO"}

Then, in the root folder of your project, modify the `.env` file: add an `ANTHROPIC_API_KEY` variable and populate its value with the API key that you got from the AI service.

Expand All @@ -81,6 +81,7 @@
claude-sonnet-4-20250514: 'Claude 4 Sonnet (2025-05-14)'
claude-opus-4-20250514: 'Claude Opus 4 (2025-05-14)'
```

You can now use the Anthropic connector in your project.

## Configure access to [[= product_name_connect =]]
Expand Down
1 change: 1 addition & 0 deletions docs/ai_actions/extend_ai_actions.md
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,7 @@ This template embeds the AI component, but only if a dedicated `transcript` fiel
```

And add it to the SiteAccess configuration for the `admin_group`:

``` yaml
[[= include_file('code_samples/ai_actions/config/packages/ibexa_admin_ui.yaml') =]]
```
Expand Down
1 change: 1 addition & 0 deletions docs/api/graphql/graphql_queries.md
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,7 @@ Alternatively, you can query the `children` property of an `item` or `content` o
}
}
```

Response:

```json
Expand Down
14 changes: 7 additions & 7 deletions docs/api/rest_api/rest_api_usage/rest_api_usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,12 +93,12 @@

## REST communication summary

* A REST route (URI) leads to a REST controller action. A REST route is composed of the root prefix (`ibexa.rest.path_prefix: /api/ibexa/v2`) and a resource path (for example, `/content/objects/{contentId}`).
* This controller action returns an `Ibexa\Rest\Value` descendant.
- A REST route (URI) leads to a REST controller action. A REST route is composed of the root prefix (`ibexa.rest.path_prefix: /api/ibexa/v2`) and a resource path (for example, `/content/objects/{contentId}`).

Check notice on line 96 in docs/api/rest_api/rest_api_usage/rest_api_usage.md

View workflow job for this annotation

GitHub Actions / vale

[vale] docs/api/rest_api/rest_api_usage/rest_api_usage.md#L96

[Ibexa.Passive] Try to avoid passive tense, when possible.
Raw output
{"message": "[Ibexa.Passive] Try to avoid passive tense, when possible.", "location": {"path": "docs/api/rest_api/rest_api_usage/rest_api_usage.md", "range": {"start": {"line": 96, "column": 70}}}, "severity": "INFO"}
- This controller action returns an `Ibexa\Rest\Value` descendant.
- This controller action might use the `Request` to build its result according to, for example, GET parameters, the `Accept` HTTP header, or the request payload and its `Content-Type` HTTP header.
- This controller action might wrap its return in a `CachedValue` which contains caching information for the reverse proxies.
* The `Ibexa\Bundle\Rest\EventListener\ResponseListener` attached to the `kernel.view event` is triggered, and passes the request and the controller action's result to the `AcceptHeaderVisitorDispatcher`.
* The `AcceptHeaderVisitorDispatcher` matches one of the `regexps` of an `ibexa.rest.output.visitor` service (an `Ibexa\Contracts\Rest\Output\Visitor`). The role of this `Output\Visitor` is to transform the value returned by the controller into XML or JSON output format. To do so, it combines an `Output\Generator` corresponding to the output format and a `ValueObjectVisitorDispatcher`. This `Output\Generator` is also adding the `media-type` attributes.
* The matched `Output\Visitor` uses its `ValueObjectVisitorDispatcher` to select the right `ValueObjectVisitor` according to the fully qualified class name (FQCN) of the controller result. A `ValueObjectVisitor` is a service tagged `ibexa.rest.output.value_object.visitor` and this tag has a property `type` pointing a FQCN.
* `ValueObjectVisitor`s recursively help to transform the controller result thanks to the abstraction layer of the `Generator`.
* The `Output\Visitor` returns the `Response` to send back to the client.
- The `Ibexa\Bundle\Rest\EventListener\ResponseListener` attached to the `kernel.view event` is triggered, and passes the request and the controller action's result to the `AcceptHeaderVisitorDispatcher`.

Check notice on line 100 in docs/api/rest_api/rest_api_usage/rest_api_usage.md

View workflow job for this annotation

GitHub Actions / vale

[vale] docs/api/rest_api/rest_api_usage/rest_api_usage.md#L100

[Ibexa.Passive] Try to avoid passive tense, when possible.
Raw output
{"message": "[Ibexa.Passive] Try to avoid passive tense, when possible.", "location": {"path": "docs/api/rest_api/rest_api_usage/rest_api_usage.md", "range": {"start": {"line": 100, "column": 94}}}, "severity": "INFO"}
- The `AcceptHeaderVisitorDispatcher` matches one of the `regexps` of an `ibexa.rest.output.visitor` service (an `Ibexa\Contracts\Rest\Output\Visitor`). The role of this `Output\Visitor` is to transform the value returned by the controller into XML or JSON output format. To do so, it combines an `Output\Generator` corresponding to the output format and a `ValueObjectVisitorDispatcher`. This `Output\Generator` is also adding the `media-type` attributes.
- The matched `Output\Visitor` uses its `ValueObjectVisitorDispatcher` to select the right `ValueObjectVisitor` according to the fully qualified class name (FQCN) of the controller result. A `ValueObjectVisitor` is a service tagged `ibexa.rest.output.value_object.visitor` and this tag has a property `type` pointing a FQCN.
- `ValueObjectVisitor`s recursively help to transform the controller result thanks to the abstraction layer of the `Generator`.
- The `Output\Visitor` returns the `Response` to send back to the client.
1 change: 1 addition & 0 deletions docs/cdp/cdp_activation/cdp_add_clientside_tracking.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ For example, add this tracker to the landing page template to track user entranc
```js
raptor.trackEvent('visit', ..., ...);
```

or purchases:

```js
Expand Down
34 changes: 18 additions & 16 deletions docs/cdp/cdp_data_customization.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
---

# Data customization

You can customize user, content, and product data exported to CDP and you can control what field type information you want to export.
By default, custom field types have basic export functionality.
It casts their `Value` object to string, thanks to `\Stringable` implementation.

## Export additional user data

You can extend user data exported to CDP by attaching custom information, for example user content fields or user preferences.
Expand Down Expand Up @@ -51,7 +51,7 @@
```

## Export field types

Field types are exported with metadata, for example, ID, field definition name, type, or value.
You can also provide your own [`\Ibexa\Contracts\Cdp\Export\Content\FieldProcessorInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Cdp-Export-Content-FieldProcessorInterface.html) instance to extend metadata.
The provided implementation has to be defined as a service and tagged with `ibexa.cdp.export.content.field_processor`.
Expand Down Expand Up @@ -80,19 +80,20 @@
"field_measurement_simple_value_simple_base_unit": 800000000
}
```

Field identifier is a prefix that is automatically added to each key.
You can only use scalar values.

### Built in Field Processors for custom field types

You can provide your own CDP export functionality by using one of the system Field Processors:

#### `\Ibexa\Cdp\Export\Content\FieldProcessor\SkippingFieldProcessor`

It results in the field type being excluded from the exported payload.
To avoid adding the field type data to the payload, register a new service as follows:

```yaml
custom_fieldtype.cdp.export.field_processor:
class: Ibexa\Cdp\Export\Content\FieldProcessor\SkippingFieldProcessor
Expand All @@ -102,30 +103,30 @@
tags:
- { name: 'ibexa.cdp.export.content.field_processor', priority: 0 }
```

## Export field type values

To customize export of field type values, provide your own [`\Ibexa\Contracts\Cdp\Export\Content\FieldValueProcessorInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Cdp-Export-Content-FieldValueProcessorInterface.html) instance.
New implementation has to be registered as a service manually or by using autoconfiguration.
The service has to use the tag `ibexa.cdp.export.content.field_value_processor`.
You can also provide `priority` property to override other Field Value Processors.

* `FieldValueProcessorInterface::process` - takes `Field` instance and returns an `array` with scalar values that are applied to export data payload.
- `FieldValueProcessorInterface::process` - takes `Field` instance and returns an `array` with scalar values that are applied to export data payload.

Check notice on line 114 in docs/cdp/cdp_data_customization.md

View workflow job for this annotation

GitHub Actions / vale

[vale] docs/cdp/cdp_data_customization.md#L114

[Ibexa.Passive] Try to avoid passive tense, when possible.
Raw output
{"message": "[Ibexa.Passive] Try to avoid passive tense, when possible.", "location": {"path": "docs/cdp/cdp_data_customization.md", "range": {"start": {"line": 114, "column": 115}}}, "severity": "INFO"}
If the field type returns a single value, provides a `value` key in the array.
You can return multiple values.

* `FieldValueProcessorInterface::supports` - decides whether `FieldValueProcessor` can work with the `Field`.
- `FieldValueProcessorInterface::supports` - decides whether `FieldValueProcessor` can work with the `Field`.

### Built in Field Value Processors for custom field types

Several system Field Value Processors either work by default or can be registered for custom field types:

#### `\Ibexa\Cdp\Export\Content\FieldValueProcessor\CastToStringFieldValueProcessor`

This Processor is a default one, as long as no other Processor with higher priority is registered. It makes `\Stringable` implementation of the field type `\Ibexa\Core\FieldType\Value` object to use it as a value in the final payload.

#### `\Ibexa\Cdp\Export\Content\FieldValueProcessor\JsonHashFieldValueProcessor`

This Processor generates JSON data from hash representation of the field type (it uses [`\Ibexa\Contracts\Core\FieldType\FieldType::toHash`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-FieldType-FieldType.html#method_toHash) method).

!!! caution
Expand All @@ -134,6 +135,7 @@

To use `JsonHashFieldValueProcessor`, you need to register a new service:

```yaml
custom_fieldtype.cdp.export.field_processor:
class: Ibexa\Cdp\Export\Content\FieldValueProcessor\JsonHashFieldValueProcessor
Expand Down
6 changes: 3 additions & 3 deletions docs/cdp/cdp_data_export_schedule.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,19 +49,19 @@ It's important, because each type of content/product must have its own parameter

Accepted options can be listed with the command below:

* for User:
- for User:

```bash
php bin/console ibexa:cdp:stream-user-data --help
```

* for Product:
- for Product:

```bash
php bin/console ibexa:cdp:stream-product-data --help
```

* for Content:
- for Content:

```bash
php bin/console ibexa:cdp:stream-content-data --help
Expand Down
3 changes: 1 addition & 2 deletions docs/commerce/payment/enable_paypal_payments.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
edition: commerce
---

### Enable PayPal payments with Payum
# Enable PayPal payments with Payum

Check notice on line 6 in docs/commerce/payment/enable_paypal_payments.md

View workflow job for this annotation

GitHub Actions / vale

[vale] docs/commerce/payment/enable_paypal_payments.md#L6

[Ibexa.SentenceCapitalizationInHeadings] Use sentence-style capitalization in headings
Raw output
{"message": "[Ibexa.SentenceCapitalizationInHeadings] Use sentence-style capitalization in headings", "location": {"path": "docs/commerce/payment/enable_paypal_payments.md", "range": {"start": {"line": 6, "column": 3}}}, "severity": "INFO"}

By using Payum to integrate PayPal into your application, you can offer your customers a versatile payment processing service that supports various payment methods, including credit cards, debit cards, Pay Later options, and alternative payment methods.

Expand Down Expand Up @@ -42,5 +42,4 @@
type:
pp_express_checkout:
name: "Translated PayPal Express Checkout name"

```
1 change: 1 addition & 0 deletions docs/commerce/payment/payment_method_api.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ To update payment method information, use the `PaymentMethodServiceInterface::up
## Delete payment method

To delete a payment method from the system, use the `PaymentMethodService::deletePayment` method:

``` php
[[= include_file('code_samples/api/commerce/src/Command/PaymentMethodCommand.php', 95, 101) =]]
```
Expand Down
1 change: 1 addition & 0 deletions docs/commerce/shipping_management/shipment_api.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ To update shipment information, use the `ShipmentService::updateShipment` method
``` php
[[= include_file('code_samples/api/commerce/src/Command/ShipmentCommand.php', 105, 116) =]]
```

## Delete shipment

To delete a shipment from the system, use the `ShipmentService::deleteShipment` method:
Expand Down
1 change: 1 addition & 0 deletions docs/commerce/shopping_list/install_shopping_list.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ composer require ibexa/shopping-list
The associated Symfony Flex recipe configures the bundle and its routes.

Check that the following line has been added by the recipe to `config/bundles.php` file's array:

```php
Ibexa\Bundle\ShoppingList\IbexaShoppingListBundle::class => ['all' => true],
```
Expand Down
2 changes: 1 addition & 1 deletion docs/commerce/shopping_list/shopping_list.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
A shopping list allows users to save potential purchases, recurring product sets, and other items for future use in the cart.
A user can have several shopping lists, including a default one named "My Wishlist".

## Getting Started
## Getting Started

Check notice on line 12 in docs/commerce/shopping_list/shopping_list.md

View workflow job for this annotation

GitHub Actions / vale

[vale] docs/commerce/shopping_list/shopping_list.md#L12

[Ibexa.SentenceCapitalizationInHeadings] Use sentence-style capitalization in headings
Raw output
{"message": "[Ibexa.SentenceCapitalizationInHeadings] Use sentence-style capitalization in headings", "location": {"path": "docs/commerce/shopping_list/shopping_list.md", "range": {"start": {"line": 12, "column": 4}}}, "severity": "INFO"}

[[= cards([
"commerce/shopping_list/shopping_list_guide",
Expand Down
1 change: 1 addition & 0 deletions docs/commerce/shopping_list/shopping_list_api.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ dump($list);
$list = $this->shoppingListService->addEntries($list, [new EntryAddStruct($productCode)]);
dump($list);
```

When adding array of entries with `ShoppingListService::addEntries()`,
an exception is thrown if at least product is already in the shopping list and no entries are added to the list.

Expand Down
9 changes: 8 additions & 1 deletion docs/commerce/shopping_list/shopping_list_design.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,13 @@ The following example shows the setup of an "Add to shopping list" widget on a p
For a base product, the variants are listed with an instance of the widget to demonstrate that it can be used several time on the same page.

Create an `assets/js/add-to-shopping-list.ts` that initializes the `ShoppingList` object and imports the script handling the widget interactions:

``` ts
[[= include_file('code_samples/shopping_list/add_to_shopping_list/assets/js/add-to-shopping-list.ts') =]]
```

Edit the `webpack.config.js` to enable TypeScript, set the aliases used in `add-to-shopping-list.ts`, and create an entry for it:

``` js hl_lines="5-14"
// […]

Expand Down Expand Up @@ -64,22 +66,26 @@ Then, you can use the component in your template as in the following example:
To have a more complete example, let's continue with a product full view template which could work on a fresh installation.

In `src/Controller/ProductViewController.php`, create a new controller to add the variants to the product view:

``` php hl_lines="24-30"
[[= include_file('code_samples/shopping_list/add_to_shopping_list/src/Controller/ProductViewController.php') =]]
```

In `templates/themes/standard/full/product.html.twig`, create a template to render the product in full view:

``` twig hl_lines="7 8 16-18 31-33 44"
[[= include_file('code_samples/shopping_list/add_to_shopping_list/templates/themes/standard/full/product.html.twig') =]]
```

Because the component uses global variables, it can't be used directly in a macro.

In `config/packages/views.yaml`, configure the controller and template used to render the product full view:

``` yaml hl_lines="7 8"
[[= include_file('code_samples/shopping_list/add_to_shopping_list/config/packages/views.yaml') =]]
```

![](img/add_to_shopping_list_widget.png "Preview of this “Add to shopping list” widget example")
![Preview of this “Add to shopping list” widget example](img/add_to_shopping_list_widget.png "Preview of this “Add to shopping list” widget example")

## `ShoppingList` JS class and `ibexaShoppingList` global

Expand Down Expand Up @@ -153,6 +159,7 @@ shoppingLists_Mockup = {
]
};
```

Remember that a `ShoppingList` object like the `window.ibexaShoppingList` has its data updated by the `ShoppingList.createShoppingList` and `ShoppingList.loadShoppingLists` methods.

The following script creates a shopping list, adds a product to it, then refreshes the local `window.ibexaShoppingList.shoppingLists` (as `addShoppingListEntries` method doesn't do it):
Expand Down
Loading
Loading