Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
8e1b015
Raptor integration - feature branch (#3121)
julitafalcondusza Apr 14, 2026
04258a9
Added translation-related Twig Component groups (#3091)
mnocon Apr 14, 2026
ee48945
Doc for Quable (#3085)
mnocon Apr 14, 2026
1828827
Added doc for TaxonomyNoEntries & TaxonomySubtree (#3082)
mnocon Apr 14, 2026
38e14b9
IBX-11485: Update doc for Symfony 7.4 (#3098)
mnocon Apr 14, 2026
e149aef
Product tour (#3065)
mnocon Apr 14, 2026
89920b4
Documented try_catch (and sql: execute) in migrations (#3060)
mnocon Apr 14, 2026
24be58c
IBX-10998: Document Gemini connector (#3025)
dabrt Apr 14, 2026
28b0f7b
Added doc for additional parameter for ibexa_render (#3043)
mnocon Apr 14, 2026
2048430
Product tour: Deptract+Rector fixes (#3136)
adriendupuis Apr 14, 2026
47a337d
updated_at_criterion.md: Rm EOF blank lines
adriendupuis Apr 14, 2026
ac8ec0f
Release 5.0.7 follow up (#3137)
mnocon Apr 14, 2026
cffac95
search_api.md: Minor fixes
adriendupuis Apr 16, 2026
6e0aafd
Raptor Add/Update buy event (#3141)
adriendupuis Apr 16, 2026
de49d64
5.0.7 update (#3143)
mnocon Apr 17, 2026
b6b31f9
Release 5.0.7 fixes (#3140)
mnocon Apr 17, 2026
255e84f
Release notes for v5.0.7 and v4.6.29 (#3133)
adriendupuis Apr 20, 2026
79cf068
Merge remote-tracking branch 'origin/5.0' into release-5.0.7
mnocon Apr 20, 2026
7c0d003
Apply suggestions from code review
mnocon Apr 20, 2026
1f445f5
Made Date and time/Symbol attribute links version aware
mnocon Apr 20, 2026
1700588
Update docs/release_notes/ibexa_dxp_v4.6.md
mnocon Apr 20, 2026
8a9453b
Update docs/release_notes/ibexa_dxp_v4.6.md
mnocon Apr 20, 2026
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
ibexa_connector_gemini:
text_to_text:
models:
gemini-pro-latest:
label: 'Gemini Pro Latest'
max_tokens: 4096
gemini-flash-latest:
label: 'Gemini Flash Latest'
max_tokens: 4096
default_model: gemini-pro-latest
default_max_tokens: 4096 # Must be <= the model’s max_tokens
default_temperature: 0.8
image_to_text:
models:
gemini-flash-latest:
label: 'Gemini Flash Latest'
max_tokens: 4096
default_model: gemini-flash-latest
default_max_tokens: 4096
default_temperature: 1.0
40 changes: 40 additions & 0 deletions code_samples/back_office/product_tour/config/general_scenario.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
ibexa:
system:
admin_group:
product_tour:
my_general_scenario:
type: 'general'
scenario_title_translation_key: tour.my_general_scenario.title
steps:
welcome_step:
step_title_translation_key: title
background_image: /public/img/background.jpg
blocks:
- type: title
params:
text_translation_key: subtitle
- type: text
params:
text_translation_key: tour.step.description
- type: link
params:
url: https://doc.ibexa.co
text_translation_key: tour.link.documentation
- type: image
params:
src: /public/img/diagram.jpg
alt_translation_key: tour.image.alt
- type: video
params:
# 'Big Buck Bunny' licensed under CC 3.0 by the Blender foundation. Hosted by archive.org
url: https://archive.org/download/BigBuckBunny_124/Content/big_buck_bunny_720p_surround.mp4
- type: list
params:
title_translation_key: tour.list.title
items_translation_keys:
- tour.list.item1
- tour.list.item2
- tour.list.item3
- type: twig_template
params:
template: custom_template.html.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
ibexa:
system:
admin_group:
product_tour:
targetable_dashboard_scenario:
type: 'targetable'
scenario_title_translation_key: tour.targetable_dashboard_scenario.title
steps:
dashboard_options:
step_title_translation_key: Open Dashboard options
target: ".ibexa-db-header__more"
# No interaction_mode specified or the value is set to null
blocks:
- type: text
params:
text_translation_key: Learn how to customize the blocks displayed on your dashboard
open_dashboard_options:
step_title_translation_key: Open Dashboard options
target: '.ibexa-db-header__more'
interaction_mode: clickable
blocks:
- type: text
params:
text_translation_key: Click here to customize your dashboard
customize_dashboard:
step_title_translation_key: Customize Dashboard
target: '.ibexa-db-actions-popup-menu'
interaction_mode: clickable
blocks:
- type: text
params:
text_translation_key: Choose "Customize dashboard"
drag_and_drop_step:
step_title_translation_key: Drag-and-drop blocks
target: ".c-pb-toolbox-blocks-group__blocks > * .c-pb-toolbox-block__content:first-of-type"
interaction_mode: draggable
blocks:
- type: text
params:
text_translation_key: Drag-and-drop blocks from the sidebar to the dashboard to customize it
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

declare(strict_types=1);

namespace App\EventSubscriber;

use Ibexa\Contracts\Core\Repository\NotificationService;
use Ibexa\Contracts\IntegratedHelp\Event\RenderProductTourScenarioEvent;
use Ibexa\IntegratedHelp\ProductTour\Block\LinkBlock;
use Ibexa\IntegratedHelp\ProductTour\Block\TextBlock;
use Ibexa\IntegratedHelp\ProductTour\ProductTourStep;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

final readonly class NotificationScenarioSubscriber implements EventSubscriberInterface
{
public function __construct(private NotificationService $notificationService)
{
}

public static function getSubscribedEvents(): array
{
return [
RenderProductTourScenarioEvent::class => ['onRenderScenario'],
];
}

public function onRenderScenario(RenderProductTourScenarioEvent $event): void
{
$scenario = $event->getScenario();
$steps = $scenario->getSteps();

if ($scenario->getIdentifier() !== 'notifications') {
return;
}

foreach ($steps as $step) {
$scenario->removeStep($step);
}

if (!$this->hasUnreadNotifications()) {
return;
}

$customStep = new ProductTourStep();
$customStep->setIdentifier('custom_step_identifier');
$customStep->setInteractionMode('clickable');
$customStep->setTarget('.ibexa-header-user-menu__notifications-toggler');
$customStep->setTitle('You have unread notifications');
$customStep->addBlock(new TextBlock('Click here to preview your unread notifications.'));
$customStep->addBlock(new LinkBlock(
'https://doc.ibexa.co/projects/userguide/en/latest/getting_started/notifications/',
'Learn more about notifications'
));

$scenario->addStep($customStep);
}

private function hasUnreadNotifications(): bool
{
return $this->notificationService->getPendingNotificationCount() > 0;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php declare(strict_types=1);

use Ibexa\Contracts\ProductCatalog\Values\Product\ProductQuery;
use Ibexa\Contracts\ProductCatalog\Values\Product\Query\Criterion\ProductCategorySubtree;

$taxonomyEntryId = 42;
$criteria = new ProductCategorySubtree($taxonomyEntryId);

/** @var \Ibexa\Contracts\ProductCatalog\ProductServiceInterface $productService */
$productQuery = new ProductQuery();
$productQuery->setQuery($criteria);
$results = $productService->findProducts($productQuery);
16 changes: 16 additions & 0 deletions code_samples/back_office/search/src/Query/UpdatedAtQuery.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php declare(strict_types=1);

use DateTimeImmutable;
use Ibexa\Contracts\ProductCatalog\Values\Product\ProductQuery;
use Ibexa\Contracts\ProductCatalog\Values\Product\Query\Criterion\Operator;
use Ibexa\Contracts\ProductCatalog\Values\Product\Query\Criterion\UpdatedAt;

$criteria = new UpdatedAt(
new DateTimeImmutable('2023-03-01'),
Operator::GTE,
);

/** @var \Ibexa\Contracts\ProductCatalog\ProductServiceInterface $productService */
$productQuery = new ProductQuery();
$productQuery->setQuery($criteria);
$results = $productService->findProducts($productQuery);
15 changes: 15 additions & 0 deletions code_samples/back_office/search/src/Query/UpdatedAtRangeQuery.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php declare(strict_types=1);

use DateTimeImmutable;
use Ibexa\Contracts\ProductCatalog\Values\Product\ProductQuery;
use Ibexa\Contracts\ProductCatalog\Values\Product\Query\Criterion\UpdatedAtRange;

$criteria = new UpdatedAtRange(
new DateTimeImmutable('2020-07-10T00:00:00+00:00'),
new DateTimeImmutable('2023-07-12T00:00:00+00:00'),
);

/** @var \Ibexa\Contracts\ProductCatalog\ProductServiceInterface $productService */
$productQuery = new ProductQuery();
$productQuery->setQuery($criteria);
$results = $productService->findProducts($productQuery);
13 changes: 13 additions & 0 deletions code_samples/data_migration/examples/sql_execute.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
-
type: sql
mode: execute
query:
-
driver: mysql
sql: 'INSERT INTO test_table (test_value) VALUES ("foo");'
-
driver: sqlite
sql: 'INSERT INTO test_table (test_value) VALUES ("foo");'
-
driver: postgresql
sql: "INSERT INTO test_table (test_value) VALUES ('foo');"
14 changes: 14 additions & 0 deletions code_samples/data_migration/examples/try_catch_step.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
-
type: try_catch
mode: execute
allowed_exceptions:
- Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException
stop_after_first_exception: true
steps:
-
type: language
mode: create
metadata:
languageCode: ger-DE
name: German
enabled: true
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php declare(strict_types=1);

namespace App\EventSubscriber;

use Ibexa\Contracts\ProductCatalog\Events\ProductAttributeRenderEvent;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;

final readonly class MyAttributeRenderSubscriber
{
#[AsEventListener]
public function onAttributeRender(ProductAttributeRenderEvent $event): void
{
$event->addTemplateBefore(
'templates/product/attributes/integer_attribute.html.twig',
'@ibexadesign/product_catalog/product/attributes/attribute_blocks.html.twig',
);
}
}
28 changes: 28 additions & 0 deletions code_samples/recommendations/EventData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php declare(strict_types=1);

namespace App\Tracking;

use Ibexa\Contracts\ConnectorRaptor\Tracking\Event\VisitEventData;
use Ibexa\Contracts\ConnectorRaptor\Tracking\ServerSideTrackingDispatcherInterface;
use Ibexa\Contracts\ProductCatalog\Values\ProductInterface;

class EventData
{
public function __construct(
private readonly ServerSideTrackingDispatcherInterface $trackingDispatcher,
) {
}

public function dispatchVisitEvent(ProductInterface $product): void
{
$eventData = new VisitEventData(
productCode: $product->getCode(),
productName: $product->getName(),
categoryPath: '25#Electronics;26#Smartphones', // Build manually
currency: 'USD',
itemPrice: '999.99'
);

$this->trackingDispatcher->dispatch($eventData);
}
}
29 changes: 29 additions & 0 deletions code_samples/recommendations/EventMapper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php declare(strict_types=1);

namespace App\Tracking;

use Ibexa\Contracts\ConnectorRaptor\Tracking\EventContext;
use Ibexa\Contracts\ConnectorRaptor\Tracking\EventMapperInterface;
use Ibexa\Contracts\ConnectorRaptor\Tracking\EventType;
use Ibexa\Contracts\ConnectorRaptor\Tracking\ServerSideTrackingDispatcherInterface;
use Ibexa\Contracts\ProductCatalog\Values\ProductInterface;

class EventMapper
{
public function __construct(
private readonly EventMapperInterface $eventMapper,
private readonly ServerSideTrackingDispatcherInterface $trackingDispatcher,
) {
}

public function trackProductView(ProductInterface $product): void
{
// Map product to VisitEventData automatically, override its category
$eventData = $this->eventMapper->map(EventType::VISIT, $product, [
EventContext::CATEGORY_IDENTIFIER => 'electronics',
]);

// Send tracking event
$this->trackingDispatcher->dispatch($eventData);
}
}
42 changes: 42 additions & 0 deletions code_samples/recommendations/EventSubscriber.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php declare(strict_types=1);

namespace App\Tracking;

use Ibexa\Contracts\ConnectorRaptor\Tracking\EventMapperInterface;
use Ibexa\Contracts\ConnectorRaptor\Tracking\EventType;
use Ibexa\Contracts\ConnectorRaptor\Tracking\ServerSideTrackingDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class EventSubscriber implements EventSubscriberInterface
{
public function __construct(
private readonly EventMapperInterface $eventMapper,
private readonly ServerSideTrackingDispatcherInterface $trackingDispatcher,
) {
}

public static function getSubscribedEvents(): array
{
return [KernelEvents::RESPONSE => ['onResponse', -10]];
}

public function onResponse(ResponseEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}

$request = $event->getRequest();

// Example: track only if request has specific attribute
$product = $request->attributes->get('product');
if (null === $product) {
return;
}

$eventData = $this->eventMapper->map(EventType::VISIT, $product);
$this->trackingDispatcher->dispatch($eventData);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
ibexa:
system:
<scope>:
connector_raptor:
enabled: true
customer_id: ~ # Required
tracking_type: client # One of: "client" or "server"

# Raptor Recommendations API key
recommendations_api_key: ~ # Required

# Raptor Recommendations API URL, optional, set by default
recommendations_api_url: '%ibexa.connector.raptor.recommendations.api_url%'
ibexa_connector_raptor:
# When enabled, tracking exceptions are thrown instead of being silently handled
strict_exceptions: true
Loading
Loading