Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
44f352f
Release 5.0.10
dabrt Aug 14, 2026
335dbd2
API Refs v5.0.10 (#3357)
ezrobot Aug 18, 2026
cdf0b31
Add update to 4.6.32 and 5.0.10 changes
dabrt Aug 19, 2026
2c7a9aa
MCP Servers v5.0.10 (#3301)
adriendupuis Aug 19, 2026
ed32970
Update RNs
dabrt Aug 19, 2026
5089430
Merge branch 'release_5.0.10' of https://github.com/ibexa/documentati…
dabrt Aug 19, 2026
9d8b183
Update link in rn
dabrt Aug 19, 2026
d320eb7
ibexa_dxp_v5.0.md: Rm link to Ibexa\Contracts\Mcp\Test
adriendupuis Aug 19, 2026
0f8d7cd
ibexa_dxp_v5.0.md: Fix check-yaml & markdownlint
adriendupuis Aug 19, 2026
d3fab9f
Apply suggestions from code review
dabrt Aug 20, 2026
37982e8
release_notes/: Fix markdownlint heading
adriendupuis Aug 20, 2026
4a3c55d
Add a list of PHP additions to ibexa_dxp_v4.6.md
dabrt Aug 20, 2026
4c4ac53
Added deprecations page for Cohesivo 6.0 (#3279)
mnocon Aug 20, 2026
6207b49
Add Cohesivo deprecations
dabrt Aug 20, 2026
145243b
Added doc for SiteAccessStamp (#3340)
mnocon Aug 20, 2026
1bfa8ee
PHP & JS CS Fixes
dabrt Aug 20, 2026
dc3a3a5
Add SideAccessStamp to release notes
dabrt Aug 20, 2026
79e7e07
Label/Description for custom tags (#3329)
mnocon Aug 20, 2026
26f21e1
Add custom tags descriptions to release notes
dabrt Aug 20, 2026
b9f2519
Added dor for LanguageUpdate migration (#3270)
mnocon Aug 20, 2026
f35a736
Add LanguageUpdate migration to relese notes
dabrt Aug 20, 2026
d197f86
Fix composer.json
dabrt Aug 20, 2026
9e9d421
IBX-10684: Document translation management (#3249)
dabrt Aug 20, 2026
92b1647
Adjust CustomTag example for 5.0
mnocon Aug 20, 2026
ab97d58
Make CI green
mnocon Aug 20, 2026
4932e25
Apply suggestions from @mnocon
dabrt Aug 20, 2026
2887037
help text translation key described
julitafalcondusza Aug 21, 2026
0c7b0b2
Restore missing paragraph in rn
dabrt Aug 21, 2026
0e012f5
Add security advisory
dabrt Aug 21, 2026
0a32699
IBX-11549: `name.help` translation key described in Dev-doc (#3294)
julitafalcondusza Aug 21, 2026
e355e35
Change links to absolute
dabrt Aug 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 3 additions & 2 deletions .github/workflows/api_refs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,9 @@ jobs:
fi
composer config --global http-basic.updates.ibexa.co $SATIS_NETWORK_KEY $SATIS_NETWORK_TOKEN

git config --global user.name "${GITHUB_ACTOR}"
git config --global user.email "${GITHUB_ACTOR}@users.noreply.github.com"

if [[ '4.6' != $BASE_BRANCH ]]; then
tools/api_refs/api_refs.sh
# Fix escape character:
Expand All @@ -140,8 +143,6 @@ jobs:
env:
BASE_BRANCH: ${{ steps.version_and_branches.outputs.base_branch }}
run: |
git config --global user.name "${GITHUB_ACTOR}"
git config --global user.email "${GITHUB_ACTOR}@users.noreply.github.com"
git add docs/api/php_api/php_api_reference/
if [[ '4.6' != $BASE_BRANCH ]]; then
git add tools/api_refs/.phpdoc/template/package-edition-map.twig
Expand Down
1 change: 1 addition & 0 deletions .lycheeignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
^https://support\.ibexa\.co/
^https://redocly\.com/redoc/
^https://updates\.ibexa\.co
https://cohesivo.com

# Hosts that block automated requests (403)
^https?://(www\.)?linkedin\.com
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,31 @@
ibexa:
system:
admin_group:
fieldtypes:
ibexa_richtext:
custom_tags: [factbox]
toolbar:
custom_tags_group:
buttons:
factbox:
priority: 5
ibexa_fieldtype_richtext:
custom_tags:
factbox:
template: '@ibexadesign/field_type/ibexa_richtext/custom_tags/factbox.html.twig'
icon: '/bundles/ibexaadminuiassets/vendors/ids-assets/dist/img/all-icons.svg#info-square'
icon: '/bundles/ibexaadminuiassets/vendors/ids-assets/dist/img/all-icons.svg#info-square' # Optional
is_inline: false # Optional
label: 'Factbox custom tag' # Optional
description: 'Highlight a piece of information in a box' # Optional
attributes:
name:
type: string
required: true
required: true # Optional
label: 'My name attribute' # Optional
style:
type: choice
required: true
required: true # Optional
default_value: light
choices: [light, dark]
label: 'My style attribute' # Optional

ibexa:
system:
admin_group:
fieldtypes:
ibexa_richtext:
custom_tags: [factbox]
toolbar:
custom_tags_group:
buttons:
factbox:
priority: 5
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
jms_translation:
configs:
app_translation_config:
dirs: ['%kernel.project_dir%/src']
output_dir: '%kernel.project_dir%/translations'
output_format: yaml
extractors:
- 'app.translation_extractor.factbox'
- 'app.translation_extractor.factbox_choice'
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
services:
app.extractor.custom_tag:
class: Ibexa\FieldTypeRichText\Translation\Extractor\CustomTagExtractor
arguments:
$customTags: '%ibexa.field_type.richtext.custom_tags%'
$domain: '%ibexa.field_type.richtext.custom_tags.translation_domain%'
$allowlist: ['factbox']
tags:
- name: jms_translation.extractor
alias: app.translation_extractor.factbox

app.extractor.custom_tag_choice:
class: Ibexa\FieldTypeRichText\Translation\Extractor\ChoiceAttributeExtractor
arguments:
$customTags: '%ibexa.field_type.richtext.custom_tags%'
$domain: '%ibexa.field_type.richtext.custom_tags.translation_domain%'
$allowlist: ['factbox']
tags:
- name: jms_translation.extractor
alias: app.translation_extractor.factbox_choice
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
{{ encore_entry_link_tags('factbox') }}

<div class="ibexa-factbox ibexa-factbox--{{ params.style }}">
<p>{{ params.name }}</p>
<div>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
ibexa_richtext.custom_tags.factbox.label: 'Factbox'
ibexa_richtext.custom_tags.factbox.description: 'Highlight a piece of information in a box'
ibexa_richtext.custom_tags.factbox.attributes.name.label: 'Name'
ibexa_richtext.custom_tags.factbox.attributes.style.label: 'Style'
ibexa_richtext.custom_tags.factbox.attributes.style.choice.dark.label: 'Dark'
ibexa_richtext.custom_tags.factbox.attributes.style.choice.light.label: 'Light'
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Encore.addStyleEntry('factbox', [
path.resolve(__dirname, './assets/scss/factbox.scss'),
]);
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace App\Dispatcher;

use App\Message\SomeMessage;
use Ibexa\Contracts\Core\Repository\PermissionResolver;
use Ibexa\Contracts\Messenger\Stamp\DeduplicateStamp;
use Ibexa\Contracts\Messenger\Stamp\SudoStamp;
Expand All @@ -16,15 +17,15 @@ public function __construct(
) {
}

public function schedule(object $message): void
public function schedule(): void
{
$this->bus->dispatch($message);
$this->bus->dispatch(new SomeMessage());

$currentUserId = $this->permissionResolver->getCurrentUserReference()->getUserId();
$this->bus->dispatch($message, [new UserPermissionStamp($currentUserId)]);
$this->bus->dispatch($message, [new SudoStamp()]);
$this->bus->dispatch(new SomeMessage(), [new UserPermissionStamp($currentUserId)]);
$this->bus->dispatch(new SomeMessage(), [new SudoStamp()]);

$deduplicationKey = 'my_message.project.<key_based_on_message>';
$this->bus->dispatch($message, [new DeduplicateStamp($deduplicationKey)]);
$this->bus->dispatch(new SomeMessage(), [new DeduplicateStamp($deduplicationKey)]);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php declare(strict_types=1);

namespace App\Messenger;

use App\Message\SomeMessage;
use Ibexa\Contracts\Messenger\Transport\MessageProviderInterface;

final class SomeMessageProvider implements MessageProviderInterface
{
public function getHandledClasses(): iterable
{
return [SomeMessage::class];
}
}
11 changes: 11 additions & 0 deletions code_samples/data_migration/examples/update_language.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
-
type: language
mode: update
languageCode: ger-DE
metadata:
name: 'German (Germany)'
enabled: true
references:
-
name: ref__ger_de__language_id
type: language_id
37 changes: 37 additions & 0 deletions code_samples/translations_management/config/services.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
services:
App\TranslationsManagement\MyCustomProvider:
tags:
- name: 'ibexa.translations_management.auto_translate.provider'
identifier: 'my_custom_provider'
validation_profile: 'my_custom_profile'
App\TranslationsManagement\MyProviderValidator:
tags:
- name: 'ibexa.translations_management.auto_translate.provider.validator'
profile: 'my_custom_profile'
App\TranslationsManagement\ImageAltTextTransformer:
tags:
- name: 'ibexa.translations_management.auto_translate.field_value_transformer'
field_type_identifier: 'ibexa_image'
App\TranslationsManagement\MyCustomExclusionRule:
tags:
- { name: 'ibexa.translations_management.side_by_side.exclusion_rule' }
app.translations_management.exclusion_rule.custom_field_types:
class: Ibexa\TranslationsManagement\SideBySide\Service\UnsupportedFieldTypeExclusionRule
arguments:
$excludedFieldTypeIdentifiers: ['custom_point2d', 'custom_value']
tags:
- { name: 'ibexa.translations_management.side_by_side.exclusion_rule' }
App\TranslationsManagement\TwigComponent\MyTranslationModalFooter:
tags:
- name: ibexa.twig.component
group: 'admin-ui-content-translation-modal-footer'
priority: 10
App\TranslationsManagement\MyCustomAiProvider:
tags:
- name: 'ibexa.translations_management.auto_translate.provider'
identifier: 'my_custom_ai_provider'
validation_profile: 'ai_generic'
App\TranslationsManagement\MyCustomLanguageNormalizer:
tags:
- name: 'ibexa.translations_management.auto_translate.provider.language_normalizer'
priority: 10
35 changes: 35 additions & 0 deletions code_samples/translations_management/install/schema.mysql.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
CREATE TABLE IF NOT EXISTS ibexa_auto_translation (
id INT AUTO_INCREMENT NOT NULL,
provider_identifier VARCHAR(190) NOT NULL,
content_id INT NOT NULL,
version_no INT NOT NULL,
source_language_id BIGINT NOT NULL,
target_language_id BIGINT NOT NULL,
review_status VARCHAR(64) NOT NULL,
created_at DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)',
updated_at DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)',
INDEX ibexa_auto_translation_content_version_idx (content_id, version_no),
INDEX ibexa_auto_translation_target_language_idx (target_language_id),
INDEX ibexa_auto_translation_review_status_idx (review_status),
UNIQUE INDEX ibexa_auto_translation_context_uidx (content_id, version_no, source_language_id, target_language_id),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_520_ci` ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS ibexa_auto_translation_review_log (
id INT AUTO_INCREMENT NOT NULL,
auto_translation_id INT DEFAULT NULL,
user_id INT NOT NULL,
status VARCHAR(64) NOT NULL,
operation VARCHAR(64) NOT NULL,
created_at DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)',
INDEX IDX_325A3B737CE350E8 (auto_translation_id),
INDEX ibexa_auto_translation_review_log_auto_translation_created_idx (auto_translation_id, created_at, id),
INDEX ibexa_auto_translation_review_log_status_created_idx (status, created_at),
INDEX ibexa_auto_translation_review_log_user_idx (user_id),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_520_ci` ENGINE = InnoDB;

ALTER TABLE ibexa_auto_translation_review_log ADD CONSTRAINT ibexa_auto_translation_review_log_auto_translation_fk
FOREIGN KEY (auto_translation_id) REFERENCES ibexa_auto_translation (id) ON UPDATE CASCADE ON DELETE SET NULL;
ALTER TABLE ibexa_auto_translation_review_log ADD CONSTRAINT ibexa_auto_translation_review_log_user_fk
FOREIGN KEY (user_id) REFERENCES ibexa_user (contentobject_id) ON UPDATE CASCADE ON DELETE RESTRICT;
40 changes: 40 additions & 0 deletions code_samples/translations_management/install/schema.postgresql.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
CREATE TABLE IF NOT EXISTS ibexa_auto_translation (
id SERIAL NOT NULL,
provider_identifier VARCHAR(190) NOT NULL,
content_id INT NOT NULL,
version_no INT NOT NULL,
source_language_id BIGINT NOT NULL,
target_language_id BIGINT NOT NULL,
review_status VARCHAR(64) NOT NULL,
created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL,
updated_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL,
PRIMARY KEY(id)
);

CREATE INDEX IF NOT EXISTS ibexa_auto_translation_content_version_idx ON ibexa_auto_translation (content_id, version_no);
CREATE INDEX IF NOT EXISTS ibexa_auto_translation_target_language_idx ON ibexa_auto_translation (target_language_id);
CREATE INDEX IF NOT EXISTS ibexa_auto_translation_review_status_idx ON ibexa_auto_translation (review_status);
CREATE UNIQUE INDEX IF NOT EXISTS ibexa_auto_translation_context_uidx ON ibexa_auto_translation (content_id, version_no, source_language_id, target_language_id);
COMMENT ON COLUMN ibexa_auto_translation.created_at IS '(DC2Type:datetime_immutable)';
COMMENT ON COLUMN ibexa_auto_translation.updated_at IS '(DC2Type:datetime_immutable)';

CREATE TABLE IF NOT EXISTS ibexa_auto_translation_review_log (
id SERIAL NOT NULL,
auto_translation_id INT DEFAULT NULL,
user_id INT NOT NULL,
status VARCHAR(64) NOT NULL,
operation VARCHAR(64) NOT NULL,
created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL,
PRIMARY KEY(id)
);

CREATE INDEX IF NOT EXISTS IDX_325A3B737CE350E8 ON ibexa_auto_translation_review_log (auto_translation_id);
CREATE INDEX IF NOT EXISTS ibexa_auto_translation_review_log_auto_translation_created_idx ON ibexa_auto_translation_review_log (auto_translation_id, created_at, id);
CREATE INDEX IF NOT EXISTS ibexa_auto_translation_review_log_status_created_idx ON ibexa_auto_translation_review_log (status, created_at);
CREATE INDEX IF NOT EXISTS ibexa_auto_translation_review_log_user_idx ON ibexa_auto_translation_review_log (user_id);
COMMENT ON COLUMN ibexa_auto_translation_review_log.created_at IS '(DC2Type:datetime_immutable)';

ALTER TABLE ibexa_auto_translation_review_log ADD CONSTRAINT ibexa_auto_translation_review_log_auto_translation_fk
FOREIGN KEY (auto_translation_id) REFERENCES ibexa_auto_translation (id) ON UPDATE CASCADE ON DELETE SET NULL;
ALTER TABLE ibexa_auto_translation_review_log ADD CONSTRAINT ibexa_auto_translation_review_log_user_fk
FOREIGN KEY (user_id) REFERENCES ibexa_user (contentobject_id) ON UPDATE CASCADE ON DELETE RESTRICT;
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

declare(strict_types=1);

namespace App\TranslationsManagement;

use Ibexa\Contracts\Core\Repository\Values\Content\Field;
use Ibexa\Contracts\TranslationsManagement\AutoTranslate\Transformer\Field\EncodedFieldValue;
use Ibexa\Contracts\TranslationsManagement\AutoTranslate\Transformer\Field\FieldValueTransformerInterface;
use Ibexa\Core\Base\Exceptions\InvalidArgumentException;
use Ibexa\Core\FieldType\Image\Value as ImageValue;
use Ibexa\Core\FieldType\Value;

final class ImageAltTextTransformer implements FieldValueTransformerInterface
{
public function getFieldTypeIdentifier(): string
{
return 'ibexa_image';
}

public function encode(Field $field): EncodedFieldValue
{
$value = $field->getValue();
if (!$value instanceof ImageValue) {
throw new InvalidArgumentException(
'$field',
sprintf('Expected %s, got %s.', ImageValue::class, get_debug_type($value))
);
}

return new EncodedFieldValue($value->alternativeText ?? '');
}

/**
* @param array<string, mixed> $metadata
*/
public function decode(string $value, mixed $previousFieldValue, array $metadata): Value
{
if (!$previousFieldValue instanceof ImageValue) {
throw new InvalidArgumentException(
'$previousFieldValue',
sprintf('Expected %s, got %s.', ImageValue::class, get_debug_type($previousFieldValue))
);
}

return new ImageValue([
'id' => $previousFieldValue->id,
'fileName' => $previousFieldValue->fileName,
'fileSize' => $previousFieldValue->fileSize,
'uri' => $previousFieldValue->uri,
'imageId' => $previousFieldValue->imageId,
'inputUri' => $previousFieldValue->inputUri,
'width' => $previousFieldValue->width,
'height' => $previousFieldValue->height,
'alternativeText' => $value,
'additionalData' => $previousFieldValue->additionalData,
'mime' => $previousFieldValue->mime,
]);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

declare(strict_types=1);

namespace App\TranslationsManagement;

/** Placeholder for your own HTTP client or third-party SDK wrapper. */
final class MyApiClient
{
public function translate(string $text, string $sourceLanguage, string $targetLanguage): string
{
// Your implementation here.
return '';
}
}
Loading
Loading